diff --git a/Data/Derive/UniplateDirect.hs b/Data/Derive/UniplateDirect.hs
--- a/Data/Derive/UniplateDirect.hs
+++ b/Data/Derive/UniplateDirect.hs
@@ -2,19 +2,24 @@
 -- NOTE: Cannot be guessed as it relies on type information
 
 -- | Derive Uniplate and Biplate using the Direct combinators.
---   You must specific monomorphic instances, i.e:
+--   You must request monomorphic instances, i.e:
 --
--- > data Foo a = Foo a Int
+-- > data Foo a = Foo a (Bool, a)
 -- >
 -- > {-!
 -- > deriving instance UniplateDirect (Foo Int)
+-- > deriving instance UniplateDirect (Bool, Int) Int
 -- > deriving instance UniplateDirect (Foo Int) Int
 -- > !-}
 --
---   All types referred to must be in scope at the time.
+--   This will generate the instances @Uniplate (Foo Int)@,
+--   @Biplate (Bool, Int) Int@ and @Biplate (Foo Int) Int@.
+--   Generally, start with the instance you are after (e.g. @UniplateDirect (Foo Int)@),
+--   try to compile and add further instances as necessary. @UniplateDirect@ with
+--   one argument derives Uniplate, and with two arguments derives Biplate.
 --
---   @deriving UniplateDirect@ with no arguments will be assumed to derive the Uniplate
---   instance on all types being unit.
+--   @deriving UniplateDirect@ on a data type with no arguments derives Uniplate
+--   with all type parameters defaulting to @()@.
 module Data.Derive.UniplateDirect(makeUniplateDirect) where
 
 
diff --git a/Derive/Flags.hs b/Derive/Flags.hs
--- a/Derive/Flags.hs
+++ b/Derive/Flags.hs
@@ -11,7 +11,7 @@
 
 
 data Flag = Version | Help | Output String | Import String | Modu String
-          | Append | Derive [String] | NoOpts | Test | Generate
+          | Append | Derive [String] | NoOpts | Preprocessor | Test | Generate
             deriving (Eq, Show)
 
 
@@ -25,6 +25,7 @@
     ,Option "a"  ["append"]   (NoArg Append)           "append the result to the file"
     ,Option "d"  ["derive"]   (ReqArg splt "DERIVES")  "things to derive for all types"
     ,Option "n"  ["no-opts"]  (NoArg NoOpts)           "ignore the file options"
+    ,Option "F"  ["preprocessor"] (NoArg Preprocessor) "operate as a GHC preprocessor with -pgmF"
     ,Option ""   ["test"]     (NoArg Test)             "run the test suite"
     ,Option ""   ["generate"] (NoArg Generate)         "perform code generation"
     ]
@@ -40,6 +41,7 @@
     case getOpt Permute options args of
         (o,n,[]  ) | Version `elem` o -> putStrLn "Derive 2.4.* (C) Neil Mitchell 2006-2011" >> exitSuccess
                    | Help `elem` o    -> putStr flagInfo >> exitSuccess
+                   | Preprocessor `elem` o -> return (o,n)
                    | otherwise        -> do files <- mapM pickFile n; return (o, files)
         (_,_,errs) -> hPutStr stderr (concat errs ++ flagInfo) >> exitFailure
     where
diff --git a/Derive/Main.hs b/Derive/Main.hs
--- a/Derive/Main.hs
+++ b/Derive/Main.hs
@@ -8,6 +8,7 @@
 import Derive.Test
 import Derive.Flags
 import Data.List
+import System.Directory
 
 
 deriveMain :: [Derivation] -> IO ()
@@ -17,6 +18,13 @@
         test
      else if Generate `elem` flags then
         generate
+     else if Preprocessor `elem` flags then
+        (if length files /= 3 then
+            error $ "Expected to be invoked as a GHC preprocessor with 3 files, but got " ++ show (length files)
+         else do
+            copyFile (files !! 1) (files !! 2)
+            mainFile derivations (Append:flags) (files !! 2)
+         )
      else if null files then
         putStr $ "No files specified\n" ++ flagInfo
      else
diff --git a/derive.cabal b/derive.cabal
--- a/derive.cabal
+++ b/derive.cabal
@@ -1,7 +1,7 @@
 cabal-version:  >= 1.6
 build-type:     Default
 name:           derive
-version:        2.5.4
+version:        2.5.5
 build-type:     Simple
 copyright:      Neil Mitchell 2006-2011
 author:         Neil Mitchell <ndmitchell@gmail.com>
diff --git a/derive.htm b/derive.htm
--- a/derive.htm
+++ b/derive.htm
@@ -79,18 +79,8 @@
 <h2>Obtaining and Installing Data.Derive</h2>
 
 <p>
-	Data.Derive is available using <a href="http://darcs.net/">darcs</a>:
-</p>
-<pre>
-darcs get --partial <a href="http://community.haskell.org/~ndm/darcs/derive">http://community.haskell.org/~ndm/darcs/derive</a>
-</pre>
-<p>
-	Install the program using the standard sequence of Cabal magic:
+	Installation follows the standard pattern of any Haskell library or program, type <tt>cabal update</tt> to update your local hackage database, then <tt>cabal install derive</tt> to install Derive.
 </p>
-<pre>
-cabal update
-cabal install derive
-</pre>
 
 
 <h2>Supported Derivations</h2>
@@ -175,6 +165,18 @@
 
 <p>
 	One way is to append the text to the bottom of the module, this can be done by passing the <tt>--append</tt> flag. If this is done, Derive will generate the required instances and place them at the bottom of the file, along with a checksum. Do not modify these instances.
+</p>
+
+<h3>As a GHC preprocessor</h3>
+
+<p>
+	To use Derive as a GHC preprocessor, add the following line at the top of the source file:
+</p>
+<pre>
+{-# OPTIONS_GHC -F -pgmFderive -optF-F #-}
+</pre>
+<p>
+	This instructs GHC to apply a preprocessor (<tt>-F</tt>), and to use the preprocessor <tt>derive -F</tt>.
 </p>
 
 <h3>Using CPP</h3>
