diff --git a/Examples/TestPP.hs b/Examples/TestPP.hs
new file mode 100644
--- /dev/null
+++ b/Examples/TestPP.hs
@@ -0,0 +1,20 @@
+{-# OPTIONS_GHC -F -pgmF qapp #-}
+{-# LANGUAGE FlexibleInstances #-}
+
+module Examples.TestPP where
+import QuickAnnotate
+ 
+data D a =
+  C1  
+  |C2  a  
+  |Ann  Loc  (D a)  
+  deriving Show
+           
+instance Annotatable (D a) where annotate = Ann
+                         
+instance Annotatable ([Char]) where annotate loc d = d ++ (show loc)                          
+
+t = " hello "
+
+test =   C2 1
+main = print test
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c)2012, Shayan Najd
+
+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 Shayan Najd 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/QuickAnnotate.cabal b/QuickAnnotate.cabal
new file mode 100644
--- /dev/null
+++ b/QuickAnnotate.cabal
@@ -0,0 +1,22 @@
+Name:                QuickAnnotate
+Version:             0.1
+Synopsis:            Annotation Framework
+Homepage:            darcs repository    http://code.haskell.org/QuickAnnotate/
+License:             BSD3 
+License-file:        LICENSE
+Author:              Shayan Najd
+Maintainer:          sh.najd@gmail.com
+Category:            Development
+Build-type:          Simple
+Cabal-version:       >=1.2
+description:         A framework introducing annotation by preprocessing 
+
+Executable qapp
+    Main-is: QuickAnnotate/Preprocessor.hs             
+    Build-depends: base >= 4 && < 4.5,       
+                   haskell-src-exts >= 1.11.1 &&  < 1.12	
+    Other-modules: Examples.TestPP       
+   
+Library 
+  Exposed-modules: QuickAnnotate  
+  Build-depends: base >= 4 && < 4.5       
diff --git a/QuickAnnotate.hs b/QuickAnnotate.hs
new file mode 100644
--- /dev/null
+++ b/QuickAnnotate.hs
@@ -0,0 +1,17 @@
+{-# LANGUAGE FlexibleInstances  #-}
+{-# LANGUAGE IncoherentInstances #-}
+{-# LANGUAGE OverlappingInstances #-}
+
+module QuickAnnotate where 
+
+type Loc = String           
+
+class Annotatable a  where        
+  annotate :: Loc -> a -> a 
+
+instance Annotatable a where
+  annotate _ =  id
+
+instance Annotatable b => Annotatable (a -> b) where
+  annotate l f = \x -> annotate l (f x)  
+
diff --git a/QuickAnnotate/Preprocessor.hs b/QuickAnnotate/Preprocessor.hs
new file mode 100644
--- /dev/null
+++ b/QuickAnnotate/Preprocessor.hs
@@ -0,0 +1,65 @@
+--module QuickAnnotate.Preprocessor  where
+
+import Language.Haskell.Exts
+import System.Environment (getArgs)
+
+
+annotationFunction :: String
+annotationFunction = "annotate"
+
+-- | Borrowed from HRX project         
+main :: IO ()
+main = do args <- getArgs
+          case args of
+            [origfile, infile, outfile] -> transformFile origfile infile outfile
+            [infile, outfile] -> transformFile infile infile outfile
+            [infile] -> testFile infile
+            _ -> putStrLn usageString
+
+usageString :: String
+usageString = "Usage: pp <infile> [<outfile>]"
+
+
+transformFile :: String -> String -> String -> IO ()
+transformFile origfile infile outfile = do
+        f <- readFile infile
+        let fm = process origfile f
+        writeFile outfile fm
+
+testFile :: String -> IO ()
+testFile file = do
+        f <- readFile file
+        putStrLn $ process file f
+
+process :: FilePath -> String -> String
+process fp fc = let  mode = ParseMode {
+                       parseFilename =  fp,
+                       extensions = [],
+                       ignoreLanguagePragmas = False,
+                       ignoreLinePragmas = True,
+                       fixities = Just preludeFixities
+                       }
+                     ParseOk s = parseFileContentsWithMode mode fc
+                in prettyPrint $ transModule $ s
+ 
+transModule :: Module -> Module
+transModule (Module srcLoc moduleName modulePragmas mWarningText mExportSpecs importDecls decs) 
+  = Module srcLoc moduleName modulePragmas mWarningText mExportSpecs importDecls (transDecl `map` decs)
+
+transDecl :: Decl -> Decl         
+transDecl (FunBind mtchs) = FunBind  (transMatch`map`mtchs)
+transDecl (PatBind srcLoc pat mtype rhs binds) = PatBind srcLoc pat mtype (transRhs srcLoc rhs) binds
+transDecl x = x 
+
+transMatch :: Match -> Match
+transMatch (Match srcLoc n ps mts rhs binds) =Match srcLoc n ps mts (transRhs srcLoc rhs) binds
+
+transRhs :: SrcLoc -> Rhs -> Rhs
+transRhs srcLoc (UnGuardedRhs exp)        = UnGuardedRhs (transExp srcLoc exp)
+transRhs _      (GuardedRhss  guardedRhss)= GuardedRhss  (transG `map` guardedRhss)
+
+transG :: GuardedRhs -> GuardedRhs
+transG (GuardedRhs gSrcLoc stmts exp) = GuardedRhs gSrcLoc stmts (transExp gSrcLoc exp)
+
+transExp :: SrcLoc -> Exp -> Exp
+transExp loc exp = (App (App (Var (UnQual (Ident annotationFunction))) (Lit (String $ show loc))) (Paren exp))
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
