diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,32 @@
+Copyright (c) 2010, Oscar Finnsson
+All rights reserved.
+
+Copyright (c) 2012, IIJ Innovation Institute Inc.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+  * Redistributions of source code must retain the above copyright
+    notice, this list of conditions and the following disclaimer.
+  * Redistributions in binary form must reproduce the above copyright
+    notice, this list of conditions and the following disclaimer in
+    the documentation and/or other materials provided with the
+    distribution.
+  * Neither the name of the copyright holders nor the names of its
+    contributors may be used to endorse or promote products derived
+    from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGE.
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/Test/Framework/TH/Prime.hs b/Test/Framework/TH/Prime.hs
new file mode 100644
--- /dev/null
+++ b/Test/Framework/TH/Prime.hs
@@ -0,0 +1,144 @@
+{-# LANGUAGE QuasiQuotes, TemplateHaskell #-}
+
+{-|
+  Template Haskell to generate defaultMain with a list of "Test" from
+  \"doc_test\", \"case_<somthing>\", and \"prop_<somthing>\".
+
+  An example of source code (Data/MySet.hs):
+
+  > { -| Creating a set from a list. O(N log N)
+  >
+  > >>> empty == fromList []
+  > True
+  > >>> singleton 'a' == fromList ['a']
+  > True
+  > >>> fromList [5,3,5] == fromList [5,3]
+  > True
+  > - }
+  >
+  > fromList :: Ord a => [a] -> RBTree a
+  > fromList = foldl' (flip insert) empty
+
+  The spaces of comment symbols are due to limitation of haddock.
+
+  An example of test code in the src directory (test/Test.hs):
+
+  > module Main where
+  >
+  > import Test.Framework.TH.Prime
+  > import Test.Framework.Providers.DocTest
+  > import Test.Framework.Providers.HUnit
+  > import Test.Framework.Providers.QuickCheck2
+  > import Test.QuickCheck2
+  > import Test.HUnit
+  >
+  > import Data.MySet
+  >
+  > main :: IO ()
+  > main = $(defaultMainGenerator)
+  >
+  > doc_test :: DocTests
+  > doc_test = docTest ["../Data/MySet.hs"] ["-i.."]
+  >
+  > prop_toList :: [Int] -> Bool
+  > prop_toList xs = ordered ys
+  >   where
+  >     ys = toList . fromList $ xs
+  >     ordered (x:y:xys) = x <= y && ordered (y:xys)
+  >     ordered _         = True
+  >
+  > case_ticket4242 :: Assertion
+  > case_ticket4242 = (valid $ deleteMin $ deleteMin $ fromList [0,2,5,1,6,4,8,9,7,11,10,3]) @?= True
+
+  And run:
+
+  > test% runghc -i.. Test.hs
+
+  This code is based on Test.Framework.TH by Oscar Finnsson and Emil Nordling
+  and the author integrated doctest.
+
+  Examples in haddock document is only used as unit tests at this
+  moment. I hope that properties of QuickCheck2 can also be specified in
+  haddock document in the future. I guess it's Haskell way of Behavior
+  Driven Development.
+
+-}
+
+module Test.Framework.TH.Prime (
+  defaultMainGenerator,
+  DocTests
+) where
+
+import Language.Haskell.Extract
+import Language.Haskell.TH
+import Language.Haskell.TH.Syntax
+import Test.Framework (defaultMain)
+import Test.Framework.Providers.API
+
+----------------------------------------------------------------
+
+-- | Type for \"doc_test\".
+type DocTests = IO Test
+
+----------------------------------------------------------------
+
+{-|
+  Generating defaultMain with a list of "Test" from \"doc_test\",
+  \"case_*\", and \"prop_\".
+-}
+defaultMainGenerator :: ExpQ
+defaultMainGenerator = do
+    defined <- isDefined docTestKeyword
+    if defined
+       then [| do TestGroup _ doctests <- $(docListGenerator)
+                  defaultMain [ testGroup $(locationModule) $ doctests ++ $(caseListGenerator) ++ $(propListGenerator) ] |]
+       else [| defaultMain [ testGroup $(locationModule) $ $(caseListGenerator) ++ $(propListGenerator) ] |]
+
+----------------------------------------------------------------
+-- code from Test.Framework.TH of test-framework-th
+-- by Oscar Finnsson & Emil Nordling
+
+listGenerator :: String -> String -> ExpQ
+listGenerator beginning funcName =
+  functionExtractorMap beginning (applyNameFix funcName)
+
+propListGenerator :: ExpQ
+propListGenerator = listGenerator "^prop_" "testProperty"
+
+caseListGenerator :: ExpQ
+caseListGenerator = listGenerator "^case_" "testCase"
+
+----------------------------------------------------------------
+
+-- | The same as
+--   e.g. \n f -> testProperty (fixName n) f
+applyNameFix :: String -> ExpQ
+applyNameFix n =
+  do fn <- [|fixName|]
+     return $ LamE [VarP (mkName "n")] (AppE (VarE (mkName n)) (AppE (fn) (VarE (mkName "n"))))
+
+fixName :: String -> String
+fixName name = replace '_' ' ' $ drop 5 name
+
+replace :: Eq a => a -> a -> [a] -> [a]
+replace b v = map (\i -> if b == i then v else i)
+
+----------------------------------------------------------------
+-- code from Hiromi Ishii
+
+isDefined :: String -> Q Bool
+isDefined n = do
+  return False  `recover` do
+    VarI (Name _ flavour) _ _ _ <- reify (mkName n)
+    loc <- location
+    case flavour of
+      NameG ns _ mdl -> return (ns == VarName && modString mdl == loc_module loc)
+      _              -> return False
+
+----------------------------------------------------------------
+
+docTestKeyword :: String
+docTestKeyword = "doc_test"
+
+docListGenerator :: ExpQ
+docListGenerator = varE $ mkName docTestKeyword
diff --git a/test-framework-th-prime.cabal b/test-framework-th-prime.cabal
new file mode 100644
--- /dev/null
+++ b/test-framework-th-prime.cabal
@@ -0,0 +1,23 @@
+Name:                   test-framework-th-prime
+Version:                0.0.0
+Author:                 Kazu Yamamoto <kazu@iij.ad.jp>
+Maintainer:             Kazu Yamamoto <kazu@iij.ad.jp>
+License:                BSD3
+License-File:           LICENSE
+Synopsis:               Template Haskell for test framework
+Description:            Automatically generates a Test list for
+                        HUnit, doctest and QuickCheck2.
+Category:               Testing
+Cabal-Version:          >= 1.6
+Build-Type:             Simple
+library
+  if impl(ghc >= 6.12)
+    GHC-Options:        -Wall -fno-warn-unused-do-bind
+  else
+    GHC-Options:        -Wall
+  Exposed-Modules:      Test.Framework.TH.Prime
+  Build-Depends:        base >= 4 && < 5, test-framework, language-haskell-extract >= 0.2.1, haskell-src-exts, regex-posix, template-haskell
+
+Source-Repository head
+  Type:                 git
+  Location:             https://github.com/kazu-yamamoto/test-framework-th-prime
