diff --git a/CabalGHCI.hs b/CabalGHCI.hs
new file mode 100644
--- /dev/null
+++ b/CabalGHCI.hs
@@ -0,0 +1,13 @@
+module Main where
+
+import Distribution.Dev.Interactive
+
+import System.Environment
+import System.Process
+
+main = do
+  args ← getArgs
+  withOpts args putStrLn $ 
+        \opts → do
+          putStrLn $ "Executing ghci with the following options: " ++ unwords opts
+          rawSystem "ghci" opts >> return ()
diff --git a/Distribution/Dev/Interactive.hs b/Distribution/Dev/Interactive.hs
new file mode 100644
--- /dev/null
+++ b/Distribution/Dev/Interactive.hs
@@ -0,0 +1,106 @@
+module Distribution.Dev.Interactive ( 
+  cabalSet, packageOpts, loadCabal, lookForCabalFile, withOpts
+  ) where
+
+import Distribution.Text
+import Distribution.Compiler
+import Distribution.Verbosity
+import Distribution.System
+import Distribution.Package
+import Distribution.PackageDescription
+import Distribution.PackageDescription.Parse
+import Distribution.PackageDescription.Configuration
+
+import System.FilePath
+import System.Directory
+import System.Info
+import Data.Maybe
+
+data LoadCabalRet =
+  NoCabalFile |
+  MissingDeps [Dependency] |
+  Pkg FilePath PackageDescription
+  deriving Show
+
+pkgDescr (Pkg _ p) = p
+
+compiler = CompilerId buildCompilerFlavor compilerVersion
+
+packageOpts ∷ FilePath → PackageDescription → String → Maybe [String]
+packageOpts path pkg executable =
+  maybe Nothing (\bi → Just $ includeOpts path bi ++ extensionOpts bi ++ customOpts bi) $
+  listToMaybe $
+    if executable == ""
+    then allBuildInfo pkg
+    else
+      fmap buildInfo .
+      filter (\x → exeName x == executable) .
+      executables $ pkg
+
+customOpts bi = 
+  hcOptions buildCompilerFlavor bi
+
+extensionOpts bi =
+  map (\x → "-X" ++ display x) $ allExtensions bi
+
+includeOpts path bi =
+  ["-i" ++ dir ++ "/dist/build/autogen"] ++
+  map (("-i"++) . combine dir) (hsSourceDirs bi)
+   where dir = takeDirectory path
+
+loadCabal ∷ FilePath → FlagAssignment → IO LoadCabalRet
+loadCabal path flags = do
+  mCabalFile ← lookForCabalFile =<< canonicalizePath path
+  flip (maybe (return NoCabalFile))
+    mCabalFile $ \cabalFile → do
+    gdescr ← readPackageDescription normal cabalFile
+    case finalizePackageDescription flags (const True)
+      buildPlatform compiler [] gdescr of
+        Left deps → return $ MissingDeps deps
+        Right (descr, _) → return $ Pkg cabalFile descr
+
+ifM ∷ Monad m ⇒ m Bool → m a → m a → m a
+ifM a b c = a >>= \x → if x then b else c
+                                        
+lookForCabalFile "/" = return Nothing
+lookForCabalFile path = do
+  files ← getDirectoryContents path
+  let cabals = filter (\f →
+                        takeExtension f == ".cabal"
+                        && f /= ".cabal") files
+  case cabals of
+    [] → lookForCabalFile (takeDirectory path)
+    [a] → return $ Just $ combine path a
+    _ → return Nothing
+
+cabalSet ∷ String → IO String
+cabalSet args =
+  withOpts (words args)
+    (\x → putStrLn x >> return "")
+    ((\x → putStrLn x >> return x) .
+        unlines . (map (":set "++)) . map show )
+
+withOpts args err go = do
+  let (flags, executable) = parseArgs args
+  here ← getCurrentDirectory
+  ret ← loadCabal here flags
+  case ret of
+    NoCabalFile → err "Current directory is not a cabal project"
+    MissingDeps deps → err $ "Missing dependencies: " ++ unwords (map show deps)
+    Pkg path descr → do
+      let mopts = packageOpts path descr executable
+      case mopts of
+        Nothing → err (
+          if executable /= ""
+          then "No such executable in cabal file"
+          else "No library defined in cabal file")
+        Just opts → go opts
+
+parseArgs args =
+  (map (makeFlag . drop 2) . filter flag $ args, 
+   fromMaybe "" . listToMaybe . filter (not . flag) $ args)
+  where
+    flag x = take 2 x == "-f"
+        
+makeFlag ('-':f) = (FlagName f, False)
+makeFlag f = (FlagName f, True)
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c)2011, Etienne Laurin
+
+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 Etienne Laurin 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/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/cabal-ghci.cabal b/cabal-ghci.cabal
new file mode 100644
--- /dev/null
+++ b/cabal-ghci.cabal
@@ -0,0 +1,42 @@
+Name:                cabal-ghci
+Version:             0.1
+Synopsis:            Set up ghci with options taken from a .cabal file
+Description:
+  The executable cabal-ghci runs ghci with the paths and extensions needed by a cabal project.
+
+  The cabalSet function can be added to your .ghci to provide the same functionality at runtime, giving you more control over the options that are set:
+
+  :m + Distribution.Dev.Interactive
+  :def cabalset cabalSet
+  :cabalset
+
+  Both cabal-ghci and cabalset can take cabal flags and an executable name as arguments. For example:
+
+  Prelude> :cabalset -fdevel up1
+  :set "-i/home/atnnn/up1/src/dist/build/autogen"
+  :set "-i/home/atnnn/up1/src/web"
+  :set "-XTypeFamilies"
+  :set "-XQuasiQuotes"
+
+Homepage:            http://code.atnnn.com/projects/cabal-ghci/wiki
+License:             BSD3
+License-file:        LICENSE
+Author:              Etienne Laurin
+Maintainer:          etienne@atnnn.com
+Category:            Development
+Build-type:          Simple
+Cabal-version:       >=1.6
+
+Source-repository head
+    type: darcs
+    location: http://code.atnnn.com/darcs/cabal-ghci/
+
+Executable cabal-ghci
+  Main-is: CabalGHCI.hs
+  extensions: UnicodeSyntax
+  build-depends: process
+
+Library
+  Exposed-modules: Distribution.Dev.Interactive
+  Build-depends: Cabal, base == 4.*, directory, filepath
+  extensions: UnicodeSyntax
