diff --git a/Data/Profunctor.hs b/Data/Profunctor.hs
new file mode 100644
--- /dev/null
+++ b/Data/Profunctor.hs
@@ -0,0 +1,83 @@
+{-# LANGUAGE MultiParamTypeClasses, FlexibleContexts, FlexibleInstances #-}
+{-# LANGUAGE DefaultSignatures #-}
+
+module Data.Profunctor where
+
+import Prelude hiding ((.), id)
+
+import Control.Arrow (Kleisli (..), (|||))
+import Control.Category
+import Control.Comonad
+import Control.Monad
+import Control.Monad.Fix
+import Data.Cotraversable
+
+class Profunctor p where
+    dimap :: (a -> b) -> (c -> d) -> p b c -> p a d
+    dimap f g = lmap f . rmap g
+
+    lmap :: (a -> b) -> p b c -> p a c
+    lmap f = dimap f id
+
+    rmap :: (b -> c) -> p a b -> p a c
+    rmap g = dimap id g
+
+infixr 1 ^>>, >>^, <<^, ^<<
+
+(^>>) :: Profunctor p => (a -> b) -> p b c -> p a c
+(^>>) = lmap
+
+(>>^) :: Profunctor p => p a b -> (b -> c) -> p a c
+(>>^) = flip rmap
+
+(<<^) :: Profunctor p => p b c -> (a -> b) -> p a c
+(<<^) = flip lmap
+
+(^<<) :: Profunctor p => (b -> c) -> p a b -> p a c
+(^<<) = rmap
+
+instance Profunctor (->) where
+    dimap f g a = g . a . f
+
+instance Functor f => Profunctor (Kleisli f) where
+    dimap f g (Kleisli a) = Kleisli (fmap g . a . f)
+
+instance Functor f => Profunctor (Cokleisli f) where
+    dimap f g (Cokleisli a) = Cokleisli (g . a . fmap f)
+
+class Profunctor p => Related f p where
+    relate :: p a b -> p (f a) (f b)
+
+instance Functor f => Related f (->) where relate = fmap
+
+instance (Applicative p, Traversable f) => Related f (Kleisli p) where
+    relate = Kleisli . traverse . runKleisli
+
+instance (Cotraversable f, Functor ɯ) => Related f (Cokleisli ɯ) where
+    relate = Cokleisli . cotraverse . runCokleisli
+
+instance {-# OVERLAPPING #-} Comonad ɯ => Related (Either a) (Cokleisli ɯ) where
+    relate (Cokleisli f) =
+        (\ a -> Left . copure . (a <$)) |||
+        (\ a -> Right . f     . (a <$)) ^>> Cokleisli (copure <*> void)
+
+
+class Profunctor p => Corelated f p where
+    corelate :: p (f a) (f b) -> p a b
+
+instance Corelated ((,) a) (->) where
+    corelate f a = let (c, b) = f (c, a) in b
+
+instance MonadFix m => Corelated ((,) a) (Kleisli m) where
+    corelate (Kleisli f) = Kleisli $ \ a -> snd <$> mfix (f . flip (,) a . fst)
+
+instance Corelated (Either a) (->) where
+    corelate f = let go = either (go . f . Left) id in go . f . Right
+
+instance Monad m => Corelated (Either a) (Kleisli m) where
+    corelate (Kleisli f) = let go = either (go <=< f . Left) pure in Kleisli (go <=< f . Right)
+
+instance Functor f => Corelated (Either a) (Cokleisli f) where
+    corelate (Cokleisli f) = Cokleisli (go . fmap Right)
+      where go ɯ = case f ɯ of Right b -> b
+                               Left  c -> go (Left c <$ ɯ)
diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright M Farkas-Dyck © 2019
+
+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 M Farkas-Dyck 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,1 @@
+# hs-profunctors
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/hs-profunctors.cabal b/hs-profunctors.cabal
new file mode 100644
--- /dev/null
+++ b/hs-profunctors.cabal
@@ -0,0 +1,43 @@
+name:                hs-profunctors
+version:             0.1.0.0
+synopsis:            Profunctors from Haskell to Haskell
+-- description:
+license:             BSD3
+license-file:        LICENSE
+author:              M Farkas-Dyck
+maintainer:          strake888@gmail.com
+copyright:           2019 M Farkas-Dyck
+-- category:            
+build-type:          Simple
+extra-source-files:  README.md
+cabal-version:       >=1.10
+
+library
+  hs-source-dirs:      .
+  exposed-modules:     Data.Profunctor
+  build-depends:       base >= 4.7 && < 5
+                     , hs-functors >= 0.1 && < 0.2
+  default-language:    Haskell2010
+  default-extensions:  UnicodeSyntax
+                     , LambdaCase
+                     , EmptyCase
+                     , InstanceSigs
+                     , PartialTypeSignatures
+                     , PolyKinds
+                     , ConstraintKinds
+                     , FlexibleContexts
+                     , FlexibleInstances
+                     , MonadComprehensions
+                     , StandaloneDeriving
+                     , DeriveFunctor, DeriveFoldable, DeriveTraversable
+  ghc-options:         -Wall -Wcompat -Wredundant-constraints -Wno-name-shadowing
+                       -Wincomplete-record-updates -Wincomplete-uni-patterns
+                       -Werror=incomplete-patterns
+                       -Werror=incomplete-uni-patterns
+                       -Werror=incomplete-record-updates
+                       -Werror=missing-fields
+                       -Werror=missing-methods
+
+source-repository head
+  type:     git
+  location: https://github.com/strake/hs-profunctors.hs
