diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+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.
+
+  * The names of its contributors may not 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.lhs b/Setup.lhs
new file mode 100644
--- /dev/null
+++ b/Setup.lhs
@@ -0,0 +1,8 @@
+#!/usr/bin/env runhaskell
+
+> module Main (main) where
+>
+> import Distribution.Simple
+>
+> main :: IO ()
+> main = defaultMain
diff --git a/cabal2nix.cabal b/cabal2nix.cabal
new file mode 100644
--- /dev/null
+++ b/cabal2nix.cabal
@@ -0,0 +1,33 @@
+Name:                   cabal2nix
+Version:                1.0
+Copyright:              (c) 2011 Peter Simons
+License:                BSD3
+License-File:           LICENSE
+Author:                 Peter Simons <simons@cryp.to>
+Maintainer:             Peter Simons <simons@cryp.to>
+Homepage:               http://github.com/peti/cabal2nix
+Category:               Distribution
+Synopsis:               Convert Cabal files into Nix build instructions
+Cabal-Version:          >= 1.6
+Build-Type:             Simple
+Tested-With:            GHC == 7.0.2
+Description:            This utility converts Cabal files into Nix build
+			instructions. Run the binary as follows:
+			.
+			> cabal2nix foo.cabal 57ae0330a3d0520bae3d1e447d7d5c88de9ecbf0de133f31f2cc42961c81d47f
+			.
+			The first argument is the path to the cabal file
+			to be converted, the second argument is the
+			SHA256 hash of the corresponding source tarball.
+			.
+			The Nix build instructions will be written to
+			stdout.
+
+Source-Repository head
+  Type:                 git
+  Location:             git://github.com/peti/cabal2nix.git
+
+Executable cabal2nix
+  main-is:              cabal2nix.hs
+  Build-Depends:        base >= 3 && < 5, Cabal
+  Ghc-Options:          -Wall
diff --git a/cabal2nix.hs b/cabal2nix.hs
new file mode 100644
--- /dev/null
+++ b/cabal2nix.hs
@@ -0,0 +1,114 @@
+-- cabal2nix.hs
+--
+-- Copyright (c) 20011 Peter Simons <simons@cryp.to>
+-- See LICENSE file for licensing details.
+
+module Main ( main ) where
+
+import System.IO
+import System.Environment
+import Control.Exception
+import System.Exit
+import Distribution.PackageDescription.Parse
+import Distribution.Verbosity ( silent )
+import Distribution.PackageDescription
+import Distribution.Package
+import Distribution.License
+import Data.Version
+import Data.List
+import Control.Monad
+import Data.Char
+
+type PkgName = String
+type PkgVersion = [Int]
+type PkgSHA256 = String
+type PkgURL = String
+type PkgDescription = String
+type PkgLicense = License
+type PkgDependencies = [CondTree ConfVar [Dependency] ()]
+type PkgExtraLibs = [String]
+
+data Pkg = Pkg PkgName PkgVersion PkgSHA256 PkgURL PkgDescription PkgLicense PkgDependencies PkgExtraLibs
+  deriving (Show)
+
+toNixName :: String -> String
+toNixName name = f name
+  where
+    f []                            = []
+    f ('-':c:cs) | c `notElem` "-"  = toUpper c : f cs
+    f ('-':_)                       = error ("unexpected package name " ++ show name)
+    f (c:cs)                        = c : f cs
+
+toNix :: Pkg -> String
+toNix (Pkg name ver sha256 url desc lic deps libs) =
+       "{" ++ exprArgs ++"}:\n\n"
+    ++ "cabal.mkDerivation (self : {\n"
+    ++ "  pname = " ++ show name ++ ";\n"
+    ++ "  version = \"" ++ showVer ++ "\";\n"
+    ++ "  sha256 = " ++ show sha256 ++ ";\n"
+    ++ "  propagatedBuildInputs = [" ++ depList ++ "];\n"
+    ++ "  meta = {\n"
+    ++ "    homepage = \"" ++ url ++ "\";\n"
+    ++ "    description = " ++ show desc ++ ";\n"
+    ++ "    license = " ++ showLic lic ++ ";\n"
+    ++ "  };\n"
+    ++ "})\n"
+    where
+      exprArgs = concat (intersperse "," ((if "cabal" `notElem` pkgDeps then ["cabal"] else []) ++ pkgDeps))
+      showVer = concat (intersperse "." (map show ver))
+      depList = concat (intersperse " " pkgDeps)
+      pkgDeps :: [String]
+      pkgDeps = map toNixName $
+                  nub $ sort $ libs ++
+                    [ n | dep <- deps, Dependency (PackageName n) _ <- condTreeConstraints dep
+                        , n `notElem` ["base","containers"]
+                    ]
+      showLic (GPL Nothing)                     = show "GPL"
+      showLic (GPL (Just (Version [2] [])))     = "self.stdenv.lib.licenses.gpl2"
+      showLic (GPL (Just (Version [3] [])))     = "self.stdenv.lib.licenses.gpl3"
+      showLic (LGPL Nothing)                    = show "LGPL"
+      showLic (LGPL (Just (Version [2,1] [])))  = "self.stdenv.lib.licenses.lgpl21"
+      showLic (LGPL (Just (Version [3] [])))    = "self.stdenv.lib.licenses.lgpl3"
+      showLic BSD3                              = "self.stdenv.lib.licenses.bsd3"
+      showLic BSD4                              = "self.stdenv.lib.licenses.bsd4"
+      showLic MIT                               = "self.stdenv.lib.licenses.mit"
+      showLic PublicDomain                      = "self.stdenv.lib.licenses.publicDomain"
+      showLic AllRightsReserved                 = "unknown"
+      showLic OtherLicense                      = "unknown"
+      showLic l                                 = error $ "unknown license: " ++ show l
+
+readPackage :: FilePath -> String -> IO Pkg
+readPackage cabalFile sha256 = do
+  cabal <- readPackageDescription silent cabalFile
+  let pkg = packageDescription cabal
+      PackageName pkgname = pkgName (package pkg)
+      pkgver = versionBranch (pkgVersion (package pkg))
+      lic = license pkg
+      url = homepage pkg
+      desc = synopsis pkg
+      -- globalDeps = buildDepends pkg
+      libDeps = maybe [] (\x -> [x]) (condLibrary cabal)
+      exeDeps = [ tree | (_,tree) <- condExecutables cabal ]
+      libs = concat [ extraLibs (libBuildInfo (condTreeData x)) | x <- libDeps ]
+      libs' = concat [ extraLibs (buildInfo (condTreeData x)) | x <- exeDeps ]
+  return (Pkg pkgname pkgver sha256 url desc lic (map simplify libDeps ++ map simplify exeDeps) (libs++libs'))
+    where
+
+simplify :: CondTree ConfVar [Dependency] a -> CondTree ConfVar [Dependency] ()
+simplify (CondNode _ deps nodes) = CondNode () deps (map simp nodes)
+  where
+    simp (cond,tree,mtree) = (cond, simplify tree, maybe Nothing (Just . simplify) mtree)
+
+main :: IO ()
+main = bracket (return ()) (\() -> hFlush stdout >> hFlush stderr) $ \() -> do
+  args <- getArgs
+
+  when (length args /= 2) $ do
+    mapM_ (hPutStrLn stderr) [ "*** invalid command line syntax"
+                             , "Usage: cabal2nix cabal-file sha256-hash"
+                             ]
+    exitFailure
+
+  let cabalFile:sha256:[] = args
+  pkg <- readPackage cabalFile sha256
+  putStr (toNix pkg)
