diff --git a/BerkeleyDB.cabal b/BerkeleyDB.cabal
--- a/BerkeleyDB.cabal
+++ b/BerkeleyDB.cabal
@@ -1,5 +1,5 @@
 name: BerkeleyDB
-version: 0.8.3
+version: 0.8.4
 license: BSD3
 license-file: LICENSE
 cabal-version: >= 1.4
@@ -9,9 +9,10 @@
 stability: beta
 synopsis: Berkeley DB binding
 description:
-    Berkeley DB is a fast, scalable, fully transactional database that runs on a local file
-    system, and functions as a dictionary of arbitrary-sized binary blobs.
-    (It is NOT an SQL-based database.)  This package provides a thin Haskell binding for Berkeley DB.
+    This package provides a Haskell binding for Berkeley DB, which is a fast, scalable,
+    fully transactional database that runs on a local file system, and functions as a
+    dictionary of arbitrary-sized binary blobs.  It is NOT an SQL-based database.  It
+    is not free for commercial use.
     .
     This is a work in progress: The coverage of the Berkeley DB API is not yet complete. Tested with
     Berkeley DB versions 4.7 and 4.8, but should work with earlier versions.
diff --git a/Database/Berkeley/Db.hsc b/Database/Berkeley/Db.hsc
--- a/Database/Berkeley/Db.hsc
+++ b/Database/Berkeley/Db.hsc
@@ -18,6 +18,8 @@
         dbEnv_close,
         DbEnvCreateFlag,
         dbEnv_create,
+        dbEnv_set_data_dir,
+        dbEnv_set_lg_dir,
         dbEnv_get_cache_size,
         dbEnv_get_lk_max_lockers,
         dbEnv_get_lk_max_locks,
@@ -77,10 +79,13 @@
         dbEnv_get_lg_regionmax,
         dbEnv_set_lg_regionmax,
         -- * Private
-        dbToNum,       -- | Needed for BerkeleyDBXML: Binary representation of a DbFlag
-        dbErrFromNum,  -- | Needed for BerkeleyDBXML: Convert an error code to a DbError
-        DbEnv_struct,  -- | Needed for BerkeleyDBXML: C pointer type for a DbEnv
-        DbTxn_struct   -- | Needed for BerkeleyDBXML: C pointer type for a DbTxn
+        dbToNum,
+        dbErrFromNum,
+        DbEnv_struct,
+        DbTxn_struct,
+        -- * C integration
+        DbEnv_native,
+        dbEnv_toNative
     ) where
 
 import Foreign.C
@@ -144,6 +149,7 @@
     SYSTEM_ERROR Int             -- ^ An errno value returned by the operating system
     deriving (Eq,Show)
 
