diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,30 @@
+Copyright (c) 2015
+
+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 Your 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/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/rivet-adaptor-postgresql.cabal b/rivet-adaptor-postgresql.cabal
new file mode 100644
--- /dev/null
+++ b/rivet-adaptor-postgresql.cabal
@@ -0,0 +1,36 @@
+name:                rivet-adaptor-postgresql
+version:             0.1.0.0
+synopsis:            Rivet migration library postgresql backend
+description:         Please see README.md
+homepage:            http://github.com/name/project
+license:             BSD3
+license-file:        LICENSE
+author:              Daniel Patterson
+maintainer:          dbp@dbpmail.net
+-- copyright:
+category:            Web
+build-type:          Simple
+-- extra-source-files:
+cabal-version:       >=1.10
+
+library
+  hs-source-dirs:      src
+  exposed-modules:     Database.Rivet.Adaptor.PostgreSQL
+  build-depends:       base >= 4.7 && < 5
+                     , postgresql-simple
+                     , text
+                     , rivet-core >= 0.2
+  default-language:    Haskell2010
+
+-- test-suite new-template-test
+--   type:                exitcode-stdio-1.0
+--   hs-source-dirs:      test
+--   main-is:             Spec.hs
+--   build-depends:       base
+--                      , rivet-adaptor-postgresql
+--   ghc-options:         -threaded -rtsopts -with-rtsopts=-N
+--   default-language:    Haskell2010
+
+source-repository head
+  type:     git
+  location: https://github.com/dbp/rivet
diff --git a/src/Database/Rivet/Adaptor/PostgreSQL.hs b/src/Database/Rivet/Adaptor/PostgreSQL.hs
new file mode 100644
--- /dev/null
+++ b/src/Database/Rivet/Adaptor/PostgreSQL.hs
@@ -0,0 +1,37 @@
+{-# LANGUAGE OverloadedStrings #-}
+module Database.Rivet.Adaptor.PostgreSQL (setup, ConnectInfo(..)) where
+
+import           Control.Monad              (void)
+import           Data.String                (fromString)
+import           Data.Text                  (Text)
+import qualified Data.Text                  as T (unpack)
+import           Database.PostgreSQL.Simple
+import           Database.Rivet
+
+setup :: Monad m
+      => (m () -> IO ())
+      -> ConnectInfo
+      -> IO (Adaptor m)
+setup h info =
+  do conn <- connect info
+     execute_ conn "CREATE TABLE IF NOT EXISTS migrations (name text NOT NULL\
+                   \ PRIMARY KEY, run_at timestamptz NOT NULL DEFAULT now())"
+     return $ Adaptor h (sql conn) (check conn) (mark conn)
+  where sql :: Connection -> Text -> IO ()
+        sql conn = void . execute_ conn . fromString . T.unpack
+        check :: Connection -> Text -> IO Bool
+        check conn name =
+          not . null <$> (query conn
+                                "SELECT name FROM migrations WHERE name = ?"
+                                (Only name) :: IO [Only Text])
+        mark :: Connection -> Text -> Direction -> IO ()
+        mark conn name dir =
+          case dir of
+            Up ->
+              void $ execute conn
+                             "INSERT INTO migrations (name) values (?)"
+                             (Only name)
+            Down ->
+              void $ execute conn
+                             "DELETE FROM migrations WHERE name = ?"
+                             (Only name)
