diff --git a/Git/Commit/Push.hs b/Git/Commit/Push.hs
--- a/Git/Commit/Push.hs
+++ b/Git/Commit/Push.hs
@@ -8,6 +8,7 @@
 import           Data.List
 import           Data.Maybe
 import           Data.Monoid
+import           Data.Tagged
 import           Data.Text (Text)
 import           Data.Traversable (for)
 import           Git.Commit
@@ -24,7 +25,7 @@
            => CommitOid m -> Text -> t m (CommitOid (t m))
 pushCommit coid remoteRefName = do
     commits <- mapM copyCommitOid =<< lift (listCommits Nothing coid)
-    mrref   <- resolveReference remoteRefName
+    mrref   <- fmap Tagged `liftM` resolveReference remoteRefName
     mrref'  <- for mrref $ \rref ->
         if rref `elem` commits
         then lift $ copyCommitOid rref
diff --git a/Git/Reference.hs b/Git/Reference.hs
--- a/Git/Reference.hs
+++ b/Git/Reference.hs
@@ -1,20 +1,12 @@
 module Git.Reference where
 
-import Control.Applicative
 import Git.Types
 
-resolveReference :: Repository m => RefName -> m (Maybe (CommitOid m))
+resolveReference :: Repository m => RefName -> m (Maybe (Oid m))
 resolveReference name = do
     mref <- lookupReference name
     maybe (return Nothing) referenceToOid mref
 
-referenceToOid :: Repository m => RefTarget m -> m (Maybe (CommitOid m))
+referenceToOid :: Repository m => RefTarget m -> m (Maybe (Oid m))
 referenceToOid (RefObj oid)       = return $ Just oid
 referenceToOid (RefSymbolic name) = resolveReference name
-
-resolveReferenceTree :: Repository m => RefName -> m (Maybe (Tree m))
-resolveReferenceTree refName = do
-    c <- resolveReference refName
-    case c of
-        Nothing -> return Nothing
-        Just c' -> Just <$> (lookupCommit c' >>= lookupTree . commitTree)
diff --git a/Git/Repository.hs b/Git/Repository.hs
--- a/Git/Repository.hs
+++ b/Git/Repository.hs
@@ -3,16 +3,15 @@
 import qualified Control.Exception.Lifted as Exc
 import           Control.Monad
 import           Control.Monad.IO.Class
-import           Control.Monad.Trans.Class
 import           Data.Conduit
 import           Git.Types
 import           System.Directory
 import           System.Mem
 
-withNewRepository :: (Repository (t m), MonadGit (t m),
-                      MonadBaseControl IO m, MonadIO m, MonadTrans t)
+withNewRepository :: (Repository t, MonadGit t,
+                      MonadBaseControl IO m, MonadIO m)
                   => RepositoryFactory t m c
-                  -> FilePath -> t m a -> m a
+                  -> FilePath -> t a -> m a
 withNewRepository factory path action = do
     liftIO $ do
         exists <- doesDirectoryExist path
@@ -31,9 +30,9 @@
 
     return a
 
-withNewRepository' :: (Repository (t m), MonadGit (t m),
-                       MonadBaseControl IO m, MonadIO m, MonadTrans t)
-                   => RepositoryFactory t m c -> FilePath -> t m a -> m a
+withNewRepository' :: (Repository t, MonadGit t,
+                       MonadBaseControl IO m, MonadIO m)
+                   => RepositoryFactory t m c -> FilePath -> t a -> m a
 withNewRepository' factory path action =
     Exc.bracket_ recover recover $
         withRepository' factory (defaultOptions factory)
@@ -52,11 +51,11 @@
     startupBackend fact
     Exc.finally f (liftIO performGC >> shutdownBackend fact)
 
-withRepository' :: (Repository (t m), MonadTrans t,
+withRepository' :: (Repository t,
                     MonadBaseControl IO m, MonadIO m)
                 => RepositoryFactory t m c
                 -> RepositoryOptions
-                -> t m a
+                -> t a
                 -> m a
 withRepository' factory opts action =
     Exc.bracket
@@ -64,11 +63,11 @@
         (closeRepository factory)
         (flip (runRepository factory) action)
 
