diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2013, Kei Hibino
+
+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 Kei Hibino nor the names of other
+      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/names-th.cabal b/names-th.cabal
new file mode 100644
--- /dev/null
+++ b/names-th.cabal
@@ -0,0 +1,33 @@
+name:                names-th
+version:             0.0.1.0
+synopsis:            Manipulate name strings for TH
+description:         This package includes functions to manipulate name string
+                     and extra library functions for Template Haskell.
+homepage:            http://twitter.com/khibino
+license:             BSD3
+license-file:        LICENSE
+author:              Kei Hibino
+maintainer:          ex8k.hibino@gmail.com
+copyright:           Copyright (c) 2013 Kei Hibino
+category:            Development
+build-type:          Simple
+cabal-version:       >=1.10
+
+library
+  exposed-modules:
+                     Language.Haskell.TH.Name.CamelCase
+                     Language.Haskell.TH.Lib.Extra
+  build-depends:       base <5, template-haskell
+  hs-source-dirs:    src
+  ghc-options:       -Wall
+
+  default-language:     Haskell2010
+
+
+source-repository head
+  type:       git
+  location:   https://github.com/khibino/haskell-relational-record
+
+source-repository head
+  type:       mercurial
+  location:   https://bitbucket.org/khibino/haskell-relational-record
diff --git a/src/Language/Haskell/TH/Lib/Extra.hs b/src/Language/Haskell/TH/Lib/Extra.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/TH/Lib/Extra.hs
@@ -0,0 +1,98 @@
+-- |
+-- Module      : Language.Haskell.TH.Lib.Extra
+-- Copyright   : 2013 Kei Hibino
+-- License     : BSD3
+--
+-- Maintainer  : ex8k.hibino@gmail.com
+-- Stability   : experimental
+-- Portability : unknown
+--
+-- This module provides extra helper functions
+-- complementing "Language.Haskell.TH.Lib"
+module Language.Haskell.TH.Lib.Extra (
+  -- * Extra template functions
+  -- $extraTemplateFunctions
+  integralE, simpleValD, maybeD,
+
+  -- * Pretty printing for 'Q' monad
+  -- $prettyPrint
+  pprQ,
+
+  -- * Functions to print message or errors when compile time
+  -- $compileMessage
+  reportMessage, reportWarning, reportError,
+  ) where
+
+import System.IO (hPutStrLn, stderr)
+import System.Environment (getEnvironment)
+
+import Language.Haskell.TH
+  (Ppr, ppr, Q, runQ, runIO,
+   Name, Dec, sigD, valD, TypeQ, varP, normalB,
+   ExpQ, litE, integerL)
+import Language.Haskell.TH.PprLib (Doc)
+import Language.Haskell.TH.Syntax (Quasi, qReport)
+
+{- $extraTemplateFunctions
+Extra functions to generate haskell templates.
+-}
+
+-- | Integer literal template from 'Integral' types.
+integralE :: Integral a => a -> ExpQ
+integralE =  litE . integerL . toInteger
+
+-- | Generate declaration template from name, type and expression.
+simpleValD :: Name -> TypeQ -> ExpQ -> Q [Dec]
+simpleValD var typ expr =  do
+  sig <- sigD var typ
+  val <- valD (varP var) (normalB expr) []
+  return [sig, val]
+
+-- | May generate declaration template.
+maybeD :: (a -> Q [Dec]) -> Maybe a -> Q [Dec]
+maybeD =  maybe (return [])
+
+{- $prettyPrint
+Pretty printing for haskell templates.
+-}
+
+-- | Helper function for pretty printing 'Q' Monad.
+pprQ :: (Functor m, Quasi m, Ppr a) => Q a -> m Doc
+pprQ =  fmap ppr . runQ
+
+{- $compileMessage
+Functions to display or to raise compile messages from codes
+which generating haskell templates.
+
+Only messages directly generated by 'Q' monad report actions
+are handled by ghc loggers.
+
+> -- Handled by ghc logger
+> qReport False "Foo"
+
+> -- Not handled by ghc logger
+> runIO . runQ $ qReport False "Foo"
+ -}
+
+-- | Print compile message from TH code.
+--   Only display when TH_EXTRA_MESSAGE_OUTPUT environment variable is set.
+--   When variable value string is 'as_warn' or 'as_warning' and
+--   using 'Q' monad action, Output is put into ghc logger as warning.
+--   Other cases are normal standard error output.
+reportMessage :: Quasi m => String -> m ()
+reportMessage s = runQ . runIO $ do
+  let lookupEnv n = lookup n `fmap` getEnvironment  {- for base-4.5 -}
+  mayOut <- lookupEnv "TH_EXTRA_MESSAGE_OUTPUT"
+  case mayOut of
+    Just out
+      | out `elem` ["as_warn", "as_warning"]  ->  qReport False s
+      | otherwise                             ->  hPutStrLn stderr s
+    Nothing                                   ->  return ()
+
+-- | Print compile warnings from TH code.
+reportWarning :: String -> Q ()
+reportWarning =  qReport False
+
+-- | Print compile errors from TH code.
+reportError :: String -> Q ()
+reportError =  qReport True
diff --git a/src/Language/Haskell/TH/Name/CamelCase.hs b/src/Language/Haskell/TH/Name/CamelCase.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/TH/Name/CamelCase.hs
@@ -0,0 +1,114 @@
+-- |
+-- Module      : Language.Haskell.TH.Name.CamelCase
+-- Copyright   : 2013 Kei Hibino
+-- License     : BSD3
+--
+-- Maintainer  : ex8k.hibino@gmail.com
+-- Stability   : experimental
+-- Portability : unknown
+--
+-- This module provides camelcased 'Name' for Template Haskell
+module Language.Haskell.TH.Name.CamelCase (
+  -- * Types to wrap 'Name'
+  -- $nameTypes
+  ConName (ConName, conName), toConName,
+  VarName (VarName, varName), toVarName,
+
+  -- * Functions to make camel-cased names
+  -- $makeNames
+  conCamelcaseName, varCamelcaseName,
+
+  varNameWithPrefix,
+
+  -- * Functions to generate haskell template from names
+  -- $makeTemplates
+  toTypeCon, toDataCon,
+
+  toVarExp, toVarPat
+  ) where
+
+import Data.Char (toUpper, toLower)
+import Language.Haskell.TH
+  (Name, mkName, TypeQ, conT, ExpQ, conE, varE, PatQ, varP)
+
+capitalize :: String -> String
+capitalize (c:cs) = toUpper c : cs
+capitalize ""     = ""
+
+unCapitalize :: String -> String
+unCapitalize (c:cs) = toLower c : cs
+unCapitalize ""     = ""
+
+{- $nameTypes
+Wrap 'Name' to distinguish constructor names and variable names.
+-}
+
+-- | Type to wrap constructor\'s 'Name'.
+newtype ConName = ConName { conName :: Name {- ^ Get wrapped 'Name' -} }
+
+-- | Make constructor name from 'String'.
+toConName :: String -> ConName
+toConName =  ConName . mkName . capitalize
+
+-- | Type to wrap variable\'s 'Name'.
+newtype VarName = VarName { varName :: Name {- ^ Get wrapped 'Name' -} }
+
+-- | Make variable name from 'String'.
+toVarName :: String -> VarName
+toVarName =  VarName . mkName . unCapitalize
+
+-- | 'Char' set used from camel-cased names.
+nameChars :: String
+nameChars =  '\'' : ['0' .. '9'] ++ ['A' .. 'Z'] ++  ['a' .. 'z']
+
+-- | Split into chunks to generate camel-cased 'String'.
+splitForName :: String -> [String]
+splitForName str
+  | rest /= [] = tk : splitForName (tail rest)
+  | otherwise  = [tk]
+  where
+    (tk, rest) = span (`elem` nameChars) str
+
+{- $makeNames
+Make camel-cased names.
+-}
+
+-- | Convert into camel-cased 'String'.
+--   First 'Char' of result is upper case.
+camelcaseUpper :: String -> String
+camelcaseUpper =  concatMap capitalize . splitForName
+
+-- | Make camel-cased constructor name from 'String'.
+conCamelcaseName :: String -> ConName
+conCamelcaseName =  toConName . camelcaseUpper
+
+-- | Make camel-cased variable name from 'String'.
+varCamelcaseName :: String -> VarName
+varCamelcaseName =  toVarName . camelcaseUpper
+
+-- | Make camel-cased variable name with prefix like below.
+--
+-- >  name `varNamePrefix` prefix
+--
+varNameWithPrefix :: String -> String -> VarName
+varNameWithPrefix n p =  toVarName $ p ++ camelcaseUpper n
+
+{- $makeTemplates
+Make haskell templates from names.
+-}
+
+-- | Make type constructor 'TypeQ' monad from constructor name type.
+toTypeCon :: ConName -> TypeQ
+toTypeCon =  conT . conName
+
+-- | Make data constructor 'ExpQ' monad from constructor name type.
+toDataCon :: ConName -> ExpQ
+toDataCon =  conE . conName
+
+-- | Make variable 'ExpQ' monad from variable name type.
+toVarExp :: VarName -> ExpQ
+toVarExp =  varE . varName
+
+-- | Make pattern 'PatQ' monad from variable name type.
+toVarPat :: VarName -> PatQ
+toVarPat =  varP . varName
