diff --git a/.hlint.yaml b/.hlint.yaml
new file mode 100644
--- /dev/null
+++ b/.hlint.yaml
@@ -0,0 +1,14 @@
+# .hlint.yaml
+
+- ignore: {name: Avoid lambda}
+- ignore: {name: Eta reduce}
+- ignore: {name: Redundant $}
+- ignore: {name: Redundant bracket}
+- ignore: {name: Unused LANGUAGE pragma}
+- ignore: {name: Use <$>}
+- ignore: {name: Use fmap}
+- ignore: {name: Use intercalate}
+- ignore: {name: Use isJust}
+- ignore: {name: Use Just}
+- ignore: {name: Use LANGUAGE pragmas}
+- ignore: {name: Wta reduce}
diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -2,6 +2,22 @@
 All notable changes to this project will be documented in this file.
 This project adheres to the [Package Versioning Policy](https://wiki.haskell.org/Package_versioning_policy).
 
+## [3001.3.0.3]
+### Changed
+- Bumped upper version bounds for containers and time.
+- Updated to exceptions 0.10.x. This meant extending our `MonadMask` instance
+  to provide the `generalBracket` method that was added to the class in recent
+  versions of the exceptions library.
+- The doctest suite would not work reliably with different versions of Cabal.
+  Instead of going all out with a custom written build system to support it
+  properly, we now run doctests as part of our CI builds but not as a part of
+  the Cabal build any more.
+- Fixed several compiler warnings in our code.
+
+## [3001.3.0.2]
+### Changed
+- Bumped QuickCheck upper bound to version < 2.10
+
 ## [3001.3.0.1]
 ### Changed
 - Bumped doctest to version < 0.12
@@ -42,7 +58,9 @@
 - GHC 7.8.3 support
 
 [Unreleased]:
-https://github.com/cheecheeo/haskell-cgi/compare/3001.3.0.1...HEAD
+https://github.com/cheecheeo/haskell-cgi/compare/3001.3.0.2...HEAD
+[3001.3.0.2]:
+https://github.com/cheecheeo/haskell-cgi/compare/3001.3.0.1...3001.3.0.2
 [3001.3.0.1]:
 https://github.com/cheecheeo/haskell-cgi/compare/3001.3.0.0...3001.3.0.1
 [3001.3.0.0]:
diff --git a/Network/CGI.hs b/Network/CGI.hs
--- a/Network/CGI.hs
+++ b/Network/CGI.hs
@@ -1,4 +1,3 @@
-{-# LANGUAGE OverlappingInstances #-}
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Network.CGI
diff --git a/Network/CGI/Accept.hs b/Network/CGI/Accept.hs
--- a/Network/CGI/Accept.hs
+++ b/Network/CGI/Accept.hs
@@ -30,8 +30,12 @@
 -- A bounded join-semilattice
 class Eq a => Acceptable a where
     includes :: a -> a -> Bool
-    top :: a
+{-  top :: a
 
+    TODO: This method is not exported from his module, so it cannot be used by
+          code on the outside. It is not used inside of this module either. So,
+          do we actually need it?
+-}
 instance HeaderValue a => HeaderValue (Accept a) where
     parseHeaderValue = fmap Accept $ sepBy p (lexeme (char ','))
         where p = do a <- parseHeaderValue
@@ -74,7 +78,7 @@
     includes x y = ctType x `starOrEqualTo` ctType y
                    && ctSubtype x `starOrEqualTo` ctSubtype y
                    && all (hasParameter y) (ctParameters x)
-    top = ContentType "*" "*" []
+    -- top = ContentType "*" "*" []
 
 hasParameter :: ContentType -> (String, String) -> Bool
 hasParameter t (k,v) = maybe False (==v) $ lookup k (ctParameters t)
@@ -116,7 +120,7 @@
 
 instance Acceptable Charset where
     Charset x `includes` Charset y = starOrEqualTo x y
-    top = Charset "*"
+    -- top = Charset "*"
 
 --
 -- ** Accept-Encoding
@@ -141,7 +145,7 @@
 
 instance Acceptable ContentEncoding where
     ContentEncoding x `includes` ContentEncoding y = starOrEqualTo x y
-    top = ContentEncoding "*"
+    -- top = ContentEncoding "*"
 
 --
 -- ** Accept-Language
@@ -172,4 +176,4 @@
 instance Acceptable Language where
     Language x `includes` Language y =
         x == "*" || x == y || (x `isPrefixOf` y && "-" `isPrefixOf` drop (length x) y)
-    top = Language "*"
+    -- top = Language "*"
diff --git a/Network/CGI/Monad.hs b/Network/CGI/Monad.hs
--- a/Network/CGI/Monad.hs
+++ b/Network/CGI/Monad.hs
@@ -1,5 +1,7 @@
-{-# OPTIONS_GHC -fglasgow-exts #-}
-{-# LANGUAGE CPP, DeriveDataTypeable #-}
+{-# LANGUAGE CPP, DeriveDataTypeable, MultiParamTypeClasses #-}
+#if __GLASGOW_HASKELL__ >= 800
+{-# OPTIONS_GHC -Wno-redundant-constraints #-}
+#endif
 -----------------------------------------------------------------------------
 -- |
 -- Module      :  Network.CGI.Monad
@@ -28,11 +30,14 @@
   throwCGI, catchCGI, tryCGI, handleExceptionCGI,
  ) where
 
+#if !MIN_VERSION_base(4,6,0)
 import Prelude hiding (catch)
+#endif
+
 import Control.Exception as Exception (SomeException)
 import Control.Applicative (Applicative(..))
 import Control.Monad (liftM)
-import Control.Monad.Catch (MonadCatch, MonadThrow, MonadMask, throwM, catch, try, mask, uninterruptibleMask)
+import Control.Monad.Catch (MonadCatch, MonadThrow, MonadMask, throwM, catch, try, mask, uninterruptibleMask, generalBracket)
 import Control.Monad.Except (MonadError(..))
 import Control.Monad.Reader (ReaderT(..), asks)
 import Control.Monad.Writer (WriterT(..), tell)
@@ -57,7 +62,7 @@
 -- | The CGIT monad transformer.
 newtype CGIT m a = CGIT { unCGIT :: ReaderT CGIRequest (WriterT Headers m) a }
 #if MIN_VERSION_base(4,7,0)
-			deriving (Typeable)
+                        deriving (Typeable)
 
 #else
 instance (Typeable1 m, Typeable a) => Typeable (CGIT m a) where
@@ -90,6 +95,8 @@
 instance MonadMask m => MonadMask (CGIT m) where
     mask a = CGIT $ mask $ \u -> unCGIT $ a $ CGIT . u . unCGIT
     uninterruptibleMask a = CGIT $ uninterruptibleMask $ \u -> unCGIT $ a $ CGIT . u . unCGIT
+    generalBracket acquire release f = CGIT $
+      generalBracket (unCGIT acquire) (\a b -> unCGIT (release a b)) (unCGIT . f)
 
 -- | The class of CGI monads. Most CGI actions can be run in
 --   any monad which is an instance of this class, which means that
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,28 @@
+cgi
+===
+
+[![hackage release](https://img.shields.io/hackage/v/cgi.svg?label=hackage)](http://hackage.haskell.org/package/cgi)
+[![stackage LTS package](http://stackage.org/package/cgi/badge/lts)](http://stackage.org/lts/package/cgi)
+[![stackage Nightly package](http://stackage.org/package/cgi/badge/nightly)](http://stackage.org/nightly/package/cgi)
+[![travis build status](https://img.shields.io/travis/cheecheeo/haskell-cgi/master.svg?label=travis+build)](https://travis-ci.org/cheecheeo/haskell-cgi)
+
+This is a Haskell library for writing CGI programs.
+Its features include:
+
+- Access to CGI parameters (e.g. form input) from both
+  GET and POST requests.
+- Access to CGI environment variables.
+- Ability to set arbitrary response headers.
+- Support for HTTP cookies.
+- An efficient implementation of multipart/form-data
+  using Data.ByteString. This allows for efficient
+  handling of file uploads.
+- Wrapper functions for compatibility with the old
+  Network.CGI module.
+- A CGI monad transformer.
+- Basic exception handling and logging (these should be improved)
+- Low-level run functions that allow using programs written with
+  this package with protocols other than CGI, for example FastCGI.
+
+On hackage: http://hackage.haskell.org/package/cgi
+Source: https://github.com/cheecheeo/haskell-cgi
diff --git a/cgi.cabal b/cgi.cabal
--- a/cgi.cabal
+++ b/cgi.cabal
@@ -1,5 +1,5 @@
 Name: cgi
-Version: 3001.3.0.2
+Version: 3001.3.0.3
 Copyright: Bjorn Bringert, John Chee, Andy Gill, Anders Kaseorg,
            Ian Lynagh, Erik Meijer, Sven Panne, Jeremy Shaw
 Category: Network
@@ -13,8 +13,9 @@
 Description:
  This is a Haskell library for writing CGI programs.
 Build-Type: Simple
-extra-source-files: CHANGELOG.md
+extra-source-files: README.md, CHANGELOG.md, .hlint.yaml
 Cabal-Version: >=1.8
+tested-with: GHC == 7.10.3, GHC == 8.0.2, GHC == 8.2.2, GHC == 8.4.4, GHC == 8.6.2
 
 source-repository head
   type: git
@@ -44,12 +45,12 @@
 
   Build-depends:
     parsec >= 2.0 && < 3.2,
-    exceptions < 0.9,
+    exceptions >= 0.10 && < 0.11,
     xhtml >= 3000.0.0 && < 3000.3,
     bytestring < 0.11,
     base >= 4.5 && < 5,
-    time >= 1.5 && < 1.7,
-    containers < 0.6,
+    time >= 1.5 && < 1.10,
+    containers < 0.7,
     multipart >= 0.1.2 && < 0.2
   If flag(network-uri)
     Build-depends: network-uri == 2.6.*, network == 2.6.*
@@ -61,19 +62,6 @@
   Else
     Build-depends:
       mtl>=2.2.1 && < 2.3
-
-test-suite doctests
-  type:             exitcode-stdio-1.0
-  ghc-options:      -threaded
-  main-is:          DocTestMain.hs
-  other-modules:
-    DocTest
-  hs-source-dirs:   src
-  ghc-options:      -Wall
-  build-depends:
-      base
-    , doctest >= 0.8 && < 0.12
-    , QuickCheck >= 2.8.1 && < 2.10
 
 --Executable:     printinput
 --Main-Is:        printinput.hs
diff --git a/src/DocTest.hs b/src/DocTest.hs
deleted file mode 100644
--- a/src/DocTest.hs
+++ /dev/null
@@ -1,7 +0,0 @@
-module DocTest (
-  test
-  ) where
-import Test.DocTest
-
-test :: IO ()
-test = doctest ["-iNetwork", "Network/CGI/Protocol.hs"]
diff --git a/src/DocTestMain.hs b/src/DocTestMain.hs
deleted file mode 100644
--- a/src/DocTestMain.hs
+++ /dev/null
@@ -1,8 +0,0 @@
-module Main (
-  main
-  ) where
-
-import qualified DocTest
-
-main :: IO ()
-main = DocTest.test
