diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,31 @@
+Copyright (c) 2013, Jinjing Wang
+
+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 Jinjing Wang 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/Nemesis b/Nemesis
new file mode 100644
--- /dev/null
+++ b/Nemesis
@@ -0,0 +1,28 @@
+import System.Nemesis.Titan
+import System.Nemesis.Env
+import Air.Env
+import Prelude ()
+
+main = run - do
+  
+  clean
+    [ "**/*.hi"
+    , "**/*.o"
+    , "manifest"
+    ]
+    
+  desc "prepare cabal dist"
+  task "dist" - do
+    sh "cabal clean"
+    sh "cabal configure"
+    sh "cabal sdist"
+
+  desc "run shell"
+  task "i" - do
+    sh "ghci -isrc -XTemplateHaskell src/Test.hs"
+    
+
+  
+  titan "Test.hs"
+  
+  task "t:Test/titan" - return ()
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,3 @@
+import Distribution.Simple
+main = defaultMain
+ 
diff --git a/air-spec.cabal b/air-spec.cabal
new file mode 100644
--- /dev/null
+++ b/air-spec.cabal
@@ -0,0 +1,27 @@
+Name:                 air-spec
+Version:              2013.7.1
+Build-type:           Simple
+Synopsis:             air spec helper
+Description:          wrapper around shouldBe so error message is Unicode aware
+License:              BSD3
+Author:               Jinjing Wang
+Maintainer:           Jinjing Wang <nfjinjing@gmail.com>
+Build-Depends:        base
+Cabal-version:        >= 1.2
+category:             Development
+license-file:         LICENSE
+homepage:             https://github.com/nfjinjing/air-spec
+data-files:           Nemesis
+
+library
+
+  build-depends:  
+                  base >= 4 && < 99
+                , text
+                , hspec
+
+  hs-source-dirs: src/
+
+  exposed-modules:  
+                    Air.Data.PlainShow
+                  , Air.Spec
diff --git a/src/Air/Data/PlainShow.hs b/src/Air/Data/PlainShow.hs
new file mode 100644
--- /dev/null
+++ b/src/Air/Data/PlainShow.hs
@@ -0,0 +1,31 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE OverlappingInstances #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+
+
+module Air.Data.PlainShow where
+
+import Data.Text (Text, unpack)
+
+class (Show a) => PlainShow a where
+    plainShow :: a -> String
+
+instance PlainShow String where 
+  plainShow x = x
+
+instance PlainShow Char where 
+  plainShow x = [x]
+
+instance PlainShow Text where
+  plainShow = unpack
+
+instance (Show a) => PlainShow a where 
+  plainShow = show
+
+
+newtype PlainShowWrapper a = PlainShowWrapper {unPlainShowWrapper :: a }
+  deriving (Eq)
+
+instance (PlainShow a) => Show (PlainShowWrapper a) where
+  show (PlainShowWrapper x) = plainShow x
diff --git a/src/Air/Spec.hs b/src/Air/Spec.hs
new file mode 100644
--- /dev/null
+++ b/src/Air/Spec.hs
@@ -0,0 +1,14 @@
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE OverlappingInstances #-}
+{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE TypeSynonymInstances #-}
+
+
+module Air.Spec where
+
+import Air.Data.PlainShow
+import Test.Hspec (shouldBe, Expectation)
+
+(===) :: (PlainShow a, Eq a) => a -> a -> Expectation
+x === y = (PlainShowWrapper x) `shouldBe` (PlainShowWrapper y)
+infixr 0 ===
