diff --git a/libraries/liblmdb/Makefile b/libraries/liblmdb/Makefile
index 501921767068823e794da3f2b7f504ceaa25014d..c33d4d4d249730773992b75f0a43629f8f639eae 100644
--- a/libraries/liblmdb/Makefile
+++ b/libraries/liblmdb/Makefile
@@ -38,7 +38,6 @@ mtest3:	mtest3.o liblmdb.a
 mtest4:	mtest4.o liblmdb.a
 mtest5:	mtest5.o liblmdb.a
 mtest6:	mtest6.o liblmdb.a
-mfree:	mfree.o liblmdb.a
 
 mdb.o: mdb.c lmdb.h midl.h
 	$(CC) $(CFLAGS) -fPIC $(CPPFLAGS) -c mdb.c
diff --git a/libraries/liblmdb/mdb.c b/libraries/liblmdb/mdb.c
index 8508dbd62fd6afa84047bd62181bf6c81943fcb8..eb4f0425eff94ad50ae638ceb63c25c08f114f29 100644
--- a/libraries/liblmdb/mdb.c
+++ b/libraries/liblmdb/mdb.c
@@ -1338,7 +1338,7 @@ none:
 			MDB_oldpages *mop = txn->mt_env->me_pghead;
 			if (num > 1) {
 				MDB_cursor m2;
-				int retry = 60, readit = 0, n2 = num-1;
+				int retry = 500, readit = 0, n2 = num-1;
 				unsigned int i, j, k;
 
 				/* If current list is too short, must fetch more and coalesce */
@@ -1347,11 +1347,14 @@ none:
 
 				mdb_cursor_init(&m2, txn, FREE_DBI, NULL);
 				do {
-					/* bail out if we're operating on the freelist.
+					/* If on freelist, don't try to read more. If what we have
+					 * right now isn't enough just use new pages.
 					 * TODO: get all of this working. Many circular dependencies...
 					 */
-					if (mc->mc_dbi == FREE_DBI)
-						break;
+					if (mc->mc_dbi == FREE_DBI) {
+						retry = 0;
+						readit = 0;
+					}
 					if (readit) {
 						MDB_val key, data;
 						MDB_oldpages *mop2;
@@ -2124,7 +2127,7 @@ mdb_txn_commit(MDB_txn *txn)
 	mdb_cursor_init(&mc, txn, FREE_DBI, NULL);
 
 	/* should only be one record now */
-	if (env->me_pghead) {
+	if (env->me_pghead || env->me_pgfirst) {
 		/* make sure first page of freeDB is touched and on freelist */
 		rc = mdb_page_search(&mc, NULL, MDB_PS_MODIFY);
 		if (rc && rc != MDB_NOTFOUND) {
diff --git a/libraries/liblmdb/mfree.c b/libraries/liblmdb/mfree.c
deleted file mode 100644
index 79cce66fa6d7f5eafed4116d848baee54b01c2d8..0000000000000000000000000000000000000000
--- a/libraries/liblmdb/mfree.c
+++ /dev/null
@@ -1,56 +0,0 @@
-/* mfree.c - memory-mapped database freelist scanner */
-/*
- * Copyright 2011 Howard Chu, Symas Corp.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted only as authorized by the OpenLDAP
- * Public License.
- *
- * A copy of this license is available in the file LICENSE in the
- * top-level directory of the distribution or, alternatively, at
- * <http://www.OpenLDAP.org/license.html>.
- */
-#define _XOPEN_SOURCE 500		/* srandom(), random() */
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include "lmdb.h"
-#include "midl.h"
-
-int main(int argc,char * argv[])
-{
-	int rc;
-	MDB_env *env;
-	MDB_dbi dbi;
-	MDB_val key, data;
-	MDB_txn *txn;
-	MDB_stat mst;
-	MDB_cursor *cursor;
-	MDB_ID i, j, *iptr;
-
-	if (argc != 2) {
-		fprintf(stderr, "usage: %s <pathname>\n", argv[0]);
-		exit(1);
-	}
-
-	rc = mdb_env_create(&env);
-	rc = mdb_env_open(env, argv[1], MDB_RDONLY, 0664);
-	rc = mdb_txn_begin(env, NULL, MDB_RDONLY, &txn);
-	dbi = 0;
-	rc = mdb_cursor_open(txn, dbi, &cursor);
-	while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
-		printf("key: %p %zu, data: %p\n",
-			key.mv_data,  *(MDB_ID *) key.mv_data,
-			data.mv_data);
-		iptr = data.mv_data;
-		j = *iptr++;
-		for (i=0; i<j; i++)
-			printf(" %zu\n", iptr[i]);
-	}
-	mdb_cursor_close(cursor);
-	mdb_txn_abort(txn);
-	mdb_env_close(env);
-
-	return 0;
-}