diff --git a/LICENSE b/LICENSE
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2007-2015 Dino Morelli
+Copyright (c) 2007-2016 Dino Morelli
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,41 @@
+# photoname
+
+
+## Synopsis
+
+Rename photo image files based on EXIF shoot date (Haskell)
+
+
+## Description
+
+photoname is a command-line utility for renaming/moving photo image
+files. The new folder location and naming are determined by the
+photo shoot date information contained within the file's EXIF tags.
+
+
+## Getting source
+
+- Download the cabalized source package [from Hackage](http://hackage.haskell.org/package/photoname)
+- epub-tools is available for Arch Linux [from the AUR](https://aur.archlinux.org/packages/photoname/)
+- Get the source with darcs: `$ darcs get http://hub.darcs.net/dino/photoname`
+- If you're just looking, [browse the source](http://hub.darcs.net/dino/photoname)
+
+And once you have it, building the usual way:
+
+    $ cabal configure --enable-tests
+    $ cabal build
+    $ cabal test
+    $ cabal install
+
+
+## Installing
+
+Build and install with cabal-install:
+  `$ cabal update ; cabal install photoname`
+
+
+## Contact
+
+Dino Morelli <[dino@ui3.info](mailto:dino@ui3.info)>
+
+Past Debian 64-bit packaging work was performed by Magnus Therning
diff --git a/TODO.md b/TODO.md
new file mode 100644
--- /dev/null
+++ b/TODO.md
@@ -0,0 +1,8 @@
+- Allow user to specify permissions for newly-created dirs and
+  files. Bonus points for parsing the octal codes everyone knows
+  and loves.
+- Add a `--force` switch to disregard existing links.
+- Deal gracefully with unknown dates. This means not just putting
+  pictures into the 0000/0000-00-00 directory, but making sure that
+  the `_###` serial number part is incremented from the highest one
+  in there.
diff --git a/changelog.md b/changelog.md
new file mode 100644
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,79 @@
+3.1 (2015-06-28)
+
+   * Removed ambiguous import of `System.Locale.defaultTimeLocale`
+   * Updated to use `Data.Version` to fish the version out of cabal info
+   * Replaced deprecated ErrorT with ExceptT
+   * Added pragma for Control.Applicative import
+   * Updated README and cabal file with current info
+   * Moved copyright year up to 2015
+
+
+3.0.1 (2012-11-01)
+
+   * Updated test suite to build cleanly (without warnings) and
+     run against modern cabal versions
+   * Updated cabal file to modern cabal standards. Unit testing is
+     now cabal-driven and we now fully support cabal sdist.
+   * Fixed a problem where try is no longer available. Now importing
+     Control.Exception to bring it into scope.
+   * Adjusted usage to explain a change in how we find the EXIF
+     date stamps
+   * Moved copyright year up to 2012
+
+
+3.0.0 (2011-05-08)
+
+   * New naming scheme that uses date/time only, no serial. This
+     is a BIG change but the old naming scheme is still available.
+   * Parent directory is now a switch
+   * Subdirectory path creation of year and day can be suppressed
+   * User can specify an arbitrary suffix string for the new names
+   * User can now put switches into a config file
+
+
+2.3.0 (2010-01-25)
+
+   * Problem fixed that had recently come up with the Exif
+     library. Specifically, files with no EXIF data were causing
+     an IO error to be thrown and processing to halt. (thanks to
+     Josh Hoyt)
+   * Other minor updates to things like copyright info and version
+     number
+
+
+2.2 (2009-06-07)
+
+   * No changes in how the software behaves
+   * Updated build-depends to be explicit about base version
+     requirement
+   * Minor update to BSD3 copyright notices to bring them up to 2009
+   * Debian binary package of v2.2 available
+
+
+2.1 (2008-10-11)
+
+   * More big changes to the transformers used. No longer using
+     WriterT. Now using ErrorT for error handling.
+   * Changed to record-style data for the arg parsing. 
+
+
+2.0 (2008-03-05)
+
+   * Upgraded to build under GHC 6.8.2
+   * Major internal changes. Now using ReaderT and WriterT
+   * Changed version numbering scheme to be more conventional. Recent
+     versions of cabal were not amused with the strange version
+     string.
+   * This project now added to HackageDB 
+
+
+003 (2007-09-13)
+
+   * Repairs for a build problem with GHC > 6.6 specifically related
+     to depending on FilePath instead of filepath and now requiring
+     import of Data.Time.Format
+
+
+002 (2007-04-28)
+
+   * Initial release
diff --git a/doc/dev/notes b/doc/dev/notes
new file mode 100644
--- /dev/null
+++ b/doc/dev/notes
@@ -0,0 +1,41 @@
+-----
+- To change the app version:
+   - Edit photoname.cabal
+   - Edit src/Photoname/Opts.hs, usageText near the bottom of footer
+
+   I'd like to make a script in util/ to automate this.
+   After such a script has been made, may want to put developer notes on using it in doc/dev/<somefile>
+
+----------
+File naming format:
+
+yyyymmdd_[oth_]nnn[-e[n]].jpg
+yyyymmdd-hhmmss[_oth][_ss].jpg
+
+date: year month day
+time: hour minute second
+oth: could be photographer: 2 or 3 character initials
+ss: edited or sized, optional number for more than one
+   _sp _ep : sized/edited for printing
+   _sd1920x1080 _ed : sized/edited for desktop
+   _sw _ew : sized/edited for web
+
+
+These files are arranged into a dir structure
+
+top-level/
+   0000/
+      0000-00-00/
+         00000000_001.jpg   -- Unknown pictures
+         00000000_002.jpg
+   2006/
+      2006-10-13/
+         20061013_431.jpg
+         20061013_509.jpg
+   2007/
+      2007-01-30/
+         20070130_002.jpg
+         20070130_119-ew.jpg
+      2007-04-19/
+         20070419_bmd_323.jpg
+         20070419_bmd_325-sd.jpg
diff --git a/doc/hcar-photoname.tex b/doc/hcar-photoname.tex
new file mode 100644
--- /dev/null
+++ b/doc/hcar-photoname.tex
@@ -0,0 +1,21 @@
+\begin{hcarentry}{photoname}
+\label{photoname}
+\report{Dino Morelli}%11/08
+\status{stable, maintained}
+\makeheader
+
+photoname is a command-line utility for renaming/moving photo image files. The new folder location and naming are determined by the EXIF photo shoot date and the usually-camera-assigned serial number, often appearing in the filename.
+
+photoname is on Hackage and can be acquired using darcs or other methods. See the project page below for more.
+
+\FurtherReading
+\begin{compactitem}
+\item Project page:
+
+\url{http://ui3.info/d/proj/photoname.html}
+
+\item Source repository:
+
+\texttt{darcs get} \url{http://ui3.info/darcs/photoname}
+\end{compactitem}
+\end{hcarentry}
diff --git a/photoname.cabal b/photoname.cabal
--- a/photoname.cabal
+++ b/photoname.cabal
@@ -1,10 +1,10 @@
 name:                photoname
 cabal-version:       >= 1.8
-version:             3.1
+version:             3.2
 build-type:          Simple
 license:             BSD3
 license-file:        LICENSE
-copyright:           2007-2015 Dino Morelli
+copyright:           2007-2016 Dino Morelli
 author:              Dino Morelli 
 maintainer:          Dino Morelli <dino@ui3.info>
 stability:           stable
@@ -14,7 +14,7 @@
    Command-line utility for renaming/moving photo image files based on 
    EXIF tags.
 category:            Application, Console
-tested-with:         GHC >= 7.6.1
+tested-with:         GHC >= 8.0.1
 
 extra-source-files:  testsuite/resources/*.jpg
 
@@ -24,8 +24,15 @@
 
 executable           photoname
    main-is:          photoname.hs
-   build-depends:    base >= 3 && < 5, directory, exif, filepath, mtl, 
-                     old-locale, parsec, time, unix
+   build-depends:      base >=4.5 && < 5.0
+                     , directory
+                     , exif
+                     , filepath
+                     , mtl
+                     , old-locale
+                     , parsec
+                     , time
+                     , unix
    other-modules:    Photoname.Common
                      Photoname.DateFormat
                      Photoname.Date
@@ -38,9 +45,18 @@
 test-suite           photoname-tests
    type:             exitcode-stdio-1.0
    main-is:          runtests.hs
-   build-depends:    base, directory, exif, filepath, HUnit, mtl,
-                     old-locale, parsec, process, regex-posix, time,
-                     unix
+   build-depends:      base >=4.5 && < 5.0
+                     , directory
+                     , exif
+                     , filepath
+                     , HUnit
+                     , mtl
+                     , old-locale
+                     , parsec
+                     , process
+                     , regex-posix
+                     , time
+                     , unix
    other-modules:    TestHelp
                      TestLink
                      Util
diff --git a/stack.yaml b/stack.yaml
new file mode 100644
--- /dev/null
+++ b/stack.yaml
@@ -0,0 +1,71 @@
+# This file was automatically generated by 'stack init'
+#
+# Some commonly used options have been documented as comments in this file.
+# For advanced use and comprehensive documentation of the format, please see:
+# http://docs.haskellstack.org/en/stable/yaml_configuration/
+
+# Resolver to choose a 'specific' stackage snapshot or a compiler version.
+# A snapshot resolver dictates the compiler version and the set of packages
+# to be used for project dependencies. For example:
+#
+# resolver: lts-3.5
+# resolver: nightly-2015-09-21
+# resolver: ghc-7.10.2
+# resolver: ghcjs-0.1.0_ghc-7.10.2
+# resolver:
+#  name: custom-snapshot
+#  location: "./custom-snapshot.yaml"
+resolver: lts-7.2
+
+# User packages to be built.
+# Various formats can be used as shown in the example below.
+#
+# packages:
+# - some-directory
+# - https://example.com/foo/bar/baz-0.0.2.tar.gz
+# - location:
+#    git: https://github.com/commercialhaskell/stack.git
+#    commit: e7b331f14bcffb8367cd58fbfc8b40ec7642100a
+# - location: https://github.com/commercialhaskell/stack/commit/e7b331f14bcffb8367cd58fbfc8b40ec7642100a
+#   extra-dep: true
+#  subdirs:
+#  - auto-update
+#  - wai
+#
+# A package marked 'extra-dep: true' will only be built if demanded by a
+# non-dependency (i.e. a user package), and its test suites and benchmarks
+# will not be run. This is useful for tweaking upstream packages.
+#packages: []
+packages:
+- .
+- https://hackage.haskell.org/package/exif-3000.0.0/exif-3000.0.0.tar.gz
+
+# Dependency packages to be pulled from upstream that are not in the resolver
+# (e.g., acme-missiles-0.3)
+#extra-deps: []
+extra-deps:
+- exif-3000.0.0
+
+# Override default flag values for local packages and extra-deps
+flags: {}
+
+# Extra package databases containing global packages
+extra-package-dbs: []
+
+# Control whether we use the GHC we find on the path
+# system-ghc: true
+#
+# Require a specific version of stack, using version ranges
+# require-stack-version: -any # Default
+# require-stack-version: ">=1.2"
+#
+# Override the architecture used by stack, especially useful on Windows
+# arch: i386
+# arch: x86_64
+#
+# Extra directories used by stack for building
+# extra-include-dirs: [/path/to/dir]
+# extra-lib-dirs: [/path/to/dir]
+#
+# Allow a newer minor version of GHC than the snapshot specifies
+# compiler-check: newer-minor
diff --git a/testsuite/Util.hs b/testsuite/Util.hs
--- a/testsuite/Util.hs
+++ b/testsuite/Util.hs
@@ -2,19 +2,20 @@
 -- Author: Dino Morelli <dino@ui3.info>
 
 module Util (
-   binPath, resourcesPath,
+   resourcesPath,
    getProcessOutput, getBinaryOutput,
    assertFalse
 )
    where
 
-import System.IO
-import System.Process
-import Test.HUnit
+import Data.List ( intercalate )
+import System.IO ( hGetContents )
+import System.Process ( ProcessHandle, runInteractiveCommand )
+import Test.HUnit ( Assertion, assertBool )
 
 
-binPath :: FilePath
-binPath = "dist/build/photoname/photoname"
+command :: String
+command = "stack exec photoname"
 
 
 resourcesPath :: FilePath
@@ -24,17 +25,17 @@
 {- Quick and dirty function to run a process and grab its output.
    This evil thing doesn't watch STDERR at all or otherwise do anything
    even remotely safe.
-   XXX Move this somewhere logical like Photoname.Util
 -}
 getProcessOutput :: FilePath -> [String] -> IO (String, ProcessHandle)
 getProcessOutput path' args = do
-   (_, outH, _, procH) <- runInteractiveProcess path' args Nothing Nothing
+   (_, outH, _, procH) <- runInteractiveCommand
+      $ path' ++ " -- " ++ (intercalate " " args)
    output <- hGetContents outH
    return (output, procH)
 
 
 getBinaryOutput :: [String] -> IO (String, ProcessHandle)
-getBinaryOutput = getProcessOutput binPath
+getBinaryOutput = getProcessOutput command
 
 
 assertFalse :: String -> Bool -> Assertion
diff --git a/util/install.hs b/util/install.hs
new file mode 100644
--- /dev/null
+++ b/util/install.hs
@@ -0,0 +1,296 @@
+#! /usr/bin/env stack
+{- stack runghc -}
+
+{-# LANGUAGE ScopedTypeVariables #-}
+
+import Control.Exception
+import Control.Monad
+import Data.List
+import Data.Version
+import Distribution.Package
+import Distribution.PackageDescription hiding ( error, options )
+import Distribution.PackageDescription.Parse
+import Distribution.Verbosity
+import Distribution.Version
+import System.Console.GetOpt
+import System.Directory
+import System.Environment
+import System.Exit
+import System.FilePath
+import System.Process
+import Text.Printf
+import Text.Read
+
+
+defaultOptions :: Options
+defaultOptions = Options
+   { optClean = False
+   , optDelete = False
+   , optHelp = False
+   , optPrefix = "/opt"
+   , optRsrcCpVerbose = True
+   , optInstType = FHS
+   , optVersion = True
+   }
+
+data InstallType = Bundle | FHS
+
+
+main :: IO ()
+main = do
+   -- Parse args
+   (opts, _) <- parseOpts =<< getArgs
+
+   -- User asked for help
+   when (optHelp opts) $ putStrLn usageText >> exitSuccess
+
+   -- Locate cabal file
+   cabalFiles <- (filter $ isSuffixOf ".cabal") <$> getDirectoryContents "."
+
+   when (null cabalFiles) $ do
+      die "Can't continue because no cabal files were found in ."
+
+   -- Parse the cabal file and extract things we need from it
+   -- then pass a pile of what we know to a function to create the
+   -- installation dirs
+   dirs <- constructDirs opts . package . packageDescription
+      <$> readPackageDescription normal (head cabalFiles)
+
+
+   -- Perform the installation
+
+   -- Remove existing install directory
+   appDirExists <- doesDirectoryExist $ appDir dirs
+   when (optDelete opts && appDirExists) $ do
+      putStrLn $ "Removing existing directory " ++ (appDir dirs)
+      removeDirectoryRecursive $ appDir dirs
+
+   -- Clean before building
+   when (optClean opts) $ system "stack clean" >> return ()
+
+   -- Copy the binaries
+   installExitCode <- system $ "stack install --local-bin-path=" ++ (binDir dirs)
+   unless (ok installExitCode) $ die "Can't continue because stack install failed"
+
+   -- Copy the license
+   putStrLn "\nCopying LICENSE"
+   createDirectoryIfMissing True $ docDir dirs
+   copyFile "LICENSE" (docDir dirs </> "LICENSE")
+
+   -- Copy the resources
+   let rsrcDirSrc = "." </> "resources"
+   rsrcsExist <- doesDirectoryExist rsrcDirSrc
+   when rsrcsExist $ do
+      putStrLn $ "\nCopying resources"
+      copyTree (optRsrcCpVerbose opts) rsrcDirSrc (rsrcDir dirs)
+      return ()
+
+   exitSuccess
+
+
+data Dirs = Dirs
+   { appDir :: FilePath
+   , binDir :: FilePath
+   , docDir :: FilePath
+   , rsrcDir :: FilePath
+   }
+
+
+constructDirs :: Options -> PackageId -> Dirs
+constructDirs opts pkgId =
+   Dirs appDir binDir' (appDir </> "doc") (appDir </> "resources")
+
+   where
+      project = unPackageName . pkgName $ pkgId
+      version = showVersion . pkgVersion $ pkgId
+      versionPart = if optVersion opts then "-" ++ version else ""
+      appDir = case (optInstType opts) of
+         Bundle -> optPrefix opts </> (project ++ versionPart)
+         FHS    -> optPrefix opts </> "share" </> (project ++ versionPart)
+      binDir' = case (optInstType opts) of
+         Bundle -> appDir </> "bin"
+         FHS    -> optPrefix opts </> "bin"
+
+
+{- Turn an exit code (say, from system) into a Bool
+-}
+ok :: ExitCode -> Bool
+ok ExitSuccess = True
+ok _           = False
+
+
+{-
+   Argument parsing code
+-}
+
+data Options = Options
+   { optClean :: Bool
+   , optDelete :: Bool
+   , optHelp :: Bool
+   , optPrefix :: FilePath
+   , optRsrcCpVerbose :: Bool
+   , optInstType :: InstallType
+   , optVersion :: Bool
+   }
+
+
+instance Read InstallType where
+   readsPrec _ "bundle" = [(Bundle, "")]
+   readsPrec _ "fhs"    = [(FHS, "")]
+   readsPrec _ _        = []
+
+instance Show InstallType where
+   show Bundle = "bundle"
+   show FHS = "fhs"
+
+
+readInstallType :: String -> InstallType
+readInstallType s =
+   case (readEither s) of
+      Left _ -> error $ printf "Can't continue because %s is not a valid install type\n\n%s" s usageText
+      Right t -> t
+
+
+options :: [OptDescr (Options -> Options)]
+options =
+   [ Option ['c'] ["clean"]
+      (NoArg (\opts -> opts { optClean = True } ))
+      ("Do 'stack clean' first." ++ (defaultText . optClean $ defaultOptions))
+   , Option ['C'] ["no-clean"]
+      (NoArg (\opts -> opts { optClean = False } ))
+      ("Do not 'stack clean' first."
+         ++ (defaultText . not . optClean $ defaultOptions))
+   , Option ['d'] ["delete"]
+      (NoArg (\opts -> opts { optDelete = True } ))
+      ("Delete the app directory before copying files."
+         ++ (defaultText . optDelete $ defaultOptions))
+   , Option ['D'] ["no-delete"]
+      (NoArg (\opts -> opts { optDelete = False } ))
+      ("Do not delete the app directory before copying files."
+         ++ (defaultText . not . optDelete $ defaultOptions))
+   , Option ['h'] ["help"]
+      (NoArg (\opts -> opts { optHelp = True } ))
+      "This help information."
+   , Option ['p'] ["prefix"]
+      (ReqArg (\s opts -> opts { optPrefix = s } ) "PREFIX" )
+      (printf "Install prefix directory. Defaults to %s so what you'll end up with is %s/PROJECT-VERSION"
+         (optPrefix defaultOptions) (optPrefix defaultOptions))
+   , Option ['r'] ["resource-copy-verbose"]
+      (NoArg (\opts -> opts { optRsrcCpVerbose = True } ))
+      ("Be chatty when copying the resources directory."
+         ++ (defaultText . optRsrcCpVerbose $ defaultOptions))
+   , Option ['R'] ["no-resource-copy-verbose"]
+      (NoArg (\opts -> opts { optRsrcCpVerbose = False } ))
+      ("Don't be chatty when copying the resources directory. Useful when there are a LOT of resources."
+         ++ (defaultText . not . optRsrcCpVerbose $ defaultOptions))
+   , Option ['t'] ["type"]
+      (ReqArg (\s opts -> opts { optInstType = readInstallType s } ) "INST_TYPE" )
+      (printf "Installation type, see INSTALLATION TYPE below for details. Default: %s"
+         (show . optInstType $ defaultOptions))
+   , Option ['v'] ["version"]
+      (NoArg (\opts -> opts { optVersion = True } ))
+      (printf "Include version in installation path, meaning: %s/PROJECT-VERSION %s"
+         (optPrefix defaultOptions) (defaultText . optVersion $ defaultOptions))
+   , Option ['V'] ["no-version"]
+      (NoArg (\opts -> opts { optVersion = False } ))
+      (printf "Do not include version in installation path, meaning: %s/PROJECT %s"
+         (optPrefix defaultOptions) (defaultText . not . optVersion $ defaultOptions))
+   ]
+
+
+defaultText :: Bool -> String
+defaultText True  = " Default"
+defaultText False = ""
+
+
+parseOpts :: [String] -> IO (Options, [String])
+parseOpts args =
+   case getOpt Permute options args of
+      (o,n,[]  ) -> return (foldl (flip id) defaultOptions o, n)
+      (_,_,errs) -> ioError $ userError (concat errs ++ usageText)
+
+
+usageText :: String
+usageText = (usageInfo header options) ++ "\n" ++ footer
+   where
+      header = init $ unlines
+         [ "Usage: install.hs [OPTIONS]"
+         , ""
+         , "options:"
+         ]
+      footer = init $ unlines
+         [ "INSTALLATION TYPE"
+         , ""
+         , "This is the topology used when copying files, one of: bundle, fhs"
+         , ""
+         , "bundle is sort-of a self-contained structure like this:"
+         , ""
+         , "  $PREFIX/"
+         , "    $PROJECT-$VERSION/    <-- this is the \"app directory\""
+         , "      bin/..."
+         , "      doc/LICENSE"
+         , "      resources/..."
+         , ""
+         , "fhs is the more traditional UNIX structure like this:"
+         , ""
+         , "  $PREFIX/"
+         , "    bin/..."
+         , "    share/"
+         , "      $PROJECT-$VERSION/  <-- this is the \"app directory\""
+         , "        doc/LICENSE"
+         , "        resources/..."
+         , ""
+         , "Be aware that when the --delete switch is used along with fhs type, the binaries WILL NOT be deleted, only the \"app directory\"."
+         , ""
+         , "COMPILING"
+         , ""
+         , "install.hs was intentionally left as a script, but if you would prefer to compile it, do this:"
+         , ""
+         , "  $ stack ghc -- -o util/install util/install.hs"
+         , ""
+         , ""
+         , "This script is part of the hsinstall package by Dino Morelli <dino@ui3.info>"
+         ]
+
+
+{-
+   Recursive file copying code
+
+   It was desireable to have a standalone recursive file copy in
+   this script for maximum cross-platform compatibility and to
+   avoid Haskell library dependencies.
+
+   Many thanks to [abuzittin gillifirca](https://codereview.stackexchange.com/users/20251/abuzittin-gillifirca) for the StackOverflow post [Copying files in Haskell](https://codereview.stackexchange.com/questions/68908/copying-files-in-haskell) where the following code was lifted.
+-}
+
+copyTree :: Bool -> FilePath -> FilePath -> IO ()
+copyTree chatty s t = do
+    createDirectoryIfMissing True t
+    subItems <- getSubitems s
+    mapM_ (copyItem chatty s t) subItems
+
+
+getSubitems :: FilePath -> IO [(Bool, FilePath)]
+getSubitems path = getSubitems' ""
+  where
+    getChildren path =  (\\ [".", ".."]) <$> getDirectoryContents path
+
+    getSubitems' relPath = do
+        let absPath = path </> relPath
+        isDir <- doesDirectoryExist absPath
+        children <- if isDir then getChildren absPath else return []
+        let relChildren = [relPath </> p | p <- children]
+        ((isDir, relPath) :) . concat <$> mapM getSubitems' relChildren
+
+
+copyItem :: Bool -> FilePath -> FilePath -> (Bool, FilePath) -> IO ()
+copyItem chatty baseSourcePath baseTargetPath (isDir, relativePath) = do
+    let sourcePath = baseSourcePath </> relativePath
+    let targetPath = baseTargetPath </> relativePath
+
+    when chatty $
+       putStrLn $ "Copying " ++ sourcePath ++ " to " ++ targetPath
+
+    if isDir
+      then createDirectoryIfMissing False targetPath
+      else copyFile sourcePath targetPath
diff --git a/util/prefs/boring b/util/prefs/boring
new file mode 100644
--- /dev/null
+++ b/util/prefs/boring
@@ -0,0 +1,124 @@
+# This file contains a list of extended regular expressions, one per
+# line. A file path matching any of these expressions will be filtered
+# out during `darcs add', or when the `--look-for-adds' flag is passed
+# to `darcs whatsnew' and `record'. The entries in ~/.darcs/boring (if
+# it exists) supplement those in this file.
+# 
+# Blank lines, and lines beginning with an octothorpe (#) are ignored.
+# See regex(7) for a description of extended regular expressions.
+
+### compiler and interpreter intermediate files
+# haskell (ghc) interfaces
+\.hi$
+\.hi-boot$
+\.o-boot$
+# object files
+\.o$
+\.o\.cmd$
+# profiling haskell
+\.p_hi$
+\.p_o$
+# haskell program coverage resp. profiling info
+\.tix$
+\.prof$
+# fortran module files
+\.mod$
+# linux kernel
+\.ko\.cmd$
+\.mod\.c$
+(^|/)\.tmp_versions($|/)
+# *.ko files aren't boring by default because they might
+# be Korean translations rather than kernel modules
+# \.ko$
+# python, emacs, java byte code
+\.py[co]$
+\.elc$
+\.class$
+# objects and libraries; lo and la are libtool things
+\.(obj|a|exe|so|lo|la)$
+# compiled zsh configuration files
+\.zwc$
+# Common LISP output files for CLISP and CMUCL
+\.(fas|fasl|sparcf|x86f)$
+
+### build and packaging systems
+# cabal intermediates
+\.installed-pkg-config
+\.setup-config
+# standard cabal build dir, might not be boring for everybody
+# ^dist(/|$)
+# autotools
+(^|/)autom4te\.cache($|/)
+(^|/)config\.(log|status)$
+# microsoft web expression, visual studio metadata directories
+\_vti_cnf$
+\_vti_pvt$
+# gentoo tools
+\.revdep-rebuild.*
+# generated dependencies
+^\.depend$
+
+### version control systems
+# cvs
+(^|/)CVS($|/)
+\.cvsignore$
+# cvs, emacs locks
+^\.#
+# rcs
+(^|/)RCS($|/)
+,v$
+# subversion
+(^|/)\.svn($|/)
+# mercurial
+(^|/)\.hg($|/)
+# git
+(^|/)\.git($|/)
+# bzr
+\.bzr$
+# sccs
+(^|/)SCCS($|/)
+# darcs
+(^|/)_darcs($|/)
+(^|/)\.darcsrepo($|/)
+^\.darcs-temp-mail$
+-darcs-backup[[:digit:]]+$
+# gnu arch
+(^|/)(\+|,)
+(^|/)vssver\.scc$
+\.swp$
+(^|/)MT($|/)
+(^|/)\{arch\}($|/)
+(^|/).arch-ids($|/)
+# bitkeeper
+(^|/)BitKeeper($|/)
+(^|/)ChangeSet($|/)
+
+### miscellaneous
+# backup files
+~$
+\.bak$
+\.BAK$
+# patch originals and rejects
+\.orig$
+\.rej$
+# X server
+\..serverauth.*
+# image spam
+\#
+(^|/)Thumbs\.db$
+# vi, emacs tags
+(^|/)(tags|TAGS)$
+#(^|/)\.[^/]
+# core dumps
+(^|/|\.)core$
+# partial broken files (KIO copy operations)
+\.part$
+# waf files, see http://code.google.com/p/waf/
+(^|/)\.waf-[[:digit:].]+-[[:digit:]]+($|/)
+(^|/)\.lock-wscript$
+# mac os finder
+(^|/)\.DS_Store$
+# emacs saved sessions (desktops)
+(^|.*/)\.emacs\.desktop(\.lock)?$
+
+(^|/).stack-work($|/)
diff --git a/util/resources/test.conf b/util/resources/test.conf
new file mode 100644
--- /dev/null
+++ b/util/resources/test.conf
@@ -0,0 +1,4 @@
+move
+old-style
+parent-dir=~/mypics
+suffix=_dwm
