diff --git a/cabal-debian.cabal b/cabal-debian.cabal
--- a/cabal-debian.cabal
+++ b/cabal-debian.cabal
@@ -1,5 +1,5 @@
 Name:           cabal-debian
-Version:        3.0.3
+Version:        3.0.4
 License:        BSD3
 License-File:   debian/copyright
 Author:         David Fox <dsf@seereason.com>
@@ -9,9 +9,6 @@
 Build-Type:     Simple
 Synopsis:       Create a debianization for a cabal package
 Cabal-Version: >= 1.8
-Extra-Source-Files:
-  debian/changelog,
-  debian/Debianize.hs
 Description:
  Tool for creating debianizations of Haskell packages based on the .cabal
  file.  If apt-file is installed it will use it to discover what is the
diff --git a/debian/Debianize.hs b/debian/Debianize.hs
deleted file mode 100644
--- a/debian/Debianize.hs
+++ /dev/null
@@ -1,49 +0,0 @@
-{-# LANGUAGE OverloadedStrings #-}
-import Debian.Debianize
-import Data.Lens.Lazy
-import Debian.Changes (ChangeLog(..), ChangeLogEntry(..))
-import Debian.Relation (BinPkgName(BinPkgName), Relation(Rel), VersionReq(SLT))
-import Debian.Version (parseDebianVersion)
-import Data.Map as Map (insertWith)
-import Data.Maybe (fromMaybe)
-import Data.Set as Set (insert, union, singleton)
-import Data.Text as Text (intercalate)
-
-main :: IO ()
-main =
-    do new <- debianization "."
-               (modL control (\ y -> y {homepage = Just "http://src.seereason.com/cabal-debian"}) $
-                setL changelog (Just log) $
-                setL compat (Just 7) $
-                setL standards (Just (StandardsVersion 3 9 3 Nothing)) $
-                setL sourceFormat (Just Native3) $
-                setL utilsPackageName (Just (BinPkgName "cabal-debian")) $
-                modL depends (Map.insertWith union (BinPkgName "cabal-debian") (singleton (Rel (BinPkgName "apt-file") Nothing Nothing))) $
-                modL conflicts (Map.insertWith union (BinPkgName "cabal-debian")
-                                      (singleton (Rel (BinPkgName "haskell-debian-utils") (Just (SLT (parseDebianVersion ("3.59" :: String)))) Nothing))) $
-                modL description (Map.insertWith (error "test7") (BinPkgName "cabal-debian")
-                                        (Text.intercalate "\n"
-                                         [ "Create a debianization for a cabal package"
-                                         , " Tool for creating debianizations of Haskell packages based on the .cabal"
-                                         , " file.  If apt-file is installed it will use it to discover what is the"
-                                         , " debian package name of a C library."
-                                         , " ."
-                                         , "  Author: David Fox <dsf@seereason.com>"
-                                         , "  Upstream-Maintainer: David Fox <dsf@seereason.com>" ])) $
-                defaultAtoms)
-       inputDebianization "." defaultAtoms >>= \ old -> case compareDebianization old (copyFirstLogEntry old new) of
-                                                          "" -> return ()
-                                                          s -> error $ "Debianization mismatch:\n" ++ s
-       -- This would overwrite the existing debianization rather than
-       -- just make sure it matches:
-       -- writeDebianization "." new
-
--- | This copies the first log entry of deb1 into deb2.  Because the
--- debianization process updates that log entry, we need to undo that
--- update in order to get a clean comparison.
-copyFirstLogEntry :: Atoms -> Atoms -> Atoms
-copyFirstLogEntry deb1 deb2 =
-    modL changelog (const (Just (ChangeLog (hd1 : tl2)))) deb2
-    where
-      ChangeLog (hd1 : _) = fromMaybe (error "Missing debian/changelog") (getL changelog deb1)
-      ChangeLog (_ : tl2) = fromMaybe (error "Missing debian/changelog") (getL changelog deb2)
diff --git a/debian/changelog b/debian/changelog
deleted file mode 100644
--- a/debian/changelog
+++ /dev/null
@@ -1,477 +0,0 @@
-haskell-cabal-debian (3.0.3) unstable; urgency=low
-
-  * Due to a typo, the noDocumentationLibrary lens was turning off
-    profiling rather than documentation.
-
- -- David Fox <dsf@seereason.com>  Fri, 08 Feb 2013 17:14:09 -0800
-
-haskell-cabal-debian (3.0.2) unstable; urgency=low
-
-  * Fix argument and exception handling in cabal-debian
-  * Make Standards-Version field non-mandatory
-  * Make sure every binary deb paragraph has a non-empty description
-
- -- David Fox <dsf@seereason.com>  Thu, 07 Feb 2013 10:03:25 -0800
-
-haskell-cabal-debian (3.0.1) unstable; urgency=low
-
-  * Don't build Debian version numbers with revision (Just "").
-  * Output the descriptions of the binary packages.
-
- -- David Fox <dsf@seereason.com>  Tue, 05 Feb 2013 14:48:33 -0800
-
-haskell-cabal-debian (3.0) unstable; urgency=low
-
-  * Moved the Distribution.Debian modules to Debian.Cabal and
-    Debian.Debianize.
-  * Refactored the debianize function for easier testing
-  * Added test cases.
-  * Add a Debianization type that intends to fully describe a debian
-    package, with functions to read, build, modify, and write a
-    Debianization.
-
- -- David Fox <dsf@seereason.com>  Wed, 26 Dec 2012 05:45:35 -0800
-
-haskell-cabal-debian (2.6.3) unstable; urgency=low
-
-  * Fix pretty printing of Relations (i.e. dependency lists.)  There
-    is an instance for printing lists in ansi-wl-pprint which prevents
-    us from writing customized Pretty instances for type aliases like
-    Relations, AndRelation, and OrRelation.
-
- -- David Fox <dsf@seereason.com>  Fri, 04 Jan 2013 09:30:48 -0800
-
-haskell-cabal-debian (2.6.2) unstable; urgency=low
-
-  * Fix a bug constructing the destination pathnames that was dropping
-    files that were supposed to be installed into packages.
-
- -- David Fox <dsf@seereason.com>  Thu, 20 Dec 2012 06:49:25 -0800
-
-haskell-cabal-debian (2.6.1) unstable; urgency=low
-
-  * Remove the modifyAtoms field from the Flags record, we want to
-    be able to create instances like Read and Show for this type.
-    The modifyAtoms function is now passed separately to debianize.
-  * The flags field of Server was renamed serverFlags because the
-    newly exported Config record has a flags field.
-
- -- David Fox <dsf@seereason.com>  Wed, 19 Dec 2012 09:45:22 -0800
-
-haskell-cabal-debian (2.5.10) unstable; urgency=low
-
-  * Filter cabal self dependencies out before generating
-    Build-Depends-Indep, just as we added code to filter them out
-    of Build-Depends in version 2.5.7.
-
- -- David Fox <dsf@seereason.com>  Tue, 18 Dec 2012 13:23:39 -0800
-
-haskell-cabal-debian (2.5.9) unstable; urgency=low
-
-  * Always add +RTS -IO -RTS to server flags.
-
- -- David Fox <dsf@seereason.com>  Sun, 16 Dec 2012 10:40:52 -0800
-
-haskell-cabal-debian (2.5.8) unstable; urgency=low
-
-  * Add a builtin list for ghc-7.6.1.
-
- -- David Fox <dsf@seereason.com>  Sat, 15 Dec 2012 07:04:49 -0800
-
-haskell-cabal-debian (2.5.7) unstable; urgency=low
-
-  * Filter out cabal self-dependencies before building the debian
-    dependencies.  In cabal a self dependency means you need the library
-    to build an executable, while in debian it means you need an older
-    version installed to build the current version.
-
- -- David Fox <dsf@seereason.com>  Thu, 29 Nov 2012 08:42:30 -0800
-
-haskell-cabal-debian (2.5.6) unstable; urgency=low
-
-  * Don't add --base-uri and --http-port arguments automatically, they can be
-    computed by calling the oldClckwrksFlags function and adding the value to
-    the flags field.  Clckwrks-0.3 no longer needs the --base-uri argument.
-
- -- David Fox <dsf@seereason.com>  Tue, 27 Nov 2012 13:34:31 -0800
-
-haskell-cabal-debian (2.5.5) unstable; urgency=low
-
-  * Have the debianize function return False if there is no debian/Debianize.hs file,
-    but throw an exception if running it failed, so we notice bad debianization code.
-
- -- David Fox <dsf@seereason.com>  Tue, 27 Nov 2012 07:34:51 -0800
-
-haskell-cabal-debian (2.5.4) unstable; urgency=low
-
-  * Insert "SetEnv proxy-sendcl 1" line into Apache config.
-
- -- David Fox <dsf@seereason.com>  Tue, 20 Nov 2012 13:43:54 -0800
-
-haskell-cabal-debian (2.5.3) unstable; urgency=low
-
-  * Remove extra copy of binary from the executable debs
-  * Add a sourcePackageName field to Flags, and a --source-package-name
-    command line option.
-
- -- David Fox <dsf@seereason.com>  Sat, 17 Nov 2012 00:16:21 -0800
-
-haskell-cabal-debian (2.5.2) unstable; urgency=low
-
-  * Fix the path to where the DHInstallTo and DHInstallCabalExecTo
-    DebAtoms put their files.
-
- -- David Fox <dsf@seereason.com>  Fri, 16 Nov 2012 18:11:45 -0800
-
-haskell-cabal-debian (2.5.1) unstable; urgency=low
-
-  * Add a destName field to Executable so we can give installed
-    executables a different name than they had in the build.
-
- -- David Fox <dsf@seereason.com>  Fri, 16 Nov 2012 15:37:16 -0800
-
-haskell-cabal-debian (2.5) unstable; urgency=low
-
-  * Add a debName field to the Executable record, before the deb
-    package name had to equal the executable name.
-
- -- David Fox <dsf@seereason.com>  Fri, 16 Nov 2012 12:32:39 -0800
-
-haskell-cabal-debian (2.4.2) unstable; urgency=low
-
-  * Move location of cabal install files from dist/build/install to
-    debian/cabalInstall, the dist directory was getting wiped at bad
-    moments.
-  * Split the autobuilder function autobuilderDebianize into two
-    new functions in cabal-debian: runDebianize and callDebianize.
-  * Custom debianization code now goes in debian/Debianize.hs rather than
-    in setup, so we can distinguish it failing from it not existing more
-    easily.
-
- -- David Fox <dsf@seereason.com>  Thu, 15 Nov 2012 11:00:08 -0800
-
-haskell-cabal-debian (2.4.1) unstable; urgency=low
-
-  * We need to verify that debian/compat was created after running the
-    debianize function, because ghc still exits with ExitSuccess
-
- -- David Fox <dsf@seereason.com>  Thu, 15 Nov 2012 06:34:02 -0800
-
-haskell-cabal-debian (2.4.0) unstable; urgency=low
-
-  * You can run a function in Setup.hs other than main using ghc -e, so we
-    will use this trick to run the debianize function directly rather than
-    running main.
-  * Eliminate the autobuilderDebianize function.
-
- -- David Fox <dsf@seereason.com>  Thu, 15 Nov 2012 04:05:49 -0800
-
-haskell-cabal-debian (2.3.4) unstable; urgency=low
-
-  * Fix the builddir used when running the cabal-debian standalone
-    executable - it was dist-cabal/build, so the resulting debianization
-    had files in places where cabal didn't expect them.
-
- -- David Fox <dsf@seereason.com>  Tue, 13 Nov 2012 06:20:51 -0800
-
-haskell-cabal-debian (2.3.3) unstable; urgency=low
-
-  * Eliminate class MonadBuild and the BuildT monad.
-
- -- David Fox <dsf@seereason.com>  Sun, 11 Nov 2012 17:46:31 -0800
-
-haskell-cabal-debian (2.3.2) unstable; urgency=low
-
-  * Fix exception that was keeping changelogs from being preserved.
-
- -- David Fox <dsf@seereason.com>  Sat, 10 Nov 2012 10:07:50 -0800
-
-haskell-cabal-debian (2.3.1) unstable; urgency=low
-
-  * Fix the extension of the debhelper links files
-  * Add a general mechanism for installing a file into a deb when
-    we have the file's text in a String (rather than in a file.)
-
- -- David Fox <dsf@seereason.com>  Sat, 10 Nov 2012 07:35:09 -0800
-
-haskell-cabal-debian (2.3) unstable; urgency=low
-
-  * Add MonadBuild.
-
- -- David Fox <dsf@seereason.com>  Fri, 09 Nov 2012 12:21:14 -0800
-
-haskell-cabal-debian (2.2.1) unstable; urgency=low
-
-  * Add a modifyAtoms function to Flags that is applied to final list of
-    DebAtom before writing the debianization.
-  * Add DHApacheSite and DHInstallCabalExec atoms so atoms don't depend on
-    the build directory
-  * Add #DEBHELPER# and exit 0 to default web server postinst.
-
- -- David Fox <dsf@seereason.com>  Fri, 09 Nov 2012 10:25:32 -0800
-
-haskell-cabal-debian (2.2.0) unstable; urgency=low
-
-  * Append a trailing slash to the --base-uri argument passed to the
-    server.  This is required by Web.Routes.Site.runSite.
-
- -- David Fox <dsf@seereason.com>  Thu, 08 Nov 2012 04:40:08 -0800
-
-haskell-cabal-debian (2.1.4) unstable; urgency=low
-
-  * Merge the Executable and Script constructors of the Executable type
-  * Add a destDir field to Executable to specify the destination.
-
- -- David Fox <dsf@seereason.com>  Tue, 06 Nov 2012 13:24:25 -0800
-
-haskell-cabal-debian (2.1.3) unstable; urgency=low
-
-  * Don't append a slash to the base-uri.
-  * Construct the name of the data directory in /usr/share from the cabal
-    package name rather than the debian source package name.
-  * Add a --self-depend flag to include a build dependency on this library
-    in all generated debianizations.
-
- -- David Fox <dsf@seereason.com>  Tue, 06 Nov 2012 07:07:57 -0800
-
-haskell-cabal-debian (2.1.2) unstable; urgency=low
-
-  * Output the server support files.
-
- -- David Fox <dsf@seereason.com>  Tue, 06 Nov 2012 06:37:18 -0800
-
-haskell-cabal-debian (2.1.1) unstable; urgency=low
-
-  * Restore code that checks for version number match when validating
-    a debianization.  The autobuilder can now pass the version number
-    to cabal-debian, so it should match.
-
- -- David Fox <dsf@seereason.com>  Mon, 05 Nov 2012 17:42:32 -0800
-
-haskell-cabal-debian (2.1.0) unstable; urgency=low
-
-  * Enable processing of Script, Server and WebSite executables.
-
- -- David Fox <dsf@seereason.com>  Mon, 05 Nov 2012 12:45:42 -0800
-
-haskell-cabal-debian (2.0.9) unstable; urgency=low
-
-  * Add a Library section, export all the modules.
-
- -- David Fox <dsf@seereason.com>  Mon, 05 Nov 2012 06:41:25 -0800
-
-haskell-cabal-debian (2.0.8) unstable; urgency=low
-
-  * Bypass abandoned versions.
-
- -- David Fox <dsf@seereason.com>  Sat, 03 Nov 2012 06:13:27 -0700
-
-haskell-cabal-debian (1.26) unstable; urgency=low
-
-  * Don't try to update the existing debianization, except for the
-    changelog where we retain entries that look older than the one
-    we generate.
-  * Use .install files instead of adding rules to debian/rules
-  * Add --depends and --conflicts options
-
- -- David Fox <dsf@seereason.com>  Thu, 25 Oct 2012 12:03:49 -0700
-
-haskell-cabal-debian (1.25) unstable; urgency=low
-
-  * If the --disable-haddock flag is given omit the doc package from the
-    control file.
-  * The tarball that was uploaded to Hackage as version 1.24 had a (buggy)
-    change which was not pushed to darcs.  This resolves that confusion.
-
- -- David Fox <dsf@seereason.com>  Sat, 16 Jun 2012 14:42:12 -0700
-
-haskell-cabal-debian (1.24) unstable; urgency=low
-
-  * No wonder it doesn't build on hackage - none of the source
-    modules were shipped.
-
- -- David Fox <dsf@seereason.com>  Thu, 14 Jun 2012 08:19:19 -0700
-
-haskell-cabal-debian (1.23) unstable; urgency=low
-
-  * Add a --quilt option to switch from native to quilt format.
-    Without this option the file debian/source/format will contain
-    '3.0 (native)', with it '3.0 (quilt)'.
-
- -- David Fox <dsf@seereason.com>  Fri, 01 Jun 2012 05:53:36 -0700
-
-haskell-cabal-debian (1.22) unstable; urgency=low
-
-  * Bump version to make sure all changes are uploaded.
-
- -- David Fox <dsf@seereason.com>  Wed, 23 May 2012 19:54:17 -0700
-
-haskell-cabal-debian (1.21) unstable; urgency=low
-
-  * fix conversion of wildcards into intersected ranges
-
- -- David Fox <dsf@seereason.com>  Wed, 23 May 2012 19:51:34 -0700
-
-haskell-cabal-debian (1.20) unstable; urgency=low
-
-  * Fix generation of debian library dependencies from the Extra-Libraries
-    field of the cabal file.
-
- -- David Fox <dsf@seereason.com>  Wed, 23 May 2012 19:50:39 -0700
-
-haskell-cabal-debian (1.19) unstable; urgency=low
-
-  * Handle cabal equals dependencies.
-
- -- David Fox <dsf@seereason.com>  Tue, 20 Mar 2012 14:34:58 -0700
-
-haskell-cabal-debian (1.18) unstable; urgency=low
-
-  * High level of confidence this time.  Interesting new Interspersed
-    class, and an implementation of invertVersionRanges which should be
-    forwarded to the Cabal folks.
-  * Removes dependency on logic-classes
-
- -- David Fox <dsf@seereason.com>  Tue, 20 Mar 2012 08:17:25 -0700
-
-haskell-cabal-debian (1.17) unstable; urgency=low
-
-  * Restore code to downcase cabal package name before using it as the
-    base of the debian package name.
-
- -- David Fox <dsf@seereason.com>  Sun, 18 Mar 2012 15:32:04 -0700
-
-haskell-cabal-debian (1.16) unstable; urgency=low
-
-  * Remove code that implements a special case for the debian name of the
-    haskell-src-exts package.
-
- -- David Fox <dsf@seereason.com>  Sun, 18 Mar 2012 14:11:21 -0700
-
-haskell-cabal-debian (1.15) unstable; urgency=low
-
-  * Yet another stab at fixing the code for converting cabal dependencies
-    to debian dependencies, with support for splitting version ranges of
-    cabal files among different debian packages.
-
- -- David Fox <dsf@seereason.com>  Fri, 16 Mar 2012 17:59:28 -0700
-
-haskell-cabal-debian (1.14) unstable; urgency=low
-
-  * Don't try to strip data files
-  * Use permissions 644 for data files, not 755.
-
- -- David Fox <dsf@seereason.com>  Wed, 07 Mar 2012 14:46:04 -0800
-
-haskell-cabal-debian (1.13) unstable; urgency=low
-
-  * Append the version number when constructing the directory for data
-    files.
-
- -- David Fox <dsf@seereason.com>  Wed, 07 Mar 2012 08:56:39 -0800
-
-haskell-cabal-debian (1.12) unstable; urgency=low
-
-  * Include any files listed in the Data-Files field of the cabal file
-    in the utils package.
-
- -- David Fox <dsf@seereason.com>  Tue, 06 Mar 2012 11:31:47 -0800
-
-haskell-cabal-debian (1.11) unstable; urgency=low
-
-  * Replace --epoch flag with --epoch-map, so we can specify epoch numbers
-    for both the package being built and for dependency packages.
-
- -- David Fox <dsf@seereason.com>  Thu, 09 Feb 2012 07:01:19 -0800
-
-haskell-cabal-debian (1.10) unstable; urgency=low
-
-  * Add bundled package list for ghc 7.4.1.
-
- -- David Fox <dsf@seereason.com>  Sat, 04 Feb 2012 14:44:33 -0800
-
-haskell-cabal-debian (1.9) unstable; urgency=low
-
-  * Add --dep-map flag to allow mapping of cabal package names to the base
-    of a debian package name.  This modifies the name to which the prefix
-    "lib" and the suffix "-dev" are added.
-  * Fix dependency generation bug introduced in 1.8.
-
- -- David Fox <dsf@seereason.com>  Mon, 23 Jan 2012 14:13:05 -0800
-
-haskell-cabal-debian (1.8) unstable; urgency=low
-
-  * Add a --dev-dep flag to make one or more packages install dependencies
-    of the dev package.
-
- -- David Fox <dsf@seereason.com>  Mon, 23 Jan 2012 05:00:46 -0800
-
-haskell-cabal-debian (1.7) unstable; urgency=low
-
-  * Add info about ghc 7.4.0 pre-release.
-
- -- David Fox <dsf@seereason.com>  Wed, 11 Jan 2012 09:57:45 -0800
-
-haskell-cabal-debian (1.6) unstable; urgency=low
-
-  * Don't omit dependencies built into ghc, they should be satisfied by
-    the Provides in the compiler if they are not available in the
-    repository.  However, we do need to make ghc an alterantive to any
-    versioned dependencies that are bundled with the compiler, since the
-    built in dependencies are virtual packages and thus unversioned.
-
- -- David Fox <dsf@seereason.com>  Wed, 07 Dec 2011 06:10:17 -0800
-
-haskell-cabal-debian (1.5) unstable; urgency=low
-
-  * Fix the generation of build dependency version ranges by using an
-    intermediate version range type.
-  * If the version range for the cabal file touches two different debian
-    package, don't try to write build dependencies that allow either one,
-    it can't really be done.  Just give the allowable versions of the
-    newer package (e.g. libghc-parsec3-dev rather than libghc-parsec2-dev.)
-
- -- David Fox <dsf@seereason.com>  Sun, 04 Dec 2011 05:59:25 -0800
-
-haskell-cabal-debian (1.4) unstable; urgency=low
-
-  * Add a --revision <suffix> flag which appends a (perhaps empty) string
-    cabal version number to get the debian version number.  Without this
-    flag the string "-1~hackage1" is appended.
-  * Make it an error to specify a debian version via --deb-version that is
-    older than the current cabal version.
-
- -- David Fox <dsf@seereason.com>  Sun, 20 Nov 2011 06:45:33 -0800
-
-haskell-cabal-debian (1.3) unstable; urgency=low
-
-  * Fix error message when compiler version is not in bundled package list.
-  * Add bundled package list for compiler 7.0.4 (same as 7.0.3.)
-
- -- David Fox <dsf@seereason.com>  Sat, 08 Oct 2011 07:58:19 -0700
-
-haskell-cabal-debian (1.2) unstable; urgency=low
-
-  * When computing the debian name from a package's cabal name, if we
-    have no particular version number we are comparing to, use the name
-    from the version split that corresponds to newer version numbers.
-  * Add code to make the cabal package haskell-src-exts map to the debian
-    packages libghc-src-exts-dev etc.  Normally it would map to
-    libghc-haskell-src-exts-dev.
-
- -- David Fox <dsf@seereason.com>  Thu, 06 Oct 2011 09:27:02 -0700
-
-haskell-cabal-debian (1.1) unstable; urgency=low
-
-  * Use propositional logic package to compute normal form for dependencies
-  * Make sure to correct format of cabal package synopsis before using as debian
-    package description.
-
- -- David Fox <dsf@seereason.com>  Fri, 30 Sep 2011 06:16:34 -0700
-
-haskell-cabal-debian (1.0) unstable; urgency=low
-
-  * Debianization generated by cabal-debian
-
- -- David Fox <dsf@seereason.com>  Sun, 18 Sep 2011 06:40:21 -0700
-
diff --git a/src/Debian/Debianize.hs b/src/Debian/Debianize.hs
--- a/src/Debian/Debianize.hs
+++ b/src/Debian/Debianize.hs
@@ -1,5 +1,6 @@
--- | QUICK START: You can either run the cabal-debian executable, or
--- for more power and flexibility you can construct a
+-- | QUICK START: You can either run the @cabal-debian --debianize@, or
+-- for more power and flexibility you can put a @Debianize.hs@ script in
+-- the package's @debian@ subdirectory.
 -- 'Debian.Debianize.Atoms' value and pass it to the
 -- 'Debian.Debianize.debianize' function.  The
 -- 'Debian.Debianize.callDebianize' function retrieves extra arguments
@@ -24,14 +25,24 @@
 -- At this point you may need to modify Cabal.defaultFlags to achieve
 -- specific packaging goals.  Create a module for this in debian/Debianize.hs:
 -- 
--- > import Distribution.Debian (Flags(..), defaultFlags)
--- > main = debianize (defaultFlags { extraDevDeps = "haskell-hsx-utils" : extraDevDeps defaultFlags})
+-- > import Data.Lens.Lazy
+-- > import Data.Map as Map (insertWith)
+-- > import Data.Set as Set (union, singleton)
+-- > import Debian.Relation (BinPkgName(BinPkgName), Relation(Rel))
+-- > import Debian.Debianize (defaultAtoms, depends, debianization, writeDebianization)
+-- > main = debianization "." defaultAtoms >>=
+-- >        return . modL depends (insertWith union (BinPkgName "cabal-debian") (singleton (Rel (BinPkgName "debian-policy") Nothing Nothing))) >>=
+-- >        writeDebianization "."
 -- 
 -- Then to test it,
 -- 
 -- > % CABALDEBIAN='["-n"]' runhaskell debian/Debianize.hs
 -- 
--- and to run it
+-- or equivalently
+-- 
+-- > % ghc -e 'Debian.Debianize.runDebianize ["-n"]'
+-- 
+-- and to run it for real:
 -- 
 -- > % runhaskell debian/Debianize.hs
 module Debian.Debianize
diff --git a/src/Debian/Debianize/Atoms.hs b/src/Debian/Debianize/Atoms.hs
--- a/src/Debian/Debianize/Atoms.hs
+++ b/src/Debian/Debianize/Atoms.hs
@@ -470,7 +470,7 @@
     where
       g atoms = foldAtoms from Map.empty atoms
           where
-            from (Binary b) (DHExecutable f) x = Map.insertWith (error "executable") b f x
+            from (Binary b) (DHExecutable f) x = Map.insertWith (\ a b -> error $ "executable: " ++ show (a, b)) b f x
             from _ _ x = x
       s x atoms = Map.foldWithKey (\ b y atoms'-> insertAtom (Binary b) (DHExecutable y) atoms') (deleteAtoms p atoms) x
           where
diff --git a/src/Debian/Debianize/Debianize.hs b/src/Debian/Debianize/Debianize.hs
--- a/src/Debian/Debianize/Debianize.hs
+++ b/src/Debian/Debianize/Debianize.hs
@@ -8,6 +8,7 @@
     ( cabalDebian
     , callDebianize
     , runDebianize
+    , runDebianize'
     , debianize
     , debianization
     , writeDebianization
@@ -17,7 +18,7 @@
     ) where
 
 import Control.Applicative ((<$>), (<*>), pure)
-import Control.Exception (catch)
+import Control.Exception (catch, throw)
 import Data.Algorithm.Diff.Context (contextDiff)
 import Data.Algorithm.Diff.Pretty (prettyDiff)
 import Data.Lens.Lazy (getL, setL, modL)
@@ -61,34 +62,35 @@
 import Text.ParserCombinators.Parsec.Rfc2822 (NameAddr)
 import Text.PrettyPrint.ANSI.Leijen (Pretty(pretty))
 
-{-
-import Debian.Debianize.ControlFile as Debian (SourceDebDescription(source, binaryPackages), BinaryDebDescription(package))
-import Debian.Debianize.Files (toFileMap)
-import Debian.Debianize.Goodies (defaultAtoms)
-import Debian.Debianize.Input (inputDebianization)
-import Debian.Debianize.Utility (withCurrentDirectory)
-import System.Directory (Permissions(executable), getPermissions, setPermissions, createDirectoryIfMissing)
-import Text.PrettyPrint.ANSI.Leijen (pretty)
--}
-
 -- | The main function for the cabal-debian executable.
 cabalDebian :: IO ()
 cabalDebian =
-    compileAllArgs defaultAtoms >>= \ atoms ->
+    compileEnvironmentArgs defaultAtoms >>=
+    compileCommandlineArgs >>= \ atoms ->
       case getL debAction atoms of
         SubstVar debType -> substvars atoms debType
-        Debianize ->  debianize "." atoms
+        Debianize -> debianize "." atoms
         Usage -> do
           progName <- getProgName
           let info = "Usage: " ++ progName ++ " [FLAGS]\n"
           putStrLn (usageInfo info options)
 
+compileEnvironmentArgs :: Atoms -> IO Atoms
+compileEnvironmentArgs atoms0 =
+    (compileArgs <$> (read <$> getEnv "CABALDEBIAN") <*> pure atoms0) `catchIOError` const (return atoms0)
+
+compileCommandlineArgs :: Atoms -> IO Atoms
+compileCommandlineArgs atoms0 = compileArgs <$> getArgs <*> pure atoms0
+
 -- | Compile the given arguments into an Atoms value and run the
 -- debianize function.  This is basically equivalent to @cabal-debian
 -- --debianize@, except that the command line arguments come from the
 -- function parameter.
 callDebianize :: [String] -> IO ()
-callDebianize args = compileEnvironmentArgs defaultAtoms >>= debianize "." . compileArgs args
+callDebianize args =
+    compileEnvironmentArgs defaultAtoms >>=
+    return . compileArgs args >>=
+    debianize "."
 
 -- | Put an argument list into the @CABALDEBIAN@ environment variable
 -- and then run the script in debian/Debianize.hs.  If this exists and
@@ -109,16 +111,25 @@
             (code, out, err) ->
               error ("runDebianize failed with " ++ show code ++ ":\n stdout: " ++ show out ++"\n stderr: " ++ show err)
 
--- | Generate a debianization, and then either validate, describe, or
--- write it out dependeing on the command line arguments.
+-- | Insert a value for CABALDEBIAN into the environment that the
+-- withEnvironment* functions above will find and use.  E.g.
+-- putEnvironmentFlags ["--dry-run", "--validate"] (debianize defaultFlags)
+putEnvironmentArgs :: [String] -> IO ()
+putEnvironmentArgs fs = setEnv "CABALDEBIAN" (show fs) True
+
+-- | Call runDebianize with the given working directory.
+runDebianize' :: FilePath -> [String] -> IO Bool
+runDebianize' top args = withCurrentDirectory top $ runDebianize args
+
+-- | Depending on the options in @atoms@, either validate, describe,
+-- or write the generated debianization.
 debianize :: FilePath -> Atoms -> IO ()
 debianize top atoms =
     debianization top atoms >>= \ atoms' ->
     if getL validate atoms'
-    then inputDebianization top >>= \ old -> either error return (validateDebianization old atoms')
+    then inputDebianization top >>= \ old -> return (validateDebianization old atoms')
     else if getL dryRun atoms'
-         then inputDebianization top >>= \ old ->
-              putStr . ("Debianization (dry run):\n" ++) $ compareDebianization old atoms'
+         then inputDebianization top >>= \ old -> putStr ("Debianization (dry run):\n" ++ compareDebianization old atoms')
          else writeDebianization top atoms'
 
 -- | Given an Atoms value, get any additional configuration
@@ -239,21 +250,6 @@
 anyrel' :: BinPkgName -> [Relation]
 anyrel' x = [Rel x Nothing Nothing]
 
-compileAllArgs :: Atoms -> IO Atoms
-compileAllArgs atoms0 = compileEnvironmentArgs atoms0 >>= compileCommandlineArgs
-
-compileEnvironmentArgs :: Atoms -> IO Atoms
-compileEnvironmentArgs atoms0 = (compileArgs <$> (read <$> getEnv "CABALDEBIAN") <*> pure atoms0) `catchIOError` const (return atoms0)
-
-compileCommandlineArgs :: Atoms -> IO Atoms
-compileCommandlineArgs atoms0 = compileArgs <$> getArgs <*> pure atoms0
-
--- | Insert a value for CABALDEBIAN into the environment that the
--- withEnvironment* functions above will find and use.  E.g.
--- putEnvironmentFlags ["--dry-run", "--validate"] (debianize defaultFlags)
-putEnvironmentArgs :: [String] -> IO ()
-putEnvironmentArgs fs = setEnv "CABALDEBIAN" (show fs) True
-
 -- | Write the files of the debianization @d@ to the directory @top@.
 writeDebianization :: FilePath -> Atoms -> IO ()
 writeDebianization top d =
@@ -286,13 +282,13 @@
 -- | Don't change anything, just make sure the new debianization
 -- matches the existing debianization in several particulars -
 -- specifically, version number, and source and binary package names.
-validateDebianization :: Atoms -> Atoms -> Either String ()
+validateDebianization :: Atoms -> Atoms -> ()
 validateDebianization old new =
     case () of
-      _ | oldVersion /= newVersion -> Left ("Version mismatch, expected " ++ show (pretty oldVersion) ++ ", found " ++ show (pretty newVersion))
-        | oldSource /= newSource -> Left ("Source mismatch, expected " ++ show (pretty oldSource) ++ ", found " ++ show (pretty newSource))
-        | oldPackages /= newPackages -> Left ("Package mismatch, expected " ++ show (pretty oldPackages) ++ ", found " ++ show (pretty newPackages))
-        | True -> Right ()
+      _ | oldVersion /= newVersion -> throw (userError ("Version mismatch, expected " ++ show (pretty oldVersion) ++ ", found " ++ show (pretty newVersion)))
+        | oldSource /= newSource -> throw (userError ("Source mismatch, expected " ++ show (pretty oldSource) ++ ", found " ++ show (pretty newSource)))
+        | oldPackages /= newPackages -> throw (userError ("Package mismatch, expected " ++ show (pretty oldPackages) ++ ", found " ++ show (pretty newPackages)))
+        | True -> ()
     where
       oldVersion = logVersion (head (unChangeLog (fromMaybe (error "Missing changelog") (getL changelog old))))
       newVersion = logVersion (head (unChangeLog (fromMaybe (error "Missing changelog") (getL changelog new))))
diff --git a/src/Debian/Debianize/Goodies.hs b/src/Debian/Debianize/Goodies.hs
--- a/src/Debian/Debianize/Goodies.hs
+++ b/src/Debian/Debianize/Goodies.hs
@@ -103,15 +103,15 @@
 
 -- | Add a debian binary package to the debianization containing a cabal executable file.
 doExecutable :: BinPkgName -> InstallFile -> Atoms -> Atoms
-doExecutable bin x deb = modL executable (Map.insertWith (error "executable") bin x) deb
+doExecutable bin x deb = modL executable (Map.insertWith (\ a b -> error $ "doExecutable: " ++ show (a, b)) bin x) deb
 
 -- | Add a debian binary package to the debianization containing a cabal executable file set up to be a server.
 doServer :: BinPkgName -> Server -> Atoms -> Atoms
-doServer bin x deb = modL serverInfo (Map.insertWith (error "serverInfo") bin x) deb
+doServer bin x deb = modL serverInfo (Map.insertWith (\ a b -> error $ "doServer: " ++ show (a, b)) bin x) deb
 
 -- | Add a debian binary package to the debianization containing a cabal executable file set up to be a web site.
 doWebsite :: BinPkgName -> Site -> Atoms -> Atoms
-doWebsite bin x deb = modL website (Map.insertWith (error "website") bin x) deb
+doWebsite bin x deb = modL website (Map.insertWith (\ a b -> error $ "doWebsite: " ++ show (a, b)) bin x) deb
 
 -- | Add a debian binary package to the debianization containing a cabal executable file set up to be a backup script.
 doBackups :: BinPkgName -> String -> Atoms -> Atoms
diff --git a/src/Debian/Debianize/Input.hs b/src/Debian/Debianize/Input.hs
--- a/src/Debian/Debianize/Input.hs
+++ b/src/Debian/Debianize/Input.hs
@@ -11,7 +11,7 @@
 
 import Debug.Trace (trace)
 
-import Control.Exception (SomeException, catch, bracket)
+import Control.Exception (bracket)
 import Control.Monad (when, foldM, filterM)
 import Control.Monad.Trans (MonadIO, liftIO)
 import Data.Char (isSpace)
@@ -58,9 +58,8 @@
 
 inputDebianization :: FilePath -> IO Atoms
 inputDebianization top =
-    do (ctl, _) <- inputSourceDebDescription debian `catchIOError` (\ e -> error ("Failure parsing SourceDebDescription: " ++ show e))
-       -- Different from snd of above?
-       atoms <- inputAtomsFromDirectory debian mempty `catch` (\ (e :: SomeException) -> error ("Failure parsing atoms: " ++ show e))
+    do (ctl, _) <- inputSourceDebDescription debian
+       atoms <- inputAtomsFromDirectory debian mempty
        return $ modL control (const ctl) atoms
     where
       debian = top </> "debian"
@@ -152,7 +151,7 @@
 -- | Look for a field and apply a function to its value
 findMap :: String -> (String -> a) -> [Field] -> a
 findMap field f fields =
-    fromMaybe (error $ "Missing field: " ++ field) (foldr findMap' Nothing fields)
+    fromMaybe (error $ "Missing " ++ show field ++ " field in " ++ show fields) (foldr findMap' Nothing fields)
     where
       findMap' (Field (fld, val)) x = if fld == field then Just (f val) else x
       findMap' _ x = x
diff --git a/src/Debian/Debianize/Tests.hs b/src/Debian/Debianize/Tests.hs
--- a/src/Debian/Debianize/Tests.hs
+++ b/src/Debian/Debianize/Tests.hs
@@ -18,11 +18,11 @@
 import Debian.Changes (ChangeLog(..), ChangeLogEntry(..), parseEntry)
 import Debian.Debianize.Debianize (debianization)
 import Debian.Debianize.Atoms as Atoms
-    (Atoms, rulesHead, compat, sourceFormat, changelog, sourcePackageName, control, missingDependencies, revision,
-     binaryArchitectures, copyright, debVersion, execMap, buildDeps, buildDepsIndep, utilsPackageName, description,
-     depends, conflicts, install, installData)
+    (Atoms, rulesHead, compat, sourceFormat, changelog, control, missingDependencies, revision,
+     binaryArchitectures, copyright, debVersion, execMap, buildDeps, utilsPackageName, description,
+     depends, conflicts, installData {-, sourcePackageName, install, buildDepsIndep-})
 import Debian.Debianize.ControlFile as Deb (SourceDebDescription(..), BinaryDebDescription(..), PackageRelations(..), VersionControlSpec(..))
-import Debian.Debianize.Debianize (writeDebianization)
+-- import Debian.Debianize.Debianize (writeDebianization)
 import Debian.Debianize.Dependencies (getRulesHead)
 import Debian.Debianize.Files (toFileMap)
 import Debian.Debianize.Finalize (finalizeDebianization)
@@ -37,7 +37,9 @@
 import Debian.Version (buildDebianVersion, parseDebianVersion)
 import Distribution.License (License(BSD3))
 import Prelude hiding (log)
+import System.Exit (ExitCode(ExitSuccess))
 import System.FilePath ((</>))
+import System.Process (readProcessWithExitCode)
 import Test.HUnit
 import Text.ParserCombinators.Parsec.Rfc2822 (NameAddr(..))
 import Text.PrettyPrint.ANSI.Leijen (Pretty, pretty, text)
@@ -403,6 +405,9 @@
 test6 :: Test
 test6 =
     TestLabel "test6" $
+    TestCase (do result <- readProcessWithExitCode "runhaskell" ["-isrc", "test-data/artvaluereport2/input/debian/Debianize.hs"] ""
+                 assertEqual "test6" (ExitSuccess, "", "") result)
+{-
     TestCase ( do old <- inputDebianization "test-data/artvaluereport2/output"
                   new <- debianization "test-data/artvaluereport2/input"
                             (modL control (\ y -> y {homepage = Just "http://appraisalreportonline.com"}) $
@@ -490,6 +495,7 @@
             "artvaluereport2-staging"     -> 9031
             "artvaluereport2-development" -> 9032
             _ -> error $ "Unexpected package name: " ++ deb
+-}
 
 test7 :: Test
 test7 =
@@ -500,6 +506,8 @@
                             setL sourceFormat (Just Native3) $
                             setL utilsPackageName (Just (BinPkgName "cabal-debian")) $
                             modL Atoms.depends (Map.insertWith union (BinPkgName "cabal-debian") (singleton (anyrel (BinPkgName "apt-file")))) $
+                            modL Atoms.depends (Map.insertWith union (BinPkgName "cabal-debian") (singleton (anyrel (BinPkgName "debian-policy")))) $
+                            modL Atoms.depends (Map.insertWith union (BinPkgName "libghc-cabal-debian-dev") (singleton (anyrel (BinPkgName "debian-policy")))) $
                             modL Atoms.conflicts (Map.insertWith union (BinPkgName "cabal-debian")
                                     (singleton (Rel (BinPkgName "haskell-debian-utils") (Just (SLT (parseDebianVersion ("3.59" :: String)))) Nothing))) $
                             modL Atoms.description (Map.insertWith (error "test7") (BinPkgName "cabal-debian")
@@ -539,7 +547,7 @@
                             setL debVersion (Just (parseDebianVersion ("3.0.2-1~hackage1" :: String))) $
                             setL sourceFormat (Just Native3) $
                             modL control (\ y -> y {homepage = Just "http://www.haskell.org/alex/"}) $
-                            (\ atoms -> foldr (\ name atoms -> modL installData (Map.insertWith union (BinPkgName "alex") (singleton (name, name))) atoms)
+                            (\ atoms -> foldr (\ name atoms' -> modL installData (Map.insertWith union (BinPkgName "alex") (singleton (name, name))) atoms')
                                               atoms
                                               [ "AlexTemplate"
                                               , "AlexTemplate-debug"
