diff --git a/.travis.yml b/.travis.yml
--- a/.travis.yml
+++ b/.travis.yml
@@ -7,13 +7,17 @@
 
   # Try installing some of the build-deps with apt-get for speed.
   - travis/cabal-apt-install $mode
+  - travis/cabal-apt-install packdeps packunused
 
 install:
   - cabal configure $mode
-  - cabal build
+  - cabal build --ghc-options=-ddump-minimal-imports
 
 script:
-  - $script && hlint src --cpp-define HLINT
+  - $script
+  - hlint src --cpp-define HLINT
+  - packdeps adjunctions.cabal
+  - packunused
 
 notifications:
   irc:
diff --git a/adjunctions.cabal b/adjunctions.cabal
--- a/adjunctions.cabal
+++ b/adjunctions.cabal
@@ -1,6 +1,6 @@
 name:          adjunctions
 category:      Data Structures, Adjunctions
-version:       4.0.3
+version:       4.1.0.1
 license:       BSD3
 cabal-version: >= 1.6
 license-file:  LICENSE
@@ -47,11 +47,12 @@
     contravariant >= 0.4.1   && < 1,
     distributive  >= 0.4     && < 1,
     free          >= 4       && < 5,
-    mtl           >= 2.0.1   && < 2.2,
+    mtl           >= 2.0.1   && < 2.3,
+    profunctors   >= 4       && < 5,
     tagged        >= 0.7     && < 1,
     semigroupoids >= 4       && < 5,
     semigroups    >= 0.11    && < 1,
-    transformers  >= 0.2     && < 0.4,
+    transformers  >= 0.2     && < 0.5,
     void          >= 0.5.5.1 && < 1
 
   exposed-modules:
