diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,8 @@
+To the extent possible under law, 唐鳳 has waived all copyright and
+related or neighboring rights to string-qq.
+
+This work is published from Taiwan.
+
+<http://creativecommons.org/publicdomain/zero/1.0>
+
+
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,6 @@
+import Distribution.Simple
+import System.Cmd(system)
+
+main = defaultMainWithHooks $ simpleUserHooks { runTests = runElfTests }
+
+runElfTests a b pd lb = system "runhaskell -i./src ./tests/Test.hs" >> return ()
diff --git a/src/Data/String/QQ.hs b/src/Data/String/QQ.hs
new file mode 100644
--- /dev/null
+++ b/src/Data/String/QQ.hs
@@ -0,0 +1,40 @@
+{-# LANGUAGE TemplateHaskell, CPP #-}
+
+-- | QuasiQuoter for non-interpolated strings, texts and bytestrings.
+--
+-- The "s" quoter contains a multi-line string with no interpolation at all,
+-- except that the leading newline is trimmed and carriage returns stripped.
+--
+-- @
+-- {-\# LANGUAGE QuasiQuotes #-}
+-- import Data.Text (Text)
+-- import Data.String.QQ
+-- foo :: Text -- "String", "ByteString" etc also works
+-- foo = [s|
+-- Well here is a
+--     multi-line string!
+-- |]
+-- @
+--
+-- Any instance of the IsString type is permitted.
+-- 
+-- (For GHC versions 6, write "[$s||]" instead of "[s||]".)
+--
+module Data.String.QQ (s) where
+import GHC.Exts (IsString(..))
+import qualified Language.Haskell.TH as TH
+import Language.Haskell.TH.Quote
+
+-- | QuasiQuoter for a non-interpolating IsString literal. The pattern portion is undefined.
+s :: QuasiQuoter
+s = QuasiQuoter ((\a -> [|fromString a|]) . trimLeadingNewline . removeCRs)
+                 (error "Cannot use q as a pattern")
+#if (__GLASGOW_HASKELL__ >= 700)
+                 (error "Cannot use q as a type")
+                 (error "Cannot use q as a dec")
+#endif
+    where
+    removeCRs = filter (/= '\r')
+    trimLeadingNewline ('\n':xs) = xs
+    trimLeadingNewline xs = xs
+
diff --git a/string-qq.cabal b/string-qq.cabal
new file mode 100644
--- /dev/null
+++ b/string-qq.cabal
@@ -0,0 +1,26 @@
+Name:          string-qq
+Version:       0.0.2
+License:       PublicDomain
+License-file:  LICENSE
+Category:      Data
+Author:        Audrey Tang
+Copyright:     Audrey Tang
+Maintainer:    Audrey Tang <audreyt@audreyt.org>
+Stability:     unstable
+Cabal-Version: >= 1.6
+Build-Depends: base
+Build-Type:    Custom
+Synopsis:      QuasiQuoter for non-interpolated strings, texts and bytestrings.
+Description:   QuasiQuoter for non-interpolated strings, texts and bytestrings.
+Data-Files:    tests/Test.hs
+Tested-With:   GHC==6.10.1, GHC==7.0.2
+
+Source-Repository head
+    type: git
+    location: git://github.com/audreyt/string-qq.git
+
+library
+    extensions:      TemplateHaskell
+    build-depends:   base > 3 && < 6, template-haskell >= 2
+    hs-source-dirs:  src
+    exposed-modules: Data.String.QQ
diff --git a/tests/Test.hs b/tests/Test.hs
new file mode 100644
--- /dev/null
+++ b/tests/Test.hs
@@ -0,0 +1,41 @@
+{-# LANGUAGE QuasiQuotes, ExtendedDefaultRules, CPP #-}
+
+module Main where
+
+import Data.Text
+import Data.String.QQ
+import Test.HUnit
+
+#if (__GLASGOW_HASKELL__ >= 700)
+test0 = assertBool "" ([s||] == "")
+test1 = assertBool "" ([s|1|] == "1")
+test2 = assertBool "" ([s|2|] == pack "2")
+test0' = assertBool "" ([s|
+|] == "")
+test1' = assertBool "" ([s|
+1|] == "1")
+test2' = assertBool "" ([s|
+2|] == pack "2")
+#else
+test0 = assertBool "" ([$s||] == "")
+test1 = assertBool "" ([$s|1|] == "1")
+test2 = assertBool "" ([$s|2|] == pack "2")
+test0' = assertBool "" ([$s|
+|] == "")
+test1' = assertBool "" ([$s|
+1|] == "1")
+test2' = assertBool "" ([$s|
+2|] == pack "2")
+#endif
+
+tests = TestList
+    [ TestLabel "Empty String" $ TestCase test0
+    , TestLabel "String instance" $ TestCase test1
+    , TestLabel "Text instance" $ TestCase test2
+    , TestLabel "Empty String with trimmed leading newline" $ TestCase test0'
+    , TestLabel "String instance with trimmed leading newline" $ TestCase test1'
+    , TestLabel "Text instance with trimmed leading newline" $ TestCase test2'
+    ]
+
+main = runTestTT tests
+
