diff --git a/air.cabal b/air.cabal
--- a/air.cabal
+++ b/air.cabal
@@ -1,5 +1,5 @@
 Name:                 air
-Version:              2011.6.12
+Version:              2011.6.18
 Build-type:           Simple
 Synopsis:             air
 Description:          An alternative Haskell Prelude library.
@@ -35,7 +35,9 @@
                     Air
                   , Air.Light
                   , Air.Env
-                  , Air.Here.TH
+                  , Air.TH.Here
+                  , Air.TH.Default
+                  , Air.TH.Air
                   , Air.TH
                   , Air.Control.Monad.ListBuilder
                   , Air.Control.Monad.ObjectBuilder
diff --git a/src/Air/Here/TH.hs b/src/Air/Here/TH.hs
deleted file mode 100644
--- a/src/Air/Here/TH.hs
+++ /dev/null
@@ -1,16 +0,0 @@
--- {-# LANGUAGE CPP #-}
-
-module Air.Here.TH where
-
-import Language.Haskell.TH.Quote 
-import Language.Haskell.TH.Syntax 
-import Language.Haskell.TH.Lib 
-
-
-here :: QuasiQuoter 
-here = 
-  QuasiQuoter 
-    {
-      quoteExp = litE . stringL
-    , quotePat = litP . stringL
-    }
diff --git a/src/Air/TH.hs b/src/Air/TH.hs
--- a/src/Air/TH.hs
+++ b/src/Air/TH.hs
@@ -1,8 +1,12 @@
 module Air.TH (
     module Air.Data.Record.SimpleLabel
-  , module Air.Here.TH
+  , module Air.TH.Here
+  , module Air.TH.Default
+  , module Air.TH.Air
 ) where
 
 import Air.Data.Record.SimpleLabel
-import Air.Here.TH
+import Air.TH.Here
+import Air.TH.Default
+import Air.TH.Air
 
diff --git a/src/Air/TH/Air.hs b/src/Air/TH/Air.hs
new file mode 100644
--- /dev/null
+++ b/src/Air/TH/Air.hs
@@ -0,0 +1,18 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module Air.TH.Air where
+
+import Language.Haskell.TH
+import Control.Monad (replicateM)
+
+
+{-
+> $(tuple 3) [1,2,3,4,5]
+ (1,2,3)
+ > $(tuple 2) [1,2]
+ (1,2)
+-}
+tuple :: Int -> ExpQ
+tuple n = do
+    ns <- replicateM n (newName "x")
+    lamE [foldr (\x y -> conP '(:) [varP x,y]) wildP ns] (tupE $ map varE ns)
diff --git a/src/Air/TH/Default.hs b/src/Air/TH/Default.hs
new file mode 100644
--- /dev/null
+++ b/src/Air/TH/Default.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE TemplateHaskell #-}
+
+module Air.TH.Default where
+
+import Language.Haskell.TH
+import Data.Default
+
+
+-- $(reify ''Dummy >>= show > stringE)
+-- "TyConI (DataD [] Main.Dummy [] [RecC Main.Dummy [(Main.test_field_1,NotStrict,ConT GHC.Base.String),(Main.test_field_2,NotStrict,ConT GHC.Integer.Type.Integer)]] [])"
+
+-- runQ [d| instance Default Dummy where def = Dummy def def |]
+-- [InstanceD [] (AppT (ConT Data.Default.Default) (ConT Main.Dummy)) [ValD (VarP def) (NormalB (AppE (AppE (ConE Main.Dummy) (VarE def)) (VarE def))) []]]
+
+-- runQ [d| instance Default Dummy where def = Dummy {test_field_1 = def, test_field_2 = def} |]
+-- [InstanceD [] (AppT (ConT Data.Default.Default) (ConT Main.Dummy)) [ValD (VarP def) (NormalB (RecConE Main.Dummy [(Main.test_field_1,VarE def),(Main.test_field_2,VarE def)])) []]]
+
+
+mkDefault :: Name -> Q [Dec]
+mkDefault name = do
+  info <- reify name
+  case info of
+    TyConI x -> do
+      case x of
+        (DataD _ data_name _ recs _)  -> do
+          case recs of
+            [] -> error $ "no phontom type"
+            (RecC record_name fields):_ -> do
+              let def_name = mkName "def"
+              let def_fields = map (\(field_name, _, _) -> (field_name, VarE def_name)) fields
+              return $ return $ 
+                InstanceD [] 
+                  (AppT (ConT ''Default) (ConT data_name)) 
+                  [ValD (VarP def_name) (NormalB (RecConE record_name def_fields)) []]
+        NewtypeD _ _ _ _ _ -> error "Newtypes are not supported"
+        _ -> error $ "Unknown declaration type"
+    _        -> error "Only datatypes can be processed"
diff --git a/src/Air/TH/Here.hs b/src/Air/TH/Here.hs
new file mode 100644
--- /dev/null
+++ b/src/Air/TH/Here.hs
@@ -0,0 +1,18 @@
+-- {-# LANGUAGE CPP #-}
+
+module Air.TH.Here where
+
+import Language.Haskell.TH.Quote 
+import Language.Haskell.TH.Syntax 
+import Language.Haskell.TH.Lib 
+
+
+here :: QuasiQuoter 
+here = 
+  QuasiQuoter 
+    {
+      quoteExp = litE . stringL
+    , quotePat = litP . stringL
+    }
+
+
