diff --git a/ChangeLog.md b/ChangeLog.md
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,20 +1,23 @@
 # Changelog for vformat
 
-## V0.10.0
-- Rewrite error system & fix bugs
-- Fix document
-- Rewrite unit tests
+## V0.14.0
+- Add `QuasiQuoter`s for `Format` and `Format1`
 
+## V0.13.0
+- Add `FromArgKey` typeclass
+- Fix `OVERLAPPABLE` issue
+
+## V0.12.0
+- Add `defaultSpecs`
+- Remove `FormatTime` instance
+
 ## V0.11.0
 - Simplify `ArgKey`
 - Make generic instantiate FormatArg configurable
 - Expose standard formatters
 - Fix some issue and doc
 
-## V0.12.0
-- Add `defaultSpecs`
-- Remove `FormatTime` instance
-
-## V0.13.0
-- Add `FromArgKey` typeclass
-- Fix `OVERLAPPABLE` issue
+## V0.10.0
+- Rewrite error system & fix bugs
+- Fix document
+- Rewrite unit tests
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,3 +1,8 @@
-# vformat
+# vformat [![Hackage](https://img.shields.io/hackage/v/vformat)](http://hackage.haskell.org/package/vformat) [![Travis Build Status](https://travis-ci.org/versioncloud/vformat.svg?branch=master)](https://travis-ci.org/versioncloud/vformat) [![Appveyor Build status](https://ci.appveyor.com/api/projects/status/abnb32r34v4oah62/branch/master?svg=true)](https://ci.appveyor.com/project/gqk007/vformat/branch/master)
 
 Please see http://hackage.haskell.org/package/vformat
+
+
+## Related packages
+- http://hackage.haskell.org/package/vformat-time
+- http://hackage.haskell.org/package/vformat-aeson
diff --git a/src/Text/Format/TH.hs b/src/Text/Format/TH.hs
new file mode 100644
--- /dev/null
+++ b/src/Text/Format/TH.hs
@@ -0,0 +1,93 @@
+{-# LANGUAGE DeriveLift         #-}
+{-# LANGUAGE StandaloneDeriving #-}
+
+module Text.Format.TH ( formatQQ, format1QQ ) where
+
+import           Data.String
+import           Language.Haskell.TH
+import           Language.Haskell.TH.Quote
+import           Language.Haskell.TH.Syntax
+import           Text.Format.ArgFmt
+import           Text.Format.ArgKey
+import           Text.Format.Format
+
+deriving instance Lift ArgKey
+deriving instance Lift ArgFmt
+deriving instance Lift FmtAlign
+deriving instance Lift FmtSign
+deriving instance Lift FmtNumSep
+deriving instance Lift FmtItem
+deriving instance Lift Format
+deriving instance Lift Format1
+
+
+{-| A QuasiQuoter for 'Format' with which you can write multi-line 'Format'.
+
+Note: @">>>"@ after @"[formatQQ|"@ means starting from the next line,
+      @"<<<"@ before @"|]"@ means ending from the previous line.
+
+==== Example
+
+>>> :set -XTemplateHaskell
+>>> :set -XQuasiQuotes
+>>> import     Text.Format
+>>> import     Text.Format.TH
+>>> :{
+fmt1 :: Format
+fmt1 = [formatQQ|>>>
+first line {hi}
+newline {words}
+last line {bye}
+<<<|]
+fmt2 :: Format
+fmt2 = [formatQQ|first line {hi}
+newline {words}
+last line {bye}|]
+fmt3 :: Format
+fmt3 = "first line {hi}\nnewline {words}\nlast line {bye}"
+:}
+>>> format fmt1 ("hi" := "hi") ("words"  := "say something") ("bye" := "bye")
+"first line hi\nnewline say something\nlast line bye"
+>>> format fmt2 ("hi" := "hi") ("words"  := "say something") ("bye" := "bye")
+"first line hi\nnewline say something\nlast line bye"
+>>> format fmt3 ("hi" := "hi") ("words"  := "say something") ("bye" := "bye")
+"first line hi\nnewline say something\nlast line bye"
+
+@since 0.14.0
+-}
+formatQQ :: QuasiQuoter
+formatQQ = QuasiQuoter { quoteExp = formatExp
+                       , quotePat = undefined
+                       , quoteType = undefined
+                       , quoteDec = undefined
+                       }
+
+formatExp :: String -> Q Exp
+formatExp fs = lift $ (fromString (fixEnd $ fixBegin fs) :: Format)
+
+
+{-| Same as 'formatQQ', but for 'Format1'.
+
+@since 0.14.0
+-}
+format1QQ :: QuasiQuoter
+format1QQ = QuasiQuoter { quoteExp = format1Exp
+                        , quotePat = undefined
+                        , quoteType = undefined
+                        , quoteDec = undefined
+                        }
+
+format1Exp :: String -> Q Exp
+format1Exp fs = lift $ (fromString (fixEnd $ fixBegin fs) :: Format1)
+
+
+fixBegin :: String -> String
+fixBegin ('>':'>':'>':"")      = ""
+fixBegin ('>':'>':'>':'\n':fs) = fs
+fixBegin fs                    = fs
+
+
+fixEnd :: String -> String
+fixEnd ('<':'<':'<':"") = ""
+fixEnd fs               | ('<':'<':'<':'\n':fs') <- reverse fs = reverse fs'
+fixEnd fs               = fs
diff --git a/vformat.cabal b/vformat.cabal
--- a/vformat.cabal
+++ b/vformat.cabal
@@ -4,10 +4,10 @@
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: f705e4890246248ac73f5ee9489edc8b4f36b6938729787e055dcb2f2973386b
+-- hash: 81b8aa366e7778096840d2ebe95e156e87ba58b0430ef7e01c19011083c4351e
 
 name:           vformat
-version:        0.13.0.0
+version:        0.14.0.0
 synopsis:       A Python str.format() like formatter
 description:    Please see the http://hackage.haskell.org/package/vformat
 category:       Text, Format
@@ -29,6 +29,7 @@
 library
   exposed-modules:
       Text.Format
+      Text.Format.TH
   other-modules:
       Text.Format.ArgFmt
       Text.Format.ArgKey
@@ -42,6 +43,7 @@
       base >=4.7 && <5
     , containers >=0.5.9 && <1.0
     , exceptions >=0.8 && <1.0
+    , template-haskell >=2.12 && <3.0
   default-language: Haskell2010
 
 test-suite vformat-test
@@ -58,5 +60,6 @@
     , containers >=0.5.9 && <1.0
     , exceptions >=0.8 && <1.0
     , hspec >=2.1 && <3.0
+    , template-haskell >=2.12 && <3.0
     , vformat
   default-language: Haskell2010
