diff --git a/libraries/liblmdb/lmdb.h b/libraries/liblmdb/lmdb.h
index a2118b5bac5570b2b3f524e6a63b4d14b5d10be9..9c21cdc68b12452e74ffae8d47ff00712f40814f 100644
--- a/libraries/liblmdb/lmdb.h
+++ b/libraries/liblmdb/lmdb.h
@@ -1,7 +1,7 @@
 /** @file lmdb.h
  *	@brief Lightning memory-mapped database library
  *
- *	@mainpage	MDB Lightning Memory-Mapped Database Manager
+ *	@mainpage	Lightning Memory-Mapped Database Manager (MDB)
  *
  *	@section intro_sec Introduction
  *	MDB is a Btree-based database management library modeled loosely on the
@@ -237,7 +237,7 @@ typedef void (MDB_rel_func)(MDB_val *item, void *oldptr, void *newptr, void *rel
 #define MDB_MAPASYNC		0x100000
 /** @} */
 
-/**	@defgroup	mdb_open	Database Flags
+/**	@defgroup	mdb_dbi_open	Database Flags
  *
  *	Values do not overlap Environment Flags.
  *	@{
@@ -716,9 +716,14 @@ void mdb_txn_reset(MDB_txn *txn);
 	 */
 int  mdb_txn_renew(MDB_txn *txn);
 
+/** Compat with version <= 0.9.4, avoid clash with libmdb from MDB Tools project */
+#define mdb_open(txn,name,flags,dbi)	mdb_dbi_open(txn,name,flags,dbi)
+/** Compat with version <= 0.9.4, avoid clash with libmdb from MDB Tools project */
+#define mdb_close(env,dbi)				mdb_dbi_close(env,dbi)
+
 	/** @brief Open a database in the environment.
 	 *
-	 * The database handle may be discarded by calling #mdb_close().  The
+	 * The database handle may be discarded by calling #mdb_dbi_close().  The
 	 * database handle resides in the shared environment, it is not owned
 	 * by the given transaction. Only one thread should call this function;
 	 * it is not mutex-protected in a read-only transaction.
@@ -768,12 +773,12 @@ int  mdb_txn_renew(MDB_txn *txn);
 	 *	<li>ENFILE - too many databases have been opened. See #mdb_env_set_maxdbs().
 	 * </ul>
 	 */
-int  mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi);
+int  mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi);
 
 	/** @brief Retrieve statistics for a database.
 	 *
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[out] stat The address of an #MDB_stat structure
 	 * 	where the statistics will be copied
 	 * @return A non-zero error value on failure and 0 on success. Some possible
@@ -790,16 +795,16 @@ int  mdb_stat(MDB_txn *txn, MDB_dbi dbi, MDB_stat *stat);
 	 * a single thread, and only if no other threads are going to reference
 	 * the database handle any further.
 	 * @param[in] env An environment handle returned by #mdb_env_create()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 */
