diff --git a/executables/APITests.hs b/executables/APITests.hs
deleted file mode 100644
--- a/executables/APITests.hs
+++ /dev/null
@@ -1,49 +0,0 @@
-{-# OPTIONS_GHC -F -pgmF htfpp #-}
-
-import BasePrelude
-import Test.Framework
-import NeatInterpolation
-
-
-main = htfMain $ htf_thisModulesTests
-
-
-test_demo = do
-  assertEqual
-    "function(){\n  function(){\n    {\n      indented line\n      indented line\n    }\n  }\n  return {\n    indented line\n    indented line\n  }\n}\n"
-    (template a a)
-  assertEqual
-    "this_could_be_one_long_identifier\n"
-    (escaped "one")
-  where
-    template a b = 
-      [text|
-        function(){
-          function(){
-            $a
-          }
-          return $b
-        }
-      |]
-    escaped name = [text|this_could_be_${name}_long_identifier|]
-    a = "{\n  indented line\n  indented line\n}"
-
-test_dollar = do
-  assertEqual
-    "function(){\n  function(){\n    {\n      indented line\n      indented line\n    }\n  }\n  return \"$b\"\n}\n"
-    (template a a)
-  assertEqual
-    "this_could_be_$one$_long_identifier\n"
-    (escaped "one")
-  where
-    template a b = 
-      [text|
-        function(){
-          function(){
-            $a
-          }
-          return "$$b"
-        }
-      |]
-    escaped name = [text|this_could_be_$$${name}$$_long_identifier|]
-    a = "{\n  indented line\n  indented line\n}"
diff --git a/library/NeatInterpolation.hs b/library/NeatInterpolation.hs
--- a/library/NeatInterpolation.hs
+++ b/library/NeatInterpolation.hs
@@ -1,4 +1,3 @@
-{-# OPTIONS_GHC -fno-warn-missing-fields #-}
 -- |
 -- NeatInterpolation provides a quasiquoter for producing strings
 -- with a simple interpolation of input values.
@@ -81,10 +80,10 @@
 -- > f "funny" == "$my funny ${string}|]
 module NeatInterpolation (text) where
 
-import BasePrelude
+import NeatInterpolation.Prelude
 
 import Language.Haskell.TH
-import Language.Haskell.TH.Quote
+import Language.Haskell.TH.Quote hiding (quoteExp)
 
 import NeatInterpolation.String
 import NeatInterpolation.Parsing
@@ -96,19 +95,17 @@
 -- |
 -- The quasiquoter.
 text :: QuasiQuoter
-text = QuasiQuoter {quoteExp = quoteExprExp}
+text = QuasiQuoter quoteExp notSupported notSupported notSupported where
+  notSupported _ = fail "Quotation in this context is not supported"
 
--- |
--- A function used internally by the quasiquoter. Just ignore it.
 indentQQPlaceholder :: Int -> Text -> Text
 indentQQPlaceholder indent text = case T.lines text of
-  head:tail -> T.intercalate (T.pack "\n") $
+  head:tail -> T.intercalate (T.singleton '\n') $
                head : map (T.replicate indent (T.singleton ' ') <>) tail
   [] -> text
 
-
-quoteExprExp :: String -> Q Exp
-quoteExprExp input =
+quoteExp :: String -> Q Exp
+quoteExp input =
   case parseLines $ normalizeQQInput input of
     Left e -> fail $ show e
     Right lines -> sigE (appE [|T.unlines|] $ listE $ map lineExp lines)
diff --git a/library/NeatInterpolation/Parsing.hs b/library/NeatInterpolation/Parsing.hs
--- a/library/NeatInterpolation/Parsing.hs
+++ b/library/NeatInterpolation/Parsing.hs
@@ -1,6 +1,6 @@
 module NeatInterpolation.Parsing where
 
-import BasePrelude hiding (many, some, try, (<|>))
+import NeatInterpolation.Prelude hiding (many, some, try, (<|>))
 import Data.Text (Text, pack)
 import Text.Megaparsec hiding (Line)
 import Text.Megaparsec.Char
diff --git a/library/NeatInterpolation/Prelude.hs b/library/NeatInterpolation/Prelude.hs
new file mode 100644
--- /dev/null
+++ b/library/NeatInterpolation/Prelude.hs
@@ -0,0 +1,79 @@
+module NeatInterpolation.Prelude
+( 
+  module Exports,
+)
+where
+
+-- base
+-------------------------
+import Control.Applicative as Exports
+import Control.Arrow as Exports hiding (first, second)
+import Control.Category as Exports
+import Control.Concurrent as Exports
+import Control.Exception as Exports
+import Control.Monad as Exports hiding (fail, mapM_, sequence_, forM_, msum, mapM, sequence, forM)
+import Control.Monad.IO.Class as Exports
+import Control.Monad.Fail as Exports
+import Control.Monad.Fix as Exports hiding (fix)
+import Control.Monad.ST as Exports
+import Data.Bifunctor as Exports
+import Data.Bits as Exports
+import Data.Bool as Exports
+import Data.Char as Exports
+import Data.Coerce as Exports
+import Data.Complex as Exports
+import Data.Data as Exports
+import Data.Dynamic as Exports
+import Data.Either as Exports
+import Data.Fixed as Exports
+import Data.Foldable as Exports hiding (toList)
+import Data.Function as Exports hiding (id, (.))
+import Data.Functor as Exports
+import Data.Functor.Contravariant as Exports
+import Data.Functor.Identity as Exports
+import Data.Int as Exports
+import Data.IORef as Exports
+import Data.Ix as Exports
+import Data.List as Exports hiding (sortOn, isSubsequenceOf, uncons, concat, foldr, foldl1, maximum, minimum, product, sum, all, and, any, concatMap, elem, foldl, foldr1, notElem, or, find, maximumBy, minimumBy, mapAccumL, mapAccumR, foldl')
+import Data.Maybe as Exports
+import Data.Monoid as Exports hiding (Last(..), First(..), (<>))
+import Data.Ord as Exports
+import Data.Proxy as Exports
+import Data.Ratio as Exports
+import Data.Semigroup as Exports
+import Data.STRef as Exports
+import Data.String as Exports
+import Data.Traversable as Exports
+import Data.Tuple as Exports
+import Data.Unique as Exports
+import Data.Version as Exports
+import Data.Void as Exports
+import Data.Word as Exports
+import Debug.Trace as Exports
+import Foreign.ForeignPtr as Exports
+import Foreign.Ptr as Exports
+import Foreign.StablePtr as Exports
+import Foreign.Storable as Exports hiding (sizeOf, alignment)
+import GHC.Conc as Exports hiding (withMVar, threadWaitWriteSTM, threadWaitWrite, threadWaitReadSTM, threadWaitRead)
+import GHC.Exts as Exports (lazy, inline, sortWith, groupWith, IsList(..))
+import GHC.Generics as Exports (Generic, Generic1)
+import GHC.IO.Exception as Exports
+import Numeric as Exports
+import Prelude as Exports hiding (fail, concat, foldr, mapM_, sequence_, foldl1, maximum, minimum, product, sum, all, and, any, concatMap, elem, foldl, foldr1, notElem, or, mapM, sequence, id, (.))
+import System.Environment as Exports
+import System.Exit as Exports
+import System.IO as Exports
+import System.IO.Error as Exports
+import System.IO.Unsafe as Exports
+import System.Mem as Exports
+import System.Mem.StableName as Exports
+import System.Timeout as Exports
+import Text.ParserCombinators.ReadP as Exports (ReadP, ReadS, readP_to_S, readS_to_P)
+import Text.ParserCombinators.ReadPrec as Exports (ReadPrec, readPrec_to_P, readP_to_Prec, readPrec_to_S, readS_to_Prec)
+import Text.Printf as Exports (printf, hPrintf)
+import Text.Read as Exports (Read(..), readMaybe, readEither)
+import Unsafe.Coerce as Exports
+
+-- text
+-------------------------
+import Data.Text as Exports (Text)
diff --git a/library/NeatInterpolation/String.hs b/library/NeatInterpolation/String.hs
--- a/library/NeatInterpolation/String.hs
+++ b/library/NeatInterpolation/String.hs
@@ -1,6 +1,6 @@
 module NeatInterpolation.String where
 
-import BasePrelude
+import NeatInterpolation.Prelude
 
 
 normalizeQQInput :: [Char] -> [Char]
diff --git a/neat-interpolation.cabal b/neat-interpolation.cabal
--- a/neat-interpolation.cabal
+++ b/neat-interpolation.cabal
@@ -1,77 +1,53 @@
-name:
-  neat-interpolation
-version:
-  0.3.2.5
-synopsis:
-  A quasiquoter for neat and simple multiline text interpolation
+name: neat-interpolation
+version: 0.3.2.6
+synopsis: A quasiquoter for neat and simple multiline text interpolation
 description:
   A quasiquoter for producing Text values with support for
   a simple interpolation of input values.
   It removes the excessive indentation from the input and
   accurately manages the indentation of all lines of the interpolated variables.
-category:
-  String, QuasiQuotes
-license:
-  MIT
-license-file:
-  LICENSE
-copyright:
-  (c) 2013, Nikita Volkov
-author:
-  Nikita Volkov <nikita.y.volkov@mail.ru>
-maintainer:
-  Nikita Volkov <nikita.y.volkov@mail.ru>
-homepage:
-  https://github.com/nikita-volkov/neat-interpolation
-bug-reports:
-  https://github.com/nikita-volkov/neat-interpolation/issues
-build-type:
-  Simple
-cabal-version:
-  >=1.10
-
+category: String, QuasiQuotes
+license: MIT
+license-file: LICENSE
+copyright: (c) 2013, Nikita Volkov
+author: Nikita Volkov <nikita.y.volkov@mail.ru>
+maintainer: Nikita Volkov <nikita.y.volkov@mail.ru>
+homepage: https://github.com/nikita-volkov/neat-interpolation
+bug-reports: https://github.com/nikita-volkov/neat-interpolation/issues
+build-type: Simple
+cabal-version: >=1.10
 
 source-repository head
-  type:
-    git
-  location:
-    git://github.com/nikita-volkov/neat-interpolation.git
-
+  type: git
+  location: git://github.com/nikita-volkov/neat-interpolation.git
 
 library
-  hs-source-dirs:
-    library
+  hs-source-dirs: library
+  default-extensions: BangPatterns, BinaryLiterals, BlockArguments, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, DuplicateRecordFields, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, HexFloatLiterals, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, NumericUnderscores, OverloadedLists, OverloadedStrings, PatternGuards, PatternSynonyms, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, StrictData, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples
+  default-language: Haskell2010
   exposed-modules:
     NeatInterpolation
   other-modules:
     NeatInterpolation.Parsing
+    NeatInterpolation.Prelude
     NeatInterpolation.String
   build-depends:
-    text == 1.*,
-    megaparsec >= 7 && < 9,
-    template-haskell >= 2.8 && < 3,
-    base-prelude < 2,
-    base >= 4.9 && < 5
-  ghc-options:
-    -funbox-strict-fields
-  default-extensions:
-    Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFunctor, DeriveGeneric, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
-  default-language:
-    Haskell2010
-
+    base >=4.9 && <5,
+    megaparsec >=7 && <9,
+    template-haskell >=2.8 && <3,
+    text ==1.*
 
-test-suite api-tests
-  type:
-    exitcode-stdio-1.0
-  hs-source-dirs:
-    executables
-  main-is:
-    APITests.hs
+test-suite test
+  type: exitcode-stdio-1.0
+  hs-source-dirs: test
+  default-extensions: BangPatterns, BinaryLiterals, BlockArguments, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFoldable, DeriveFunctor, DeriveGeneric, DeriveTraversable, DuplicateRecordFields, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, HexFloatLiterals, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, NumericUnderscores, OverloadedLists, OverloadedStrings, PatternGuards, PatternSynonyms, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, StrictData, TemplateHaskell, TupleSections, TypeApplications, TypeFamilies, TypeOperators, UnboxedTuples
+  default-language: Haskell2010
+  main-is: Main.hs
   build-depends:
     neat-interpolation,
-    HTF >= 0.11 && < 0.14,
-    base-prelude
-  default-extensions:
-    Arrows, BangPatterns, ConstraintKinds, DataKinds, DefaultSignatures, DeriveDataTypeable, DeriveFunctor, DeriveGeneric, EmptyDataDecls, FlexibleContexts, FlexibleInstances, FunctionalDependencies, GADTs, GeneralizedNewtypeDeriving, LambdaCase, LiberalTypeSynonyms, MagicHash, MultiParamTypeClasses, MultiWayIf, NoImplicitPrelude, NoMonomorphismRestriction, OverloadedStrings, PatternGuards, ParallelListComp, QuasiQuotes, RankNTypes, RecordWildCards, ScopedTypeVariables, StandaloneDeriving, TemplateHaskell, TupleSections, TypeFamilies, TypeOperators, UnboxedTuples
-  default-language:
-    Haskell2010
+    QuickCheck >=2.13 && <3,
+    quickcheck-instances >=0.3.22 && <0.4,
+    rerebase <2,
+    tasty >=1.2.3 && <2,
+    tasty-hunit >=0.10.0.2 && <0.11,
+    tasty-quickcheck >=0.10.1 && <0.11
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,56 @@
+module Main where
+
+import Prelude hiding (choose)
+import Test.QuickCheck.Instances
+import Test.Tasty
+import Test.Tasty.Runners
+import Test.Tasty.HUnit
+import Test.Tasty.QuickCheck
+import NeatInterpolation
+import qualified Test.QuickCheck as QuickCheck
+import qualified Test.QuickCheck.Property as QuickCheck
+
+
+main = defaultMain $ testGroup "" $
+  [
+    testCase "Demo" $ let
+      template a b = 
+        [text|
+          function(){
+            function(){
+              $a
+            }
+            return $b
+          }
+        |]
+      a = "{\n  indented line\n  indented line\n}"
+      in assertEqual ""
+          "function(){\n  function(){\n    {\n      indented line\n      indented line\n    }\n  }\n  return {\n    indented line\n    indented line\n  }\n}\n"
+          (template a a)
+    ,
+    testCase "Isolation" $ let
+      isolated name = [text|this_could_be_${name}_long_identifier|]
+      in assertEqual ""
+          "this_could_be_one_long_identifier\n"
+          (isolated "one")
+    ,
+    testCase "Escaping" $ let
+      template a b = 
+        [text|
+          function(){
+            function(){
+              $a
+            }
+            return "$$b"
+          }
+        |]
+      escaped name = [text|this_could_be_$$${name}$$_long_identifier|]
+      a = "{\n  indented line\n  indented line\n}"
+      in do
+        assertEqual ""
+          "function(){\n  function(){\n    {\n      indented line\n      indented line\n    }\n  }\n  return \"$b\"\n}\n"
+          (template a a)
+        assertEqual ""
+          "this_could_be_$one$_long_identifier\n"
+          (escaped "one")
+  ]
