diff --git a/Data/Universal.hs b/Data/Universal.hs
new file mode 100644
--- /dev/null
+++ b/Data/Universal.hs
@@ -0,0 +1,24 @@
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE TypeFamilies #-}
+{-# LANGUAGE DataKinds #-}
+
+module Data.Universal where
+
+import Prelude hiding (Functor (..))
+import Control.Categorical.Functor
+import Control.Category.Const2
+import Data.Functor.Const
+
+-- | Laws:
+--
+-- * @f = 'map' ('universal' f) . 'getConst' 'morphism'@
+class Functor s t f => Universal (s :: α -> α -> *) (t :: β -> β -> *) (x :: β) (f :: α -> β) where
+    type Element s t x f :: α
+    morphism :: Const (t x (f (Element s t x f))) s
+    universal :: t x (f a) -> s (Element s t x f) a
+
+-- Terminal
+instance Universal (Const2 () :: () -> () -> *) (->) () (Const ()) where
+    type Element (Const2 ()) (->) () (Const ()) = '()
+    morphism = Const Const
+    universal = \ _ -> Const2 ()
diff --git a/Setup.hs b/Setup.hs
deleted file mode 100644
--- a/Setup.hs
+++ /dev/null
@@ -1,2 +0,0 @@
-import Distribution.Simple
-main = defaultMain
diff --git a/universal.cabal b/universal.cabal
--- a/universal.cabal
+++ b/universal.cabal
@@ -1,5 +1,5 @@
 name:                universal
-version:             0.0.0.0
+version:             0.0.1.0
 synopsis:            Universal
 -- description:
 license:             BSD3
@@ -14,9 +14,10 @@
 
 library
   hs-source-dirs:      .
-  exposed-modules:     
+  exposed-modules:     Data.Universal
   build-depends:       base >= 4.7 && < 5
                      , base-unicode-symbols
+                     , category
                      , util
   default-language:    Haskell2010
   default-extensions:  UnicodeSyntax
