diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,7 @@
+0.0.7
+
+* More generalising
+
 0.0.6
 
 * More generalising
diff --git a/reader.cabal b/reader.cabal
--- a/reader.cabal
+++ b/reader.cabal
@@ -1,5 +1,5 @@
 name:                 reader
-version:              0.0.6
+version:              0.0.7
 synopsis:             A reader data type with all the bits
 description:          A reader data type with all the bits and type constructor rearrangements
 license:              BSD3
@@ -25,7 +25,6 @@
                       Data.Reader.Reader1
                       Data.Reader.Reader2
                       Data.Reader.Reader3
-                      Data.Reader.Readers
 
   build-depends:        base >= 4.8 && < 6
                       , contravariant >= 1 && < 2
diff --git a/src/Data/Reader.hs b/src/Data/Reader.hs
--- a/src/Data/Reader.hs
+++ b/src/Data/Reader.hs
@@ -7,4 +7,3 @@
 import Data.Reader.Reader1 as R
 import Data.Reader.Reader2 as R
 import Data.Reader.Reader3 as R
-import Data.Reader.Readers as R
diff --git a/src/Data/Reader/Reader.hs b/src/Data/Reader/Reader.hs
--- a/src/Data/Reader/Reader.hs
+++ b/src/Data/Reader/Reader.hs
@@ -23,8 +23,12 @@
 --
 -- Iso (Reader a b) (Reader a' b') (a -> b) (a' -> b')
 reader ::
