diff --git a/CHANGELOG.txt b/CHANGELOG.txt
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,3 +1,12 @@
+0.1.0, 2010-04-01:
+   Got rid of the regex-dfa dependency.
+
+   Dropped all the Datum stuff. New rule* signatures:
+		rule :: String -> [String] -> ([Source] -> Target -> IO ()) -> [([Source],Target)] -> Coadjute ()
+		ruleM :: String -> [String] -> ([Source] -> [Target] -> IO ()) -> [([Source],[Target])] -> Coadjute ()
+		rule' :: String -> ([Source] -> Target -> IO ()) -> [([Source],Target)] -> Coadjute ()
+		ruleM' :: String -> ([Source] -> [Target] -> IO ()) -> [([Source],[Target])] -> Coadjute ()
+
 0.0.1, 2009-01-18:
 	Initial release.
 
diff --git a/Coadjute.cabal b/Coadjute.cabal
--- a/Coadjute.cabal
+++ b/Coadjute.cabal
@@ -1,7 +1,7 @@
 Cabal-Version: >= 1.2
 
 Name:        Coadjute
-Version:     0.0.1
+Version:     0.1.0
 Homepage:    http://iki.fi/matti.niemenmaa/coadjute/
 Synopsis:    A generic build tool
 Category:    Development
@@ -11,7 +11,7 @@
    portable replacement for make. It's not tailored toward any particular
    language, and is not meant to replace tools which target a specific
    environment.
-
+   .
    Portability is striven towards in two ways:
      - You don't have to deal with the idiosyncrasies of many make implementations
        (well, people don't, but they call their GNU Make files makefiles
@@ -19,7 +19,7 @@
      - You have Haskell at your disposal, and are encouraged to use that
        whenever possible instead of system-specific binaries like the POSIX
        commands we all know and love.
-
+   .
    With support for:
      - Parallel task performing.
      - Advanced out-of-dateness detection:
@@ -43,9 +43,9 @@
 
 Library
    Build-Depends: base           >= 4     && < 5
-                , array          >= 0.1   && < 0.3
+                , array          >= 0.1   && < 0.4
                 , bytestring     >= 0.9   && < 0.10
-                , containers     >= 0.2   && < 0.3
+                , containers     >= 0.2   && < 0.4
                 , directory      >= 1.0   && < 1.1
                 , filepath       >= 1.1   && < 1.2
                 , mtl            >= 1.1   && < 1.2
@@ -53,8 +53,7 @@
                 , pretty         >= 1.0.1 && < 1.1
                 , bytestring-csv >= 0.1.2 && < 0.2
                 , fgl            >= 5.4   && < 5.5
-                , pureMD5        >= 0.2.4 && < 0.3
-                , regex-dfa      >= 0.91  && < 1
+                , pureMD5        >= 0.2.4 && < 1.2
                 , safe           >= 0.2   && < 0.3
                 , utf8-string    >= 0.3   && < 0.4
 
diff --git a/Coadjute.hs b/Coadjute.hs
--- a/Coadjute.hs
+++ b/Coadjute.hs
@@ -32,26 +32,19 @@
      -- ** Defining rules
      -- $rules
    , rule, ruleM
-   , sourceToDatum
-     -- *** Convenience functions
      -- $convenience
    , rule', ruleM'
-   , sourceToDatum'
      -- ** Other functions within Coadjute
    , getUserArgs
      -- ** Sources and Targets
      -- $sourcesTargets
    , Source, Target
-     -- * TaskDatum
-     -- $taskdata
-   , TaskDatum, SingleDatum, MultiDatum
    ) where
 
 import Coadjute.Main (coadjute)
 import Coadjute.Rule ( Coadjute
                      , rule, rule', ruleM, ruleM'
-                     , sourceToDatum, sourceToDatum', getUserArgs
-                     , TaskDatum, SingleDatum, MultiDatum
+                     , getUserArgs
                      )
 import Coadjute.Task (Source, Target)
 
@@ -71,22 +64,22 @@
 --
 -- Each function takes:
 --
---   * A name for the rule.
+--   * A name for the rule. (Currently only used in error messages.)
 --
 --   * A build action: this function will be run if the dependencies are deemed
 --     out of date compared to the target.
 --
---   * 'TaskDatum's: dependencies paired up with targets.
+--   * A list of dependencies paіred with one or more targets.
 --
 -- For instance, you might have a rule \"C files\" which handles building of C
 -- code, thus:
 --
 -- > rule' "C files"
 -- >       (\_ c -> system ("gcc -c " ++ c))