-void mdb_close(MDB_env *env, MDB_dbi dbi);
+void mdb_dbi_close(MDB_env *env, MDB_dbi dbi);
 
 	/** @brief Delete a database and/or free all its pages.
 	 *
 	 * If the \b del parameter is 1, the DB handle will be closed
 	 * and the DB will be deleted.
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[in] del 1 to delete the DB from the environment,
 	 * 0 to just free its pages.
 	 * @return A non-zero error value on failure and 0 on success.
@@ -811,13 +816,13 @@ int  mdb_drop(MDB_txn *txn, MDB_dbi dbi, int del);
 	 * The comparison function is called whenever it is necessary to compare a
 	 * key specified by the application with a key currently stored in the database.
 	 * If no comparison function is specified, and no special key flags were specified
-	 * with #mdb_open(), the keys are compared lexically, with shorter keys collating
+	 * with #mdb_dbi_open(), the keys are compared lexically, with shorter keys collating
 	 * before longer keys.
 	 * @warning This function must be called before any data access functions are used,
 	 * otherwise data corruption may occur. The same comparison function must be used by every
 	 * program accessing the database, every time the database is used.
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[in] cmp A #MDB_cmp_func function
 	 * @return A non-zero error value on failure and 0 on success. Some possible
 	 * errors are:
@@ -834,13 +839,13 @@ int  mdb_set_compare(MDB_txn *txn, MDB_dbi dbi, MDB_cmp_func *cmp);
 	 * This function only takes effect if the database was opened with the #MDB_DUPSORT
 	 * flag.
 	 * If no comparison function is specified, and no special key flags were specified
-	 * with #mdb_open(), the data items are compared lexically, with shorter items collating
+	 * with #mdb_dbi_open(), the data items are compared lexically, with shorter items collating
 	 * before longer items.
 	 * @warning This function must be called before any data access functions are used,
 	 * otherwise data corruption may occur. The same comparison function must be used by every
 	 * program accessing the database, every time the database is used.
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[in] cmp A #MDB_cmp_func function
 	 * @return A non-zero error value on failure and 0 on success. Some possible
 	 * errors are:
@@ -860,7 +865,7 @@ int  mdb_set_dupsort(MDB_txn *txn, MDB_dbi dbi, MDB_cmp_func *cmp);
 	 * Currently the relocation feature is unimplemented and setting
 	 * this function has no effect.
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[in] rel A #MDB_rel_func function
 	 * @return A non-zero error value on failure and 0 on success. Some possible
 	 * errors are:
@@ -874,7 +879,7 @@ int  mdb_set_relfunc(MDB_txn *txn, MDB_dbi dbi, MDB_rel_func *rel);
 	 *
 	 * See #mdb_set_relfunc and #MDB_rel_func for more details.
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[in] ctx An arbitrary pointer for whatever the application needs.
 	 * It will be passed to the callback function set by #mdb_set_relfunc
 	 * as its \b relctx parameter whenever the callback is invoked.
@@ -900,7 +905,7 @@ int  mdb_set_relctx(MDB_txn *txn, MDB_dbi dbi, void *ctx);
 	 * modify it in any way. For values returned in a read-only transaction
 	 * any modification attempts will cause a SIGSEGV.
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[in] key The key to search for in the database
 	 * @param[out] data The data corresponding to the key
 	 * @return A non-zero error value on failure and 0 on success. Some possible
@@ -919,7 +924,7 @@ int  mdb_get(MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data);
 	 * if duplicates are disallowed, or adding a duplicate data item if
 	 * duplicates are allowed (#MDB_DUPSORT).
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[in] key The key to store in the database
 	 * @param[in,out] data The data to store
 	 * @param[in] flags Special options for this operation. This parameter
@@ -970,7 +975,7 @@ int  mdb_put(MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data,
 	 * This function will return #MDB_NOTFOUND if the specified key/data
 	 * pair is not in the database.
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[in] key The key to delete from the database
 	 * @param[in] data The data to delete
 	 * @return A non-zero error value on failure and 0 on success. Some possible
@@ -987,7 +992,7 @@ int  mdb_del(MDB_txn *txn, MDB_dbi dbi, MDB_val *key, MDB_val *data);
 	 * Cursors are associated with a specific transaction and database and
 	 * may not span threads.
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[out] cursor Address where the new #MDB_cursor handle will be stored
 	 * @return A non-zero error value on failure and 0 on success. Some possible
 	 * errors are:
@@ -1137,7 +1142,7 @@ int  mdb_cursor_count(MDB_cursor *cursor, size_t *countp);
 	 * This returns a comparison as if the two data items were keys in the
 	 * specified database.
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[in] a The first item to compare
 	 * @param[in] b The second item to compare
 	 * @return < 0 if a < b, 0 if a == b, > 0 if a > b
@@ -1149,7 +1154,7 @@ int  mdb_cmp(MDB_txn *txn, MDB_dbi dbi, const MDB_val *a, const MDB_val *b);
 	 * This returns a comparison as if the two items were data items of
 	 * a sorted duplicates #MDB_DUPSORT database.
 	 * @param[in] txn A transaction handle returned by #mdb_txn_begin()
-	 * @param[in] dbi A database handle returned by #mdb_open()
+	 * @param[in] dbi A database handle returned by #mdb_dbi_open()
 	 * @param[in] a The first item to compare
 	 * @param[in] b The second item to compare
 	 * @return < 0 if a < b, 0 if a == b, > 0 if a > b
diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c
index 790aebe2cd7756d601549cfb974ade1e6e0c1145..4af49989cde992de3f07f7307ebe0c8e933fedf7 100644
--- a/libraries/liblmdb/mdb.c
+++ b/libraries/liblmdb/mdb.c
@@ -723,7 +723,7 @@ typedef struct MDB_node {
 	/** Information about a single database in the environment. */
 typedef struct MDB_db {
 	uint32_t	md_pad;		/**< also ksize for LEAF2 pages */
-	uint16_t	md_flags;	/**< @ref mdb_open */
+	uint16_t	md_flags;	/**< @ref mdb_dbi_open */
 	uint16_t	md_depth;	/**< depth of this tree */
 	pgno_t		md_branch_pages;	/**< number of internal pages */
 	pgno_t		md_leaf_pages;		/**< number of leaf pages */
@@ -6787,7 +6787,7 @@ mdb_env_info(MDB_env *env, MDB_envinfo *arg)
  * The user can then override them with #mdb_set_compare() or
  * #mdb_set_dupsort().
  * @param[in] txn A transaction handle returned by #mdb_txn_begin()
- * @param[in] dbi A database handle returned by #mdb_open()
+ * @param[in] dbi A database handle returned by #mdb_dbi_open()
  */
 static void
 mdb_default_cmp(MDB_txn *txn, MDB_dbi dbi)
@@ -6808,7 +6808,7 @@ mdb_default_cmp(MDB_txn *txn, MDB_dbi dbi)
 #define PERSISTENT_FLAGS	0xffff
 #define VALID_FLAGS	(MDB_REVERSEKEY|MDB_DUPSORT|MDB_INTEGERKEY|MDB_DUPFIXED|\
 	MDB_INTEGERDUP|MDB_REVERSEDUP|MDB_CREATE)
