diff --git a/Cabal/Distribution/PackageDescription.hs b/Cabal/Distribution/PackageDescription.hs
index 871c92c3746735eabad5cf3820f665cc46e4eb66..47d321814a7eb59548b10ea69332daa1bdfc8fb9 100644
--- a/Cabal/Distribution/PackageDescription.hs
+++ b/Cabal/Distribution/PackageDescription.hs
@@ -77,6 +77,7 @@ module Distribution.PackageDescription (
         allLanguages,
         allExtensions,
         usedExtensions,
+        usesTemplateHaskellOrQQ,
         hcOptions,
         hcProfOptions,
         hcSharedOptions,
diff --git a/Cabal/Distribution/Simple/GHC.hs b/Cabal/Distribution/Simple/GHC.hs
index 455cfed3e1bfd0ba941d81904919056667f0c26f..e74ba6bae0e56cce8b2190a3f491e4421fad8d0d 100644
--- a/Cabal/Distribution/Simple/GHC.hs
+++ b/Cabal/Distribution/Simple/GHC.hs
@@ -535,7 +535,7 @@ buildOrReplLib forRepl verbosity numJobs pkg_descr lbi lib clbi = do
 
   let isGhcDynamic        = isDynamic comp
       dynamicTooSupported = supportsDynamicToo comp
-      doingTH = EnableExtension TemplateHaskell `elem` allExtensions libBi
+      doingTH = usesTemplateHaskellOrQQ libBi
       forceVanillaLib = doingTH && not isGhcDynamic
       forceSharedLib  = doingTH &&     isGhcDynamic
       -- TH always needs default libs, even when building for profiling
@@ -1184,7 +1184,7 @@ gbuild verbosity numJobs pkg_descr lbi bm clbi = do
       -- by the compiler.
       -- With dynamic-by-default GHC the TH object files loaded at compile-time
       -- need to be .dyn_o instead of .o.
-      doingTH = EnableExtension TemplateHaskell `elem` allExtensions bnfo
+      doingTH = usesTemplateHaskellOrQQ bnfo
       -- Should we use -dynamic-too instead of compiling twice?
       useDynToo = dynamicTooSupported && isGhcDynamic
                   && doingTH && withStaticExe
diff --git a/Cabal/Distribution/Simple/GHCJS.hs b/Cabal/Distribution/Simple/GHCJS.hs
index ce204c0390f65d3c4386aa42d4d83628952d4b87..e06a8fe78a684a914d03cd04dff709006955d6f6 100644
--- a/Cabal/Distribution/Simple/GHCJS.hs
+++ b/Cabal/Distribution/Simple/GHCJS.hs
@@ -46,7 +46,6 @@ import Distribution.Verbosity
 import Distribution.Utils.NubList
 import Distribution.Text
 import Distribution.Types.UnitId
-import Language.Haskell.Extension
 
 import qualified Data.Map as Map
 import System.Directory         ( doesFileExist )
@@ -289,7 +288,7 @@ buildOrReplLib forRepl verbosity numJobs pkg_descr lbi lib clbi = do
       libBi               = libBuildInfo lib
       isGhcjsDynamic      = isDynamic comp
       dynamicTooSupported = supportsDynamicToo comp
-      doingTH = EnableExtension TemplateHaskell `elem` allExtensions libBi
+      doingTH = usesTemplateHaskellOrQQ libBi
       forceVanillaLib = doingTH && not isGhcjsDynamic
       forceSharedLib  = doingTH &&     isGhcjsDynamic
       -- TH always needs default libs, even when building for profiling
@@ -624,7 +623,7 @@ buildOrReplExe forRepl verbosity numJobs _pkg_descr lbi
       -- by the compiler.
       -- With dynamic-by-default GHC the TH object files loaded at compile-time
       -- need to be .dyn_o instead of .o.
-      doingTH = EnableExtension TemplateHaskell `elem` allExtensions exeBi
+      doingTH = usesTemplateHaskellOrQQ exeBi
       -- Should we use -dynamic-too instead of compiling twice?
       useDynToo = dynamicTooSupported && isGhcjsDynamic
                   && doingTH && withStaticExe && null (ghcjsSharedOptions exeBi)
diff --git a/Cabal/Distribution/Simple/LHC.hs b/Cabal/Distribution/Simple/LHC.hs
index 9451831ffd85e2f746e0598972fd641f59b7af2e..ea3df7cc8e70a4019ea78a392c72d6699eae0b67 100644
--- a/Cabal/Distribution/Simple/LHC.hs
+++ b/Cabal/Distribution/Simple/LHC.hs
@@ -306,7 +306,7 @@ buildLib verbosity pkg_descr lbi lib clbi = do
              (compiler lbi) (withProfLib lbi) (libBuildInfo lib)
 
   let libTargetDir = pref
-      forceVanillaLib = EnableExtension TemplateHaskell `elem` allExtensions libBi
+      forceVanillaLib = usesTemplateHaskellOrQQ libBi
       -- TH always needs vanilla libs, even when building for profiling
 
   createDirectoryIfMissingVerbose verbosity True libTargetDir
@@ -515,7 +515,7 @@ buildExe verbosity _pkg_descr lbi
   -- with profiling. This is because the code that TH needs to
   -- run at compile time needs to be the vanilla ABI so it can
   -- be loaded up and run by the compiler.
-  when (withProfExe lbi && EnableExtension TemplateHaskell `elem` allExtensions exeBi)
+  when (withProfExe lbi && usesTemplateHaskellOrQQ exeBi)
      (runGhcProg $ lhcWrap (binArgs False False))
 
   runGhcProg (binArgs True (withProfExe lbi))
diff --git a/Cabal/Distribution/Types/BuildInfo.hs b/Cabal/Distribution/Types/BuildInfo.hs
index 635834a8fb51eb627e040139e53bf26be8e1b14e..111ade8e4fbff3d91f99dd6b4193544942f47fbe 100644
--- a/Cabal/Distribution/Types/BuildInfo.hs
+++ b/Cabal/Distribution/Types/BuildInfo.hs
@@ -8,6 +8,7 @@ module Distribution.Types.BuildInfo (
     allLanguages,
     allExtensions,
     usedExtensions,
+    usesTemplateHaskellOrQQ,
 
     hcOptions,
     hcProfOptions,
@@ -180,6 +181,14 @@ usedExtensions :: BuildInfo -> [Extension]
 usedExtensions bi = oldExtensions bi
                  ++ defaultExtensions bi
 
+-- | Whether any modules in this component use Template Haskell or
+-- Quasi Quotes
+usesTemplateHaskellOrQQ :: BuildInfo -> Bool
+usesTemplateHaskellOrQQ bi = any p (allExtensions bi)
+  where
+    p ex = ex `elem`
+      [EnableExtension TemplateHaskell, EnableExtension QuasiQuotes]
+
 -- |Select options for a particular Haskell compiler.
 hcOptions :: CompilerFlavor -> BuildInfo -> [String]
 hcOptions = lookupHcOptions options
diff --git a/Cabal/Language/Haskell/Extension.hs b/Cabal/Language/Haskell/Extension.hs
index eacf0a2e76d1a272f4fe272f534969c4527db5a2..8f2358593eecb8dc2f7758caf5082d961315f874 100644
--- a/Cabal/Language/Haskell/Extension.hs
+++ b/Cabal/Language/Haskell/Extension.hs
@@ -777,7 +777,7 @@ data KnownExtension =
   -- code will compile with the new planned desugaring of fail.
   | MonadFailDesugaring
 
-  -- | A subset of @TemplateHaskell@ including only quasi-quoting.
+  -- | A subset of @TemplateHaskell@ including only quoting.
   | TemplateHaskellQuotes
 
   -- | Allows use of the @#label@ syntax.
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Exe.hs b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Exe.hs
new file mode 100644
index 0000000000000000000000000000000000000000..7565ea2cab959b06df60671efa58fe4d64c4fbf2
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Exe.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE QuasiQuotes #-}
+module Main where
+
+import QQ
+
+main = putStrLn [myq|hello|]
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Lib.hs b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Lib.hs
new file mode 100644
index 0000000000000000000000000000000000000000..340f6dbd34c211d2985934c0e924e028c8c03492
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/Lib.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE QuasiQuotes #-}
+module Lib where
+
+import QQ
+
+val = [myq|hello|]
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/QQ.hs b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/QQ.hs
new file mode 100644
index 0000000000000000000000000000000000000000..bd2fc6c4fc947a41c7ef86e3af70b25f19d73e93
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/QQ.hs
@@ -0,0 +1,6 @@
+module QQ where
+
+import Language.Haskell.TH
+import Language.Haskell.TH.Quote
+
+myq = QuasiQuoter { quoteExp = \s -> litE $ stringL $ s ++ " world"}
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/my.cabal b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/my.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..72fd9fca30856f89e549bf2c121f549f7da079f8
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/my.cabal
@@ -0,0 +1,15 @@
+Name: quasiQuotes
+Version: 0.1
+Build-Type: Simple
+Cabal-Version: >= 1.2
+
+Library
+    Exposed-Modules: Lib
+    Other-Modules: QQ
+    Build-Depends: base, template-haskell
+    Extensions: QuasiQuotes
+
+Executable main
+    Main-is: Exe.hs
+    Build-Depends: base, template-haskell
+    Extensions: QuasiQuotes
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.cabal.out b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.cabal.out
new file mode 100644
index 0000000000000000000000000000000000000000..0f5c034c61cd0d6ed307e6a7962c299e4018757b
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.cabal.out
@@ -0,0 +1,8 @@
+# Setup configure
+Resolving dependencies...
+Configuring quasiQuotes-0.1...
+# Setup build
+Preprocessing executable 'main' for quasiQuotes-0.1..
+Building executable 'main' for quasiQuotes-0.1..
+Preprocessing library for quasiQuotes-0.1..
+Building library for quasiQuotes-0.1..
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.out b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.out
new file mode 100644
index 0000000000000000000000000000000000000000..5fb92491c45bf2f4fc574a20fc70204ac48b2359
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.out
@@ -0,0 +1,7 @@
+# Setup configure
+Configuring quasiQuotes-0.1...
+# Setup build
+Preprocessing executable 'main' for quasiQuotes-0.1..
+Building executable 'main' for quasiQuotes-0.1..
+Preprocessing library for quasiQuotes-0.1..
+Building library for quasiQuotes-0.1..
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.test.hs b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.test.hs
new file mode 100644
index 0000000000000000000000000000000000000000..e35b9b695065f3e43497737af94bca53c08ee26d
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/dynamic/setup.test.hs
@@ -0,0 +1,5 @@
+import Test.Cabal.Prelude
+-- Test building a dynamic library/executable which uses QuasiQuotes
+main = setupAndCabalTest $ do
+    skipUnless =<< hasSharedLibraries
+    setup_build ["--enable-shared", "--enable-executable-dynamic"]
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Exe.hs b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Exe.hs
new file mode 100644
index 0000000000000000000000000000000000000000..7565ea2cab959b06df60671efa58fe4d64c4fbf2
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Exe.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE QuasiQuotes #-}
+module Main where
+
+import QQ
+
+main = putStrLn [myq|hello|]
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Lib.hs b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Lib.hs
new file mode 100644
index 0000000000000000000000000000000000000000..340f6dbd34c211d2985934c0e924e028c8c03492
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/Lib.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE QuasiQuotes #-}
+module Lib where
+
+import QQ
+
+val = [myq|hello|]
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/QQ.hs b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/QQ.hs
new file mode 100644
index 0000000000000000000000000000000000000000..bd2fc6c4fc947a41c7ef86e3af70b25f19d73e93
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/QQ.hs
@@ -0,0 +1,6 @@
+module QQ where
+
+import Language.Haskell.TH
+import Language.Haskell.TH.Quote
+
+myq = QuasiQuoter { quoteExp = \s -> litE $ stringL $ s ++ " world"}
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/my.cabal b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/my.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..72fd9fca30856f89e549bf2c121f549f7da079f8
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/my.cabal
@@ -0,0 +1,15 @@
+Name: quasiQuotes
+Version: 0.1
+Build-Type: Simple
+Cabal-Version: >= 1.2
+
+Library
+    Exposed-Modules: Lib
+    Other-Modules: QQ
+    Build-Depends: base, template-haskell
+    Extensions: QuasiQuotes
+
+Executable main
+    Main-is: Exe.hs
+    Build-Depends: base, template-haskell
+    Extensions: QuasiQuotes
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.cabal.out b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.cabal.out
new file mode 100644
index 0000000000000000000000000000000000000000..0f5c034c61cd0d6ed307e6a7962c299e4018757b
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.cabal.out
@@ -0,0 +1,8 @@
+# Setup configure
+Resolving dependencies...
+Configuring quasiQuotes-0.1...
+# Setup build
+Preprocessing executable 'main' for quasiQuotes-0.1..
+Building executable 'main' for quasiQuotes-0.1..
+Preprocessing library for quasiQuotes-0.1..
+Building library for quasiQuotes-0.1..
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.out b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.out
new file mode 100644
index 0000000000000000000000000000000000000000..5fb92491c45bf2f4fc574a20fc70204ac48b2359
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.out
@@ -0,0 +1,7 @@
+# Setup configure
+Configuring quasiQuotes-0.1...
+# Setup build
+Preprocessing executable 'main' for quasiQuotes-0.1..
+Building executable 'main' for quasiQuotes-0.1..
+Preprocessing library for quasiQuotes-0.1..
+Building library for quasiQuotes-0.1..
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.test.hs b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.test.hs
new file mode 100644
index 0000000000000000000000000000000000000000..d555b26c2facdd96a8cdeb93e213358a4dbe6788
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/profiling/setup.test.hs
@@ -0,0 +1,7 @@
+import Test.Cabal.Prelude
+-- Test building a profiled library/executable which uses QuasiQuotes
+-- (setup has to build the non-profiled version first)
+main = setupAndCabalTest $ do
+    skipUnless =<< hasProfiledLibraries
+    setup_build ["--enable-library-profiling",
+                 "--enable-profiling"]
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Exe.hs b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Exe.hs
new file mode 100644
index 0000000000000000000000000000000000000000..7565ea2cab959b06df60671efa58fe4d64c4fbf2
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Exe.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE QuasiQuotes #-}
+module Main where
+
+import QQ
+
+main = putStrLn [myq|hello|]
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Lib.hs b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Lib.hs
new file mode 100644
index 0000000000000000000000000000000000000000..340f6dbd34c211d2985934c0e924e028c8c03492
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/Lib.hs
@@ -0,0 +1,6 @@
+{-# LANGUAGE QuasiQuotes #-}
+module Lib where
+
+import QQ
+
+val = [myq|hello|]
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/QQ.hs b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/QQ.hs
new file mode 100644
index 0000000000000000000000000000000000000000..bd2fc6c4fc947a41c7ef86e3af70b25f19d73e93
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/QQ.hs
@@ -0,0 +1,6 @@
+module QQ where
+
+import Language.Haskell.TH
+import Language.Haskell.TH.Quote
+
+myq = QuasiQuoter { quoteExp = \s -> litE $ stringL $ s ++ " world"}
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/my.cabal b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/my.cabal
new file mode 100644
index 0000000000000000000000000000000000000000..72fd9fca30856f89e549bf2c121f549f7da079f8
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/my.cabal
@@ -0,0 +1,15 @@
+Name: quasiQuotes
+Version: 0.1
+Build-Type: Simple
+Cabal-Version: >= 1.2
+
+Library
+    Exposed-Modules: Lib
+    Other-Modules: QQ
+    Build-Depends: base, template-haskell
+    Extensions: QuasiQuotes
+
+Executable main
+    Main-is: Exe.hs
+    Build-Depends: base, template-haskell
+    Extensions: QuasiQuotes
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.cabal.out b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.cabal.out
new file mode 100644
index 0000000000000000000000000000000000000000..0f5c034c61cd0d6ed307e6a7962c299e4018757b
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.cabal.out
@@ -0,0 +1,8 @@
+# Setup configure
+Resolving dependencies...
+Configuring quasiQuotes-0.1...
+# Setup build
+Preprocessing executable 'main' for quasiQuotes-0.1..
+Building executable 'main' for quasiQuotes-0.1..
+Preprocessing library for quasiQuotes-0.1..
+Building library for quasiQuotes-0.1..
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.out b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.out
new file mode 100644
index 0000000000000000000000000000000000000000..5fb92491c45bf2f4fc574a20fc70204ac48b2359
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.out
@@ -0,0 +1,7 @@
+# Setup configure
+Configuring quasiQuotes-0.1...
+# Setup build
+Preprocessing executable 'main' for quasiQuotes-0.1..
+Building executable 'main' for quasiQuotes-0.1..
+Preprocessing library for quasiQuotes-0.1..
+Building library for quasiQuotes-0.1..
diff --git a/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.test.hs b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.test.hs
new file mode 100644
index 0000000000000000000000000000000000000000..df61a665bca98531fe555f208ea52b86c06523e6
--- /dev/null
+++ b/cabal-testsuite/PackageTests/QuasiQuotes/vanilla/setup.test.hs
@@ -0,0 +1,3 @@
+import Test.Cabal.Prelude
+-- Test building a vanilla library/executable which uses QuasiQuotes
+main = setupAndCabalTest $ setup_build []