-  (Rewrapped t t, Rewrapped s1 s1, Rewrapped s2 s2, Rewrapped c c, Unwrapped t ~ (a1 -> c), Unwrapped s1 ~ (a2 -> s2)) =>
-  Iso s1 t (a2 -> Unwrapped s2) (a1 -> Unwrapped c)
+  (Rewrapped s s, Rewrapped t t, Rewrapped s' s', Rewrapped t' t', Unwrapped t ~ (a -> t'), Unwrapped s ~ (a' -> s')) =>
+  Iso
+    s
+    t
+    (a' -> Unwrapped s')
+    (a -> Unwrapped t')
 reader =
   iso
     (\r -> view _Wrapped . view _Wrapped r)
@@ -32,14 +36,14 @@
 
 -- |
 --
--- Iso (LensLike f s t a b) (LensLike f' s' t' a' b') (Reader1Lens f s t a b) (Reader1Lens f' s' t' a' b')
+-- Iso (LensLike f s t a b) (LensLike f' s' t' a' b') (ReaderT a f b -> ReaderT s f t) (ReaderT a' f b' -> ReaderT s' f t')
 readerLens ::
-  (Rewrapped t1 t1, Rewrapped s1 s1, Rewrapped s2 s2, Rewrapped t2 t2) =>
+  (Rewrapped s s, Rewrapped t t, Rewrapped s' s', Rewrapped t' t') =>
   Iso
-    (Unwrapped s1 -> Unwrapped t1)
-    (Unwrapped t2 -> Unwrapped s2)
-    (s1 -> t1)
-    (t2 -> s2)
+    (Unwrapped s -> Unwrapped t)
+    (Unwrapped t' -> Unwrapped s')
+    (s -> t)
+    (t' -> s')
 readerLens =
   iso
     (\k f -> review _Wrapped (k (view _Wrapped f)))
@@ -49,8 +53,8 @@
 --
 -- Applicative f => Reader a b -> ReaderT a f b
 pureReader ::
-  (Applicative f, Rewrapped s1 t, Rewrapped t s1, Rewrapped s2 s2, Unwrapped t ~ (a -> f (Unwrapped s2)), Unwrapped s1 ~ (a -> s2)) =>
-  s1
+  (Applicative f, Rewrapped s t, Rewrapped t s, Rewrapped s' s', Unwrapped s ~ (a -> s'), Unwrapped t ~ (a -> f (Unwrapped s'))) =>
+  s
   -> t
 pureReader =
   over _Wrapped (\f -> pure . view _Wrapped . f)
@@ -59,7 +63,7 @@
 --
 -- (forall x. f x -> g x) -> ReaderT a f b -> ReaderT a g b
 homReader ::
-  (Rewrapped s t, Rewrapped t s, Category cat, Unwrapped t ~ cat a c, Unwrapped s ~ cat a b) =>
+  (Rewrapped s t, Rewrapped t s, Category cat, Unwrapped s ~ cat a b, Unwrapped t ~ cat a c) =>
   cat b c
   -> s
   -> t
@@ -70,8 +74,12 @@
 --
 -- Iso (Star f a b) (Star f' a' b') (ReaderT a f b) (ReaderT a' f' b')
 star ::
-  (Rewrapped a a, Rewrapped s s, Unwrapped a ~ (d1 -> f2 c1), Unwrapped s ~ (d2 -> f3 c2)) =>
-  Iso (Star f2 d1 c1) (Star f3 d2 c2) a s
+  (Rewrapped a a, Rewrapped b b, Unwrapped a ~ (x -> f y), Unwrapped b ~ (x' -> f' y')) =>
+  Iso
+    (Star f x y)
+    (Star f' x' y')
+    a
+    b
 star =
   reader'
 
@@ -79,14 +87,34 @@
 --
 -- Iso (Kleisli f a b) (Kleisli f' a' b') (ReaderT a f b) (ReaderT a' f' b')
 kleisli ::
-  (Rewrapped a1 a1, Rewrapped s s, Unwrapped a1 ~ (a2 -> m1 b1), Unwrapped s ~ (a3 -> m2 b2)) =>
-  Iso (Kleisli m1 a2 b1) (Kleisli m2 a3 b2) a1 s
+  (Rewrapped a a, Rewrapped b b, Unwrapped a ~ (x -> m y), Unwrapped b ~ (x' -> m' y')) =>
+  Iso
+    (Kleisli m x y)
+    (Kleisli m' x' y')
+    a
+    b
 kleisli =
   reader'
 
-reader' ::
-  (Rewrapped s s, Rewrapped t t, Rewrapped a a, Rewrapped b b, Unwrapped b ~ Unwrapped t, Unwrapped a ~ Unwrapped s) =>
+-- |
+--
+-- Iso (ReaderT a f b) (ReaderT a' f' b') (Reader a (f b)) (Reader a' (f' b'))
+liftReader ::
+  (Rewrapped s s, Rewrapped t t, Rewrapped a a, Rewrapped b b, Rewrapped s' s', Rewrapped t' t',
+  Unwrapped s ~ (a'' -> Unwrapped s'), Unwrapped t ~ (a' -> Unwrapped t'), Unwrapped a ~ (a'' -> s'), Unwrapped b ~ (a' -> t')) =>
   Iso s t a b
+liftReader =
+  iso
+    (review reader . view _Wrapped)
+    (review _Wrapped . view reader)
+
+reader' ::
+  (Rewrapped s s, Rewrapped t t, Rewrapped a a, Rewrapped b b, Unwrapped a ~ Unwrapped s, Unwrapped b ~ Unwrapped t) =>
+  Iso
+    s
+    t
+    a
+    b
 reader' =
   iso
     (review _Wrapped . view _Wrapped)
diff --git a/src/Data/Reader/Reader1.hs b/src/Data/Reader/Reader1.hs
--- a/src/Data/Reader/Reader1.hs
+++ b/src/Data/Reader/Reader1.hs
@@ -9,26 +9,15 @@
 module Data.Reader.Reader1(
   Reader1T(..)
 , Reader1
-, Reader1Lens
-, reader1
-, reader1Lens
-, reader1'
-, star1
-, kleisli1
-, liftReader1
-, pureReader1
-, homReader1
 ) where
 
 import Control.Applicative
     ( Applicative((<*>), pure), Alternative((<|>), empty) )
-import Control.Arrow ( Kleisli )
 import Control.Category ( Category(..) )
 import Control.Lens
-    ( LensLike, view, iso, review, over, _Wrapped, Iso, Rewrapped, Wrapped(..) )
+    ( view, iso, over, _Wrapped, Rewrapped, Wrapped(..) )
 import Control.Monad
     ( Monad(return, (>>=)), MonadPlus(..) )
-import qualified Control.Monad.Reader as Reader( ReaderT )
 import Control.Monad.Reader.Class ( MonadReader )
 import qualified Control.Monad.Reader.Class as Reader ( MonadReader(..) )
 import Control.Monad.State.Class ( MonadState(..) )
@@ -49,15 +38,6 @@
 import Data.Functor.Identity ( Identity(..) )
 import Data.Functor.Plus ( Plus(..) )
 import Data.Monoid(Monoid(mempty))
-import Data.Profunctor ( Star )
-import Data.Reader.Reader
-    ( pureReader,
-      homReader,
-      reader,
-      readerLens,
-      star,
-      kleisli,
-      reader' )
 import Data.Semigroup ( Semigroup((<>)) )
 
 newtype Reader1T a f b =
@@ -74,80 +54,6 @@
 
 type Reader1 a b =
   Reader1T a Identity b
-
-reader1 ::
-  Iso
-    (Reader1 a b)
-    (Reader1 a' b')
-    (a -> b)
-    (a' -> b')
-reader1 =
-  reader
-
-type Reader1Lens f s t a b =
-  Reader1T a f b
-  -> Reader1T s f t
-
-reader1Lens ::
-  Iso
-    (LensLike f s t a b)
-    (LensLike f' s' t' a' b')
-    (Reader1Lens f s t a b)
-    (Reader1Lens f' s' t' a' b')
-reader1Lens =
-  readerLens
-
-reader1' ::
-  Iso
-    (Reader.ReaderT a f b)
-    (Reader.ReaderT a' f' b')
-    (Reader1T a f b)
-    (Reader1T a' f' b')
-reader1' =
-  reader'
-
-star1 ::
-  Iso
-    (Star f a b)
-    (Star f' a' b')
-    (Reader1T a f b)
-    (Reader1T a' f' b')
-star1 =
-  star
-
-kleisli1 ::
-  Iso
-    (Kleisli f a b)
-    (Kleisli f' a' b')
-    (Reader1T a f b)
-    (Reader1T a' f' b')
-kleisli1 =
-  kleisli
-
-liftReader1 ::
-  Iso
-    (Reader1T a f b)
-    (Reader1T a' f' b')
-    (Reader1 a (f b))
-    (Reader1 a' (f' b'))
-liftReader1 =
-  iso
-    (review reader1 . view _Wrapped)
-    (review _Wrapped . view reader1)
-
-pureReader1 ::
-  Applicative f =>
-  Reader1 a b
-  -> Reader1T a f b
-pureReader1 =
-  pureReader
-
-homReader1 ::
-  (forall x. f x -> g x)
-  -> Reader1T a f b
-  -> Reader1T a g b
-homReader1 =
-  homReader
 
 instance Functor f => Functor (Reader1T a f) where
   fmap f (Reader1T g) =
diff --git a/src/Data/Reader/Reader2.hs b/src/Data/Reader/Reader2.hs
--- a/src/Data/Reader/Reader2.hs
+++ b/src/Data/Reader/Reader2.hs
@@ -10,15 +10,6 @@
 module Data.Reader.Reader2(
   Reader2T(..)
 , Reader2
-, Reader2Lens
-, reader2
-, reader2Lens
-, reader2'
-, star2
-, kleisli2
-, liftReader2
-, pureReader2
-, homReader2
 ) where
 
 import Control.Applicative
@@ -30,14 +21,12 @@
       (>>>),
       ArrowApply(..),
       ArrowChoice(..),
-      ArrowLoop(..),
-      Kleisli )
+      ArrowLoop(..) )
 import Control.Category ( Category(..) )
 import Control.Lens
-    ( LensLike, view, iso, review, over, _Wrapped, Iso, Rewrapped, Wrapped(..) )
+    ( view, iso, over, _Wrapped, Rewrapped, Wrapped(..) )
 import Control.Monad
     ( Monad(return, (>>=)), sequence, MonadPlus(..), (>=>) )
-import qualified Control.Monad.Reader as Reader( ReaderT )
 import Control.Monad.Reader.Class ( MonadReader )
 import qualified Control.Monad.Reader.Class as Reader ( MonadReader(..) )
 import Control.Monad.State.Class ( MonadState(..) )
@@ -61,21 +50,12 @@
 import Data.Profunctor
     ( Choice(..),
       Profunctor(dimap),
-      Star,
       Closed(..),
       Costrong(unfirst),
       Strong(..),
       Mapping(..),
       Cochoice(unright) )
 import Data.Profunctor.Traversing ( Traversing(..) )
-import Data.Reader.Reader
-    ( pureReader,
-      homReader,
-      reader,
-      readerLens,
-      star,
-      kleisli,
-      reader' )
 import Data.Semigroup ( Semigroup((<>)) )
 import Data.Semigroupoid ( Semigroupoid(..) )
 import Data.Traversable ( Traversable(traverse) )
@@ -95,80 +75,6 @@
 
 type Reader2 a b =
   Reader2T Identity a b
-
-reader2 ::
-  Iso
-    (Reader2 a b)
-    (Reader2 a' b')
-    (a -> b)
-    (a' -> b')
-reader2 =
-  reader
-
-reader2' ::
-  Iso
-    (Reader.ReaderT a f b)
-    (Reader.ReaderT a' f' b')
-    (Reader2T f a b)
-    (Reader2T f' a' b')
-reader2' =
-  reader'
-
-type Reader2Lens f s t a b =
-  Reader2T f a b
-  -> Reader2T f s t
-
-reader2Lens ::
-  Iso
-    (LensLike f s t a b)
-    (LensLike f' s' t' a' b')
-    (Reader2Lens f s t a b)
-    (Reader2Lens f' s' t' a' b')
-reader2Lens =
-  readerLens
-
-star2 ::
-  Iso
-    (Star f a b)
-    (Star f' a' b')
-    (Reader2T f a b)
-    (Reader2T f' a' b')
-star2 =
-  star
-
-kleisli2 ::
-  Iso
-    (Kleisli f a b)
-    (Kleisli f' a' b')
-    (Reader2T f a b)
-    (Reader2T f' a' b')
-kleisli2 =
-  kleisli
-
-liftReader2 ::
-  Iso
-    (Reader2T f a b)
-    (Reader2T f' a' b')
-    (Reader2 a (f b))
-    (Reader2 a' (f' b'))
-liftReader2 =
-  iso
-    (review reader2 . view _Wrapped)
-    (review _Wrapped . view reader2)
-
-pureReader2 ::
-  Applicative f =>
-  Reader2 a b
-  -> Reader2T f a b
-pureReader2 =
-  pureReader
-
-homReader2 ::
-  (forall x. f x -> g x)
-  -> Reader2T f a b
-  -> Reader2T g a b
-homReader2 =
-  homReader
 
 instance Functor f => Functor (Reader2T f a) where
   fmap f (Reader2T g) =
diff --git a/src/Data/Reader/Reader3.hs b/src/Data/Reader/Reader3.hs
--- a/src/Data/Reader/Reader3.hs
+++ b/src/Data/Reader/Reader3.hs
@@ -9,40 +9,20 @@
 module Data.Reader.Reader3(
   Reader3T(..)
 , Reader3
-, Reader3Lens
-, reader3
-, reader3Lens
-, reader3'
-, star3
-, kleisli3
-, liftReader3
-, pureReader3
-, homReader3
 ) where
 
 import Control.Applicative
     ( Applicative(pure), liftA2 )
-import Control.Arrow ( Kleisli )
 import Control.Category ( Category(..) )
 import Control.Lens
-    ( LensLike, view, iso, review, over, _Wrapped, Iso, Rewrapped, Wrapped(..) )
-import qualified Control.Monad.Reader as Reader( ReaderT )
+    ( iso, over, _Wrapped, Rewrapped, Wrapped(..) )
 import Data.Either ( either )
 import Data.Functor.Apply ( Apply(liftF2) )
 import Data.Functor.Contravariant ( Contravariant(contramap) )
 import Data.Functor.Contravariant.Divisible
     ( Decidable(..), Divisible(..) )
 import Data.Functor.Identity ( Identity(..) )
-import Data.Profunctor ( Star )
 import Data.Monoid(Monoid(mempty, mappend))
-import Data.Reader.Reader
-    ( pureReader,
-      homReader,
-      reader,
-      readerLens,
-      star,
-      kleisli,
-      reader' )
 import Data.Semigroup ( Semigroup((<>)) )
 import Data.Void ( absurd )
 
@@ -60,80 +40,6 @@
 
 type Reader3 a b =
   Reader3T Identity b a
-
-reader3 ::
-  Iso
-    (Reader3 a b)
-    (Reader3 a' b')
-    (a -> b)
-    (a' -> b')
-reader3 =
-  reader
-
-reader3' ::
-  Iso
-    (Reader.ReaderT a f b)
-    (Reader.ReaderT a' f' b')
-    (Reader3T f b a)
-    (Reader3T f' b' a')
-reader3' =
-  reader'
-
-type Reader3Lens f s t a b =
-  Reader3T f b a
-  -> Reader3T f t s
-
-reader3Lens ::
-  Iso
-    (LensLike f s t a b)
-    (LensLike f' s' t' a' b')
-    (Reader3Lens f s t a b)
-    (Reader3Lens f' s' t' a' b')
-reader3Lens =
-  readerLens
-
-star3 ::
-  Iso
-    (Star f a b)
-    (Star f' a' b')
-    (Reader3T f b a)
-    (Reader3T f' b' a')
-star3 =
-  star
-
-kleisli3 ::
-  Iso
-    (Kleisli f a b)
-    (Kleisli f' a' b')
-    (Reader3T f b a)
-    (Reader3T f' b' a')
-kleisli3 =
-  kleisli
-
-liftReader3 ::
-  Iso
-    (Reader3T f b a)
-    (Reader3T f' b' a')
-    (Reader3 a (f b))
-    (Reader3 a' (f' b'))
-liftReader3 =
-  iso
-    (review reader3 . view _Wrapped)
-    (review _Wrapped . view reader3)
-
-pureReader3 ::
-  Applicative f =>
-  Reader3 a b
-  -> Reader3T f b a
-pureReader3 =
-  pureReader
-
-homReader3 ::
-  (forall x. f x -> g x)
-  -> Reader3T f b a
-  -> Reader3T g b a
-homReader3 =
-  homReader
 
 instance Contravariant (Reader3T f b) where
   contramap f =
diff --git a/src/Data/Reader/Readers.hs b/src/Data/Reader/Readers.hs
deleted file mode 100644
--- a/src/Data/Reader/Readers.hs
+++ /dev/null
@@ -1,78 +0,0 @@
-{-# OPTIONS_GHC -Wall #-}
-{-# LANGUAGE NoImplicitPrelude #-}
-
-module Data.Reader.Readers(
-  _Reader1Reader2
-, _Reader2Reader1
-) where
-
-import Control.Lens ( iso, Iso )
-import Data.Reader.Reader1 ( Reader1T(..) )
-import Data.Reader.Reader2 ( Reader2T(..) )
-import Data.Reader.Reader3 ( Reader3T(..) )
-
-_Reader1Reader2 ::
-  Iso
-    (Reader2T f a b)
-    (Reader2T f' a' b')
-    (Reader1T a f b)
-    (Reader1T a' f' b')
-_Reader1Reader2 =
-  iso
-    (\(Reader2T f) -> Reader1T f)
-    (\(Reader1T f) -> Reader2T f)
-
-_Reader1Reader3 ::
-  Iso
-    (Reader3T f b a)
-    (Reader3T f' b' a')
-    (Reader1T a f b)
-    (Reader1T a' f' b')
-_Reader1Reader3 =
-  iso
-    (\(Reader3T f) -> Reader1T f)
-    (\(Reader1T f) -> Reader3T f)
-
-_Reader2Reader1 ::
-  Iso
-    (Reader1T a f b)
-    (Reader1T a' f' b')
-    (Reader2T f a b)
-    (Reader2T f' a' b')
-_Reader2Reader1 =
-  iso
-    (\(Reader1T f) -> Reader2T f)
-    (\(Reader2T f) -> Reader1T f)
-
-_Reader2Reader3 ::
-  Iso
-    (Reader3T f b a)
-    (Reader3T f' b' a')
-    (Reader2T f a b)
-    (Reader2T f' a' b')
-_Reader2Reader3 =
-  iso
-    (\(Reader3T f) -> Reader2T f)
-    (\(Reader2T f) -> Reader3T f)
-
-_Reader3Reader1 ::
-  Iso
-    (Reader1T a f b)
-    (Reader1T a' f' b')
-    (Reader3T f b a)
-    (Reader3T f' b' a')
-_Reader3Reader1 =
-  iso
-    (\(Reader1T f) -> Reader3T f)
-    (\(Reader3T f) -> Reader1T f)
-
-_Reader3Reader2 ::
-  Iso
-    (Reader2T f a b)
-    (Reader2T f' a' b')
-    (Reader3T f b a)
-    (Reader3T f' b' a')
-_Reader3Reader2 =
-  iso
-    (\(Reader2T f) -> Reader3T f)
-    (\(Reader3T f) -> Reader2T f)
