diff --git a/BerkeleyDB.cabal b/BerkeleyDB.cabal
--- a/BerkeleyDB.cabal
+++ b/BerkeleyDB.cabal
@@ -1,5 +1,5 @@
 name: BerkeleyDB
-version: 0.8.6
+version: 0.8.7
 license: BSD3
 license-file: LICENSE
 cabal-version: >= 1.4
@@ -26,9 +26,11 @@
     DARCS repository:
     <http://code.haskell.org/BerkeleyDB/>
     .
-    Changes: 0.8:   Support db4.7 and db4.8, removed C++ binding.
+    Changes: 0.7.2: Fix on db4.7
+             0.8:   Support db4.7 and db4.8, removed C++ binding.
              0.8.5: Add db_sync.
-             0.7.2: Fix on db4.7
+             0.8.6: Fix crash in transaction commit.
+             0.8.7: Add dbCursor_set_range.
     .
     Contributors: Michael Stone, Balázs Jávorszky
 
diff --git a/Database/Berkeley/Db.hsc b/Database/Berkeley/Db.hsc
--- a/Database/Berkeley/Db.hsc
+++ b/Database/Berkeley/Db.hsc
@@ -71,6 +71,7 @@
         dbCursor_dup,
         dbCursor_get,
         dbCursor_set,
+        dbCursor_set_range,
         dbCursor_put,
         -- * Logging subsystem
 #if (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 7) || DB_VERSION_MAJOR > 4
@@ -1225,7 +1226,7 @@
                      BSI.fromForeignPtr value 0 (fromIntegral value_len))
 
 foreign import ccall "db_helper.h _dbCursor_set" _dbCursor_set
-    :: Ptr DbCursor_struct -> Ptr Word8 -> CUInt -> Ptr (Ptr Word8) -> Ptr CUInt -> Word32 -> IO CInt
+    :: Ptr DbCursor_struct -> Ptr Word8 -> CUInt -> Ptr (Ptr Word8) -> Ptr CUInt -> Ptr (Ptr Word8) -> Ptr CUInt -> Word32 -> IO CInt
 
 -- | Move the cursor to the specified key/data pair of the database, and return
 -- the datum associated with the given key, or Nothing if it wasn't matched.
@@ -1236,7 +1237,7 @@
     alloca $ \ptr1 ->
     alloca $ \ptr2 ->
     withForeignPtr cur $ \c_cur -> do
-        ret <- _dbCursor_set c_cur c_key (fromIntegral key_len) ptr1 ptr2 (dbOrFlags (DB_SET:flags))
+        ret <- _dbCursor_set c_cur c_key (fromIntegral key_len) nullPtr nullPtr ptr1 ptr2 (dbOrFlags (DB_SET:flags))
         if ret /= 0
             then
                 if (dbErrFromNum$ fromIntegral ret) == DB_NOTFOUND
@@ -1247,6 +1248,34 @@
                 value_len <- peek ptr2
                 str <- newForeignPtr _freeString_finalizer c_value
                 return $ Just $ BSI.fromForeignPtr str 0 (fromIntegral value_len)
+
+-- | Move the cursor to the specified key/data pair of the database, and return
+-- the next record (key, value) where the key is greater than or equal to
+-- the specified key, or Nothing if no such record was found.
+-- (This is DBC->get with the DB_SET_RANGE flag. The DB_SET_RANGE flag is implied.)
+dbCursor_set_range :: [DbFlag] -> DbCursor -> ByteString -> IO (Maybe (ByteString, ByteString))
+dbCursor_set_range flags cur key =
+    withByteString key $ \c_key key_len ->
+    alloca $ \ptr1 ->
+    alloca $ \ptr2 ->
+    alloca $ \ptr3 ->
+    alloca $ \ptr4 ->
+    withForeignPtr cur $ \c_cur -> do
+        ret <- _dbCursor_set c_cur c_key (fromIntegral key_len) ptr1 ptr2 ptr3 ptr4 (dbOrFlags (DB_SET_RANGE:flags))
+        if ret /= 0
+            then
+                if (dbErrFromNum$ fromIntegral ret) == DB_NOTFOUND
+                    then return Nothing
+                    else throwDB "dbCursor_set" ret
+            else do
+                c_key <- peek ptr1
+                key_len <- peek ptr2
+                key_str <- newForeignPtr _freeString_finalizer c_key
+                c_value <- peek ptr3
+                value_len <- peek ptr4
+                value_str <- newForeignPtr _freeString_finalizer c_value
+                return $ Just (BSI.fromForeignPtr key_str 0 (fromIntegral key_len),
+                               BSI.fromForeignPtr value_str 0 (fromIntegral value_len))
 
 foreign import ccall "db_helper.h _dbCursor_put" _dbCursor_put
     :: Ptr DbCursor_struct -> Ptr Word8 -> CUInt -> Ptr Word8 -> CUInt -> Word32 -> IO CInt
diff --git a/Database/Berkeley/db_helper.c b/Database/Berkeley/db_helper.c
--- a/Database/Berkeley/db_helper.c
+++ b/Database/Berkeley/db_helper.c
@@ -458,14 +458,15 @@
     return ret;
 }
 
-int _dbCursor_set(DBC** dbcp, const char* key, u_int32_t key_len, char** value, u_int32_t* value_len, u_int32_t flags)
+int _dbCursor_set(DBC** dbcp, const char* key, u_int32_t key_len, char** okey, u_int32_t* okey_len,
+                                                                  char** value, u_int32_t* value_len, u_int32_t flags)
 {
     UNWRAP_DBCURSOR();
     int ret;
 
     DBT keyDbt;
     memset(&keyDbt, 0, sizeof(keyDbt));
-    keyDbt.flags = DB_DBT_USERMEM;
+    keyDbt.flags = okey ? DB_DBT_MALLOC : DB_DBT_USERMEM;
     keyDbt.data = (void*)key;
     keyDbt.size = key_len;
 
@@ -477,6 +478,10 @@
 
     ret = dbc->get(dbc, &keyDbt, &valueDbt, flags);
     if (ret == 0) {
+        if (okey) {
+            *okey = (char*)keyDbt.data;
+            *okey_len = keyDbt.size;
+        }
         *value = (char*)valueDbt.data;
         *value_len = valueDbt.size;
     }
diff --git a/Database/Berkeley/db_helper.h b/Database/Berkeley/db_helper.h
--- a/Database/Berkeley/db_helper.h
+++ b/Database/Berkeley/db_helper.h
@@ -63,7 +63,8 @@
 int _dbCursor_del(DBC** dbcp, u_int32_t flags);
 int _dbCursor_dup(DBC** dbcp, DBC*** dbcursorpp, u_int32_t flags);
 int _dbCursor_get(DBC** dbcp, char** key, u_int32_t* key_len, char** value, u_int32_t* value_len, u_int32_t flags);
-int _dbCursor_set(DBC** dbcp, const char* key, u_int32_t key_len, char** value, u_int32_t* value_len, u_int32_t flags);
+int _dbCursor_set(DBC** dbcp, const char* key, u_int32_t key_len, char** okey, u_int32_t* okey_len,
+                                                                  char** value, u_int32_t* value_len, u_int32_t flags);
 int _dbCursor_put(DBC** dbcp, const char* key, u_int32_t key_len, const char* value, u_int32_t value_len, u_int32_t flags);
 
 #endif
