diff --git a/Database/MongoDB/Query.hs b/Database/MongoDB/Query.hs
--- a/Database/MongoDB/Query.hs
+++ b/Database/MongoDB/Query.hs
@@ -21,7 +21,7 @@
     -- ** Insert
     insert, insert_, insertMany, insertMany_, insertAll, insertAll_,
     -- ** Update
-    save, replace, repsert, Modifier, modify,
+    save, replace, repsert, upsert, Modifier, modify,
     -- ** Delete
     delete, deleteOne,
     -- * Read
@@ -305,10 +305,10 @@
 -- ** Update
 
 save :: (MonadIO m) => Collection -> Document -> Action m ()
--- ^ Save document to collection, meaning insert it if its new (has no \"_id\" field) or update it if its not new (has \"_id\" field)
+-- ^ Save document to collection, meaning insert it if its new (has no \"_id\" field) or upsert it if its not new (has \"_id\" field)
 save col doc = case look "_id" doc of
     Nothing -> insert_ col doc
-    Just i -> repsert (Select ["_id" := i] col) doc
+    Just i -> upsert (Select ["_id" := i] col) doc
 
 replace :: (MonadIO m) => Selection -> Document -> Action m ()
 -- ^ Replace first document in selection with given document
@@ -317,7 +317,12 @@
 repsert :: (MonadIO m) => Selection -> Document -> Action m ()
 -- ^ Replace first document in selection with given document, or insert document if selection is empty
 repsert = update [Upsert]
+{-# DEPRECATED repsert "use upsert instead" #-}
 
+upsert :: (MonadIO m) => Selection -> Document -> Action m ()
+-- ^ Update first document in selection with given document, or insert document if selection is empty
+upsert = update [Upsert]
+
 type Modifier = Document
 -- ^ Update operations on fields in a document. See <http://www.mongodb.org/display/DOCS/Updating#Updating-ModifierOperations>
 
@@ -434,7 +439,7 @@
   return $ case eres of
     Left l -> Left l
     Right r -> case r of
-      -- mongoDB manual says this is only possible when update is True
+      -- only possible when upsert is True and new is False
       Nothing  -> Left "findAndModify: impossible null result"
       Just doc -> Right doc
 
@@ -462,21 +467,20 @@
                 , "new"    := Bool famNew    -- return updated document, not original document
                 , "upsert" := Bool famUpsert -- insert if nothing is found
                 ])
-    return $
-      case lookup "value" result of
-          Left err   -> leftErr err
-          Right mdoc -> case mdoc of
-              Just doc@(_:_) -> case lookupErr result of
-                  Just e -> leftErr e
-                  Nothing -> Right (Just doc)
-              _  -> case famOpts of
-                      FamUpdate { famUpsert = True, famNew = True } -> Right Nothing
-                      _ -> leftErr $ show result
+    return $ case lookupErr result of
+        Just e -> leftErr e
+        Nothing -> case lookup "value" result of
+            Left err   -> leftErr $ "no document found: " `mappend` err
+            Right mdoc -> case mdoc of
+                Just doc@(_:_) -> Right (Just doc)
+                Just [] -> case famOpts of
+                    FamUpdate { famUpsert = True, famNew = False } -> Right Nothing
+                    _ -> leftErr $ show result
+                _  -> leftErr $ show result
   where
-    leftErr err = Left $ "findAndModify: no document found: "
-        `mappend` show collection
-        `mappend` "from query: " `mappend` show sel
-        `mappend` err
+    leftErr err = Left $ "findAndModify " `mappend` show collection
+        `mappend` "\nfrom query: " `mappend` show sel
+        `mappend` "\nerror: " `mappend` err
 
     -- return Nothing means ok, Just is the error message
     lookupErr result = case lookup "lastErrorObject" result of
diff --git a/mongoDB.cabal b/mongoDB.cabal
--- a/mongoDB.cabal
+++ b/mongoDB.cabal
@@ -1,5 +1,5 @@
 Name:           mongoDB
-Version:        2.0.2
+Version:        2.0.3
 Synopsis:       Driver (client) for MongoDB, a free, scalable, fast, document
                 DBMS
 Description:    This package lets you connect to MongoDB servers and
