diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,14 @@
+## Ormolu 0.1.3.0
+
+* Ormolu no longer overwrites already formatted files. [PR
+  649](https://github.com/tweag/ormolu/pull/649).
+
+* Now a space is guaranteed before ticked promoted types. [Issue
+  631](https://github.com/tweag/ormolu/issues/631).
+
+* Formatting of single-line explicitly bidirectional pattern synonyms
+  idempotent. [Issue 630](https://github.com/tweag/ormolu/issues/630).
+
 ## Ormolu 0.1.2.0
 
 * Fixed the bug when comments in different styles got glued together after
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -22,7 +22,7 @@
 * That formatting style aims to result in minimal diffs while still
   remaining very close to “conventional” Haskell formatting people use.
 * Choose a style compatible with modern dialects of Haskell. As new Haskell
-  extensions enter broad use, we may change the style to accomodate them.
+  extensions enter broad use, we may change the style to accommodate them.
 * Idempotence: formatting already formatted code doesn't change it.
 * Be well-tested and robust to the point that it can be used in large
   projects without exposing unfortunate, disappointing bugs here and there.
@@ -114,10 +114,10 @@
 
 This allows us to disable formatting selectively for code between these
 markers or disable it for the entire file. To achieve the latter, just put
-`{- ORMOLU_DISABLE -}` at the very top. Note that the source code should
-still be parseable even without the “excluded” part. Because of that the
-magic comments cannot be placed arbitrary, but should rather enclose
-independent top-level definitions.
+`{- ORMOLU_DISABLE -}` at the very top. Note that for Ormolu to work the
+source code must still be parseable even when the disabled regions are
+omitted. Because of that the magic comments cannot be placed arbitrarily,
+but rather must enclose independent top-level definitions.
 
 ## Current limitations
 
@@ -130,14 +130,6 @@
   criterion than just being valid Haskell modules.
 * Various minor idempotence issues, most of them are related to comments.
 
-## Editor integration
-
-We know of the following editor integrations:
-
-* [Emacs][emacs-package]
-* [VS Code][vs-code-plugin]
-* vim: [neoformat][neoformat], [vim-ormolu][vim-ormolu]
-
 ## Running on Hackage
 
 It's possible to try Ormolu on arbitrary packages from Hackage. For that
@@ -152,6 +144,22 @@
 `.hs-original` extension (those are with CPP dropped, exactly what is fed
 into Ormolu).
 
+## Editor integration
+
+We know of the following editor integrations:
+
+* [Emacs][emacs-package]
+* [VS Code][vs-code-plugin]
+* vim: [neoformat][neoformat], [vim-ormolu][vim-ormolu]
+
+## Arch Linux
+
+To install Ormolu on Arch Linux, one can use [the package on AUR][aur]:
+
+```console
+yay -S ormolu
+```
+
 ## Contributing
 
 See [CONTRIBUTING.md][contributing].
@@ -170,3 +178,4 @@
 [vs-code-plugin]: https://marketplace.visualstudio.com/items?itemName=sjurmillidahl.ormolu-vscode
 [vim-ormolu]: https://github.com/sdiehl/vim-ormolu
 [neoformat]: https://github.com/sbdchd/neoformat
+[aur]: https://aur.archlinux.org/packages/ormolu
diff --git a/app/Main.hs b/app/Main.hs
--- a/app/Main.hs
+++ b/app/Main.hs
@@ -61,15 +61,19 @@
         -- 101 is different from all the other exit codes we already use.
         exitWith (ExitFailure 101)
   Just inputFile -> do
-    r <- ormoluFile config inputFile
+    originalInput <- TIO.readFile inputFile
+    formattedInput <- ormoluFile config inputFile
     case mode of
       Stdout ->
-        TIO.putStr r
-      InPlace ->
-        TIO.writeFile inputFile r
+        TIO.putStr formattedInput
+      InPlace -> do
+        -- Only write when the contents have changed, in order to avoid
+        -- updating the modified timestamp if the file was already correctly
+        -- formatted.
+        when (formattedInput /= originalInput) $
+          TIO.writeFile inputFile formattedInput
       Check -> do
-        r' <- TIO.readFile inputFile
-        when (r /= r') $
+        when (formattedInput /= originalInput) $
           -- 100 is different to all the other exit code that are emitted
           -- either from an 'OrmoluException' or from 'error' and
           -- 'notImplemented'.
diff --git a/data/examples/declaration/type/promotion-out.hs b/data/examples/declaration/type/promotion-out.hs
--- a/data/examples/declaration/type/promotion-out.hs
+++ b/data/examples/declaration/type/promotion-out.hs
@@ -1,5 +1,7 @@
 type Foo = Cluster '[ 'NodeCore, 'NodeRelay', 'NodeEdge]
 
+type Query = Query '[] '[] DB '[ 'NotNull 'PGint4] (RowPG RawElementData)
+
 data T = T' | T'T
 
 type S0 = ' T'
diff --git a/data/examples/declaration/type/promotion.hs b/data/examples/declaration/type/promotion.hs
--- a/data/examples/declaration/type/promotion.hs
+++ b/data/examples/declaration/type/promotion.hs
@@ -1,5 +1,7 @@
 type Foo = Cluster '[ 'NodeCore, 'NodeRelay', 'NodeEdge ]
 
+type Query = Query '[] '[] DB '[ 'NotNull 'PGint4] (RowPG RawElementData)
+
 data T = T' | T'T
 
 type S0 = ' T'
@@ -12,4 +14,3 @@
 type S6 = Proxy ( '( '(), '() ))
 type S7 = Proxy ( '( 'a, 'b ))
 type S8 = Proxy ( '[ Int, Bool ])
-
diff --git a/data/examples/declaration/value/pattern-synonyms/bidirectional.hs b/data/examples/declaration/value/pattern-synonyms/bidirectional.hs
--- a/data/examples/declaration/value/pattern-synonyms/bidirectional.hs
+++ b/data/examples/declaration/value/pattern-synonyms/bidirectional.hs
@@ -18,4 +18,3 @@
 
 pattern a :< b <-
   (a , b)
-
diff --git a/data/examples/declaration/value/pattern-synonyms/explicitely-bidirectional-out.hs b/data/examples/declaration/value/pattern-synonyms/explicitely-bidirectional-out.hs
--- a/data/examples/declaration/value/pattern-synonyms/explicitely-bidirectional-out.hs
+++ b/data/examples/declaration/value/pattern-synonyms/explicitely-bidirectional-out.hs
@@ -1,5 +1,7 @@
 {-# LANGUAGE PatternSynonyms #-}
 
+pattern P a <- C a where P a = C a
+
 pattern HeadC x <-
   x : xs
   where
diff --git a/data/examples/declaration/value/pattern-synonyms/explicitely-bidirectional.hs b/data/examples/declaration/value/pattern-synonyms/explicitely-bidirectional.hs
--- a/data/examples/declaration/value/pattern-synonyms/explicitely-bidirectional.hs
+++ b/data/examples/declaration/value/pattern-synonyms/explicitely-bidirectional.hs
@@ -1,5 +1,7 @@
 {-# LANGUAGE PatternSynonyms #-}
 
+pattern P a <- C a where P a = C a
+
 pattern HeadC x <- x:xs where
   HeadC x = [x]
 
@@ -16,4 +18,3 @@
   (a , b)
   where
     a :< b = (a, b)
-
diff --git a/ormolu.cabal b/ormolu.cabal
--- a/ormolu.cabal
+++ b/ormolu.cabal
@@ -1,10 +1,10 @@
 cabal-version:   1.18
 name:            ormolu
-version:         0.1.2.0
+version:         0.1.3.0
 license:         BSD3
 license-file:    LICENSE.md
 maintainer:      Mark Karpov <mark.karpov@tweag.io>
-tested-with:     ghc ==8.6.5 ghc ==8.8.3 ghc ==8.10.1
+tested-with:     ghc ==8.6.5 ghc ==8.8.4 ghc ==8.10.1
 homepage:        https://github.com/tweag/ormolu
 bug-reports:     https://github.com/tweag/ormolu/issues
 synopsis:        A formatter for Haskell source code
@@ -119,7 +119,7 @@
         base >=4.12 && <5.0,
         bytestring >=0.2 && <0.11,
         containers >=0.5 && <0.7,
-        dlist >=0.8 && <0.9,
+        dlist >=0.8 && <2.0,
         exceptions >=0.6 && <0.11,
         ghc-lib-parser >=8.10 && <8.11,
         mtl >=2.0 && <3.0,
@@ -144,7 +144,7 @@
         base >=4.12 && <5.0,
         ghc-lib-parser >=8.10 && <8.11,
         gitrev >=1.3 && <1.4,
-        optparse-applicative >=0.14 && <0.16,
+        optparse-applicative >=0.14 && <0.17,
         ormolu -any,
         text >=0.2 && <1.3
 
diff --git a/src/Ormolu/Printer/Meat/Declaration/Value.hs b/src/Ormolu/Printer/Meat/Declaration/Value.hs
--- a/src/Ormolu/Printer/Meat/Declaration/Value.hs
+++ b/src/Ormolu/Printer/Meat/Declaration/Value.hs
@@ -832,9 +832,9 @@
             txt "<-"
             breakpoint
             located psb_def p_pat
-            newline
+            breakpoint
             txt "where"
-            newline
+            breakpoint
             inci (p_matchGroup (Function psb_id) mgroup)
   txt "pattern"
   case psb_args of
diff --git a/src/Ormolu/Printer/Meat/Type.hs b/src/Ormolu/Printer/Meat/Type.hs
--- a/src/Ormolu/Printer/Meat/Type.hs
+++ b/src/Ormolu/Printer/Meat/Type.hs
@@ -52,6 +52,7 @@
   HsTyVar NoExtField p n -> do
     case p of
       IsPromoted -> do
+        space
         txt "'"
         case showOutputable (unLoc n) of
           _ : '\'' : _ -> space