--- >       (sourceToDatum' (reverse.('o':).drop 1 . reverse) ["foo.c","bar.c"])
+-- >       [(["foo.c"],"foo.o"), (["bar.c"],"bar.o")]
 --
--- This example also demonstrates poor practices: you should really use
--- 'sourceToDatum' and specify complete dependency data, such as header files.
+-- This example also demonstrates poor practices: you should really specify
+-- complete dependency data, such as header files.
 --
 -- The above example did not use command line arguments, so let's have a look
 -- at those. Let's say you want to build either a debug or a release version of
diff --git a/Coadjute/CoData.hs b/Coadjute/CoData.hs
--- a/Coadjute/CoData.hs
+++ b/Coadjute/CoData.hs
@@ -34,7 +34,6 @@
 import System.IO                 (hPutStrLn, stderr)
 import Text.Printf               (printf)
 import Text.PrettyPrint.HughesPJ (renderStyle, style, Style(..), fsep, text)
-import Text.Regex.DFA
 
 import Coadjute.Util.Misc (mread)
 
@@ -200,14 +199,9 @@
 
    prettify = renderStyle (style {lineLength = 80}) . fsep . map text . words
 
-helpRegex :: Regex
-helpRegex =
-   makeRegexOpts CompOption { caseSensitive = False, multiline = False }
-                 defaultExecOpt
-                 "^(--?|/)([?]|h(e?lp)?)$"
-
 isHelp :: String -> Bool
-isHelp = matchTest helpRegex
+isHelp = flip elem [ pre ++ opt | pre <- ["-","/","--"]
+                                , opt <- ["?","h","hlp","help"] ]
 
 handleNonOpt :: String -> String -> OptionData -> OptionData
 handleNonOpt helpString opt (cd,s) =
diff --git a/Coadjute/Rule.hs b/Coadjute/Rule.hs
--- a/Coadjute/Rule.hs
+++ b/Coadjute/Rule.hs
@@ -2,15 +2,13 @@
 
 -- |Holds the 'Rule' and 'Coadjute' types and relevant functions which act on
 -- them. For user code, the important parts here are the 'rule' family of
--- functions and sourceToDatum.
+-- functions.
 module Coadjute.Rule(
    Rule(..),
    Coadjute, runCoadjute,
    getUserArgs,
    rule, ruleM,
-   rule', ruleM',
-   sourceToDatum, sourceToDatum',
-   TaskDatum, SingleDatum, MultiDatum
+   rule', ruleM'
 ) where
 
 import Control.Arrow       (first)
@@ -55,58 +53,36 @@
 getUserArgs :: Coadjute [String]
 getUserArgs = Co $ gets snd
 
-newtype TaskDatum a = TD ([Source], a)
-
--- | A SingleDatum stores a single 'Target'.
-type SingleDatum = TaskDatum  Target
-
--- | A MultiDatum stores multiple 'Target's, to be built all at once in one
--- action.
-type  MultiDatum = TaskDatum [Target]
-
 -- |A rule for building targets individually.
 rule :: String
      -> [String]
      -> ([Source] -> Target -> IO ())
-     -> [SingleDatum]
+     -> [([Source],Target)]
      -> Coadjute ()
 rule name args action =
    Co . modify . first . addRule . Rule name .
-      map (\(TD (d, t)) -> Task name (Set.fromList args) [t] d (action d t))
+      map (\(d,t) -> Task name (Set.fromList args) [t] d (action d t))
 
 -- |A rule for building multiple targets at once.
 ruleM :: String
       -> [String]
       -> ([Source] -> [Target] -> IO ())
-      -> [MultiDatum]
+      -> [([Source],[Target])]
       -> Coadjute ()
 ruleM name args action =
    Co . modify . first . addRule . Rule name .
-      map (\(TD (d, t)) -> Task name (Set.fromList args) t d (action d t))
+      map (\(d,t) -> Task name (Set.fromList args) t d (action d t))
 
 -- | > rule' = flip rule []
 rule' :: String
       -> ([Source] -> Target -> IO ())
-      -> [SingleDatum]
+      -> [([Source],Target)]
       -> Coadjute ()
 rule' = flip rule []
 
 -- | > ruleM' = flip ruleM []
 ruleM' :: String
        -> ([Source] -> [Target] -> IO ())
-       -> [MultiDatum]
+       -> [([Source],[Target])]
        -> Coadjute ()
 ruleM' = flip ruleM []
-
--- |Use a supplied function of type @Source -> ([Source], Target)@ or @Source
--- -> ([Source], [Target])@ to turn a list of Sources to 'SingleDatum's or
--- 'MultiDatum's, for passing to one of the 'rule' functions.
---
--- The original Source is prepended to the list of dependencies in the Datum.
-sourceToDatum :: (Source -> ([Source], a)) -> [Source] -> [TaskDatum a]
-sourceToDatum f = map (\x -> TD $ first (x:) (f x))
-
--- |A convenience around 'sourceToDatum' for when you don't wish to provide
--- extra dependencies.
-sourceToDatum' :: (Source -> a) -> [Source] -> [TaskDatum a]
-sourceToDatum' f = sourceToDatum ((,) [] . f)
diff --git a/Coadjute/Task/Perform.hs b/Coadjute/Task/Perform.hs
--- a/Coadjute/Task/Perform.hs
+++ b/Coadjute/Task/Perform.hs
@@ -104,7 +104,7 @@
    io$ do
       when (verbosity >= Verbose) $ do
          let n = noNodes gr
-         printf "Performing %d task%s in parallel, " n (plural n)
+         printf "Performing %d task%s in parallel, " n (plural n) :: IO ()
          case cap of
               Nothing -> putStrLn "with no limit to the simultaneity."
               Just c  -> printf "running at most %d at a time.\n" c
@@ -116,7 +116,7 @@
       -- set the manager thread rolling
       managerDone <- newEmptyMVar
       managerChan <- newChan
-      forkIO $ do
+      _ <- forkIO $ do
          manage verbosity cap managerChan
          putMVar managerDone ()
 
@@ -149,7 +149,7 @@
                  KeepGoing task doneChan -> do
                     maybe (return ()) wait cap
                     printMessage verbosity task
-                    forkIO $ do
+                    _ <- forkIO $ do
                        s <- performTask task
                        when (not.null $ s) (writeChan chan (ErrorMessage s))
                        writeChan doneChan ()
diff --git a/LICENSE.txt b/LICENSE.txt
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,4 +1,4 @@
-Copyright (c) 2008-2009, Matti Niemenmaa
+Copyright (c) 2008-2010, Matti Niemenmaa
 All rights reserved.
 
 Redistribution and use in source and binary forms, with or without
