diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright Pepe Iborra (c) 2017
+
+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 Pepe Iborra 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/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,51 @@
+[![Travis Build Status](https://travis-ci.org/pepeiborra/debug-pp.svg)](https://travis-ci.org/pepeiborra/debug-pp)
+[![Hackage](https://img.shields.io/hackage/v/debug-pp.svg)](https://hackage.haskell.org/package/debug-pp)
+[![Stackage Nightly](http://stackage.org/package/debug-pp/badge/nightly)](http://stackage.org/nightly/package/debug-pp)
+# debug-pp
+
+A preprocessor for streamlining the `debug` instrumentation of a module or a package.
+
+Description
+---------------
+
+`debug-pp` is a Haskell source preprocessor that performs the steps a programmer would need to follow in order to debug a module with the [`debug`](http://hackage.haskell.org/package/debug) package. That is:
+* append an import for the `Debug` module, and 
+* wrap the body in a `debug` splice using a TH declaration quasiquote. 
+
+Usage
+--------
+```
+usage: debug-pp [FILENAME] [SOURCE] [DEST]
+Instrument Haskell module for debugging from SOURCE (derived from FILENAME) and write
+standard Haskell to DEST.
+If no FILENAME, use SOURCE as the original name.
+If no DEST or if DEST is `-', write to standard output.
+If no SOURCE or if SOURCE is `-', read standard input.
+```
+To instrument a module, add the following pragma to the top of the file:
+```
+{-# OPTIONS -F -pgmF debug-pp #-}
+```
+
+To instrument an entire program, add the following line to your stack descriptor, or if you don't use stack, to your cabal descriptor:
+```
+ghc-options: -F -pgmF debug-pp
+```
+
+In both cases you will also need to modify your Cabal descriptor in order to:
+* add a dependency on the `debug` package, and
+* add a build tool depends on `debug-pp` (required Cabal 2.0) :
+```
+Library
+  ...
+  build-tool-depends: debug-pp:debug-pp
+```
+
+Motivation
+-------------
+
+* Debugging individual functions is often impractical due to the declaration groups [restriction](http://ghc.readthedocs.io/en/8.0.1/glasgow_exts.html#ghc-flag--XTemplateHaskellQuotes) of Template Haskell. Therefore, it's often easier to debug an entire module.
+
+* However, error messages are much worse for TH quoted code. Errors like `Not in scope: data constructor Foo in line X` become `Not in scope: Foo, in the TH quotation ENTIRE MODULE HERE`. 
+
+* Personally, quoting/unquoting the module by hand is annoying. Having a preprocessor do this for me is convenient, and can be easily tied to a Cabal flag ora stack command line arg.
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/debug-pp.cabal b/debug-pp.cabal
new file mode 100644
--- /dev/null
+++ b/debug-pp.cabal
@@ -0,0 +1,31 @@
+-- This file has been generated from package.yaml by hpack version 0.20.0.
+--
+-- see: https://github.com/sol/hpack
+--
+-- hash: 961f3a1ce57f79aa77bfe78b26a463a2bab8121dbb2e495de793608f4dc714e4
+
+name:           debug-pp
+version:        0.1.0.0
+description:    A preprocessor to automate the debug instrumentation of a module
+category:       Debugging
+homepage:       https://github.com/pepeiborra/debug-hoed-pp#readme
+author:         Pepe Iborra
+maintainer:     pepeiborra@gmail.com
+copyright:      All Rights Reserved
+license:        BSD3
+license-file:   LICENSE
+build-type:     Simple
+cabal-version:  >= 1.10
+
+extra-source-files:
+    README.md
+
+executable debug-pp
+  main-is: Main.hs
+  hs-source-dirs:
+      src
+  build-depends:
+      base >=4.7 && <5
+  other-modules:
+      Paths_debug_pp
+  default-language: Haskell2010
diff --git a/src/Main.hs b/src/Main.hs
new file mode 100644
--- /dev/null
+++ b/src/Main.hs
@@ -0,0 +1,77 @@
+{-# LANGUAGE ViewPatterns #-}
+
+module Main (main) where
+
+import Control.Monad
+import Data.Char
+import Data.List
+import System.Environment
+import System.Exit
+import System.IO
+import Text.Printf
+
+usage :: String -> String
+usage progName = unlines [
+  "usage: " ++ progName ++
+  " [FILENAME] [SOURCE] [DEST]",
+  "Instrument Haskell module for debugging from SOURCE (derived from FILENAME) and write",
+  "standard Haskell to DEST.",
+  "If no FILENAME, use SOURCE as the original name.",
+  "If no DEST or if DEST is `-', write to standard output.",
+  "If no SOURCE or if SOURCE is `-', read standard input."
+  ]
+
+main :: IO ()
+main = do
+  args <- getArgs
+  progName <- getProgName
+  (orig, inp, out) <- case args of
+    ["--help"] -> do
+      putStrLn $ usage progName
+      exitSuccess
+    []     -> return ("input",Nothing,Nothing)
+    [i]    -> return (i, Just i, Nothing)
+    [i,o]  -> return (i, Just i, Just o)
+    [orig,i,o] -> return (orig, Just i, Just o)
+    _ -> do
+      putStrLn $ usage progName
+      error "Unrecognized set of command line arguments"
+  hIn  <- maybe (return stdin)  (`openFile` ReadMode) inp
+  hOut <- maybe (return stdout) (`openFile` WriteMode) out
+  contents <- hGetContents hIn
+  hPutStr hOut $ instrument contents
+  unless (hOut == stdout) $ hClose hOut
+
+instrument contents = unlines [top', modules', body']
+  where
+    (top,modules,body) = parseModule contents
+    modules' = unlines $ modules ++ ["import qualified Debug"]
+    top' =
+      unlines
+        $ "{-# LANGUAGE TemplateHaskell #-}"
+        : "{-# LANGUAGE PartialTypeSignatures #-}"
+        : "{-# LANGUAGE ViewPatterns #-}"
+        : "{-# OPTIONS -Wno-partial-type-signatures #-}"
+        : top
+    body' = unlines $ "Debug.debug [d|" : map indent (body ++ ["  |]"])
+
+parseModule contents = (top, modules, body)
+  where
+    isImportLine = ("import" `isPrefixOf`)
+    (top, rest) = break isImportLine (lines contents)
+    (reverse -> body0, reverse -> modules0) =
+      break (isImportLine . fst) (reverse $ annotateBlockComments rest)
+    body = map fst $ dropWhile snd body0
+    modules = map fst modules0 ++ map fst (takeWhile snd body0)
+
+indent it@('#':_) = it
+indent other = "  " ++ other
+
+annotateBlockComments :: [String] -> [(String, Bool)]
+annotateBlockComments = annotateBlockComments' False
+annotateBlockComments' _ [] = []
+annotateBlockComments' False (l:rest)
+    | "{-" `isInfixOf` l = (l,True) : annotateBlockComments' True rest
+    | otherwise = (l,False) : annotateBlockComments' False rest
+annotateBlockComments' True (l:rest) =
+  (l,True) : annotateBlockComments' (not $ "-}" `isInfixOf` l) rest