-int mdb_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)
+int mdb_dbi_open(MDB_txn *txn, const char *name, unsigned int flags, MDB_dbi *dbi)
 {
 	MDB_val key, data;
 	MDB_dbi i;
@@ -6914,7 +6914,7 @@ int mdb_stat(MDB_txn *txn, MDB_dbi dbi, MDB_stat *arg)
 	return mdb_stat0(txn->mt_env, &txn->mt_dbs[dbi], arg);
 }
 
-void mdb_close(MDB_env *env, MDB_dbi dbi)
+void mdb_dbi_close(MDB_env *env, MDB_dbi dbi)
 {
 	char *ptr;
 	if (dbi <= MAIN_DBI || dbi >= env->me_numdbs)
@@ -6971,9 +6971,9 @@ mdb_drop0(MDB_cursor *mc, int subs)
 			rc = mdb_cursor_sibling(mc, 1);
 			if (rc) {
 				/* no more siblings, go back to beginning
-				 * of previous level. (stack was already popped
-				 * by mdb_cursor_sibling)
+				 * of previous level.
 				 */
+				mdb_cursor_pop(mc);
 				for (i=1; i<mc->mc_top; i++)
 					mc->mc_pg[i] = mx.mc_pg[i];
 			}
@@ -7008,7 +7008,7 @@ int mdb_drop(MDB_txn *txn, MDB_dbi dbi, int del)
 	if (del && dbi > MAIN_DBI) {
 		rc = mdb_del(txn, MAIN_DBI, &mc->mc_dbx->md_name, NULL);
 		if (!rc)
-			mdb_close(txn->mt_env, dbi);
+			mdb_dbi_close(txn->mt_env, dbi);
 	} else {
 		/* reset the DB record, mark it dirty */
 		txn->mt_dbflags[dbi] |= DB_DIRTY;
diff --git a/libraries/liblmdb/midl.c b/libraries/liblmdb/midl.c
index 8de61e3d0cd8653f20f21f6c26f4f3f8f928653a..7289f405d901b41f3693df6555266c6d14c118a5 100644
--- a/libraries/liblmdb/midl.c
+++ b/libraries/liblmdb/midl.c
@@ -132,7 +132,7 @@ void mdb_midl_free(MDB_IDL ids)
 int mdb_midl_shrink( MDB_IDL *idp )
 {
 	MDB_IDL ids = *idp;
-	if (ids[-1] > MDB_IDL_UM_MAX) {
+	if (*(--ids) > MDB_IDL_UM_MAX) {
 		ids = realloc(ids, (MDB_IDL_UM_MAX+1) * sizeof(MDB_ID));
 		*ids++ = MDB_IDL_UM_MAX;
 		*idp = ids;