diff --git a/LICENSE b/LICENSE
new file mode 100644
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,20 @@
+Copyright (c) 2016 Braden Walters
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
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/src/Yesod/Payments/PayPal.hs b/src/Yesod/Payments/PayPal.hs
new file mode 100644
--- /dev/null
+++ b/src/Yesod/Payments/PayPal.hs
@@ -0,0 +1,62 @@
+-- |
+-- Module: Yesod.Payments.PayPal
+-- Copyright: (C) 2016 Braden Walters
+-- License: MIT (see LICENSE file)
+-- Maintainer: Braden Walters <vc@braden-walters.info>
+-- Stability: experimental
+-- Portability: ghc
+
+module Yesod.Payments.PayPal
+( PayPalCredentials
+, YesodPayPalState
+, mkYesodPayPalState
+, YesodPayPal(..)
+, yesodExecPayPal
+) where
+
+import Data.IORef
+import Data.Time.Clock
+import Network.Payments.PayPal
+import Network.Payments.PayPal.Auth
+import Network.Payments.PayPal.Environment
+import Yesod.Core
+
+-- |All credentials needed to log into PayPal's API.
+type PayPalCredentials = (EnvironmentUrl, ClientID, Secret)
+
+-- |State needed over multiple PayPal requests.
+data YesodPayPalState =
+  YesodPayPalState { yPpStToken :: IORef (AccessToken, UTCTime) }
+
+-- |Create a PayPal state for a site.
+mkYesodPayPalState :: PayPalCredentials -> IO (Maybe YesodPayPalState)
+mkYesodPayPalState (envUrl, clientId, secret) = do
+  accessTokenOrErr <- fetchAccessTokenWithExpiration envUrl clientId secret
+  case accessTokenOrErr of
+    Left err -> return Nothing
+    Right accessToken -> do
+      ref <- newIORef accessToken
+      return $ Just $ YesodPayPalState ref
+
+-- |Typeclass for Yesod sites which use PayPal.
+class Yesod site => YesodPayPal site where
+  -- |The PayPal API credentials for a site.
+  yesodPayPalCredentials :: site -> PayPalCredentials
+  -- |State needed over multiple PayPal requests for a site.
+  yesodPayPalState :: site -> YesodPayPalState
+
+-- |Execute PayPal operations in the context of Yesod.
+yesodExecPayPal :: (YesodPayPal site, FromJSON a) =>
+                   PayPalOperations a -> HandlerT site IO (Either PayPalError a)
+yesodExecPayPal operations = do
+  site <- getYesod
+  let (envUrl, clientId, secret) = yesodPayPalCredentials site
+      accessTokenRef = yPpStToken $ yesodPayPalState site
+  liftIO $ do
+    accessToken <- readIORef accessTokenRef
+    resultOrErr <- execPayPalOpers envUrl clientId secret accessToken operations
+    case resultOrErr of
+      Left err -> return $ Left err
+      Right (result, accessToken') -> do
+        writeIORef accessTokenRef accessToken'
+        return $ Right result
diff --git a/yesod-paypal-rest.cabal b/yesod-paypal-rest.cabal
new file mode 100644
--- /dev/null
+++ b/yesod-paypal-rest.cabal
@@ -0,0 +1,36 @@
+name: yesod-paypal-rest
+version: 0.1.0
+synopsis: Yesod plugin to use PayPal with the paypal-rest-client library.
+license: MIT
+license-file: LICENSE
+author: Braden Walters
+maintainer: vc@braden-walters.info
+category: Yesod
+stability: experimental
+build-type: Simple
+cabal-version: >= 1.10
+Tested-With: GHC == 7.8.4, GHC == 7.10.2, GHC == 8.0.1
+
+description:
+  Library to connect Yesod applications with PayPal's
+  <https://developer.paypal.com/docs/api/ REST API v1> by using the
+  <http://hackage.haskell.org/package/paypal-rest-client paypal-reset-client>
+  package. For documentation, see the
+  <https://github.com/meoblast001/yesod-paypal-rest/blob/master/README.md README>.
+  Due to the experimental nature of the paypal-rest-client, it is recommended to
+  explicitly give an exact version of that package even when you are already
+  including this package.
+
+library
+  exposed-modules: Yesod.Payments.PayPal
+  build-depends:
+      base >= 4 && < 5
+    , yesod-core >= 1.2 && < 1.5
+    , paypal-rest-client < 1.0.0
+    , time >= 1.5 && < 1.7
+  hs-source-dirs: src
+  default-language: Haskell2010
+
+source-repository head
+  type: git
+  location: https://github.com/meoblast001/yesod-paypal-rest.git
