diff --git a/README b/README
index a00da5a2134f9dc40904cc45df92cbdff4af43d3..a47a698e98e6ed603a8d28f94a54229e11c8a60b 100644
--- a/README
+++ b/README
@@ -43,4 +43,5 @@ To run OSv
 
     # gdb build/debug/loader.elf
     (gdb) connect
+    (gdb) osv syms
     (gdb) bt
diff --git a/bootfs.manifest b/bootfs.manifest
index 68744e57786871b2b49df7c240db14ef0d82fc7b..8eaace4398e5a8bd982e76717260f11a804eea87 100644
--- a/bootfs.manifest
+++ b/bootfs.manifest
@@ -1,8 +1,15 @@
 [manifest]
-/usr/lib/jre/lib/server/libjvm.so: %(jdkbase)s/jre/lib/amd64/server/libjvm.so
-/usr/lib/jre/lib/libverify.so: %(jdkbase)s/jre/lib/amd64/libverify.so
-/usr/lib/jre/lib/libjava.so: %(jdkbase)s/jre/lib/amd64/libjava.so
-/usr/lib/jre/lib/libzip.so: %(jdkbase)s/jre/lib/amd64/libzip.so
+/usr/lib/jvm/jre/lib/amd64/server/libjvm.so: %(jdkbase)s/jre/lib/amd64/server/libjvm.so
+/usr/lib/jvm/jre/lib/amd64/libverify.so: %(jdkbase)s/jre/lib/amd64/libverify.so
+/usr/lib/jvm/jre/lib/amd64/libjava.so: %(jdkbase)s/jre/lib/amd64/libjava.so
+/usr/lib/jvm/jre/lib/amd64/libzip.so: %(jdkbase)s/jre/lib/amd64/libzip.so
+/usr/lib/jvm/jre/lib/resources.jar: %(jdkbase)s/jre/lib/resources.jar
+/usr/lib/jvm/jre/lib/rt.jar: %(jdkbase)s/jre/lib/rt.jar
+/usr/lib/jvm/jre/lib/jsse.jar: %(jdkbase)s/jre/lib/jsse.jar
+/usr/lib/jvm/jre/lib/jce.jar: %(jdkbase)s/jre/lib/jce.jar
+/usr/lib/jvm/jre/lib/charsets.jar: %(jdkbase)s/jre/lib/charsets.jar
+/usr/lib/jvm/jre/lib/rhino.jar: %(jdkbase)s/jre/lib/rhino.jar
+/usr/lib/jvm/jre/lib/meta-index: %(jdkbase)s/jre/lib/meta-index
 /usr/lib/libstdc++.so.6: /usr/lib64/libstdc++.so.6
 /usr/lib/libm.so.6: /usr/lib64/libm.so.6
 /usr/lib/libgcc_s.so.1: /usr/lib64/libgcc_s.so.1
diff --git a/elf.cc b/elf.cc
index 0f304d7a031b7ddc7500f3377cb4d392e86ff046..e3286e6a8463974d51c94dce61baa3f4ec52dd41 100644
--- a/elf.cc
+++ b/elf.cc
@@ -94,7 +94,6 @@ namespace elf {
     void elf_file::load_elf_header()
     {
 	_f->read(&_ehdr, 0, sizeof(_ehdr));
-	debug(fmt("elf header: %1%") % _ehdr.e_ident);
 	if (!(_ehdr.e_ident[EI_MAG0] == '\x7f'
 	      && _ehdr.e_ident[EI_MAG1] == 'E'
 	      && _ehdr.e_ident[EI_MAG2] == 'L'
@@ -114,7 +113,6 @@ namespace elf {
 	      || _ehdr.e_ident[EI_OSABI] == 0)) {
 	    throw std::runtime_error("bad os abi");
 	}
-	debug("loaded elf header");
     }
 
     namespace {
@@ -142,7 +140,6 @@ namespace elf {
                                       { return a.p_type == PT_LOAD
                                             && a.p_vaddr > b.p_vaddr; });
         _end = _base + q->p_vaddr + q->p_memsz;
-        debug(fmt("base %p end %p") % _base % _end);
     }
 
     void* elf_object::base() const
@@ -157,14 +154,11 @@ namespace elf {
 
     void elf_file::load_program_headers()
     {
-	debug(fmt("program headers: %1%") % _ehdr.e_phnum);
 	_phdrs.resize(_ehdr.e_phnum);
 	for (unsigned i = 0; i < _ehdr.e_phnum; ++i) {
 	    _f->read(&_phdrs[i],
 		    _ehdr.e_phoff + i * _ehdr.e_phentsize,
 		    _ehdr.e_phentsize);
-	    debug(fmt("phdr %1%: vaddr %2$16x")
-				   % i % _phdrs[i].p_vaddr);
 	}
     }
 
@@ -197,7 +191,6 @@ namespace elf {
     void elf_object::load_segments()
     {
         for (unsigned i = 0; i < _ehdr.e_phnum; ++i) {
-            debug(fmt("loading segment %1%") % i);
             auto &phdr = _phdrs[i];
             switch (phdr.p_type) {
             case PT_NULL:
@@ -489,7 +482,6 @@ namespace elf {
     {
         auto needed = dynamic_str_array(DT_NEEDED);
         for (auto lib : needed) {
-            debug(fmt("needed: %1%") % lib);
             _prog.add(std::string("/usr/lib") + lib);
         }
     }
diff --git a/loader.cc b/loader.cc
index db28650f7631d8f042b186297b31dae6ef2d53c7..5b28e748243e53fdd75051a48d111adae7cd9771 100644
--- a/loader.cc
+++ b/loader.cc
@@ -170,7 +170,7 @@ void load_test(elf::program& prog)
     	debug("FAIL");
 }
 
-#define JVM_PATH	"/usr/lib/jre/lib/server/libjvm.so"
+#define JVM_PATH	"/usr/lib/jvm/jre/lib/amd64/server/libjvm.so"
 
 void start_jvm(elf::program& prog)
 {
diff --git a/mempool.cc b/mempool.cc
index 904779de2db6f5c8d584b5471baeb2b12603dbdb..bcad5727948e06dbace8995c8cdee0c368fc1d6c 100644
--- a/mempool.cc
+++ b/mempool.cc
@@ -86,7 +86,9 @@ void pool::free(void* object)
     auto obj = static_cast<free_object*>(object);
     auto header = to_header(obj);
     if (!--header->nalloc) {
-        _free.erase(_free.iterator_to(*header));
+        if (header->local_free) {
+            _free.erase(_free.iterator_to(*header));
+        }
         // FIXME: add hysteresis
         free_page(header);
     } else {