diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -5,6 +5,9 @@
 `smuggler2` uses [PVP Versioning][1].
 The change log is available [on GitHub][2].
 
+##  [0.3.4.2]: --  10 June 2020
+- Add test golden files to the distribution
+
 ##  [0.3.4.1]: --  9 June 2020
 - Place output from CPP and literate Haskell sources into new files
 
diff --git a/smuggler2.cabal b/smuggler2.cabal
--- a/smuggler2.cabal
+++ b/smuggler2.cabal
@@ -1,6 +1,6 @@
 cabal-version:      3.0
 name:               smuggler2
-version:            0.3.4.1
+version:            0.3.4.2
 synopsis:
   GHC Source Plugin that helps to minimise imports and generate explicit exports
 
@@ -27,7 +27,13 @@
   TODO.md
 
 extra-source-files:
-  test/tests/*.hs
+  test/tests/**/*.hs
+  test/tests/**/*.MinimiseImportsNoExportProcessing-golden
+  test/tests/**/*.MinimiseImportsReplaceExports-golden
+  test/tests/**/*.NoImportProcessingAddExplicitExports-golden
+  test/tests/**/*.NoImportProcessingNoExportProcessing-golden
+  test/tests/**/*.NoImportProcessingReplaceExports-golden
+  test/tests/**/*.PreserveInstanceImportsNoExportProcessing-golden
   Makefile
   Setup.hs
   weeder.dhall
@@ -72,15 +78,12 @@
 
   -- Most of these are unnecessary
   default-extensions:
-    DeriveGeneric
-    GeneralizedNewtypeDeriving
+    FlexibleContexts
+    FlexibleInstances
     InstanceSigs
     LambdaCase
-    OverloadedStrings
-    RecordWildCards
-    ScopedTypeVariables
-    StandaloneDeriving
-    TypeApplications
+    MultiParamTypeClasses
+    TupleSections
 
 common executable-options
   ghc-options: -rtsopts
