diff --git a/Cloud/AWS/Lib/FromText.hs b/Cloud/AWS/Lib/FromText.hs
new file mode 100644
--- /dev/null
+++ b/Cloud/AWS/Lib/FromText.hs
@@ -0,0 +1,108 @@
+{-# LANGUAGE TemplateHaskell, FlexibleInstances #-}
+
+module Cloud.AWS.Lib.FromText
+    ( FromText
+      ( fromText
+      , fromNamedText
+      )
+    , deriveFromText
+    , failText
+    -- Re-exports
+    , IPv4
+    , AddrRange
+    , Text
+    , UTCTime
+    ) where
+
+import Control.Applicative ((<$>))
+import Control.Monad
+import Data.IP (IPv4, AddrRange)
+import Data.Monoid ((<>))
+import Data.Text (Text)
+import qualified Data.Text as T
+import Data.Time (UTCTime)
+import qualified Data.Time as Time
+import qualified Data.Time.Parse as TP
+import Language.Haskell.TH
+import Safe
+
+class FromText a where
+    fromText :: Monad m => Text -> m a
+
+    fromText' :: Monad m => Text -> m a
+    fromText' name
+        = maybe (failText name) return
+        . fromText
+        $ name
+
+    fromNamedText :: Monad m => Text -> Maybe Text -> m a
+    fromNamedText name
+        = maybe
+            (failText $ T.pack "no text name=" <> name)
+            fromText'
+
+failText :: Monad m => Text -> m a
+failText msg = fail $ "FromText error: " <> T.unpack msg
+
+instance FromText a => FromText (Maybe a) where
+    fromText' = return . join . fromText
+    fromNamedText _name Nothing  = return Nothing
+    fromNamedText _name (Just t) = return $ fromText t
+    fromText = return . fromText
+
+instance FromText Int where
+    fromText = fromTextToRead
+
+instance FromText Integer where
+    fromText = fromTextToRead
+
+instance FromText Double where
+    fromText = fromTextToRead
+
+instance FromText IPv4 where
+    fromText = fromTextToRead
+
+instance FromText (AddrRange IPv4) where
+    fromText = fromTextToRead
+
+fromTextToRead :: (Monad m, Read a) => Text -> m a
+fromTextToRead = readM . T.unpack
+
+readM :: (Monad m, Read a) => String -> m a
+readM a = maybe (fail $ "read failue: " <> a) return $ readMay a
+
+instance FromText Text where
+    fromText t
+        | t == ""   = failText "Text"
+        | otherwise = return t
+
+instance FromText Bool where
+    fromText "true"  = return True
+    fromText "false" = return False
+    fromText _       = failText "Bool"
+
+instance FromText UTCTime where
+    fromText t
+        = maybe
+            (fail "UTCTime")
+            (return . Time.localTimeToUTC Time.utc)
+        $ fst <$> (TP.strptime fmt $ T.unpack t)
+      where
+        fmt = "%FT%T"
+
+deriveFromText :: String -> [String] -> DecsQ
+deriveFromText dstr strs = do
+    ctrs <- map (\(NormalC name _) -> name) <$> cons
+    x <- newName "x"
+    let cases = caseE (varE x) (map f (zip strs ctrs) ++ [wild])
+    let fun = funD 'fromText [clause [varP x] (normalB cases) []]
+    (:[]) <$> instanceD ctx typ [fun]
+  where
+    d = mkName dstr
+    cons = do
+        (TyConI (DataD _ _ _ cs _)) <- reify d
+        return cs
+    f (s, t) = match (litP $ stringL s) (normalB $ [|return $(conE t)|]) []
+    wild = match wildP (normalB [|fail dstr|]) []
+    typ = appT (conT ''FromText) (conT d)
+    ctx = return []
diff --git a/Cloud/AWS/Lib/ToText.hs b/Cloud/AWS/Lib/ToText.hs
new file mode 100644
--- /dev/null
+++ b/Cloud/AWS/Lib/ToText.hs
@@ -0,0 +1,52 @@
+{-# LANGUAGE FlexibleInstances #-}
+
+module Cloud.AWS.Lib.ToText
+    ( ToText (toText)
+    ) where
+
+import Data.ByteString (ByteString)
+import qualified Data.ByteString.Char8 as BC
+import Data.IP (IPv4, AddrRange)
+import Data.Text (Text)
+import qualified Data.Text as T
+import Data.Time (UTCTime)
+import qualified Data.Time as Time
+import System.Locale (defaultTimeLocale)
+
+class ToText a where
+    toText :: a -> Text
+    toMaybeText :: a -> Maybe Text
+    toMaybeText = Just . toText
+
+instance ToText Text where
+    toText t = t
+
+instance ToText ByteString where
+    toText = T.pack . BC.unpack
+
+instance ToText Bool where
+    toText True  = "true"
+    toText False = "false"
+
+instance ToText UTCTime where
+    toText
+        = T.pack
+        . Time.formatTime defaultTimeLocale "%FT%T"
+
+instance ToText Int where
+    toText = toTextFromShow
+
+instance ToText Integer where
+    toText = toTextFromShow
+
+instance ToText Double where
+    toText = toTextFromShow
+
+instance ToText IPv4 where
+    toText = toTextFromShow
+
+instance ToText (AddrRange IPv4) where
+    toText = toTextFromShow
+
+toTextFromShow :: Show a => a -> Text
+toTextFromShow = T.pack . show
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2013, Yusuke Nomura
+
+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 Yusuke Nomura 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/aws-sdk-text-converter.cabal b/aws-sdk-text-converter.cabal
new file mode 100644
--- /dev/null
+++ b/aws-sdk-text-converter.cabal
@@ -0,0 +1,48 @@
+name:                aws-sdk-text-converter
+version:             0.1.0.0
+synopsis:            The text converter for aws-sdk.
+description:         The text converter for aws-sdk.
+license:             BSD3
+license-file:        LICENSE
+homepage:            https://github.com/worksap-ate/aws-sdk-text-converter
+author:              Yusuke Nomura <yunomu@gmail.com>
+maintainer:          Yusuke Nomura <yunomu@gmail.com>
+category:            Web
+build-type:          Simple
+cabal-version:       >=1.10
+
+library
+  exposed-modules:     Cloud.AWS.Lib.FromText
+                     , Cloud.AWS.Lib.ToText
+  ghc-options:         -Wall -fno-warn-unused-do-bind
+  default-extensions:  OverloadedStrings
+  build-depends:       base == 4.*
+                     , template-haskell
+                     , bytestring
+                     , text
+                     , time
+                     , old-locale
+                     , strptime
+                     , safe
+                     , iproute
+  default-language:    Haskell2010
+
+test-suite spec
+  type:                exitcode-stdio-1.0
+  hs-source-dirs:      ., test
+  main-is:             Spec.hs
+  ghc-options:         -Wall
+  default-extensions:  OverloadedStrings
+  default-language:    Haskell2010
+  build-depends:       base == 4.*
+                     , template-haskell
+                     , bytestring
+                     , text
+                     , time
+                     , old-locale
+                     , strptime
+                     , safe
+                     , iproute
+                     , hspec
+                     , QuickCheck
+                     , HUnit
diff --git a/test/Spec.hs b/test/Spec.hs
new file mode 100644
--- /dev/null
+++ b/test/Spec.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE FlexibleInstances, TemplateHaskell #-}
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+import Control.Applicative
+import Data.IP
+import Data.Time
+import Test.Hspec
+import Test.HUnit
+import Test.Hspec.QuickCheck
+import Test.QuickCheck
+
+import Cloud.AWS.Lib.FromText
+import Cloud.AWS.Lib.ToText
+
+prop_class :: (Eq a, FromText a, ToText a) => a -> Bool
+prop_class a = fromText (toText a) == Just a
+
+instance Arbitrary Day where
+    arbitrary = ModifiedJulianDay <$> arbitrary
+
+instance Arbitrary DiffTime where
+    arbitrary = secondsToDiffTime <$> choose (0, 60*60*24-1)
+
+instance Arbitrary UTCTime where
+    arbitrary = UTCTime <$> arbitrary <*> arbitrary
+
+instance Arbitrary IPv4 where
+    arbitrary = toIPv4 <$> vectorOf 4 (choose (0,255))
+
+instance Arbitrary (AddrRange IPv4) where
+    arbitrary = makeAddrRange <$> arbitrary <*> choose (0, 32)
+
+prop_mclass :: (Eq a, FromText a, ToText a) => a -> Bool
+prop_mclass a = fromText (toText a) == Just (Just a)
+
+testNothing :: IO ()
+testNothing = (fromText "" :: Maybe Int) @=? Nothing
+
+data A = B | C deriving (Eq, Show)
+
+instance ToText A where
+    toText B = "ab"
+    toText C = "ac"
+
+deriveFromText "A" ["ab", "ac"]
+
+instance Arbitrary A where
+    arbitrary = elements [B, C]
+
+main :: IO ()
+main = hspec $ do
+    describe "Cloud.AWS.Lib.{FromText,ToText}" $ do
+        prop "Int" (prop_class :: Int -> Bool)
+        prop "Integer" (prop_class :: Integer -> Bool)
+        prop "Double" (prop_class :: Double -> Bool)
+        prop "Bool" (prop_class :: Bool -> Bool)
+        prop "UTCTime" (prop_class :: UTCTime -> Bool)
+        prop "IPv4" (prop_class :: IPv4 -> Bool)
+        prop "AddrRange IPv4" (prop_class :: AddrRange IPv4 -> Bool)
+        prop "Maybe Int" (prop_mclass :: Int -> Bool)
+        it "convert Nothing" testNothing
+        prop "deriveFromText" (prop_class :: A -> Bool)
