diff --git a/multipool.cabal b/multipool.cabal
--- a/multipool.cabal
+++ b/multipool.cabal
@@ -1,11 +1,13 @@
--- This file has been generated from package.yaml by hpack version 0.28.2.
+cabal-version: 1.12
+
+-- This file has been generated from package.yaml by hpack version 0.31.1.
 --
 -- see: https://github.com/sol/hpack
 --
--- hash: 94857348efe4280780cf43aafdfa4d309b7f052c478231a8894f01882519533b
+-- hash: 038273645193a39608f132b11aa88c25325bba2abb8d3f74b86f4a90a376e90c
 
 name:           multipool
-version:        0.1.0.1
+version:        0.2.0.0
 synopsis:       Generalized system for reading and writing to distributed systems that have primary/replica topologies.
 description:    Please see the README on GitHub at <https://github.com/iand675/multipool#readme>
 category:       Database
@@ -17,10 +19,9 @@
 license:        BSD3
 license-file:   LICENSE
 build-type:     Simple
-cabal-version:  >= 1.10
 extra-source-files:
-    ChangeLog.md
     README.md
+    ChangeLog.md
 
 source-repository head
   type: git
diff --git a/src/Data/MultiPool.hs b/src/Data/MultiPool.hs
--- a/src/Data/MultiPool.hs
+++ b/src/Data/MultiPool.hs
@@ -43,38 +43,48 @@
 instance (Show (InstanceDoesNotExist backend), Typeable backend) => Exception (InstanceDoesNotExist backend)
 
 class Monad m => MultiPoolBackend m backend where
-  type Masters backend :: *
-  type Masters backend = Pool (MasterConnection backend)
+  type Primaries backend :: *
+  type Primaries backend = Pool (PrimaryConnection backend)
   type Replicas backend :: *
   type Replicas backend = HashMap (ReplicaIdentifier backend) (Pool (ReplicaConnection backend))
 
-  type MasterConnection backend :: *
+  type LocalPrimary backend :: *
+  type LocalPrimary backend = LocalPool (PrimaryConnection backend)
+  type LocalReplica backend :: *
+  type LocalReplica backend = LocalPool (ReplicaConnection backend)
+
+  type PrimaryConnection backend :: *
   type ReplicaConnection backend :: *
 
-  type MasterIdentifier backend :: *
-  type MasterIdentifier backend = ()
+  type PrimaryIdentifier backend :: *
+  type PrimaryIdentifier backend = ()
   type ReplicaIdentifier backend :: *
   type ReplicaIdentifier backend = InstanceName backend
 
-  runWriteAny :: MultiPool backend -> ReaderT (MasterConnection backend) m a -> m a
-  runWrite :: MultiPool backend -> MasterIdentifier backend -> ReaderT (MasterConnection backend) m a -> m a
+  runWriteAny :: MultiPool backend -> ReaderT (PrimaryConnection backend) m a -> m a
+  runWrite :: MultiPool backend -> PrimaryIdentifier backend -> ReaderT (PrimaryConnection backend) m a -> m a
 
-  runReadMaster :: MultiPool backend -> MasterIdentifier backend -> ReaderT (ReplicaConnection backend) m a -> m a
-  runReadAnyMaster :: MultiPool backend -> ReaderT (ReplicaConnection backend) m a -> m a
+  runReadPrimary :: MultiPool backend -> PrimaryIdentifier backend -> ReaderT (ReplicaConnection backend) m a -> m a
+  runReadAnyPrimary :: MultiPool backend -> ReaderT (ReplicaConnection backend) m a -> m a
   runReadAny :: MultiPool backend -> ReaderT (ReplicaConnection backend) m a -> m a
   runRead :: MultiPool backend -> ReplicaIdentifier backend -> ReaderT (ReplicaConnection backend) m a -> m a
 
+  takePrimary :: MultiPool backend -> PrimaryIdentifier backend -> m (PrimaryConnection backend, LocalPrimary backend)
+  putPrimary :: MultiPool backend -> LocalPrimary backend -> PrimaryConnection backend -> m ()
 
+  takeReplica :: MultiPool backend -> ReplicaIdentifier backend -> m (ReplicaConnection backend, LocalReplica backend)
+  putReplica :: MultiPool backend -> LocalReplica backend -> ReplicaConnection backend -> m ()
+
 -- Invariant: MultiPool should not be modified after creation?
 data MultiPool backend = MultiPool
-  { multiPoolMaster :: !(Masters backend)
+  { multiPoolPrimary :: !(Primaries backend)
   , multiPoolReplica :: !(Replicas backend)
-  , multiPoolAnyMasterSelector :: MultiPool backend -> IO (MasterIdentifier backend)
+  , multiPoolAnyPrimarySelector :: MultiPool backend -> IO (PrimaryIdentifier backend)
   , multiPoolAnyReplicaSelector :: MultiPool backend -> IO (Maybe (ReplicaIdentifier backend))
   }
 
 forReplicas :: (MultiPoolBackend m backend, Replicas backend ~ HashMap k v) => MultiPool backend -> (k -> v -> m a) -> m [a]
-forReplicas pool f = forM (HM.toList (multiPoolReplica pool)) $ \(k, v) -> f k v
+forReplicas pool f = forM (HM.toList $ multiPoolReplica pool) $ \(k, v) -> f k v
 
 roundRobin :: MonadIO m => [choice] -> m (a -> IO (Maybe choice))
 roundRobin [] = return $ const $ return Nothing