diff --git a/test/tests/Bare.MinimiseImportsNoExportProcessing-golden b/test/tests/Bare.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Bare.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+
+
+main = undefined
diff --git a/test/tests/Bare.MinimiseImportsReplaceExports-golden b/test/tests/Bare.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Bare.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,3 @@
+
+
+main = undefined
diff --git a/test/tests/Bare.NoImportProcessingAddExplicitExports-golden b/test/tests/Bare.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Bare.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,4 @@
+
+import Data.List
+
+main = undefined
diff --git a/test/tests/Bare.NoImportProcessingNoExportProcessing-golden b/test/tests/Bare.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Bare.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Bare.NoImportProcessingReplaceExports-golden b/test/tests/Bare.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Bare.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,4 @@
+
+import Data.List
+
+main = undefined
diff --git a/test/tests/Bare.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/Bare.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Bare.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+
+
+import Data.List ()
+
+main = undefined
diff --git a/test/tests/BareHello.MinimiseImportsNoExportProcessing-golden b/test/tests/BareHello.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BareHello.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/BareHello.MinimiseImportsReplaceExports-golden b/test/tests/BareHello.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BareHello.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,4 @@
+module BareHello (
+  main ) where
+
+main = putStrLn "Hello, World"
diff --git a/test/tests/BareHello.NoImportProcessingAddExplicitExports-golden b/test/tests/BareHello.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BareHello.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,4 @@
+module BareHello (
+  main ) where
+
+main = putStrLn "Hello, World"
diff --git a/test/tests/BareHello.NoImportProcessingNoExportProcessing-golden b/test/tests/BareHello.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BareHello.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/BareHello.NoImportProcessingReplaceExports-golden b/test/tests/BareHello.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BareHello.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,4 @@
+module BareHello (
+  main ) where
+
+main = putStrLn "Hello, World"
diff --git a/test/tests/BareHello.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/BareHello.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BareHello.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/BoolBoolUnused.MinimiseImportsNoExportProcessing-golden b/test/tests/BoolBoolUnused.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUnused.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+module Test.BoolBoolUnused where
diff --git a/test/tests/BoolBoolUnused.MinimiseImportsReplaceExports-golden b/test/tests/BoolBoolUnused.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUnused.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,1 @@
+module Test.BoolBoolUnused where
diff --git a/test/tests/BoolBoolUnused.NoImportProcessingAddExplicitExports-golden b/test/tests/BoolBoolUnused.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUnused.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,3 @@
+module Test.BoolBoolUnused where
+
+import Data.Bool (bool)
diff --git a/test/tests/BoolBoolUnused.NoImportProcessingNoExportProcessing-golden b/test/tests/BoolBoolUnused.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUnused.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/BoolBoolUnused.NoImportProcessingReplaceExports-golden b/test/tests/BoolBoolUnused.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUnused.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,3 @@
+module Test.BoolBoolUnused where
+
+import Data.Bool (bool)
diff --git a/test/tests/BoolBoolUnused.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/BoolBoolUnused.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUnused.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+module Test.BoolBoolUnused where
+
+import Data.Bool ()
diff --git a/test/tests/BoolBoolUsed.MinimiseImportsNoExportProcessing-golden b/test/tests/BoolBoolUsed.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUsed.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.BoolBoolUsed where
+
+import Data.Bool ( bool )
+
+func = bool
diff --git a/test/tests/BoolBoolUsed.MinimiseImportsReplaceExports-golden b/test/tests/BoolBoolUsed.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUsed.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.BoolBoolUsed (
+  func ) where
+
+import Data.Bool ( bool )
+
+func = bool
diff --git a/test/tests/BoolBoolUsed.NoImportProcessingAddExplicitExports-golden b/test/tests/BoolBoolUsed.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUsed.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.BoolBoolUsed (
+  func ) where
+
+import Data.Bool (bool)
+
+func = bool
diff --git a/test/tests/BoolBoolUsed.NoImportProcessingNoExportProcessing-golden b/test/tests/BoolBoolUsed.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUsed.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/BoolBoolUsed.NoImportProcessingReplaceExports-golden b/test/tests/BoolBoolUsed.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUsed.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.BoolBoolUsed (
+  func ) where
+
+import Data.Bool (bool)
+
+func = bool
diff --git a/test/tests/BoolBoolUsed.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/BoolBoolUsed.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolBoolUsed.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.BoolBoolUsed where
+
+import Data.Bool ( bool )
+
+func = bool
diff --git a/test/tests/BoolPartlyUsedFirst.MinimiseImportsNoExportProcessing-golden b/test/tests/BoolPartlyUsedFirst.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedFirst.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.BoolPartlyUsedFirst where
+
+import Data.Bool ( bool )
+
+foo = bool
diff --git a/test/tests/BoolPartlyUsedFirst.MinimiseImportsReplaceExports-golden b/test/tests/BoolPartlyUsedFirst.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedFirst.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.BoolPartlyUsedFirst (
+  foo ) where
+
+import Data.Bool ( bool )
+
+foo = bool
diff --git a/test/tests/BoolPartlyUsedFirst.NoImportProcessingAddExplicitExports-golden b/test/tests/BoolPartlyUsedFirst.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedFirst.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.BoolPartlyUsedFirst (
+  foo ) where
+
+import Data.Bool (bool, not)
+
+foo = bool
diff --git a/test/tests/BoolPartlyUsedFirst.NoImportProcessingNoExportProcessing-golden b/test/tests/BoolPartlyUsedFirst.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedFirst.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/BoolPartlyUsedFirst.NoImportProcessingReplaceExports-golden b/test/tests/BoolPartlyUsedFirst.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedFirst.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.BoolPartlyUsedFirst (
+  foo ) where
+
+import Data.Bool (bool, not)
+
+foo = bool
diff --git a/test/tests/BoolPartlyUsedFirst.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/BoolPartlyUsedFirst.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedFirst.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.BoolPartlyUsedFirst where
+
+import Data.Bool ( bool )
+
+foo = bool
diff --git a/test/tests/BoolPartlyUsedLast.MinimiseImportsNoExportProcessing-golden b/test/tests/BoolPartlyUsedLast.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedLast.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+module Test.BoolPartlyUsedLast where
+
+foo = not
diff --git a/test/tests/BoolPartlyUsedLast.MinimiseImportsReplaceExports-golden b/test/tests/BoolPartlyUsedLast.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedLast.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,4 @@
+module Test.BoolPartlyUsedLast (
+  foo ) where
+
+foo = not
diff --git a/test/tests/BoolPartlyUsedLast.NoImportProcessingAddExplicitExports-golden b/test/tests/BoolPartlyUsedLast.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedLast.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.BoolPartlyUsedLast (
+  foo ) where
+
+import Data.Bool (bool, not)
+
+foo = not
diff --git a/test/tests/BoolPartlyUsedLast.NoImportProcessingNoExportProcessing-golden b/test/tests/BoolPartlyUsedLast.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedLast.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/BoolPartlyUsedLast.NoImportProcessingReplaceExports-golden b/test/tests/BoolPartlyUsedLast.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedLast.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.BoolPartlyUsedLast (
+  foo ) where
+
+import Data.Bool (bool, not)
+
+foo = not
diff --git a/test/tests/BoolPartlyUsedLast.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/BoolPartlyUsedLast.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/BoolPartlyUsedLast.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.BoolPartlyUsedLast where
+
+import Data.Bool ()
+
+foo = not
diff --git a/test/tests/CPP.MinimiseImportsNoExportProcessing-golden b/test/tests/CPP.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/CPP.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/CPP.MinimiseImportsReplaceExports-golden b/test/tests/CPP.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/CPP.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/CPP.NoImportProcessingAddExplicitExports-golden b/test/tests/CPP.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/CPP.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/CPP.NoImportProcessingNoExportProcessing-golden b/test/tests/CPP.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/CPP.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/CPP.NoImportProcessingReplaceExports-golden b/test/tests/CPP.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/CPP.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/CPP.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/CPP.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/CPP.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Class.MinimiseImportsNoExportProcessing-golden b/test/tests/Class.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Class.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Class.MinimiseImportsReplaceExports-golden b/test/tests/Class.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Class.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,45 @@
+module Class (
+  CatchImpossible(..),
+  Impossible(..),
+  Record(..) ) where
+
+
+data Record a = Record { aa :: a,  b :: String }
+
+data Impossible
+
+  = Impossible  String Integer
+    -- ^ We reached a program point which should be unreachable.
+
+  | Unreachable String Integer
+    -- ^ @Impossible@ with a different error message.
+    --   Used when we reach a program point which can in principle
+    --   be reached, but not for a certain run.
+
+  | ImpMissingDefinitions [String] String
+    -- ^ We reached a program point without all the required
+    -- primitives or BUILTIN to proceed forward.
+    -- @ImpMissingDefinitions neededDefs forThis@
+
+
+class CatchImpossible m where
+
+  -- | Catch any 'Impossible' exception.
+  catchImpossible :: m a -> (Impossible -> m a) -> m a
+  catchImpossible = catchImpossibleJust Just
+
+  -- | Catch only 'Impossible' exceptions selected by the filter.
+  catchImpossibleJust :: (Impossible -> Maybe b) -> m a -> (b -> m a) -> m a
+  catchImpossibleJust = flip . handleImpossibleJust
+
+  -- | Version of 'catchImpossible' with argument order suiting short handlers.
+  handleImpossible :: (Impossible -> m a) -> m a -> m a
+  handleImpossible = flip catchImpossible
+
+  -- | Version of 'catchImpossibleJust' with argument order suiting short handlers.
+  handleImpossibleJust :: (Impossible -> Maybe b) -> (b -> m a) -> m a -> m a
+  handleImpossibleJust = flip . catchImpossibleJust
+
+  {-# MINIMAL catchImpossibleJust | handleImpossibleJust #-}
+
+
diff --git a/test/tests/Class.NoImportProcessingAddExplicitExports-golden b/test/tests/Class.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Class.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,45 @@
+module Class (
+  CatchImpossible(..),
+  Impossible(..),
+  Record(..) ) where
+
+
+data Record a = Record { aa :: a,  b :: String }
+
+data Impossible
+
+  = Impossible  String Integer
+    -- ^ We reached a program point which should be unreachable.
+
+  | Unreachable String Integer
+    -- ^ @Impossible@ with a different error message.
+    --   Used when we reach a program point which can in principle
+    --   be reached, but not for a certain run.
+
+  | ImpMissingDefinitions [String] String
+    -- ^ We reached a program point without all the required
+    -- primitives or BUILTIN to proceed forward.
+    -- @ImpMissingDefinitions neededDefs forThis@
+
+
+class CatchImpossible m where
+
+  -- | Catch any 'Impossible' exception.
+  catchImpossible :: m a -> (Impossible -> m a) -> m a
+  catchImpossible = catchImpossibleJust Just
+
+  -- | Catch only 'Impossible' exceptions selected by the filter.
+  catchImpossibleJust :: (Impossible -> Maybe b) -> m a -> (b -> m a) -> m a
+  catchImpossibleJust = flip . handleImpossibleJust
+
+  -- | Version of 'catchImpossible' with argument order suiting short handlers.
+  handleImpossible :: (Impossible -> m a) -> m a -> m a
+  handleImpossible = flip catchImpossible
+
+  -- | Version of 'catchImpossibleJust' with argument order suiting short handlers.
+  handleImpossibleJust :: (Impossible -> Maybe b) -> (b -> m a) -> m a -> m a
+  handleImpossibleJust = flip . catchImpossibleJust
+
+  {-# MINIMAL catchImpossibleJust | handleImpossibleJust #-}
+
+
diff --git a/test/tests/Class.NoImportProcessingNoExportProcessing-golden b/test/tests/Class.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Class.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Class.NoImportProcessingReplaceExports-golden b/test/tests/Class.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Class.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,45 @@
+module Class (
+  CatchImpossible(..),
+  Impossible(..),
+  Record(..) ) where
+
+
+data Record a = Record { aa :: a,  b :: String }
+
+data Impossible
+
+  = Impossible  String Integer
+    -- ^ We reached a program point which should be unreachable.
+
+  | Unreachable String Integer
+    -- ^ @Impossible@ with a different error message.
+    --   Used when we reach a program point which can in principle
+    --   be reached, but not for a certain run.
+
+  | ImpMissingDefinitions [String] String
+    -- ^ We reached a program point without all the required
+    -- primitives or BUILTIN to proceed forward.
+    -- @ImpMissingDefinitions neededDefs forThis@
+
+
+class CatchImpossible m where
+
+  -- | Catch any 'Impossible' exception.
+  catchImpossible :: m a -> (Impossible -> m a) -> m a
+  catchImpossible = catchImpossibleJust Just
+
+  -- | Catch only 'Impossible' exceptions selected by the filter.
+  catchImpossibleJust :: (Impossible -> Maybe b) -> m a -> (b -> m a) -> m a
+  catchImpossibleJust = flip . handleImpossibleJust
+
+  -- | Version of 'catchImpossible' with argument order suiting short handlers.
+  handleImpossible :: (Impossible -> m a) -> m a -> m a
+  handleImpossible = flip catchImpossible
+
+  -- | Version of 'catchImpossibleJust' with argument order suiting short handlers.
+  handleImpossibleJust :: (Impossible -> Maybe b) -> (b -> m a) -> m a -> m a
+  handleImpossibleJust = flip . catchImpossibleJust
+
+  {-# MINIMAL catchImpossibleJust | handleImpossibleJust #-}
+
+
diff --git a/test/tests/Class.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/Class.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Class.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ConstructorsUnused.MinimiseImportsNoExportProcessing-golden b/test/tests/ConstructorsUnused.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ConstructorsUnused.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+module Test.ConstructorsUnused where
+
+foo = not
diff --git a/test/tests/ConstructorsUnused.MinimiseImportsReplaceExports-golden b/test/tests/ConstructorsUnused.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ConstructorsUnused.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,4 @@
+module Test.ConstructorsUnused (
+  foo ) where
+
+foo = not
diff --git a/test/tests/ConstructorsUnused.NoImportProcessingAddExplicitExports-golden b/test/tests/ConstructorsUnused.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ConstructorsUnused.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.ConstructorsUnused (
+  foo ) where
+
+import Data.Bool (Bool (True, False), not)
+
+foo = not
diff --git a/test/tests/ConstructorsUnused.NoImportProcessingNoExportProcessing-golden b/test/tests/ConstructorsUnused.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ConstructorsUnused.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ConstructorsUnused.NoImportProcessingReplaceExports-golden b/test/tests/ConstructorsUnused.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ConstructorsUnused.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.ConstructorsUnused (
+  foo ) where
+
+import Data.Bool (Bool (True, False), not)
+
+foo = not
diff --git a/test/tests/ConstructorsUnused.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/ConstructorsUnused.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ConstructorsUnused.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.ConstructorsUnused where
+
+import Data.Bool ()
+
+foo = not
diff --git a/test/tests/Dummy.MinimiseImportsNoExportProcessing-golden b/test/tests/Dummy.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Dummy.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Dummy.MinimiseImportsReplaceExports-golden b/test/tests/Dummy.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Dummy.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,5 @@
+module Test.Dummy (
+  main ) where
+
+main :: IO ()
+main = pure ()
diff --git a/test/tests/Dummy.NoImportProcessingAddExplicitExports-golden b/test/tests/Dummy.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Dummy.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,5 @@
+module Test.Dummy (
+  main ) where
+
+main :: IO ()
+main = pure ()
diff --git a/test/tests/Dummy.NoImportProcessingNoExportProcessing-golden b/test/tests/Dummy.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Dummy.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Dummy.NoImportProcessingReplaceExports-golden b/test/tests/Dummy.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Dummy.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,5 @@
+module Test.Dummy (
+  main ) where
+
+main :: IO ()
+main = pure ()
diff --git a/test/tests/Dummy.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/Dummy.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Dummy.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Duplicated.MinimiseImportsNoExportProcessing-golden b/test/tests/Duplicated.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Duplicated.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,7 @@
+module Duplicated where
+
+import Data.Char ( isDigit )
+import Data.Char ( isLetter )
+
+
+test x = isDigit x || isLetter x
diff --git a/test/tests/Duplicated.MinimiseImportsReplaceExports-golden b/test/tests/Duplicated.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Duplicated.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,8 @@
+module Duplicated (
+  test ) where
+
+import Data.Char ( isDigit )
+import Data.Char ( isLetter )
+
+
+test x = isDigit x || isLetter x
diff --git a/test/tests/Duplicated.NoImportProcessingAddExplicitExports-golden b/test/tests/Duplicated.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Duplicated.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,9 @@
+module Duplicated (
+  test ) where
+
+import Data.Char (isDigit, isSpace)
+import Data.Char (isPrint, isSpace)
+import Data.Char (isLetter, isSpace)
+
+
+test x = isDigit x || isLetter x
diff --git a/test/tests/Duplicated.NoImportProcessingNoExportProcessing-golden b/test/tests/Duplicated.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Duplicated.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Duplicated.NoImportProcessingReplaceExports-golden b/test/tests/Duplicated.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Duplicated.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,9 @@
+module Duplicated (
+  test ) where
+
+import Data.Char (isDigit, isSpace)
+import Data.Char (isPrint, isSpace)
+import Data.Char (isLetter, isSpace)
+
+
+test x = isDigit x || isLetter x
diff --git a/test/tests/Duplicated.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/Duplicated.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Duplicated.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,8 @@
+module Duplicated where
+
+import Data.Char ( isDigit )
+import Data.Char ()
+import Data.Char ( isLetter )
+
+
+test x = isDigit x || isLetter x
diff --git a/test/tests/ExportExplicit.MinimiseImportsNoExportProcessing-golden b/test/tests/ExportExplicit.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportExplicit.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ExportExplicit.MinimiseImportsReplaceExports-golden b/test/tests/ExportExplicit.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportExplicit.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,14 @@
+module Test.ExportExplicit (
+  isExported,
+  anotherExport,
+  andAnother,
+  main ) where
+
+isExported = (+1)
+
+anotherExport = True
+
+andAnother = 27
+
+main :: IO ()
+main = pure ()
diff --git a/test/tests/ExportExplicit.NoImportProcessingAddExplicitExports-golden b/test/tests/ExportExplicit.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportExplicit.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,10 @@
+module Test.ExportExplicit (isExported, anotherExport) where
+
+isExported = (+1)
+
+anotherExport = True
+
+andAnother = 27
+
+main :: IO ()
+main = pure ()
diff --git a/test/tests/ExportExplicit.NoImportProcessingNoExportProcessing-golden b/test/tests/ExportExplicit.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportExplicit.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ExportExplicit.NoImportProcessingReplaceExports-golden b/test/tests/ExportExplicit.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportExplicit.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,14 @@
+module Test.ExportExplicit (
+  isExported,
+  anotherExport,
+  andAnother,
+  main ) where
+
+isExported = (+1)
+
+anotherExport = True
+
+andAnother = 27
+
+main :: IO ()
+main = pure ()
diff --git a/test/tests/ExportExplicit.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/ExportExplicit.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportExplicit.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ExportImplicit.MinimiseImportsNoExportProcessing-golden b/test/tests/ExportImplicit.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportImplicit.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ExportImplicit.MinimiseImportsReplaceExports-golden b/test/tests/ExportImplicit.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportImplicit.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,13 @@
+module Test.ExportImplicit (
+  isExported,
+  alsoExported,
+  main ) where
+
+import Data.Char ( toLower )
+
+isExported = (+1)
+
+alsoExported = map toLower "AbC"
+
+main :: IO ()
+main = print $ isExported 1
diff --git a/test/tests/ExportImplicit.NoImportProcessingAddExplicitExports-golden b/test/tests/ExportImplicit.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportImplicit.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,13 @@
+module Test.ExportImplicit (
+  isExported,
+  alsoExported,
+  main ) where
+
+import Data.Char
+
+isExported = (+1)
+
+alsoExported = map toLower "AbC"
+
+main :: IO ()
+main = print $ isExported 1
diff --git a/test/tests/ExportImplicit.NoImportProcessingNoExportProcessing-golden b/test/tests/ExportImplicit.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportImplicit.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ExportImplicit.NoImportProcessingReplaceExports-golden b/test/tests/ExportImplicit.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportImplicit.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,13 @@
+module Test.ExportImplicit (
+  isExported,
+  alsoExported,
+  main ) where
+
+import Data.Char
+
+isExported = (+1)
+
+alsoExported = map toLower "AbC"
+
+main :: IO ()
+main = print $ isExported 1
diff --git a/test/tests/ExportImplicit.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/ExportImplicit.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportImplicit.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ExportPattern2.MinimiseImportsNoExportProcessing-golden b/test/tests/ExportPattern2.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportPattern2.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ExportPattern2.MinimiseImportsReplaceExports-golden b/test/tests/ExportPattern2.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportPattern2.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,161 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE ViewPatterns #-}
+
+module ExportPattern2 (
+  T(..),
+  Nat(..),
+  Showable(..),
+  Type(..),
+  pattern ExNumPat,
+  pattern Head,
+  pattern Single,
+  pattern Ess,
+  pattern Pair,
+  pattern One,
+  pattern Sh,
+  pattern Succ,
+  pattern (:>),
+  pattern (:<),
+  pattern Empty,
+  pattern Maybe,
+  pattern Int,
+  pattern Arrow,
+  pattern P ) where
+
+import Control.Monad ( guard )
+import qualified Data.Sequence as Seq
+    ( viewl, viewr, ViewL((:<), EmptyL), ViewR((:>)) )
+
+pattern P = 42
+
+--useP P = 43
+
+--
+
+data Type = App String [Type]
+
+pattern Arrow :: Type -> Type -> Type
+pattern Arrow t1 t2 = App "->" [t1, t2]
+
+pattern Int = App "Int" []
+
+pattern Maybe t = App "Maybe" [t]
+
+
+{-
+collectArgs :: Type -> [Type]
+collectArgs (Arrow t1 t2) = t1 : collectArgs t2
+collectArgs _ = []
+
+isInt :: Type -> Bool
+isInt Int = True
+isInt _ = False
+
+isIntEndo :: Type -> Bool
+isIntEndo (Arrow Int Int) = True
+isIntEndo _ = False
+
+arrows :: [Type] -> Type -> Type
+arrows = flip $ foldr Arrow
+-}
+
+--
+
+
+pattern Empty <- (Seq.viewl -> Seq.EmptyL)
+pattern x :< xs <- (Seq.viewl -> x Seq.:< xs)
+pattern xs :> x <- (Seq.viewr -> xs Seq.:> x)
+
+{-
+viewPL (x :< Empty) = x
+viewPR (Empty :> y) = y
+-}
+
+--
+
+
+pattern Succ n <-
+  (\x -> (x -1) <$ guard (x > 0) -> Just n)
+  where
+    Succ n = n + 1
+
+{-
+fac (Succ n) = Succ n * fac n
+fac 0 = 1
+-}
+
+--
+
+
+data Showable where
+  MkShowable :: (Show a) => a -> Showable
+
+-- Required context is empty, but provided context is not
+pattern Sh :: () => (Show a) => a -> Showable
+pattern Sh x <- MkShowable x
+
+{-
+showable :: (Show a) => a -> Showable
+showable x = MkShowable x
+-}
+
+--
+
+
+-- Provided context is empty
+pattern One :: (Num a, Eq a) => a
+pattern One <- 1
+
+
+-- one One = 2
+
+--
+
+
+pattern Pair x y <- [x, y]
+
+
+
+{-
+f (Pair True True) = True
+f _ = False
+
+g [True, True] = True
+g _ = False
+-}
+
+
+
+--
+
+data Nat = Z | S Nat deriving (Show)
+
+pattern Ess p = S p
+
+
+--two = S ( S Z)
+
+--
+
+pattern Single x = [x]
+
+pattern Head x <- x : xs
+
+{- single (Single x) = x
+hd :: [a] -> a
+hd (Head x) = x
+-}
+
+--
+
+
+data T a where
+  MkT :: (Show b) => a -> b -> T a
+
+pattern ExNumPat x = MkT 42 x
+
+{-
+h :: (Num t, Eq t) => T t -> String
+h (ExNumPat x) = show x
+-}
diff --git a/test/tests/ExportPattern2.NoImportProcessingAddExplicitExports-golden b/test/tests/ExportPattern2.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportPattern2.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,160 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE ViewPatterns #-}
+
+module ExportPattern2 (
+  T(..),
+  Nat(..),
+  Showable(..),
+  Type(..),
+  pattern ExNumPat,
+  pattern Head,
+  pattern Single,
+  pattern Ess,
+  pattern Pair,
+  pattern One,
+  pattern Sh,
+  pattern Succ,
+  pattern (:>),
+  pattern (:<),
+  pattern Empty,
+  pattern Maybe,
+  pattern Int,
+  pattern Arrow,
+  pattern P ) where
+
+import Control.Monad (guard)
+import qualified Data.Sequence as Seq
+
+pattern P = 42
+
+--useP P = 43
+
+--
+
+data Type = App String [Type]
+
+pattern Arrow :: Type -> Type -> Type
+pattern Arrow t1 t2 = App "->" [t1, t2]
+
+pattern Int = App "Int" []
+
+pattern Maybe t = App "Maybe" [t]
+
+
+{-
+collectArgs :: Type -> [Type]
+collectArgs (Arrow t1 t2) = t1 : collectArgs t2
+collectArgs _ = []
+
+isInt :: Type -> Bool
+isInt Int = True
+isInt _ = False
+
+isIntEndo :: Type -> Bool
+isIntEndo (Arrow Int Int) = True
+isIntEndo _ = False
+
+arrows :: [Type] -> Type -> Type
+arrows = flip $ foldr Arrow
+-}
+
+--
+
+
+pattern Empty <- (Seq.viewl -> Seq.EmptyL)
+pattern x :< xs <- (Seq.viewl -> x Seq.:< xs)
+pattern xs :> x <- (Seq.viewr -> xs Seq.:> x)
+
+{-
+viewPL (x :< Empty) = x
+viewPR (Empty :> y) = y
+-}
+
+--
+
+
+pattern Succ n <-
+  (\x -> (x -1) <$ guard (x > 0) -> Just n)
+  where
+    Succ n = n + 1
+
+{-
+fac (Succ n) = Succ n * fac n
+fac 0 = 1
+-}
+
+--
+
+
+data Showable where
+  MkShowable :: (Show a) => a -> Showable
+
+-- Required context is empty, but provided context is not
+pattern Sh :: () => (Show a) => a -> Showable
+pattern Sh x <- MkShowable x
+
+{-
+showable :: (Show a) => a -> Showable
+showable x = MkShowable x
+-}
+
+--
+
+
+-- Provided context is empty
+pattern One :: (Num a, Eq a) => a
+pattern One <- 1
+
+
+-- one One = 2
+
+--
+
+
+pattern Pair x y <- [x, y]
+
+
+
+{-
+f (Pair True True) = True
+f _ = False
+
+g [True, True] = True
+g _ = False
+-}
+
+
+
+--
+
+data Nat = Z | S Nat deriving (Show)
+
+pattern Ess p = S p
+
+
+--two = S ( S Z)
+
+--
+
+pattern Single x = [x]
+
+pattern Head x <- x : xs
+
+{- single (Single x) = x
+hd :: [a] -> a
+hd (Head x) = x
+-}
+
+--
+
+
+data T a where
+  MkT :: (Show b) => a -> b -> T a
+
+pattern ExNumPat x = MkT 42 x
+
+{-
+h :: (Num t, Eq t) => T t -> String
+h (ExNumPat x) = show x
+-}
diff --git a/test/tests/ExportPattern2.NoImportProcessingNoExportProcessing-golden b/test/tests/ExportPattern2.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportPattern2.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ExportPattern2.NoImportProcessingReplaceExports-golden b/test/tests/ExportPattern2.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportPattern2.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,160 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE ViewPatterns #-}
+
+module ExportPattern2 (
+  T(..),
+  Nat(..),
+  Showable(..),
+  Type(..),
+  pattern ExNumPat,
+  pattern Head,
+  pattern Single,
+  pattern Ess,
+  pattern Pair,
+  pattern One,
+  pattern Sh,
+  pattern Succ,
+  pattern (:>),
+  pattern (:<),
+  pattern Empty,
+  pattern Maybe,
+  pattern Int,
+  pattern Arrow,
+  pattern P ) where
+
+import Control.Monad (guard)
+import qualified Data.Sequence as Seq
+
+pattern P = 42
+
+--useP P = 43
+
+--
+
+data Type = App String [Type]
+
+pattern Arrow :: Type -> Type -> Type
+pattern Arrow t1 t2 = App "->" [t1, t2]
+
+pattern Int = App "Int" []
+
+pattern Maybe t = App "Maybe" [t]
+
+
+{-
+collectArgs :: Type -> [Type]
+collectArgs (Arrow t1 t2) = t1 : collectArgs t2
+collectArgs _ = []
+
+isInt :: Type -> Bool
+isInt Int = True
+isInt _ = False
+
+isIntEndo :: Type -> Bool
+isIntEndo (Arrow Int Int) = True
+isIntEndo _ = False
+
+arrows :: [Type] -> Type -> Type
+arrows = flip $ foldr Arrow
+-}
+
+--
+
+
+pattern Empty <- (Seq.viewl -> Seq.EmptyL)
+pattern x :< xs <- (Seq.viewl -> x Seq.:< xs)
+pattern xs :> x <- (Seq.viewr -> xs Seq.:> x)
+
+{-
+viewPL (x :< Empty) = x
+viewPR (Empty :> y) = y
+-}
+
+--
+
+
+pattern Succ n <-
+  (\x -> (x -1) <$ guard (x > 0) -> Just n)
+  where
+    Succ n = n + 1
+
+{-
+fac (Succ n) = Succ n * fac n
+fac 0 = 1
+-}
+
+--
+
+
+data Showable where
+  MkShowable :: (Show a) => a -> Showable
+
+-- Required context is empty, but provided context is not
+pattern Sh :: () => (Show a) => a -> Showable
+pattern Sh x <- MkShowable x
+
+{-
+showable :: (Show a) => a -> Showable
+showable x = MkShowable x
+-}
+
+--
+
+
+-- Provided context is empty
+pattern One :: (Num a, Eq a) => a
+pattern One <- 1
+
+
+-- one One = 2
+
+--
+
+
+pattern Pair x y <- [x, y]
+
+
+
+{-
+f (Pair True True) = True
+f _ = False
+
+g [True, True] = True
+g _ = False
+-}
+
+
+
+--
+
+data Nat = Z | S Nat deriving (Show)
+
+pattern Ess p = S p
+
+
+--two = S ( S Z)
+
+--
+
+pattern Single x = [x]
+
+pattern Head x <- x : xs
+
+{- single (Single x) = x
+hd :: [a] -> a
+hd (Head x) = x
+-}
+
+--
+
+
+data T a where
+  MkT :: (Show b) => a -> b -> T a
+
+pattern ExNumPat x = MkT 42 x
+
+{-
+h :: (Num t, Eq t) => T t -> String
+h (ExNumPat x) = show x
+-}
diff --git a/test/tests/ExportPattern2.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/ExportPattern2.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ExportPattern2.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ImplicitImportUnused.MinimiseImportsNoExportProcessing-golden b/test/tests/ImplicitImportUnused.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUnused.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,7 @@
+module Test.ImplicitImportUnused where
+
+import Data.Maybe ( isJust )
+
+foo = isJust
+
+bar = 27
diff --git a/test/tests/ImplicitImportUnused.MinimiseImportsReplaceExports-golden b/test/tests/ImplicitImportUnused.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUnused.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,9 @@
+module Test.ImplicitImportUnused (
+  foo,
+  bar ) where
+
+import Data.Maybe ( isJust )
+
+foo = isJust
+
+bar = 27
diff --git a/test/tests/ImplicitImportUnused.NoImportProcessingAddExplicitExports-golden b/test/tests/ImplicitImportUnused.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUnused.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,11 @@
+module Test.ImplicitImportUnused (
+  foo,
+  bar ) where
+
+import Data.List
+import Data.Bool (not, (&&))
+import Data.Maybe (fromMaybe, isJust, isNothing)
+
+foo = isJust
+
+bar = 27
diff --git a/test/tests/ImplicitImportUnused.NoImportProcessingNoExportProcessing-golden b/test/tests/ImplicitImportUnused.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUnused.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ImplicitImportUnused.NoImportProcessingReplaceExports-golden b/test/tests/ImplicitImportUnused.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUnused.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,11 @@
+module Test.ImplicitImportUnused (
+  foo,
+  bar ) where
+
+import Data.List
+import Data.Bool (not, (&&))
+import Data.Maybe (fromMaybe, isJust, isNothing)
+
+foo = isJust
+
+bar = 27
diff --git a/test/tests/ImplicitImportUnused.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/ImplicitImportUnused.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUnused.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,9 @@
+module Test.ImplicitImportUnused where
+
+import Data.List ()
+import Data.Bool ()
+import Data.Maybe ( isJust )
+
+foo = isJust
+
+bar = 27
diff --git a/test/tests/ImplicitImportUsed.MinimiseImportsNoExportProcessing-golden b/test/tests/ImplicitImportUsed.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUsed.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.ImplicitImportUsed where
+
+import Data.List ( intercalate )
+
+foo = intercalate ","
diff --git a/test/tests/ImplicitImportUsed.MinimiseImportsReplaceExports-golden b/test/tests/ImplicitImportUsed.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUsed.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.ImplicitImportUsed (
+  foo ) where
+
+import Data.List ( intercalate )
+
+foo = intercalate ","
diff --git a/test/tests/ImplicitImportUsed.NoImportProcessingAddExplicitExports-golden b/test/tests/ImplicitImportUsed.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUsed.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.ImplicitImportUsed (
+  foo ) where
+
+import Data.List
+
+foo = intercalate ","
diff --git a/test/tests/ImplicitImportUsed.NoImportProcessingNoExportProcessing-golden b/test/tests/ImplicitImportUsed.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUsed.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ImplicitImportUsed.NoImportProcessingReplaceExports-golden b/test/tests/ImplicitImportUsed.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUsed.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.ImplicitImportUsed (
+  foo ) where
+
+import Data.List
+
+foo = intercalate ","
diff --git a/test/tests/ImplicitImportUsed.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/ImplicitImportUsed.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImplicitImportUsed.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.ImplicitImportUsed where
+
+import Data.List ( intercalate )
+
+foo = intercalate ","
diff --git a/test/tests/ImportEmpty.MinimiseImportsNoExportProcessing-golden b/test/tests/ImportEmpty.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportEmpty.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+module Test.ImportEmpty where
diff --git a/test/tests/ImportEmpty.MinimiseImportsReplaceExports-golden b/test/tests/ImportEmpty.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportEmpty.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,1 @@
+module Test.ImportEmpty where
diff --git a/test/tests/ImportEmpty.NoImportProcessingAddExplicitExports-golden b/test/tests/ImportEmpty.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportEmpty.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,3 @@
+module Test.ImportEmpty where
+
+import Data.Bool ()
diff --git a/test/tests/ImportEmpty.NoImportProcessingNoExportProcessing-golden b/test/tests/ImportEmpty.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportEmpty.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ImportEmpty.NoImportProcessingReplaceExports-golden b/test/tests/ImportEmpty.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportEmpty.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,3 @@
+module Test.ImportEmpty where
+
+import Data.Bool ()
diff --git a/test/tests/ImportEmpty.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/ImportEmpty.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportEmpty.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+module Test.ImportEmpty where
+
+import Data.Bool ()
diff --git a/test/tests/ImportPattern.MinimiseImportsNoExportProcessing-golden b/test/tests/ImportPattern.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportPattern.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,147 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE ViewPatterns #-}
+
+module ImportPattern where
+
+import Imported.ExportPattern
+    ( T,
+      Nat(Z, S),
+      Showable(..),
+      Type,
+      pattern ExNumPat,
+      pattern Head,
+      pattern Single,
+      pattern Pair,
+      pattern One,
+      pattern Succ,
+      pattern (:>),
+      pattern (:<),
+      pattern Empty,
+      pattern Int,
+      pattern Arrow,
+      pattern P )
+
+-- pattern P = 42
+
+useP P = 43
+
+--
+
+{-
+data Type = App String [Type]
+
+pattern Arrow :: Type -> Type -> Type
+pattern Arrow t1 t2 = App "->" [t1, t2]
+
+pattern Int = App "Int" []
+
+pattern Maybe t = App "Maybe" [t]
+
+-}
+
+collectArgs :: Type -> [Type]
+collectArgs (Arrow t1 t2) = t1 : collectArgs t2
+collectArgs _ = []
+
+isInt :: Type -> Bool
+isInt Int = True
+isInt _ = False
+
+isIntEndo :: Type -> Bool
+isIntEndo (Arrow Int Int) = True
+isIntEndo _ = False
+
+arrows :: [Type] -> Type -> Type
+arrows = flip $ foldr Arrow
+
+--
+{-
+
+pattern Empty <- (Seq.viewl -> Seq.EmptyL)
+pattern x :< xs <- (Seq.viewl -> x Seq.:< xs)
+pattern xs :> x <- (Seq.viewr -> xs Seq.:> x)
+-}
+
+viewPL (x :< Empty) = x
+viewPR (Empty :> y) = y
+
+--
+
+{-
+pattern Succ n <-
+  (\x -> (x -1) <$ guard (x > 0) -> Just n)
+  where
+    Succ n = n + 1
+-}
+
+fac (Succ n) = Succ n * fac n
+fac 0 = 1
+
+--
+
+{-
+data Showable where
+  MkShowable :: (Show a) => a -> Showable
+
+-- Required context is empty, but provided context is not
+pattern Sh :: () => (Show a) => a -> Showable
+pattern Sh x <- MkShowable x
+-}
+
+showable :: (Show a) => a -> Showable
+showable x = MkShowable x
+
+--
+
+{-
+-- Provided context is empty
+pattern One :: (Num a, Eq a) => a
+pattern One <- 1
+-}
+
+one One = 2
+
+--
+
+
+--pattern Pair x y <- [x, y]
+
+
+f (Pair True True) = True
+f _ = False
+
+g [True, True] = True
+g _ = False
+
+
+--
+{-
+data Nat = Z | S Nat deriving (Show)
+
+pattern Ess p = S p
+-}
+
+two = S ( S Z)
+
+--
+
+-- pattern Single x = [x]
+
+-- pattern Head x <- x : xs
+
+single (Single x) = x
+hd :: [a] -> a
+hd (Head x) = x
+
+--
+
+{-
+data T a where
+  MkT :: (Show b) => a -> b -> T a
+
+pattern ExNumPat x = MkT 42 x
+-}
+
+h :: (Num t, Eq t) => T t -> String
+h (ExNumPat x) = show x
diff --git a/test/tests/ImportPattern.MinimiseImportsReplaceExports-golden b/test/tests/ImportPattern.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportPattern.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,163 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE ViewPatterns #-}
+
+module ImportPattern (
+  useP,
+  collectArgs,
+  isInt,
+  isIntEndo,
+  arrows,
+  viewPL,
+  viewPR,
+  fac,
+  showable,
+  one,
+  f,
+  g,
+  two,
+  single,
+  hd,
+  h ) where
+
+import Imported.ExportPattern
+    ( T,
+      Nat(Z, S),
+      Showable(..),
+      Type,
+      pattern ExNumPat,
+      pattern Head,
+      pattern Single,
+      pattern Pair,
+      pattern One,
+      pattern Succ,
+      pattern (:>),
+      pattern (:<),
+      pattern Empty,
+      pattern Int,
+      pattern Arrow,
+      pattern P )
+
+-- pattern P = 42
+
+useP P = 43
+
+--
+
+{-
+data Type = App String [Type]
+
+pattern Arrow :: Type -> Type -> Type
+pattern Arrow t1 t2 = App "->" [t1, t2]
+
+pattern Int = App "Int" []
+
+pattern Maybe t = App "Maybe" [t]
+
+-}
+
+collectArgs :: Type -> [Type]
+collectArgs (Arrow t1 t2) = t1 : collectArgs t2
+collectArgs _ = []
+
+isInt :: Type -> Bool
+isInt Int = True
+isInt _ = False
+
+isIntEndo :: Type -> Bool
+isIntEndo (Arrow Int Int) = True
+isIntEndo _ = False
+
+arrows :: [Type] -> Type -> Type
+arrows = flip $ foldr Arrow
+
+--
+{-
+
+pattern Empty <- (Seq.viewl -> Seq.EmptyL)
+pattern x :< xs <- (Seq.viewl -> x Seq.:< xs)
+pattern xs :> x <- (Seq.viewr -> xs Seq.:> x)
+-}
+
+viewPL (x :< Empty) = x
+viewPR (Empty :> y) = y
+
+--
+
+{-
+pattern Succ n <-
+  (\x -> (x -1) <$ guard (x > 0) -> Just n)
+  where
+    Succ n = n + 1
+-}
+
+fac (Succ n) = Succ n * fac n
+fac 0 = 1
+
+--
+
+{-
+data Showable where
+  MkShowable :: (Show a) => a -> Showable
+
+-- Required context is empty, but provided context is not
+pattern Sh :: () => (Show a) => a -> Showable
+pattern Sh x <- MkShowable x
+-}
+
+showable :: (Show a) => a -> Showable
+showable x = MkShowable x
+
+--
+
+{-
+-- Provided context is empty
+pattern One :: (Num a, Eq a) => a
+pattern One <- 1
+-}
+
+one One = 2
+
+--
+
+
+--pattern Pair x y <- [x, y]
+
+
+f (Pair True True) = True
+f _ = False
+
+g [True, True] = True
+g _ = False
+
+
+--
+{-
+data Nat = Z | S Nat deriving (Show)
+
+pattern Ess p = S p
+-}
+
+two = S ( S Z)
+
+--
+
+-- pattern Single x = [x]
+
+-- pattern Head x <- x : xs
+
+single (Single x) = x
+hd :: [a] -> a
+hd (Head x) = x
+
+--
+
+{-
+data T a where
+  MkT :: (Show b) => a -> b -> T a
+
+pattern ExNumPat x = MkT 42 x
+-}
+
+h :: (Num t, Eq t) => T t -> String
+h (ExNumPat x) = show x
diff --git a/test/tests/ImportPattern.NoImportProcessingAddExplicitExports-golden b/test/tests/ImportPattern.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportPattern.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,150 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE ViewPatterns #-}
+
+module ImportPattern (
+  useP,
+  collectArgs,
+  isInt,
+  isIntEndo,
+  arrows,
+  viewPL,
+  viewPR,
+  fac,
+  showable,
+  one,
+  f,
+  g,
+  two,
+  single,
+  hd,
+  h ) where
+
+import Control.Monad (guard)
+import qualified Data.Sequence as Seq
+
+import Imported.ExportPattern
+
+-- pattern P = 42
+
+useP P = 43
+
+--
+
+{-
+data Type = App String [Type]
+
+pattern Arrow :: Type -> Type -> Type
+pattern Arrow t1 t2 = App "->" [t1, t2]
+
+pattern Int = App "Int" []
+
+pattern Maybe t = App "Maybe" [t]
+
+-}
+
+collectArgs :: Type -> [Type]
+collectArgs (Arrow t1 t2) = t1 : collectArgs t2
+collectArgs _ = []
+
+isInt :: Type -> Bool
+isInt Int = True
+isInt _ = False
+
+isIntEndo :: Type -> Bool
+isIntEndo (Arrow Int Int) = True
+isIntEndo _ = False
+
+arrows :: [Type] -> Type -> Type
+arrows = flip $ foldr Arrow
+
+--
+{-
+
+pattern Empty <- (Seq.viewl -> Seq.EmptyL)
+pattern x :< xs <- (Seq.viewl -> x Seq.:< xs)
+pattern xs :> x <- (Seq.viewr -> xs Seq.:> x)
+-}
+
+viewPL (x :< Empty) = x
+viewPR (Empty :> y) = y
+
+--
+
+{-
+pattern Succ n <-
+  (\x -> (x -1) <$ guard (x > 0) -> Just n)
+  where
+    Succ n = n + 1
+-}
+
+fac (Succ n) = Succ n * fac n
+fac 0 = 1
+
+--
+
+{-
+data Showable where
+  MkShowable :: (Show a) => a -> Showable
+
+-- Required context is empty, but provided context is not
+pattern Sh :: () => (Show a) => a -> Showable
+pattern Sh x <- MkShowable x
+-}
+
+showable :: (Show a) => a -> Showable
+showable x = MkShowable x
+
+--
+
+{-
+-- Provided context is empty
+pattern One :: (Num a, Eq a) => a
+pattern One <- 1
+-}
+
+one One = 2
+
+--
+
+
+--pattern Pair x y <- [x, y]
+
+
+f (Pair True True) = True
+f _ = False
+
+g [True, True] = True
+g _ = False
+
+
+--
+{-
+data Nat = Z | S Nat deriving (Show)
+
+pattern Ess p = S p
+-}
+
+two = S ( S Z)
+
+--
+
+-- pattern Single x = [x]
+
+-- pattern Head x <- x : xs
+
+single (Single x) = x
+hd :: [a] -> a
+hd (Head x) = x
+
+--
+
+{-
+data T a where
+  MkT :: (Show b) => a -> b -> T a
+
+pattern ExNumPat x = MkT 42 x
+-}
+
+h :: (Num t, Eq t) => T t -> String
+h (ExNumPat x) = show x
diff --git a/test/tests/ImportPattern.NoImportProcessingNoExportProcessing-golden b/test/tests/ImportPattern.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportPattern.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/ImportPattern.NoImportProcessingReplaceExports-golden b/test/tests/ImportPattern.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportPattern.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,150 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE ViewPatterns #-}
+
+module ImportPattern (
+  useP,
+  collectArgs,
+  isInt,
+  isIntEndo,
+  arrows,
+  viewPL,
+  viewPR,
+  fac,
+  showable,
+  one,
+  f,
+  g,
+  two,
+  single,
+  hd,
+  h ) where
+
+import Control.Monad (guard)
+import qualified Data.Sequence as Seq
+
+import Imported.ExportPattern
+
+-- pattern P = 42
+
+useP P = 43
+
+--
+
+{-
+data Type = App String [Type]
+
+pattern Arrow :: Type -> Type -> Type
+pattern Arrow t1 t2 = App "->" [t1, t2]
+
+pattern Int = App "Int" []
+
+pattern Maybe t = App "Maybe" [t]
+
+-}
+
+collectArgs :: Type -> [Type]
+collectArgs (Arrow t1 t2) = t1 : collectArgs t2
+collectArgs _ = []
+
+isInt :: Type -> Bool
+isInt Int = True
+isInt _ = False
+
+isIntEndo :: Type -> Bool
+isIntEndo (Arrow Int Int) = True
+isIntEndo _ = False
+
+arrows :: [Type] -> Type -> Type
+arrows = flip $ foldr Arrow
+
+--
+{-
+
+pattern Empty <- (Seq.viewl -> Seq.EmptyL)
+pattern x :< xs <- (Seq.viewl -> x Seq.:< xs)
+pattern xs :> x <- (Seq.viewr -> xs Seq.:> x)
+-}
+
+viewPL (x :< Empty) = x
+viewPR (Empty :> y) = y
+
+--
+
+{-
+pattern Succ n <-
+  (\x -> (x -1) <$ guard (x > 0) -> Just n)
+  where
+    Succ n = n + 1
+-}
+
+fac (Succ n) = Succ n * fac n
+fac 0 = 1
+
+--
+
+{-
+data Showable where
+  MkShowable :: (Show a) => a -> Showable
+
+-- Required context is empty, but provided context is not
+pattern Sh :: () => (Show a) => a -> Showable
+pattern Sh x <- MkShowable x
+-}
+
+showable :: (Show a) => a -> Showable
+showable x = MkShowable x
+
+--
+
+{-
+-- Provided context is empty
+pattern One :: (Num a, Eq a) => a
+pattern One <- 1
+-}
+
+one One = 2
+
+--
+
+
+--pattern Pair x y <- [x, y]
+
+
+f (Pair True True) = True
+f _ = False
+
+g [True, True] = True
+g _ = False
+
+
+--
+{-
+data Nat = Z | S Nat deriving (Show)
+
+pattern Ess p = S p
+-}
+
+two = S ( S Z)
+
+--
+
+-- pattern Single x = [x]
+
+-- pattern Head x <- x : xs
+
+single (Single x) = x
+hd :: [a] -> a
+hd (Head x) = x
+
+--
+
+{-
+data T a where
+  MkT :: (Show b) => a -> b -> T a
+
+pattern ExNumPat x = MkT 42 x
+-}
+
+h :: (Num t, Eq t) => T t -> String
+h (ExNumPat x) = show x
diff --git a/test/tests/ImportPattern.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/ImportPattern.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/ImportPattern.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,149 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE ViewPatterns #-}
+
+module ImportPattern where
+
+import Control.Monad ()
+import qualified Data.Sequence as Seq ()
+import Imported.ExportPattern
+    ( T,
+      Nat(Z, S),
+      Showable(..),
+      Type,
+      pattern ExNumPat,
+      pattern Head,
+      pattern Single,
+      pattern Pair,
+      pattern One,
+      pattern Succ,
+      pattern (:>),
+      pattern (:<),
+      pattern Empty,
+      pattern Int,
+      pattern Arrow,
+      pattern P )
+
+-- pattern P = 42
+
+useP P = 43
+
+--
+
+{-
+data Type = App String [Type]
+
+pattern Arrow :: Type -> Type -> Type
+pattern Arrow t1 t2 = App "->" [t1, t2]
+
+pattern Int = App "Int" []
+
+pattern Maybe t = App "Maybe" [t]
+
+-}
+
+collectArgs :: Type -> [Type]
+collectArgs (Arrow t1 t2) = t1 : collectArgs t2
+collectArgs _ = []
+
+isInt :: Type -> Bool
+isInt Int = True
+isInt _ = False
+
+isIntEndo :: Type -> Bool
+isIntEndo (Arrow Int Int) = True
+isIntEndo _ = False
+
+arrows :: [Type] -> Type -> Type
+arrows = flip $ foldr Arrow
+
+--
+{-
+
+pattern Empty <- (Seq.viewl -> Seq.EmptyL)
+pattern x :< xs <- (Seq.viewl -> x Seq.:< xs)
+pattern xs :> x <- (Seq.viewr -> xs Seq.:> x)
+-}
+
+viewPL (x :< Empty) = x
+viewPR (Empty :> y) = y
+
+--
+
+{-
+pattern Succ n <-
+  (\x -> (x -1) <$ guard (x > 0) -> Just n)
+  where
+    Succ n = n + 1
+-}
+
+fac (Succ n) = Succ n * fac n
+fac 0 = 1
+
+--
+
+{-
+data Showable where
+  MkShowable :: (Show a) => a -> Showable
+
+-- Required context is empty, but provided context is not
+pattern Sh :: () => (Show a) => a -> Showable
+pattern Sh x <- MkShowable x
+-}
+
+showable :: (Show a) => a -> Showable
+showable x = MkShowable x
+
+--
+
+{-
+-- Provided context is empty
+pattern One :: (Num a, Eq a) => a
+pattern One <- 1
+-}
+
+one One = 2
+
+--
+
+
+--pattern Pair x y <- [x, y]
+
+
+f (Pair True True) = True
+f _ = False
+
+g [True, True] = True
+g _ = False
+
+
+--
+{-
+data Nat = Z | S Nat deriving (Show)
+
+pattern Ess p = S p
+-}
+
+two = S ( S Z)
+
+--
+
+-- pattern Single x = [x]
+
+-- pattern Head x <- x : xs
+
+single (Single x) = x
+hd :: [a] -> a
+hd (Head x) = x
+
+--
+
+{-
+data T a where
+  MkT :: (Show b) => a -> b -> T a
+
+pattern ExNumPat x = MkT 42 x
+-}
+
+h :: (Num t, Eq t) => T t -> String
+h (ExNumPat x) = show x
diff --git a/test/tests/Imported/ExportPattern.hs b/test/tests/Imported/ExportPattern.hs
new file mode 100644
--- /dev/null
+++ b/test/tests/Imported/ExportPattern.hs
@@ -0,0 +1,141 @@
+{-# LANGUAGE GADTs #-}
+{-# LANGUAGE PatternSynonyms #-}
+{-# LANGUAGE ViewPatterns #-}
+
+module Imported.ExportPattern where
+
+import Control.Monad (guard)
+import qualified Data.Sequence as Seq
+
+pattern P = 42
+
+--useP P = 43
+
+--
+
+data Type = App String [Type]
+
+pattern Arrow :: Type -> Type -> Type
+pattern Arrow t1 t2 = App "->" [t1, t2]
+
+pattern Int = App "Int" []
+
+pattern Maybe t = App "Maybe" [t]
+
+
+{-
+collectArgs :: Type -> [Type]
+collectArgs (Arrow t1 t2) = t1 : collectArgs t2
+collectArgs _ = []
+
+isInt :: Type -> Bool
+isInt Int = True
+isInt _ = False
+
+isIntEndo :: Type -> Bool
+isIntEndo (Arrow Int Int) = True
+isIntEndo _ = False
+
+arrows :: [Type] -> Type -> Type
+arrows = flip $ foldr Arrow
+-}
+
+--
+
+
+pattern Empty <- (Seq.viewl -> Seq.EmptyL)
+pattern x :< xs <- (Seq.viewl -> x Seq.:< xs)
+pattern xs :> x <- (Seq.viewr -> xs Seq.:> x)
+
+{-
+viewPL (x :< Empty) = x
+viewPR (Empty :> y) = y
+-}
+
+--
+
+
+pattern Succ n <-
+  (\x -> (x -1) <$ guard (x > 0) -> Just n)
+  where
+    Succ n = n + 1
+
+{-
+fac (Succ n) = Succ n * fac n
+fac 0 = 1
+-}
+
+--
+
+
+data Showable where
+  MkShowable :: (Show a) => a -> Showable
+
+-- Required context is empty, but provided context is not
+pattern Sh :: () => (Show a) => a -> Showable
+pattern Sh x <- MkShowable x
+
+{-
+showable :: (Show a) => a -> Showable
+showable x = MkShowable x
+-}
+
+--
+
+
+-- Provided context is empty
+pattern One :: (Num a, Eq a) => a
+pattern One <- 1
+
+
+-- one One = 2
+
+--
+
+
+pattern Pair x y <- [x, y]
+
+
+
+{-
+f (Pair True True) = True
+f _ = False
+
+g [True, True] = True
+g _ = False
+-}
+
+
+
+--
+
+data Nat = Z | S Nat deriving (Show)
+
+pattern Ess p = S p
+
+
+--two = S ( S Z)
+
+--
+
+pattern Single x = [x]
+
+pattern Head x <- x : xs
+
+{- single (Single x) = x
+hd :: [a] -> a
+hd (Head x) = x
+-}
+
+--
+
+
+data T a where
+  MkT :: (Show b) => a -> b -> T a
+
+pattern ExNumPat x = MkT 42 x
+
+{-
+h :: (Num t, Eq t) => T t -> String
+h (ExNumPat x) = show x
+-}
diff --git a/test/tests/Imported/TypeFam.hs b/test/tests/Imported/TypeFam.hs
new file mode 100644
--- /dev/null
+++ b/test/tests/Imported/TypeFam.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings     #-}
+{-# LANGUAGE TypeFamilies          #-}
+
+-- http://www.mchaver.com/posts/2017-06-21-type-families.html
+
+module Imported.TypeFam where
+
+import qualified Data.ByteString.Char8 as BS
+import           Data.ByteString (ByteString)
+import           Data.Monoid ((<>))
+import qualified Data.Text as T
+import           Data.Text (Text)
+
+class Concat a b where
+  type ConcatTy a b -- the declared type will replace this type synonym
+  cat :: a -> b -> ConcatTy a b
+
+instance Concat Text String where
+  type ConcatTy Text String = Text
+  cat x y = x <> (T.pack y)
+
+instance Concat String Text where
+  type ConcatTy String Text = Text
+  cat x y = (T.pack x) <> y
+
+instance Concat String ByteString where
+  type ConcatTy String ByteString = String
+  cat x y = x ++ (BS.unpack y)
+  
diff --git a/test/tests/MoreExports.MinimiseImportsNoExportProcessing-golden b/test/tests/MoreExports.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MoreExports.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/MoreExports.MinimiseImportsReplaceExports-golden b/test/tests/MoreExports.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MoreExports.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,26 @@
+module MoreExports (
+  H(..),
+  R(..),
+  D(..),
+  N(..),
+  foo,
+  main ) where
+
+--Another comment
+--
+
+newtype N a = Int a
+
+data D a = A a  | B | C a
+
+data R = R { a :: Int, b :: Bool }
+
+data H = I | J | K deriving Show
+
+
+foo = (+1)
+
+-- A further  Comment
+
+main :: IO ()
+main = print J
diff --git a/test/tests/MoreExports.NoImportProcessingAddExplicitExports-golden b/test/tests/MoreExports.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MoreExports.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,26 @@
+module MoreExports (
+  H(..),
+  R(..),
+  D(..),
+  N(..),
+  foo,
+  main ) where
+
+--Another comment
+--
+
+newtype N a = Int a
+
+data D a = A a  | B | C a
+
+data R = R { a :: Int, b :: Bool }
+
+data H = I | J | K deriving Show
+
+
+foo = (+1)
+
+-- A further  Comment
+
+main :: IO ()
+main = print J
diff --git a/test/tests/MoreExports.NoImportProcessingNoExportProcessing-golden b/test/tests/MoreExports.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MoreExports.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/MoreExports.NoImportProcessingReplaceExports-golden b/test/tests/MoreExports.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MoreExports.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,26 @@
+module MoreExports (
+  H(..),
+  R(..),
+  D(..),
+  N(..),
+  foo,
+  main ) where
+
+--Another comment
+--
+
+newtype N a = Int a
+
+data D a = A a  | B | C a
+
+data R = R { a :: Int, b :: Bool }
+
+data H = I | J | K deriving Show
+
+
+foo = (+1)
+
+-- A further  Comment
+
+main :: IO ()
+main = print J
diff --git a/test/tests/MoreExports.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/MoreExports.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MoreExports.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/MultilineUnused.MinimiseImportsNoExportProcessing-golden b/test/tests/MultilineUnused.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MultilineUnused.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.MultilineUnused where
+
+import Data.Bool ( bool )
+
+foo = bool
diff --git a/test/tests/MultilineUnused.MinimiseImportsReplaceExports-golden b/test/tests/MultilineUnused.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MultilineUnused.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.MultilineUnused (
+  foo ) where
+
+import Data.Bool ( bool )
+
+foo = bool
diff --git a/test/tests/MultilineUnused.NoImportProcessingAddExplicitExports-golden b/test/tests/MultilineUnused.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MultilineUnused.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,11 @@
+module Test.MultilineUnused (
+  foo ) where
+
+import Data.Bool (bool)
+import Data.List (break, cycle, drop, dropWhile, filter, genericDrop, genericLength,
+                  genericReplicate, genericSplitAt, genericTake, group, inits, intercalate,
+                  intersperse, isPrefixOf, iterate, map, permutations, repeat, replicate, reverse,
+                  scanl, scanr, sort, sortBy, sortOn, splitAt, subsequences, tails, take, takeWhile,
+                  transpose, unfoldr, unzip, unzip3, zip, zip3, zipWith, (++))
+
+foo = bool
diff --git a/test/tests/MultilineUnused.NoImportProcessingNoExportProcessing-golden b/test/tests/MultilineUnused.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MultilineUnused.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/MultilineUnused.NoImportProcessingReplaceExports-golden b/test/tests/MultilineUnused.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MultilineUnused.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,11 @@
+module Test.MultilineUnused (
+  foo ) where
+
+import Data.Bool (bool)
+import Data.List (break, cycle, drop, dropWhile, filter, genericDrop, genericLength,
+                  genericReplicate, genericSplitAt, genericTake, group, inits, intercalate,
+                  intersperse, isPrefixOf, iterate, map, permutations, repeat, replicate, reverse,
+                  scanl, scanr, sort, sortBy, sortOn, splitAt, subsequences, tails, take, takeWhile,
+                  transpose, unfoldr, unzip, unzip3, zip, zip3, zipWith, (++))
+
+foo = bool
diff --git a/test/tests/MultilineUnused.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/MultilineUnused.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/MultilineUnused.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,6 @@
+module Test.MultilineUnused where
+
+import Data.Bool ( bool )
+import Data.List ()
+
+foo = bool
diff --git a/test/tests/Operator.MinimiseImportsNoExportProcessing-golden b/test/tests/Operator.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Operator.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Operator.MinimiseImportsReplaceExports-golden b/test/tests/Operator.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Operator.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,9 @@
+module Operator (
+  ($+$) ) where
+
+infixl 5 $+$
+
+($+$) :: [a] -> [a] -> [a]
+[] $+$ d = d
+d $+$ [] = d
+d $+$ d' = d ++ d'
diff --git a/test/tests/Operator.NoImportProcessingAddExplicitExports-golden b/test/tests/Operator.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Operator.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,9 @@
+module Operator (
+  ($+$) ) where
+
+infixl 5 $+$
+
+($+$) :: [a] -> [a] -> [a]
+[] $+$ d = d
+d $+$ [] = d
+d $+$ d' = d ++ d'
diff --git a/test/tests/Operator.NoImportProcessingNoExportProcessing-golden b/test/tests/Operator.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Operator.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Operator.NoImportProcessingReplaceExports-golden b/test/tests/Operator.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Operator.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,9 @@
+module Operator (
+  ($+$) ) where
+
+infixl 5 $+$
+
+($+$) :: [a] -> [a] -> [a]
+[] $+$ d = d
+d $+$ [] = d
+d $+$ d' = d ++ d'
diff --git a/test/tests/Operator.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/Operator.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Operator.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Pattern.MinimiseImportsNoExportProcessing-golden b/test/tests/Pattern.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Pattern.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,10 @@
+{-# LANGUAGE PatternSynonyms #-}
+module Pattern where
+
+import qualified Data.List.NonEmpty as List1 ( cycle )
+import Data.List.NonEmpty ( NonEmpty((:|)) )
+
+
+test = List1.cycle (1 :| [2,3])
+
+test2 = 1 :| [2,3,1,2,3]
diff --git a/test/tests/Pattern.MinimiseImportsReplaceExports-golden b/test/tests/Pattern.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Pattern.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,12 @@
+{-# LANGUAGE PatternSynonyms #-}
+module Pattern (
+  test,
+  test2 ) where
+
+import qualified Data.List.NonEmpty as List1 ( cycle )
+import Data.List.NonEmpty ( NonEmpty((:|)) )
+
+
+test = List1.cycle (1 :| [2,3])
+
+test2 = 1 :| [2,3,1,2,3]
diff --git a/test/tests/Pattern.NoImportProcessingAddExplicitExports-golden b/test/tests/Pattern.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Pattern.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,12 @@
+{-# LANGUAGE PatternSynonyms #-}
+module Pattern (
+  test,
+  test2 ) where
+
+import qualified Data.List.NonEmpty as List1
+import Data.List.NonEmpty (NonEmpty, pattern (:|), (<|))
+
+
+test = List1.cycle (1 :| [2,3])
+
+test2 = 1 :| [2,3,1,2,3]
diff --git a/test/tests/Pattern.NoImportProcessingNoExportProcessing-golden b/test/tests/Pattern.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Pattern.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/Pattern.NoImportProcessingReplaceExports-golden b/test/tests/Pattern.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Pattern.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,12 @@
+{-# LANGUAGE PatternSynonyms #-}
+module Pattern (
+  test,
+  test2 ) where
+
+import qualified Data.List.NonEmpty as List1
+import Data.List.NonEmpty (NonEmpty, pattern (:|), (<|))
+
+
+test = List1.cycle (1 :| [2,3])
+
+test2 = 1 :| [2,3,1,2,3]
diff --git a/test/tests/Pattern.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/Pattern.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/Pattern.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,10 @@
+{-# LANGUAGE PatternSynonyms #-}
+module Pattern where
+
+import qualified Data.List.NonEmpty as List1 ( cycle )
+import Data.List.NonEmpty ( NonEmpty((:|)) )
+
+
+test = List1.cycle (1 :| [2,3])
+
+test2 = 1 :| [2,3,1,2,3]
diff --git a/test/tests/QualUnqual.MinimiseImportsNoExportProcessing-golden b/test/tests/QualUnqual.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/QualUnqual.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,6 @@
+module QualUnqual where
+
+import qualified Data.Char as C ( isDigit )
+import Data.Char ( isDigit )
+
+test x = C.isDigit x || isDigit x
diff --git a/test/tests/QualUnqual.MinimiseImportsReplaceExports-golden b/test/tests/QualUnqual.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/QualUnqual.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,7 @@
+module QualUnqual (
+  test ) where
+
+import qualified Data.Char as C ( isDigit )
+import Data.Char ( isDigit )
+
+test x = C.isDigit x || isDigit x
diff --git a/test/tests/QualUnqual.NoImportProcessingAddExplicitExports-golden b/test/tests/QualUnqual.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/QualUnqual.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,7 @@
+module QualUnqual (
+  test ) where
+
+import qualified Data.Char as C (isDigit, isLetter)
+import Data.Char (isDigit, isLetter)
+
+test x = C.isDigit x || isDigit x
diff --git a/test/tests/QualUnqual.NoImportProcessingNoExportProcessing-golden b/test/tests/QualUnqual.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/QualUnqual.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/QualUnqual.NoImportProcessingReplaceExports-golden b/test/tests/QualUnqual.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/QualUnqual.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,7 @@
+module QualUnqual (
+  test ) where
+
+import qualified Data.Char as C (isDigit, isLetter)
+import Data.Char (isDigit, isLetter)
+
+test x = C.isDigit x || isDigit x
diff --git a/test/tests/QualUnqual.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/QualUnqual.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/QualUnqual.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,6 @@
+module QualUnqual where
+
+import qualified Data.Char as C ( isDigit )
+import Data.Char ( isDigit )
+
+test x = C.isDigit x || isDigit x
diff --git a/test/tests/TypeConstructorUnused.MinimiseImportsNoExportProcessing-golden b/test/tests/TypeConstructorUnused.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnused.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+module Test.TypeConstructorUnused where
+
+true = True
diff --git a/test/tests/TypeConstructorUnused.MinimiseImportsReplaceExports-golden b/test/tests/TypeConstructorUnused.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnused.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,4 @@
+module Test.TypeConstructorUnused (
+  true ) where
+
+true = True
diff --git a/test/tests/TypeConstructorUnused.NoImportProcessingAddExplicitExports-golden b/test/tests/TypeConstructorUnused.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnused.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.TypeConstructorUnused (
+  true ) where
+
+import Data.Bool (Bool (False, True))
+
+true = True
diff --git a/test/tests/TypeConstructorUnused.NoImportProcessingNoExportProcessing-golden b/test/tests/TypeConstructorUnused.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnused.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/TypeConstructorUnused.NoImportProcessingReplaceExports-golden b/test/tests/TypeConstructorUnused.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnused.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.TypeConstructorUnused (
+  true ) where
+
+import Data.Bool (Bool (False, True))
+
+true = True
diff --git a/test/tests/TypeConstructorUnused.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/TypeConstructorUnused.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnused.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.TypeConstructorUnused where
+
+import Data.Bool ()
+
+true = True
diff --git a/test/tests/TypeConstructorUnusedComma.MinimiseImportsNoExportProcessing-golden b/test/tests/TypeConstructorUnusedComma.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnusedComma.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+module Test.TypeConstructorUnusedComma where
+
+false = False
diff --git a/test/tests/TypeConstructorUnusedComma.MinimiseImportsReplaceExports-golden b/test/tests/TypeConstructorUnusedComma.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnusedComma.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,4 @@
+module Test.TypeConstructorUnusedComma (
+  false ) where
+
+false = False
diff --git a/test/tests/TypeConstructorUnusedComma.NoImportProcessingAddExplicitExports-golden b/test/tests/TypeConstructorUnusedComma.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnusedComma.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.TypeConstructorUnusedComma (
+  false ) where
+
+import Data.Bool (Bool (False, True))
+
+false = False
diff --git a/test/tests/TypeConstructorUnusedComma.NoImportProcessingNoExportProcessing-golden b/test/tests/TypeConstructorUnusedComma.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnusedComma.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/TypeConstructorUnusedComma.NoImportProcessingReplaceExports-golden b/test/tests/TypeConstructorUnusedComma.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnusedComma.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.TypeConstructorUnusedComma (
+  false ) where
+
+import Data.Bool (Bool (False, True))
+
+false = False
diff --git a/test/tests/TypeConstructorUnusedComma.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/TypeConstructorUnusedComma.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUnusedComma.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.TypeConstructorUnusedComma where
+
+import Data.Bool ()
+
+false = False
diff --git a/test/tests/TypeConstructorUsed.MinimiseImportsNoExportProcessing-golden b/test/tests/TypeConstructorUsed.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUsed.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+module Test.TypeConstructorUsed where
+
+true = True
diff --git a/test/tests/TypeConstructorUsed.MinimiseImportsReplaceExports-golden b/test/tests/TypeConstructorUsed.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUsed.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,4 @@
+module Test.TypeConstructorUsed (
+  true ) where
+
+true = True
diff --git a/test/tests/TypeConstructorUsed.NoImportProcessingAddExplicitExports-golden b/test/tests/TypeConstructorUsed.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUsed.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.TypeConstructorUsed (
+  true ) where
+
+import Data.Bool (Bool (True))
+
+true = True
diff --git a/test/tests/TypeConstructorUsed.NoImportProcessingNoExportProcessing-golden b/test/tests/TypeConstructorUsed.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUsed.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/TypeConstructorUsed.NoImportProcessingReplaceExports-golden b/test/tests/TypeConstructorUsed.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUsed.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.TypeConstructorUsed (
+  true ) where
+
+import Data.Bool (Bool (True))
+
+true = True
diff --git a/test/tests/TypeConstructorUsed.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/TypeConstructorUsed.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeConstructorUsed.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.TypeConstructorUsed where
+
+import Data.Bool ()
+
+true = True
diff --git a/test/tests/TypeFam.MinimiseImportsNoExportProcessing-golden b/test/tests/TypeFam.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeFam.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,43 @@
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings     #-}
+{-# LANGUAGE TypeFamilies          #-}
+
+-- http://www.mchaver.com/posts/2017-06-21-type-families.html
+
+module TypeFam where
+
+import Data.Text ( Text )
+import Imported.TypeFam ( Concat(cat, type ConcatTy) )
+
+
+result :: ConcatTy Text String
+result =  cat ("Hello" :: Text) (" World!" :: String)
+
+main = print result
+
+class Container c where
+  type Elem c
+  empty  :: c
+  insert :: Elem c -> c -> c
+  member :: Elem c -> c -> Bool
+  toList :: c -> [Elem c]
+
+instance Eq e => Container [e] where
+  type Elem [e]   = e
+  empty           = []
+  insert e l      = (e:l)
+  member e []     = False
+  member e (x:xs)
+    | e == x      = True
+    | otherwise   = member e xs
+  toList l        = l
+
+instance Eq e => Container (Maybe e) where
+  type Elem (Maybe e) = e -- type synonym
+  empty            = Nothing
+  insert e l       = Just e -- destructive, replaces previous element
+  member e Nothing = False
+  member e (Just x) = e == x
+  toList Nothing   = []
+  toList (Just x)  = [x]
diff --git a/test/tests/TypeFam.MinimiseImportsReplaceExports-golden b/test/tests/TypeFam.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeFam.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,46 @@
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings     #-}
+{-# LANGUAGE TypeFamilies          #-}
+
+-- http://www.mchaver.com/posts/2017-06-21-type-families.html
+
+module TypeFam (
+  Container(..),
+  result,
+  main ) where
+
+import Data.Text ( Text )
+import Imported.TypeFam ( Concat(cat, type ConcatTy) )
+
+
+result :: ConcatTy Text String
+result =  cat ("Hello" :: Text) (" World!" :: String)
+
+main = print result
+
+class Container c where
+  type Elem c
+  empty  :: c
+  insert :: Elem c -> c -> c
+  member :: Elem c -> c -> Bool
+  toList :: c -> [Elem c]
+
+instance Eq e => Container [e] where
+  type Elem [e]   = e
+  empty           = []
+  insert e l      = (e:l)
+  member e []     = False
+  member e (x:xs)
+    | e == x      = True
+    | otherwise   = member e xs
+  toList l        = l
+
+instance Eq e => Container (Maybe e) where
+  type Elem (Maybe e) = e -- type synonym
+  empty            = Nothing
+  insert e l       = Just e -- destructive, replaces previous element
+  member e Nothing = False
+  member e (Just x) = e == x
+  toList Nothing   = []
+  toList (Just x)  = [x]
diff --git a/test/tests/TypeFam.NoImportProcessingAddExplicitExports-golden b/test/tests/TypeFam.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeFam.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,51 @@
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings     #-}
+{-# LANGUAGE TypeFamilies          #-}
+
+-- http://www.mchaver.com/posts/2017-06-21-type-families.html
+
+module TypeFam (
+  Container(..),
+  result,
+  main ) where
+
+import qualified Data.ByteString.Char8 as BS
+import           Data.ByteString (ByteString)
+import           Data.Monoid ((<>))
+import qualified Data.Text as T
+import           Data.Text (Text)
+
+import Imported.TypeFam
+
+
+result :: ConcatTy Text String
+result =  cat ("Hello" :: Text) (" World!" :: String)
+
+main = print result
+
+class Container c where
+  type Elem c
+  empty  :: c
+  insert :: Elem c -> c -> c
+  member :: Elem c -> c -> Bool
+  toList :: c -> [Elem c]
+
+instance Eq e => Container [e] where
+  type Elem [e]   = e
+  empty           = []
+  insert e l      = (e:l)
+  member e []     = False
+  member e (x:xs)
+    | e == x      = True
+    | otherwise   = member e xs
+  toList l        = l
+
+instance Eq e => Container (Maybe e) where
+  type Elem (Maybe e) = e -- type synonym
+  empty            = Nothing
+  insert e l       = Just e -- destructive, replaces previous element
+  member e Nothing = False
+  member e (Just x) = e == x
+  toList Nothing   = []
+  toList (Just x)  = [x]
diff --git a/test/tests/TypeFam.NoImportProcessingNoExportProcessing-golden b/test/tests/TypeFam.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeFam.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/TypeFam.NoImportProcessingReplaceExports-golden b/test/tests/TypeFam.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeFam.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,51 @@
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings     #-}
+{-# LANGUAGE TypeFamilies          #-}
+
+-- http://www.mchaver.com/posts/2017-06-21-type-families.html
+
+module TypeFam (
+  Container(..),
+  result,
+  main ) where
+
+import qualified Data.ByteString.Char8 as BS
+import           Data.ByteString (ByteString)
+import           Data.Monoid ((<>))
+import qualified Data.Text as T
+import           Data.Text (Text)
+
+import Imported.TypeFam
+
+
+result :: ConcatTy Text String
+result =  cat ("Hello" :: Text) (" World!" :: String)
+
+main = print result
+
+class Container c where
+  type Elem c
+  empty  :: c
+  insert :: Elem c -> c -> c
+  member :: Elem c -> c -> Bool
+  toList :: c -> [Elem c]
+
+instance Eq e => Container [e] where
+  type Elem [e]   = e
+  empty           = []
+  insert e l      = (e:l)
+  member e []     = False
+  member e (x:xs)
+    | e == x      = True
+    | otherwise   = member e xs
+  toList l        = l
+
+instance Eq e => Container (Maybe e) where
+  type Elem (Maybe e) = e -- type synonym
+  empty            = Nothing
+  insert e l       = Just e -- destructive, replaces previous element
+  member e Nothing = False
+  member e (Just x) = e == x
+  toList Nothing   = []
+  toList (Just x)  = [x]
diff --git a/test/tests/TypeFam.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/TypeFam.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeFam.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,47 @@
+{-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE OverloadedStrings     #-}
+{-# LANGUAGE TypeFamilies          #-}
+
+-- http://www.mchaver.com/posts/2017-06-21-type-families.html
+
+module TypeFam where
+
+import qualified Data.ByteString.Char8 as BS ()
+import Data.ByteString ()
+import Data.Monoid ()
+import qualified Data.Text as T ()
+import Data.Text ( Text )
+import Imported.TypeFam ( Concat(cat, type ConcatTy) )
+
+
+result :: ConcatTy Text String
+result =  cat ("Hello" :: Text) (" World!" :: String)
+
+main = print result
+
+class Container c where
+  type Elem c
+  empty  :: c
+  insert :: Elem c -> c -> c
+  member :: Elem c -> c -> Bool
+  toList :: c -> [Elem c]
+
+instance Eq e => Container [e] where
+  type Elem [e]   = e
+  empty           = []
+  insert e l      = (e:l)
+  member e []     = False
+  member e (x:xs)
+    | e == x      = True
+    | otherwise   = member e xs
+  toList l        = l
+
+instance Eq e => Container (Maybe e) where
+  type Elem (Maybe e) = e -- type synonym
+  empty            = Nothing
+  insert e l       = Just e -- destructive, replaces previous element
+  member e Nothing = False
+  member e (Just x) = e == x
+  toList Nothing   = []
+  toList (Just x)  = [x]
diff --git a/test/tests/TypeUnused.MinimiseImportsNoExportProcessing-golden b/test/tests/TypeUnused.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUnused.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+module Test.TypeUnused where
+
+foo = not
diff --git a/test/tests/TypeUnused.MinimiseImportsReplaceExports-golden b/test/tests/TypeUnused.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUnused.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,4 @@
+module Test.TypeUnused (
+  foo ) where
+
+foo = not
diff --git a/test/tests/TypeUnused.NoImportProcessingAddExplicitExports-golden b/test/tests/TypeUnused.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUnused.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.TypeUnused (
+  foo ) where
+
+import Data.Bool (Bool, not)
+
+foo = not
diff --git a/test/tests/TypeUnused.NoImportProcessingNoExportProcessing-golden b/test/tests/TypeUnused.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUnused.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/TypeUnused.NoImportProcessingReplaceExports-golden b/test/tests/TypeUnused.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUnused.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.TypeUnused (
+  foo ) where
+
+import Data.Bool (Bool, not)
+
+foo = not
diff --git a/test/tests/TypeUnused.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/TypeUnused.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUnused.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.TypeUnused where
+
+import Data.Bool ()
+
+foo = not
diff --git a/test/tests/TypeUsed.MinimiseImportsNoExportProcessing-golden b/test/tests/TypeUsed.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUsed.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,4 @@
+module Test.TypeUsed where
+
+foo :: Bool
+foo = undefined
diff --git a/test/tests/TypeUsed.MinimiseImportsReplaceExports-golden b/test/tests/TypeUsed.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUsed.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,5 @@
+module Test.TypeUsed (
+  foo ) where
+
+foo :: Bool
+foo = undefined
diff --git a/test/tests/TypeUsed.NoImportProcessingAddExplicitExports-golden b/test/tests/TypeUsed.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUsed.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,7 @@
+module Test.TypeUsed (
+  foo ) where
+
+import Data.Bool (Bool, not)
+
+foo :: Bool
+foo = undefined
diff --git a/test/tests/TypeUsed.NoImportProcessingNoExportProcessing-golden b/test/tests/TypeUsed.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUsed.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/TypeUsed.NoImportProcessingReplaceExports-golden b/test/tests/TypeUsed.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUsed.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,7 @@
+module Test.TypeUsed (
+  foo ) where
+
+import Data.Bool (Bool, not)
+
+foo :: Bool
+foo = undefined
diff --git a/test/tests/TypeUsed.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/TypeUsed.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/TypeUsed.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,6 @@
+module Test.TypeUsed where
+
+import Data.Bool ()
+
+foo :: Bool
+foo = undefined
diff --git a/test/tests/WildcardUnused.MinimiseImportsNoExportProcessing-golden b/test/tests/WildcardUnused.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUnused.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+module Test.WildcardUnused where
+
+foo = not
diff --git a/test/tests/WildcardUnused.MinimiseImportsReplaceExports-golden b/test/tests/WildcardUnused.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUnused.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,4 @@
+module Test.WildcardUnused (
+  foo ) where
+
+foo = not
diff --git a/test/tests/WildcardUnused.NoImportProcessingAddExplicitExports-golden b/test/tests/WildcardUnused.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUnused.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.WildcardUnused (
+  foo ) where
+
+import Data.Bool (Bool (..), not)
+
+foo = not
diff --git a/test/tests/WildcardUnused.NoImportProcessingNoExportProcessing-golden b/test/tests/WildcardUnused.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUnused.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/WildcardUnused.NoImportProcessingReplaceExports-golden b/test/tests/WildcardUnused.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUnused.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.WildcardUnused (
+  foo ) where
+
+import Data.Bool (Bool (..), not)
+
+foo = not
diff --git a/test/tests/WildcardUnused.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/WildcardUnused.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUnused.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.WildcardUnused where
+
+import Data.Bool ()
+
+foo = not
diff --git a/test/tests/WildcardUsed.MinimiseImportsNoExportProcessing-golden b/test/tests/WildcardUsed.MinimiseImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUsed.MinimiseImportsNoExportProcessing-golden
@@ -0,0 +1,3 @@
+module Test.WildcardUsed where
+
+foo = False
diff --git a/test/tests/WildcardUsed.MinimiseImportsReplaceExports-golden b/test/tests/WildcardUsed.MinimiseImportsReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUsed.MinimiseImportsReplaceExports-golden
@@ -0,0 +1,4 @@
+module Test.WildcardUsed (
+  foo ) where
+
+foo = False
diff --git a/test/tests/WildcardUsed.NoImportProcessingAddExplicitExports-golden b/test/tests/WildcardUsed.NoImportProcessingAddExplicitExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUsed.NoImportProcessingAddExplicitExports-golden
@@ -0,0 +1,6 @@
+module Test.WildcardUsed (
+  foo ) where
+
+import Data.Bool (Bool (..))
+
+foo = False
diff --git a/test/tests/WildcardUsed.NoImportProcessingNoExportProcessing-golden b/test/tests/WildcardUsed.NoImportProcessingNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUsed.NoImportProcessingNoExportProcessing-golden
@@ -0,0 +1,1 @@
+Source file was not touched
diff --git a/test/tests/WildcardUsed.NoImportProcessingReplaceExports-golden b/test/tests/WildcardUsed.NoImportProcessingReplaceExports-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUsed.NoImportProcessingReplaceExports-golden
@@ -0,0 +1,6 @@
+module Test.WildcardUsed (
+  foo ) where
+
+import Data.Bool (Bool (..))
+
+foo = False
diff --git a/test/tests/WildcardUsed.PreserveInstanceImportsNoExportProcessing-golden b/test/tests/WildcardUsed.PreserveInstanceImportsNoExportProcessing-golden
new file mode 100644
--- /dev/null
+++ b/test/tests/WildcardUsed.PreserveInstanceImportsNoExportProcessing-golden
@@ -0,0 +1,5 @@
+module Test.WildcardUsed where
+
+import Data.Bool ()
+
+foo = False
