--- a/target/site/apidocs/script.js
+++ b/target/site/apidocs/script.js
@@ -40,41 +40,51 @@ function loadScripts(doc, tag) {
     $.get(pathtoroot + "module-search-index.zip")
             .done(function() {
                 JSZipUtils.getBinaryContent(pathtoroot + "module-search-index.zip", function(e, data) {
-                    var zip = new JSZip(data);
-                    zip.load(data);
-                    moduleSearchIndex = JSON.parse(zip.file("module-search-index.json").asText());
+                    JSZip.loadAsync(data).then(function(zip){
+                        zip.file("module-search-index.json").async("text").then(function(content){
+                            moduleSearchIndex = JSON.parse(content);
+                        });
+                    });
                 });
             });
     $.get(pathtoroot + "package-search-index.zip")
             .done(function() {
                 JSZipUtils.getBinaryContent(pathtoroot + "package-search-index.zip", function(e, data) {
-                    var zip = new JSZip(data);
-                    zip.load(data);
-                    packageSearchIndex = JSON.parse(zip.file("package-search-index.json").asText());
+                    JSZip.loadAsync(data).then(function(zip){
+                        zip.file("package-search-index.json").async("text").then(function(content){
+                            packageSearchIndex = JSON.parse(content);
+                        });
+                    });
                 });
             });
     $.get(pathtoroot + "type-search-index.zip")
             .done(function() {
                 JSZipUtils.getBinaryContent(pathtoroot + "type-search-index.zip", function(e, data) {
-                    var zip = new JSZip(data);
-                    zip.load(data);
-                    typeSearchIndex = JSON.parse(zip.file("type-search-index.json").asText());
+                    JSZip.loadAsync(data).then(function(zip){
+                        zip.file("type-search-index.json").async("text").then(function(content){
+                            typeSearchIndex = JSON.parse(content);
+                        });
+                    });
                 });
             });
     $.get(pathtoroot + "member-search-index.zip")
             .done(function() {
                 JSZipUtils.getBinaryContent(pathtoroot + "member-search-index.zip", function(e, data) {
-                    var zip = new JSZip(data);
-                    zip.load(data);
-                    memberSearchIndex = JSON.parse(zip.file("member-search-index.json").asText());
+                    JSZip.loadAsync(data).then(function(zip){
+                        zip.file("member-search-index.json").async("text").then(function(content){
+                            memberSearchIndex = JSON.parse(content);
+                        });
+                    });
                 });
             });
     $.get(pathtoroot + "tag-search-index.zip")
             .done(function() {
                 JSZipUtils.getBinaryContent(pathtoroot + "tag-search-index.zip", function(e, data) {
-                    var zip = new JSZip(data);
-                    zip.load(data);
-                    tagSearchIndex = JSON.parse(zip.file("tag-search-index.json").asText());
+                    JSZip.loadAsync(data).then(function(zip){
+                        zip.file("tag-search-index.json").async("text").then(function(content){
+                            tagSearchIndex = JSON.parse(content);
+                        });
+                    });
                 });
             });
     if (!moduleSearchIndex) {
--- a/target/site/apidocs/search.js
+++ b/target/site/apidocs/search.js
@@ -50,7 +50,7 @@ function getURLPrefix(ui) {
             return ui.item.m + slash;
         } else if ((ui.item.category === catTypes && ui.item.p) || ui.item.category === catMembers) {
             $.each(packageSearchIndex, function(index, item) {
-                if (ui.item.p == item.l) {
+                if (item.m && ui.item.p == item.l) {
                     urlPrefix = item.m + slash;
                 }
             });
--- a/target/site/apidocs/stylesheet.css
+++ b/target/site/apidocs/stylesheet.css
@@ -2,8 +2,6 @@
  * Javadoc style sheet
  */
 
-@import url('resources/fonts/dejavu.css');
-
 /*
  * Styles for individual HTML elements.
  *