+-- | Needed for BerkeleyDBXML: Convert an error code to a DbError
 dbErrFromNum :: Int -> DbError
 dbErrFromNum (#const DB_BUFFER_SMALL) = DB_BUFFER_SMALL
 dbErrFromNum (#const DB_DONOTINDEX) = DB_DONOTINDEX
@@ -192,6 +198,7 @@
 
 ------ DbEnv ------------------------------------------------------------------
 
+-- | Needed for BerkeleyDBXML: C pointer type for a DbEnv
 data DbEnv_struct
 type DbEnv = ForeignPtr DbEnv_struct
 
@@ -215,6 +222,47 @@
         toNum DB_RPCCLIENT = 0x0000002
 
 
+foreign import ccall unsafe "db_helper.h _dbenv_set_data_dir" _dbenv_set_data_dir
+    :: Ptr DbEnv_struct -> CString -> IO CInt
+
+dbEnv_set_data_dir :: DbEnv -> FilePath -> IO ()
+dbEnv_set_data_dir dbenv dir =
+    withCString dir $ \c_str ->
+    withForeignPtr dbenv $ \c_dbenv -> do
+        ret <- _dbenv_set_data_dir c_dbenv c_str
+        if ret /= 0
+            then throwDB "dbEnv_set_data_dir" ret
+            else return ()
+
+
+foreign import ccall unsafe "db_helper.h _dbenv_set_lg_dir" _dbenv_set_lg_dir
+    :: Ptr DbEnv_struct -> CString -> IO CInt
+
+dbEnv_set_lg_dir :: DbEnv -> FilePath -> IO ()
+dbEnv_set_lg_dir dbenv dir =
+    withCString dir $ \c_str ->
+    withForeignPtr dbenv $ \c_dbenv -> do
+        ret <- _dbenv_set_lg_dir c_dbenv c_str
+        if ret /= 0
+            then throwDB "dbEnv_set_lg_dir" ret
+            else return ()
+
+
+foreign import ccall unsafe "db_helper.h _dbenv_toNative" _dbenv_toNative
+    :: Ptr DbEnv_struct -> Ptr (Ptr DbEnv_native) -> IO CInt
+
+data DbEnv_native
+-- | Convert the Haskell handle into a native handle of type DB_ENV* which can be passed to C.
+dbEnv_toNative :: DbEnv -> (Ptr DbEnv_native -> IO a) -> IO a
+dbEnv_toNative dbenv code =
+    alloca $ \pNative ->
+    withForeignPtr dbenv $ \c_dbenv -> do
+        ret <- _dbenv_toNative c_dbenv pNative
+        if ret /= 0
+            then throwDB "dbEnv_toNative" ret
+            else code =<< peek pNative
+
+
 foreign import ccall safe "db_helper.h _dbenv_get_lk_max_lockers" _dbenv_get_lk_max_lockers
     :: Ptr DbEnv_struct -> Ptr CUInt -> IO CInt
 
@@ -434,6 +482,7 @@
     DB_DUPSORT
 
 
+-- | Needed for BerkeleyDBXML: Binary representation of a DbFlag
 dbToNum :: DbFlag -> Word32
 dbToNum DB_CREATE = #const DB_CREATE
 dbToNum	DB_DURABLE_UNKNOWN = #const DB_DURABLE_UNKNOWN
@@ -701,6 +750,7 @@
 dbTypeToNum DB_QUEUE = 4
 dbTypeToNum DB_UNKNOWN = 5
 
+-- | Needed for BerkeleyDBXML: C pointer type for a DbTxn
 data DbTxn_struct
 type DbTxn = ForeignPtr DbTxn_struct
 foreign import ccall "db_helper.h &_dbtxn_delete" _dbtxn_delete
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
@@ -51,6 +51,26 @@
     return ret;
 }
 
+int _dbenv_toNative(MY_DBENV* dbenvp, DB_ENV** pDbEnv)
+{
+    int ret;
+    UNWRAP_DBENV();
+    *pDbEnv = dbenv;
+    return 0;
+}
+
+int _dbenv_set_data_dir(MY_DBENV* dbenvp, char* dir)
+{
+    UNWRAP_DBENV();
+    return dbenv->set_data_dir(dbenv, dir);
+}
+
+int _dbenv_set_lg_dir(MY_DBENV* dbenvp, char* dir)
+{
+    UNWRAP_DBENV();
+    return dbenv->set_lg_dir(dbenv, dir);
+}
+
 int _dbenv_get_lk_max_lockers(MY_DBENV* dbenvp, u_int32_t *lk_maxp) {
     UNWRAP_DBENV();
     return dbenv->get_lk_max_lockers(dbenv, lk_maxp);
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
@@ -11,6 +11,9 @@
 
 
 int _dbenv_create(MY_DBENV** dbenvpp, u_int32_t flags);
+int _dbenv_toNative(MY_DBENV* dbenvpp, DB_ENV** pDbEnv);
+int _dbenv_set_data_dir(MY_DBENV* dbenvp, char* dir);
+int _dbenv_set_lg_dir(MY_DBENV* dbenvp, char* dir);
 int _dbenv_get_lk_max_lockers(MY_DBENV* dbenvp, u_int32_t *lk_maxp);
 int _dbenv_set_lk_max_lockers(MY_DBENV* dbenvp, u_int32_t max);
 int _dbenv_get_lk_max_locks(MY_DBENV* dbenvp, u_int32_t *lk_maxp);
