diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@
 Snap Framework [![Hackage Status](https://img.shields.io/hackage/v/snap.svg)](https://hackage.haskell.org/package/snap)
 ==============
 
-[![Build Status](https://travis-ci.org/snapframework/snap.svg?branch=master)](https://travis-ci.org/snapframework/snap)
+[![GitHub CI](https://github.com/snapframework/snap/workflows/CI/badge.svg)](https://github.com/snapframework/snap/actions)
 
 Snap is a simple and fast web development framework and server written in
 Haskell. For more information about Snap, read the `README.SNAP.md` or visit
diff --git a/changelog.md b/changelog.md
new file mode 100644
--- /dev/null
+++ b/changelog.md
@@ -0,0 +1,25 @@
+## 1.1.3.1
+
+ - Update for GHC 8.10
+
+<!-- n.b. where did the rest of the change log entries go?? -->
+
+## 1.1.1.0
+
+### Added
+
+ - GHC 8.4 support
+
+## 1.1.0.0
+
+### Added
+
+ - Support for aeson 1.x
+ - GHC 8.2 support
+ - New [lookupByEmail](src/Snap/Snaplet/Auth/AuthManager.hs#L62) function in the auth snaplet
+
+## 1.0.0.0
+### Removed
+
+ - Removed support for `iteratees` in favor of 
+   [io-streams](https://hackage.haskell.org/package/io-streams)
diff --git a/snap.cabal b/snap.cabal
--- a/snap.cabal
+++ b/snap.cabal
@@ -1,5 +1,6 @@
+cabal-version:  2.2
 name:           snap
-version:        1.1.3.1
+version:        1.1.3.2
 synopsis:       Top-level package for the Snap Web Framework
 description:
     This is the top-level package for the official Snap Framework libraries.
@@ -23,31 +24,31 @@
     Note: since version 1.0, the \"snap\" executable program for generating
     starter projects is provided by the @snap-templates@ package.
 
-license:        BSD3
+license:        BSD-3-Clause
 license-file:   LICENSE
 author:         Ozgun Ataman, Doug Beardsley,
                 Gregory Collins, Carl Howells, Chris Smith
 maintainer:     snap@snapframework.com
 build-type:     Simple
-cabal-version:  >= 1.10
 homepage:       http://snapframework.com/
 bug-reports:    https://github.com/snapframework/snap/issues
 category:       Web, Snap
 
-Tested-With:
-  GHC == 8.0.2,
-  GHC == 8.2.2,
-  GHC == 8.4.4,
-  GHC == 8.6.3,
-  GHC == 8.8.1,
-  GHC == 8.10.2
+tested-with:
+  GHC == 8.8.4
+  GHC == 8.10.7
+  GHC == 9.0.2
+  GHC == 9.2.8
+  GHC == 9.4.5
+  GHC == 9.6.2
 
 extra-source-files:
-  .ghci
+  .ghci,
   CONTRIBUTORS,
   LICENSE,
   README.md,
   README.SNAP.md,
+  changelog.md,
   design.md,
   extra/hscolour.css,
   extra/haddock.css,
@@ -58,9 +59,9 @@
   test/db.cfg,
   test/devel.cfg,
   test/good.tpl,
-  test/snaplets/baz/devel.cfg
-  test/snaplets/baz/templates/bazconfig.tpl
-  test/snaplets/baz/templates/bazpage.tpl
+  test/snaplets/baz/devel.cfg,
+  test/snaplets/baz/templates/bazconfig.tpl,
+  test/snaplets/baz/templates/bazpage.tpl,
   test/snaplets/embedded/extra-templates/extra.tpl,
   test/snaplets/embedded/snaplets/heist/templates/embeddedpage.tpl,
   test/snaplets/foosnaplet/devel.cfg,
@@ -74,12 +75,43 @@
   test/snaplets/heist/templates/splicepage.tpl,
   test/snaplets/heist/templates/userpage.tpl
 
-Library
+common universal
   default-language: Haskell2010
+
+  build-depends:
+    , base >= 4.5 && < 5
+
+  if !impl(ghc >= 8.0)
+    build-depends:
+      , semigroups >= 0.16 && < 0.19
+      , fail       >= 4.9  && < 4.10
+
+  default-extensions:
+    BangPatterns
+    CPP
+    DeriveDataTypeable
+    ExistentialQuantification
+    FlexibleContexts
+    FlexibleInstances
+    GeneralizedNewtypeDeriving
+    MultiParamTypeClasses
+    NoMonomorphismRestriction
+    OverloadedStrings
+    PackageImports
+    Rank2Types
+    RecordWildCards
+    ScopedTypeVariables
+    TemplateHaskell
+    TypeFamilies
+    TypeOperators
+    TypeSynonymInstances
+
+Library
+  import: universal
   hs-source-dirs: src
 
   exposed-modules:
-    Snap,
+    Snap
     Snap.Snaplet
     Snap.Snaplet.Heist
     Snap.Snaplet.HeistNoClass
@@ -110,64 +142,39 @@
     Snap.Snaplet.Session.SecureCookie
 
   build-depends:
-    aeson                     >= 0.6      && < 1.5,
-    attoparsec                >= 0.10     && < 0.14,
-    base                      >= 4        && < 4.15,
-    bytestring                >= 0.9.1    && < 0.11,
+    aeson                     >= 0.6      && < 2.2.0.0,
+    attoparsec                >= 0.10     && < 0.15,
+    bytestring                >= 0.9.1    && < 0.13,
     cereal                    >= 0.3      && < 0.6,
     clientsession             >= 0.8      && < 0.10,
     configurator              >= 0.1      && < 0.4,
     containers                >= 0.2      && < 0.7,
     directory                 >= 1.1      && < 1.4,
-    directory-tree            >= 0.10     && < 0.13,
-    dlist                     >= 0.5      && < 0.9,
-    fail                      >= 4.9      && < 4.10,
+    directory-tree            >= 0.11     && < 0.13,
+    dlist                     >= 0.5      && < 1.1,
     filepath                  >= 1.3      && < 1.5,
     -- hashable is broken from 1.2.0.0 through 1.2.0.5
     -- snap does work with hashable 1.1.*, but some have complained that
     -- the version disjunction causes problems with dependency resolution.
-    hashable                  >= 1.2.0.6  && < 1.4,
+    hashable                  >= 1.2.0.6  && < 1.5,
     heist                     >= 1.1      && < 1.2,
-    lens                      >= 3.7.6    && < 4.20,
+    lens                      >= 3.7.6    && < 5.3,
     lifted-base               >= 0.2      && < 0.3,
     map-syntax                >= 0.2      && < 0.4,
     monad-control             >= 0.3      && < 1.1,
-    mtl                       >= 2.0      && < 2.3,
-    mwc-random                >= 0.8      && < 0.15,
+    mtl                       >= 2.0      && < 2.4,
+    mwc-random                >= 0.8      && < 0.16,
     pwstore-fast              >= 2.2      && < 2.5,
     snap-core                 >= 1.0      && < 1.1,
     snap-server               >= 1.0      && < 1.2,
     stm                       >= 2.2      && < 2.6,
-    text                      >= 0.11     && < 1.3,
-    time                      >= 1.1      && < 1.10,
-    transformers              >= 0.2      && < 0.6,
+    text                      >= 1.1.1.0  && < 2.1,
+    time                      >= 1.1      && < 1.14,
+    transformers              >= 0.2      && < 0.7,
     transformers-base         >= 0.4      && < 0.5,
     unordered-containers      >= 0.1.4    && < 0.3,
     xmlhtml                   >= 0.1      && < 0.3
 
-  if !impl(ghc >= 8.0)
-    build-depends: semigroups >= 0.16 && < 0.19
-
-  default-extensions:
-    BangPatterns,
-    CPP,
-    DeriveDataTypeable,
-    ExistentialQuantification,
-    FlexibleContexts,
-    FlexibleInstances,
-    GeneralizedNewtypeDeriving,
-    MultiParamTypeClasses,
-    NoMonomorphismRestriction,
-    OverloadedStrings,
-    PackageImports,
-    Rank2Types,
-    RecordWildCards,
-    ScopedTypeVariables,
-    TemplateHaskell,
-    TypeFamilies,
-    TypeOperators,
-    TypeSynonymInstances
-
   if impl(ghc >= 6.12.0)
     ghc-options: -Wall -fwarn-tabs -funbox-strict-fields
                  -fno-warn-orphans -fno-warn-unused-do-bind
@@ -176,16 +183,19 @@
                  -fno-warn-orphans
 
 Test-suite testsuite
-  default-language: Haskell2010
+  import: universal
   hs-source-dirs: src test/suite
   type: exitcode-stdio-1.0
   main-is: TestSuite.hs
 
+  autogen-modules:
+    Paths_snap
+
   other-modules:
     Blackbox.Tests
     Paths_snap
     SafeCWD
-    Snap,
+    Snap
     Snap.Snaplet
     Snap.Snaplet.Auth
     Snap.Snaplet.Auth.AuthManager
@@ -234,7 +244,6 @@
     aeson,
     async                      >= 2.0.1.5  && < 2.3,
     attoparsec,
-    base,
     bytestring,
     cereal,
     clientsession,
@@ -244,7 +253,6 @@
     directory,
     directory-tree,
     dlist,
-    fail,
     filepath,
     hashable,
     heist,
@@ -257,7 +265,7 @@
     mtl,
     mwc-random,
     pwstore-fast,
-    QuickCheck                 >= 2.4.2    && < 2.14,
+    QuickCheck                 >= 2.4.2    && < 2.15,
     smallcheck                 >= 1.1.1    && < 1.3,
     snap-core,
     snap-server,
@@ -274,30 +282,6 @@
     transformers-base,
     unordered-containers,
     xmlhtml
-
-  if !impl(ghc >= 8.0)
-    build-depends: semigroups
-
-  default-extensions:
-    BangPatterns,
-    CPP,
-    DeriveDataTypeable,
-    ExistentialQuantification,
-    FlexibleContexts,
-    FlexibleInstances,
-    GeneralizedNewtypeDeriving,
-    MultiParamTypeClasses,
-    NoMonomorphismRestriction,
-    OverloadedStrings,
-    PackageImports,
-    Rank2Types,
-    RecordWildCards,
-    ScopedTypeVariables,
-    TemplateHaskell,
-    TypeFamilies,
-    TypeOperators,
-    TypeSynonymInstances
-
 
 source-repository head
   type:     git
diff --git a/src/Snap/Snaplet/Auth/Backends/JsonFile.hs b/src/Snap/Snaplet/Auth/Backends/JsonFile.hs
--- a/src/Snap/Snaplet/Auth/Backends/JsonFile.hs
+++ b/src/Snap/Snaplet/Auth/Backends/JsonFile.hs
@@ -11,6 +11,7 @@
 
 
 import           Control.Applicative ((<|>))
+import           Control.Monad (join)
 import           Control.Monad.State
 import           Control.Concurrent.STM
 import           Data.Aeson
diff --git a/src/Snap/Snaplet/Auth/Handlers.hs b/src/Snap/Snaplet/Auth/Handlers.hs
--- a/src/Snap/Snaplet/Auth/Handlers.hs
+++ b/src/Snap/Snaplet/Auth/Handlers.hs
@@ -11,6 +11,7 @@
 
 ------------------------------------------------------------------------------
 import           Control.Applicative
+import           Control.Monad (join, liftM, liftM2)
 import           Control.Monad.State
 import           Control.Monad.Trans.Maybe
 import           Data.ByteString (ByteString)
diff --git a/src/Snap/Snaplet/Heist/Internal.hs b/src/Snap/Snaplet/Heist/Internal.hs
--- a/src/Snap/Snaplet/Heist/Internal.hs
+++ b/src/Snap/Snaplet/Heist/Internal.hs
@@ -3,6 +3,7 @@
 
 import           Prelude
 import           Control.Lens
+import           Control.Monad (liftM)
 import           Control.Monad.State
 import qualified Data.ByteString as B
 import           Data.Char
diff --git a/src/Snap/Snaplet/Internal/Types.hs b/src/Snap/Snaplet/Internal/Types.hs
--- a/src/Snap/Snaplet/Internal/Types.hs
+++ b/src/Snap/Snaplet/Internal/Types.hs
@@ -18,10 +18,10 @@
 ------------------------------------------------------------------------------
 import           Control.Applicative          (Alternative)
 import           Control.Lens                 (ALens', makeLenses, set)
-import           Control.Monad                (liftM)
+import           Control.Monad                (MonadPlus, liftM)
 import           Control.Monad.Base           (MonadBase (..))
 import           Control.Monad.Fail           (MonadFail)
-import           Control.Monad.Reader         (MonadIO (..), MonadPlus, MonadReader (ask, local))
+import           Control.Monad.Reader         (MonadIO (..), MonadReader (ask, local))
 import           Control.Monad.State.Class    (MonadState (get, put), gets)
 import           Control.Monad.Trans.Control  (MonadBaseControl (..))
 import           Control.Monad.Trans.Writer   (WriterT)
diff --git a/test/suite/Blackbox/Tests.hs b/test/suite/Blackbox/Tests.hs
--- a/test/suite/Blackbox/Tests.hs
+++ b/test/suite/Blackbox/Tests.hs
@@ -272,38 +272,36 @@
 
     flip finally (remove badTplNew) $
       testWithCwd' "admin/reload" $ \cwd' b -> do
-        let cwd = S.pack cwd'
-        let response =
-               [T.concat     [ "Error reloading site!\n\nInitializer "
-                             , "threw an exception...\n"
-                             , T.pack cwd'
-                             , "/snaplets/heist"
-                             , "/templates/bad.tpl \""
-                             , T.pack cwd'
-                             , "/snaplets/heist/templates"
-                             , "/bad.tpl\" (line 2, column 1):\nunexpected "
-                             , "end of input\nexpecting \"=\", \"/\" or "
-                             , "\">\"\n\n...but before it died it generated "
-                             , "the following output:\nInitializing app @ /\n"
-                             , "Initializing heist @ /heist\n\n" ]
+        let cwd = T.pack cwd'
 
-               ,T.concat     [ "Error reloading site!\n\nInitializer "
-                             , "threw an exception...\n"
-                             , T.pack cwd'
-                             , "/snaplets/heist"
-                             , "/templates/bad.tpl \""
-                             , T.pack cwd'
-                             , "/snaplets/heist/templates"
-                             , "/bad.tpl\" (line 2, column 1):\nunexpected "
-                             , "end of input\nexpecting \"=\", \"/\" or "
-                             , "\">\"\n"
-                             , "CallStack (from HasCallStack):\n  error, called at src/Snap/Snaplet/Heist/Internal.hs:74:35 in main:Snap.Snaplet.Heist.Internal\n"
-                             , "\n...but before it died it generated "
-                             , "the following output:\nInitializing app @ /\n"
-                             , "Initializing heist @ /heist\n\n" ]
-               ]
+        let prefix = T.intercalate "\n"
+              [ "Error reloading site!"
+              , ""
+              , "Initializer threw an exception..."
+              , T.concat
+                [ cwd, "/snaplets/heist/templates/bad.tpl \""
+                , cwd, "/snaplets/heist/templates/bad.tpl\" (line 2, column 1):"
+                ]
+              , "unexpected end of input"
+              , "expecting \"=\", \"/\" or \">\""
 
-        assertBool "admin/reload" $ (T.decodeUtf8 b) `elem` response 
+              -- Building with the latest dependency versions produces the following:
+              -- "CallStack (from HasCallStack):"
+              -- "  error, called at src/Snap/Snaplet/Heist/Internal.hs:75:35 in main:Snap.Snaplet.Heist.Internal"
+              ]
+
+        let suffix = T.intercalate "\n"
+              [ "...but before it died it generated the following output:"
+              , "Initializing app @ /"
+              , "Initializing heist @ /heist"
+              , ""
+              , ""
+              ]
+
+        let response = T.decodeUtf8 b
+
+        assertEqual "admin/reload" prefix (T.take    (T.length prefix) response)
+        assertEqual "admin/reload" suffix (T.takeEnd (T.length suffix) response)
 
     copyFile goodTplOrig goodTplNew
 
