diff --git a/BSD3.txt b/BSD3.txt
new file mode 100644
--- /dev/null
+++ b/BSD3.txt
@@ -0,0 +1,24 @@
+Copyright (c) 2010, Oscar Finnsson
+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 Oscar Finnsson nor the
+      names of its 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 Oscar Finnsson 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.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,6 @@
+#!/usr/bin/runhaskell 
+> module Main where
+> import Distribution.Simple
+> main :: IO ()
+> main = defaultMain
+
diff --git a/language-haskell-extract.cabal b/language-haskell-extract.cabal
new file mode 100644
--- /dev/null
+++ b/language-haskell-extract.cabal
@@ -0,0 +1,79 @@
+name: language-haskell-extract
+version: 0.1.2
+cabal-version: -any
+build-type: Simple
+license: BSD3
+license-file: "BSD3.txt"
+maintainer: Oscar Finnsson
+build-depends: base >= 4 && < 5, haskell98, regex-posix, haskell-src-exts, template-haskell
+stability: stable
+homepage: http://github.com/finnsson/template-helper
+package-url:
+bug-reports:
+synopsis: Module to automatically extract functions from the local code.
+description:
+   @language-haskell-extract@ contains some useful helper functions on top of Template Haskell.
+   .
+   @functionExtractor@ extracts all functions after a regexp-pattern.
+   .
+   > foo = "test"
+   > boo = "testing"
+   > bar = $(functionExtractor "oo$")
+   .  
+   will automagically extract the functions ending with @oo@ such as
+   . 
+   > bar = [("foo",foo), ("boo",boo)]
+   .
+   This can be useful if you wish to extract all functions beginning with test (for a test-framework)
+   or all functions beginning with wc (for a web service).
+   .
+   @functionExtractorMap@ works like @functionsExtractor@ but applies a function over all function-pairs.
+   .
+   This functions is useful if the common return type of the functions is a type class.
+   .
+   Example:
+   .
+   > secondTypeclassTest =
+   >   do let expected = ["45", "88.8", "\"hej\""]
+   >          actual = $(functionExtractorMap "^tc" [|\n f -> show f|] )
+   >      expected @=? actual
+   > 
+   > tcInt :: Integer
+   > tcInt = 45
+   > 
+   > tcDouble :: Double
+   > tcDouble = 88.8
+   > 
+   > tcString :: String
+   > tcString = "hej"
+category: Template Haskell
+author: Oscar Finnsson & Emil Nordling
+tested-with:
+data-files:
+data-dir: ""
+extra-source-files:
+extra-tmp-files:
+exposed-modules: Language.Haskell.Extract 
+exposed: True
+buildable: True
+build-tools:
+cpp-options:
+cc-options:
+ld-options:
+pkgconfig-depends:
+frameworks:
+c-sources:
+extensions:
+extra-libraries:
+extra-lib-dirs:
+includes:
+install-includes:
+include-dirs:
+hs-source-dirs: src
+other-modules:
+ghc-prof-options:
+ghc-shared-options:
+ghc-options:
+hugs-options:
+nhc98-options:
+jhc-options:
diff --git a/src/Language/Haskell/Extract.hs b/src/Language/Haskell/Extract.hs
new file mode 100644
--- /dev/null
+++ b/src/Language/Haskell/Extract.hs
@@ -0,0 +1,86 @@
+module Language.Haskell.Extract (
+  functionExtractor,
+  functionExtractorMap,
+  locationModule
+) where
+import Language.Haskell.TH
+import Language.Haskell.Exts.Parser
+import Language.Haskell.Exts.Syntax
+import Text.Regex.Posix
+import Maybe
+import Language.Haskell.Exts.Extension
+
+extractAllFunctions :: String -> String-> [String]
+extractAllFunctions pattern  = 
+  allMatchingFunctions pattern . parsedModule
+
+parsedModule moduleCode = 
+  let pMod = parseModuleWithMode ( ParseMode "test" [TemplateHaskell] False False [] ) moduleCode
+      moduleOrDefault (ParseFailed _ _) = Module (SrcLoc "unknown" 1 1) (ModuleName "unknown") [] Nothing Nothing [] []
+      moduleOrDefault (ParseOk m) = m
+  in moduleOrDefault pMod 
+
+allFunctions =  onlyJust extractNameOfFunctionFromDecl . hsModuleDecls 
+allMatchingFunctions pattern = filter (\f->f=~pattern::Bool) . allFunctions 
+
+
+
+extractNameOfFunctionFromDecl :: Decl -> Maybe String
+extractNameOfFunctionFromDecl (PatBind _ (PVar (Ident n)) _ _ _ ) = Just n
+extractNameOfFunctionFromDecl (FunBind ms) = Just $ head $ [n | (Language.Haskell.Exts.Syntax.Match _ (Ident n) _ _ _ _)  <- ms]
+extractNameOfFunctionFromDecl _ = Nothing
+
+onlyJust f = map fromJust . filter isJust . map f
+
+hsModuleDecls (Module _ _ _ _ _ _ d) = d
+
+-- | Extract the names and functions from the module where this function is called.
+-- 
+--  > foo = "test"
+--  > boo = "testing"
+--  > bar = $(functionExtractor "oo$")
+-- 
+-- will automagically extract the functions ending with "oo" such as
+-- 
+-- > bar = [("foo",foo), ("boo",boo)]
+functionExtractor :: String -> ExpQ
+functionExtractor pattern =
+  do loc <- location
+     moduleCode <- runIO $ readFile $ loc_filename loc
+     let functions = extractAllFunctions pattern moduleCode
+         makePair n = TupE [ LitE $ StringL n , VarE $ mkName n]
+     return $ ListE $ map makePair functions
+
+
+-- | Extract the names and functions from the module and apply a function to every pair.
+-- 
+-- Is very useful if the common denominator of the functions is just a type class.
+--
+-- > secondTypeclassTest =
+-- >   do let expected = ["45", "88.8", "\"hej\""]
+-- >          actual = $(functionExtractorMap "^tc" [|\n f -> show f|] )
+-- >      expected @=? actual
+-- > 
+-- > tcInt :: Integer
+-- > tcInt = 45
+-- > 
+-- > tcDouble :: Double
+-- > tcDouble = 88.8
+-- > 
+-- > tcString :: String
+-- > tcString = "hej"
+functionExtractorMap :: String -> ExpQ -> ExpQ
+functionExtractorMap pattern funcName =
+  do loc <- location
+     moduleCode <- runIO $ readFile $ loc_filename loc
+     let functions :: [String]
+         functions = extractAllFunctions pattern moduleCode
+     fn <- funcName
+     let makePair n = AppE (AppE (fn) (LitE $ StringL n)) (VarE $ mkName n)
+     return $ ListE $ map makePair functions 
+
+-- | Extract the name of the current module.
+locationModule :: ExpQ
+locationModule =
+  do loc <- location
+     return $ LitE $ StringL $ loc_module loc