diff --git a/src/Data/Functor/Adjunction.hs b/src/Data/Functor/Adjunction.hs
--- a/src/Data/Functor/Adjunction.hs
+++ b/src/Data/Functor/Adjunction.hs
@@ -20,6 +20,7 @@
 -------------------------------------------------------------------------------------------
 module Data.Functor.Adjunction
   ( Adjunction(..)
+  , adjuncted
   , tabulateAdjunction
   , indexAdjunction
   , zapWithAdjunction
@@ -49,6 +50,7 @@
 import Data.Functor.Compose
 import Data.Functor.Product
 import Data.Functor.Rep
+import Data.Profunctor
 import Data.Void
 
 -- | An adjunction between Hask and Hask.
@@ -79,6 +81,16 @@
   counit         = rightAdjunct id
   leftAdjunct f  = fmap f . unit
   rightAdjunct f = counit . fmap f
+
+-- | 'leftAdjunct' and 'rightAdjunct' form two halves of an isomorphism.
+--
+-- This can be used with the combinators from the @lens@ package.
+--
+-- @'adjuncted' :: 'Adjunction' f u => 'Iso'' (f a -> b) (a -> u b)@
+adjuncted :: (Adjunction f u, Profunctor p, Functor g) 
+          => p (a -> u b) (g (c -> u d)) -> p (f a -> b) (g (f c -> d))
+adjuncted = dimap leftAdjunct (fmap rightAdjunct)
+{-# INLINE adjuncted #-}
 
 -- | Every right adjoint is representable by its left adjoint
 -- applied to a unit element
diff --git a/src/Data/Functor/Contravariant/Adjunction.hs b/src/Data/Functor/Contravariant/Adjunction.hs
--- a/src/Data/Functor/Contravariant/Adjunction.hs
+++ b/src/Data/Functor/Contravariant/Adjunction.hs
@@ -16,6 +16,7 @@
 
 module Data.Functor.Contravariant.Adjunction
   ( Adjunction(..)
+  , adjuncted
   , contrarepAdjunction
   , coindexAdjunction
   ) where
@@ -25,6 +26,7 @@
 #endif
 import Data.Functor.Contravariant
 import Data.Functor.Contravariant.Rep
+import Data.Profunctor
 
 -- | An adjunction from @Hask^op@ to @Hask@
 --
@@ -48,6 +50,16 @@
   counit = rightAdjunct id
   leftAdjunct f = contramap f . unit
   rightAdjunct f = contramap f . counit
+
+-- | 'leftAdjunct' and 'rightAdjunct' form two halves of an isomorphism.
+--
+-- This can be used with the combinators from the @lens@ package.
+--
+-- @'adjuncted' :: 'Adjunction' f g => 'Iso'' (b -> f a) (a -> g b)@
+adjuncted :: (Adjunction f g, Profunctor p, Functor h) 
+          => p (a -> g b) (h (c -> g d)) -> p (b -> f a) (h (d -> f c))
+adjuncted = dimap leftAdjunct (fmap rightAdjunct)
+{-# INLINE adjuncted #-}
 
 -- | This 'Adjunction' gives rise to the @Cont@ 'Monad'
 instance Adjunction (Op r) (Op r) where
diff --git a/src/Data/Functor/Contravariant/Rep.hs b/src/Data/Functor/Contravariant/Rep.hs
--- a/src/Data/Functor/Contravariant/Rep.hs
+++ b/src/Data/Functor/Contravariant/Rep.hs
@@ -16,6 +16,7 @@
   (
   -- * Representable Contravariant Functors
     Representable(..)
+  , tabulated
   -- * Default definitions
   , contramapRep
   ) where
@@ -24,6 +25,7 @@
 import Data.Functor.Contravariant
 import Data.Functor.Contravariant.Day
 import Data.Functor.Product
+import Data.Profunctor
 import Data.Proxy
 import Prelude hiding (lookup)
 
@@ -49,6 +51,19 @@
   -- @
   contramapWithRep :: (b -> Either a (Rep f)) -> f a -> f b
   contramapWithRep f p = tabulate $ either (index p) id . f
+
+{-# RULES
+"tabulate/index" forall t. tabulate (index t) = t #-}
+
+-- | 'tabulate' and 'index' form two halves of an isomorphism.
+--
+-- This can be used with the combinators from the @lens@ package.
+--
+-- @'tabulated' :: 'Representable' f => 'Iso'' (a -> 'Rep' f) (f a)@
+tabulated :: (Representable f, Representable g, Profunctor p, Functor h) 
+          => p (f a) (h (g b)) -> p (a -> Rep f) (h (b -> Rep g))
+tabulated = dimap tabulate (fmap index)
+{-# INLINE tabulated #-}
 
 contramapRep :: Representable f => (a -> b) -> f b -> f a
 contramapRep f = tabulate . (. f) . index
diff --git a/src/Data/Functor/Rep.hs b/src/Data/Functor/Rep.hs
--- a/src/Data/Functor/Rep.hs
+++ b/src/Data/Functor/Rep.hs
@@ -23,6 +23,7 @@
   (
   -- * Representable Functors
     Representable(..)
+  , tabulated
   -- * Wrapped representable functors
   , Co(..)
   -- * Default definitions
@@ -59,6 +60,7 @@
   ) where
 
 import Control.Applicative
+import Control.Arrow ((&&&))
 import Control.Comonad
 import Control.Comonad.Trans.Class
 import Control.Comonad.Trans.Traced
@@ -71,6 +73,7 @@
 import Data.Functor.Compose
 import Data.Functor.Extend
 import Data.Functor.Product
+import Data.Profunctor
 import Data.Proxy
 import Data.Sequence (Seq)
 import qualified Data.Sequence as Seq
@@ -103,6 +106,16 @@
 {-# RULES
 "tabulate/index" forall t. tabulate (index t) = t #-}
 
+-- | 'tabulate' and 'index' form two halves of an isomorphism.
+--
+-- This can be used with the combinators from the @lens@ package.
+--
+-- @'tabulated' :: 'Representable' f => 'Iso'' ('Rep' f -> a) (f a)@
+tabulated :: (Representable f, Representable g, Profunctor p, Functor h) 
+          => p (f a) (h (g b)) -> p (Rep f -> a) (h (Rep g -> b))
+tabulated = dimap tabulate (fmap index)
+{-# INLINE tabulated #-}
+
 -- * Default definitions
 
 fmapRep :: Representable f => (a -> b) -> f a -> f b
@@ -121,7 +134,7 @@
 mzipWithRep f as bs = tabulate $ \k -> f (index as k) (index bs k)
 
 mzipRep :: Representable f => f a -> f b -> f (a, b)
-mzipRep as bs = tabulate $ \k -> (index as k, index bs k)
+mzipRep as bs = tabulate (index as &&& index bs)
 
 askRep :: Representable f => f (Rep f)
 askRep = tabulate id
