diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,32 @@
+Copyright (C) 2018 Daniel Mendler
+Copyright (C) 2013-2015 Edward Kmett
+Copyright (C) 2012 Google Inc.
+
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+
+    * Neither the name of Author name here nor the names of other
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,7 @@
+# Control.Monad.Catch instances for CPS WriterT and RWST monad transformers
+
+[![Hackage](https://img.shields.io/hackage/v/writer-cps-exceptions.svg)](https://hackage.haskell.org/package/writer-cps-exceptions)
+[![Build Status](https://secure.travis-ci.org/minad/writer-cps-exceptions.png?branch=master)](http://travis-ci.org/minad/writer-cps-exceptions)
+* https://hackage.haskell.org/package/writer-cps-transformers
+* https://hackage.haskell.org/package/writer-cps-mtl
+* https://hackage.haskell.org/package/writer-cps-execeptions
diff --git a/Setup.hs b/Setup.hs
new file mode 100644
--- /dev/null
+++ b/Setup.hs
@@ -0,0 +1,2 @@
+import Distribution.Simple
+main = defaultMain
diff --git a/src/Control/Monad/Trans/RWS/CPS/Exceptions.hs b/src/Control/Monad/Trans/RWS/CPS/Exceptions.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Trans/RWS/CPS/Exceptions.hs
@@ -0,0 +1,36 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Control.Monad.Trans.RWS.CPS.Exceptions where
+
+import Control.Monad.Trans.Class
+import Control.Monad.Catch
+import Control.Monad.Trans.RWS.CPS
+
+instance (MonadThrow m, Monoid w) => MonadThrow (RWST r w s m) where
+  throwM e = lift $ throwM e
+instance (MonadCatch m, Monoid w) => MonadCatch (RWST r w s m) where
+  catch m h = rwsT $ \r s -> runRWST m r s `catch` \e -> runRWST (h e) r s
+instance (MonadMask m, Monoid w) => MonadMask (RWST r w s m) where
+  mask a = rwsT $ \r s -> mask $ \u -> runRWST (a $ q u) r s
+    where q u b = rwsT $ \ r s -> u (runRWST b r s)
+  uninterruptibleMask a =
+    rwsT $ \r s -> uninterruptibleMask $ \u -> runRWST (a $ q u) r s
+      where q u b = rwsT $ \ r s -> u (runRWST b r s)
+
+  generalBracket acquire release use = rwsT $ \r s0 -> do
+    ((b, _s2, _w12), (c, s3, w123)) <- generalBracket
+      (runRWST acquire r s0)
+      (\(resource, s1, w1) exitCase -> case exitCase of
+        ExitCaseSuccess (b, s2, w12) -> do
+          (c, s3, w3) <- runRWST (release resource (ExitCaseSuccess b)) r s2
+          return (c, s3, mappend w12 w3)
+        ExitCaseException e -> do
+          (c, s3, w3) <- runRWST (release resource (ExitCaseException e)) r s1
+          return (c, s3, mappend w1 w3)
+        ExitCaseAbort -> do
+          (c, s3, w3) <- runRWST (release resource ExitCaseAbort) r s1
+          return (c, s3, mappend w1 w3))
+      (\(resource, s1, w1) -> do
+        (a, s2, w2) <- runRWST (use resource) r s1
+        return (a, s2, mappend w1 w2))
+    return ((b, c), s3, w123)
diff --git a/src/Control/Monad/Trans/Writer/CPS/Exceptions.hs b/src/Control/Monad/Trans/Writer/CPS/Exceptions.hs
new file mode 100644
--- /dev/null
+++ b/src/Control/Monad/Trans/Writer/CPS/Exceptions.hs
@@ -0,0 +1,37 @@
+{-# OPTIONS_GHC -fno-warn-orphans #-}
+
+module Control.Monad.Trans.Writer.CPS.Exceptions where
+
+import Control.Monad.Trans.Class
+import Control.Monad.Catch
+import Control.Monad.Trans.Writer.CPS
+
+instance (MonadThrow m, Monoid w) => MonadThrow (WriterT w m) where
+  throwM e = lift $ throwM e
+
+instance (MonadCatch m, Monoid w) => MonadCatch (WriterT w m) where
+  catch m h = writerT $ runWriterT m `catch ` \e -> runWriterT (h e)
+
+instance (MonadMask m, Monoid w) => MonadMask (WriterT w m) where
+  mask a = writerT $ mask $ \u -> runWriterT (a $ q u)
+    where q u b = writerT $ u (runWriterT b)
+  uninterruptibleMask a =
+    writerT $ uninterruptibleMask $ \u -> runWriterT (a $ q u)
+      where q u b = writerT $ u (runWriterT b)
+  generalBracket acquire release use = writerT $ do
+    ((b, _w12), (c, w123)) <- generalBracket
+      (runWriterT acquire)
+      (\(resource, w1) exitCase -> case exitCase of
+        ExitCaseSuccess (b, w12) -> do
+          (c, w3) <- runWriterT (release resource (ExitCaseSuccess b))
+          return (c, mappend w12 w3)
+        ExitCaseException e -> do
+          (c, w3) <- runWriterT (release resource (ExitCaseException e))
+          return (c, mappend w1 w3)
+        ExitCaseAbort -> do
+          (c, w3) <- runWriterT (release resource ExitCaseAbort)
+          return (c, mappend w1 w3))
+      (\(resource, w1) -> do
+        (a, w2) <- runWriterT (use resource)
+        return (a, mappend w1 w2))
+    return ((b, c), w123)
diff --git a/writer-cps-exceptions.cabal b/writer-cps-exceptions.cabal
new file mode 100644
--- /dev/null
+++ b/writer-cps-exceptions.cabal
@@ -0,0 +1,30 @@
+name:                writer-cps-exceptions
+version:             0.1.0.0
+synopsis:            Control.Monad.Catch instances for the stricter CPS WriterT and RWST
+description:         Control.Monad.Catch instances for the stricter WriterT and RWST from writer-cps-transformers.
+homepage:            https://github.com/minad/writer-cps-exceptions
+license:             BSD3
+license-file:        LICENSE
+author:              Daniel Mendler
+maintainer:          mail@daniel-mendler.de
+copyright:           2018 Daniel Mendler, 2013-2015 Edward Kmett, 2012 Google Inc
+category:            Control
+build-type:          Simple
+extra-source-files:  README.md
+cabal-version:       >=1.10
+tested-with:         GHC == 7.10.3, GHC == 8.0.1, GHC == 8.2.1, GHC == 8.4.3, GHC == 8.6.1
+
+library
+  hs-source-dirs:      src
+  exposed-modules:     Control.Monad.Trans.RWS.CPS.Exceptions
+                     , Control.Monad.Trans.Writer.CPS.Exceptions
+  build-depends:       base < 6
+                     , writer-cps-transformers >= 0.1.1.2
+                     , transformers >= 0.4 && < 0.6
+                     , exceptions >= 0.10 && < 0.12
+  ghc-options:         -Wall
+  default-language:    Haskell2010
+
+source-repository head
+  type:     git
+  location: https://github.com/minad/writer-cps-exceptions