-withRepository :: (Repository (t m), MonadTrans t,
+withRepository :: (Repository t,
                    MonadBaseControl IO m, MonadIO m)
                => RepositoryFactory t m c
                -> FilePath
-               -> t m a
+               -> t a
                -> m a
 withRepository factory path =
     withRepository' factory
diff --git a/Git/Tree/Builder.hs b/Git/Tree/Builder.hs
--- a/Git/Tree/Builder.hs
+++ b/Git/Tree/Builder.hs
@@ -38,7 +38,6 @@
 import           Data.Text (Text)
 import           Data.Word
 import           Git.Types
-import           System.Posix.ByteString.FilePath
 
 data ModifyTreeResult m = TreeEntryNotFound
                         | TreeEntryDeleted
diff --git a/Git/Types.hs b/Git/Types.hs
--- a/Git/Types.hs
+++ b/Git/Types.hs
@@ -6,7 +6,6 @@
 import           Control.Monad.IO.Class
 import qualified Data.Binary as Bin
 import           Data.ByteString (ByteString)
-import qualified Data.ByteString as B
 import qualified Data.ByteString.Base16 as B16
 import           Data.Conduit
 import           Data.Default
@@ -20,8 +19,10 @@
 import qualified Data.Text.Encoding as T
 import           Data.Time
 import           Data.Typeable
-import           System.Posix.ByteString.FilePath
+--import           System.Posix.ByteString.FilePath
 
+type RawFilePath = ByteString
+
 data RepositoryFacts = RepositoryFacts
     { hasSymbolicReferences :: !Bool
     } deriving Show
@@ -56,15 +57,15 @@
 
     -- Object lookup
     lookupCommit  :: CommitOid m -> m (Commit m)
-    lookupTree    :: TreeOid m   -> m (Tree m)
-    lookupBlob    :: BlobOid m   -> m (Blob m)
-    lookupTag     :: TagOid m    -> m (Tag m)
-    lookupObject  :: Oid m       -> m (Object m)
-    existsObject  :: Oid m       -> m Bool
+    lookupTree    :: TreeOid m -> m (Tree m)
+    lookupBlob    :: BlobOid m -> m (Blob m)
+    lookupTag     :: TagOid m -> m (Tag m)
+    lookupObject  :: Oid m -> m (Object m)
+    existsObject  :: Oid m -> m Bool
     sourceObjects :: Maybe (CommitOid m)    -- ^ A commit we may already have
                   -> CommitOid m            -- ^ The commit we need
                   -> Bool                   -- ^ Include commit trees also?
-                  -> Source m (ObjectOid m) -- ^ All the objects in between
+                  -> Producer m (ObjectOid m) -- ^ All the objects in between
 
     -- Working with trees
     newTreeBuilder :: Maybe (Tree m) -> m (TreeBuilder m)
@@ -73,6 +74,9 @@
     treeEntry :: Tree m -> TreeFilePath -> m (Maybe (TreeEntry m))
     listTreeEntries :: Tree m -> m [(TreeFilePath, TreeEntry m)]
 
+    diffContentsWithTree :: Source m (Either TreeFilePath ByteString)
+                         -> Tree m -> Producer m ByteString
+
     -- Creating other objects
     hashContents :: BlobContents m -> m (BlobOid m)
     createBlob   :: BlobContents m -> m (BlobOid m)
@@ -107,11 +111,12 @@
 instance Default RepositoryOptions where
     def = RepositoryOptions "" True True
 
-data RepositoryFactory t m c = RepositoryFactory
+data RepositoryFactory t m c
+    = RepositoryFactory
     { openRepository  :: RepositoryOptions -> m c
-    , runRepository   :: forall a. c -> t m a -> m a
+    , runRepository   :: forall a. c -> t a -> m a
     , closeRepository :: c -> m ()
-    , getRepository   :: t m c
+    , getRepository   :: t c
     , defaultOptions  :: !RepositoryOptions
     , startupBackend  :: m ()
     , shutdownBackend :: m ()
@@ -140,7 +145,7 @@
 copyOid :: (Repository m, Repository n) => Oid m -> n (Oid n)
 copyOid = parseOid . renderOid
 
-newtype SHA = SHA B.ByteString deriving (Eq, Ord, Read)
+newtype SHA = SHA { getSHA :: ByteString } deriving (Eq, Ord, Read)
 
 shaToText :: SHA -> Text
 shaToText (SHA bs) = T.decodeUtf8 (B16.encode bs)
@@ -294,14 +299,14 @@
 untagObjOid (TagObjOid oid)    = untag oid
 
 {- $references -}
-data RefTarget m = RefObj !(CommitOid m) | RefSymbolic !RefName
+data RefTarget m = RefObj !(Oid m) | RefSymbolic !RefName
 
 instance Repository m => Show (RefTarget m) where
-    show (RefObj coid) = "RefObj#" ++ T.unpack (renderObjOid coid)
+    show (RefObj oid) = "RefObj#" ++ T.unpack (renderOid oid)
     show (RefSymbolic name) = "RefSymbolic#" ++ T.unpack name
 
 commitRefTarget :: Commit m -> RefTarget m
-commitRefTarget = RefObj . commitOid
+commitRefTarget = RefObj . untag . commitOid
 
 {- $merges -}
 data ModificationKind = Unchanged | Modified | Added | Deleted | TypeChanged
@@ -386,42 +391,48 @@
 {- $exceptions -}
 -- | There is a separate 'GitException' for each possible failure when
 --   interacting with the Git repository.
-data GitException = BackendError Text
-                  | GitError Text
-                  | RepositoryNotExist
-                  | RepositoryInvalid
-                  | RepositoryCannotAccess Text
-                  | BlobCreateFailed
-                  | BlobEmptyCreateFailed
-                  | BlobEncodingUnknown Text
-                  | BlobLookupFailed
-                  | PushNotFastForward Text
-                  | TranslationException Text
-                  | TreeCreateFailed Text
-                  | TreeBuilderCreateFailed
-                  | TreeBuilderInsertFailed TreeFilePath
-                  | TreeBuilderRemoveFailed TreeFilePath
-                  | TreeBuilderWriteFailed Text
-                  | TreeLookupFailed
-                  | TreeCannotTraverseBlob
-                  | TreeCannotTraverseCommit
-                  | TreeEntryLookupFailed TreeFilePath
-                  | TreeUpdateFailed
-                  | TreeWalkFailed
-                  | TreeEmptyCreateFailed
-                  | CommitCreateFailed
-                  | CommitLookupFailed Text
-                  | ReferenceCreateFailed RefName
-                  | ReferenceDeleteFailed RefName
-                  | RefCannotCreateFromPartialOid
-                  | ReferenceListingFailed
-                  | ReferenceLookupFailed RefName
-                  | ObjectLookupFailed Text Int
-                  | ObjectRefRequiresFullOid
-                  | OidCopyFailed
-                  | OidParseFailed Text
-                  | QuotaHardLimitExceeded Int Int
-                  deriving (Eq, Show, Typeable)
+data GitException
+    = BackendError Text
+    | GitError Text
+    | RepositoryNotExist
+    | RepositoryInvalid
+    | RepositoryCannotAccess Text
+    | BlobCreateFailed Text
+    | BlobEmptyCreateFailed
+    | BlobEncodingUnknown Text
+    | BlobLookupFailed
+    | DiffBlobFailed Text
+    | DiffPrintToPatchFailed Text
+    | DiffTreeToIndexFailed Text
+    | IndexAddFailed TreeFilePath Text
+    | IndexCreateFailed Text
+    | PushNotFastForward Text
+    | TranslationException Text
+    | TreeCreateFailed Text
+    | TreeBuilderCreateFailed
+    | TreeBuilderInsertFailed TreeFilePath
+    | TreeBuilderRemoveFailed TreeFilePath
+    | TreeBuilderWriteFailed Text
+    | TreeLookupFailed
+    | TreeCannotTraverseBlob
+    | TreeCannotTraverseCommit
+    | TreeEntryLookupFailed TreeFilePath
+    | TreeUpdateFailed
+    | TreeWalkFailed
+    | TreeEmptyCreateFailed
+    | CommitCreateFailed
+    | CommitLookupFailed Text
+    | ReferenceCreateFailed RefName
+    | ReferenceDeleteFailed RefName
+    | RefCannotCreateFromPartialOid
+    | ReferenceListingFailed
+    | ReferenceLookupFailed RefName
+    | ObjectLookupFailed Text Int
+    | ObjectRefRequiresFullOid
+    | OidCopyFailed
+    | OidParseFailed Text
+    | QuotaHardLimitExceeded Int Int
+    deriving (Eq, Show, Typeable)
 
 -- jww (2013-02-11): Create a BackendException data constructor of forall
 -- e. Exception e => BackendException e, so that each can throw a derived
diff --git a/gitlib.cabal b/gitlib.cabal
--- a/gitlib.cabal
+++ b/gitlib.cabal
@@ -1,5 +1,5 @@
 Name:                gitlib
-Version:             2.1.0.0
+Version:             2.2.0.0
 Synopsis:            API library for working with Git repositories
 License-file:        LICENSE
 License:             MIT
@@ -54,7 +54,6 @@
         , text                 >= 0.11.2
         , time                 >= 1.4
         , transformers         >= 0.3.0.0
-        , unix                 >= 2.5
         , unordered-containers >= 0.2.3.0
     exposed-modules:
         Git
