diff --git a/inventory/src/main/java/org/apache/felix/inventory/InventoryPrinter.java b/inventory/src/main/java/org/apache/felix/inventory/InventoryPrinter.java
index f1ad0f4..16376f4 100644
--- a/inventory/src/main/java/org/apache/felix/inventory/InventoryPrinter.java
+++ b/inventory/src/main/java/org/apache/felix/inventory/InventoryPrinter.java
@@ -66,6 +66,13 @@
     String CONFIG_TITLE = "felix.inventory.printer.title"; //$NON-NLS-1$
 
     /**
+     * Optional property controlling whether the printer will be displayed
+     * in the web console. By default, a printer is displayed in the
+     * web console, unless this property is added with the value 'false'.
+     */
+    String CONFIG_WEBCONSOLE = "felix.inventory.printer.webconsole"; //$NON-NLS-1$
+
+    /**
      * Prints the configuration report to the given <code>printWriter</code>.
      * Implementations are free to print whatever information they deem useful.
      *
@@ -75,6 +82,7 @@
      * @param mode The render mode.
      * @param printWriter where to write the configuration data. It might be flushed,
      * but must not be closed.
+     * @param isZip whether this is included in a zip file or used directly
      */
-    void print( PrinterMode mode, PrintWriter printWriter );
+    void print( PrinterMode mode, PrintWriter printWriter, boolean isZip );
 }
diff --git a/inventory/src/main/java/org/apache/felix/inventory/PrinterMode.java b/inventory/src/main/java/org/apache/felix/inventory/PrinterMode.java
index fe1fdf6..478c4d0 100644
--- a/inventory/src/main/java/org/apache/felix/inventory/PrinterMode.java
+++ b/inventory/src/main/java/org/apache/felix/inventory/PrinterMode.java
@@ -26,18 +26,12 @@
     // plain text
     public static PrinterMode TEXT = new PrinterMode("TEXT");
 
-    // HTML which can be placed inside a HTML body element (no external references)
-    public static PrinterMode HTML_BODY = new PrinterMode("HTML_BODY");
+    // valid HTML fragment (no external references)
+    public static PrinterMode HTML_FRAGMENT = new PrinterMode("HTML_FRAGMENT");
 
     // JSON output
     public static PrinterMode JSON = new PrinterMode("JSON");
 
-    // file content for a zip
-    public static PrinterMode ZIP_FILE_TEXT = new PrinterMode("ZIP_FILE_TEXT");
-
-    // json file content for a zip
-    public static PrinterMode ZIP_FILE_JSON = new PrinterMode("ZIP_FILE_JSON");
-
     private final String mode;
 
     private PrinterMode(final String mode) {
@@ -47,14 +41,10 @@
     public static PrinterMode valueOf(final String m) {
         if ( TEXT.name().equals(m) ) {
             return TEXT;
-        } else if ( HTML_BODY.name().equals(m) ) {
-            return HTML_BODY;
+        } else if ( HTML_FRAGMENT.name().equals(m) ) {
+            return HTML_FRAGMENT;
         } else if ( JSON.name().equals(m) ) {
             return JSON;
-        } else if ( ZIP_FILE_TEXT.name().equals(m) ) {
-            return ZIP_FILE_TEXT;
-        } else if ( ZIP_FILE_JSON.name().equals(m) ) {
-            return ZIP_FILE_JSON;
         }
         return null;
     }
diff --git a/inventory/src/main/java/org/apache/felix/inventory/impl/AbstractWebConsolePlugin.java b/inventory/src/main/java/org/apache/felix/inventory/impl/AbstractWebConsolePlugin.java
index 71de906..312e09f 100644
--- a/inventory/src/main/java/org/apache/felix/inventory/impl/AbstractWebConsolePlugin.java
+++ b/inventory/src/main/java/org/apache/felix/inventory/impl/AbstractWebConsolePlugin.java
@@ -20,7 +20,6 @@
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.Writer;
-import java.text.MessageFormat;
 import java.util.Date;
 import java.util.zip.Deflater;
 import java.util.zip.ZipEntry;
@@ -139,9 +138,8 @@
             zip.closeEntry();
 
             final ZipConfigurationWriter pw = new ZipConfigurationWriter( zip );
-            printConfigurationInventory( pw, PrinterMode.ZIP_FILE_TEXT, handler );
-            pw.counter = 0;
-            printConfigurationInventory( pw, PrinterMode.ZIP_FILE_JSON, handler );
+            printConfigurationInventory( pw, PrinterMode.TEXT, handler );
+            printConfigurationInventory( pw, PrinterMode.JSON, handler );
 
             zip.finish();
         } else if ( request.getPathInfo().endsWith( ".nfo" ) ) {
@@ -157,11 +155,15 @@
             pw.println ( "<html xmlns=\"http://www.w3.org/1999/xhtml\">" );
             pw.println ( "<head><title>dummy</title></head><body><div>" );
 
-            if ( handler.supports(PrinterMode.HTML_BODY) ) {
-                handler.print(PrinterMode.HTML_BODY, pw);
+            if ( handler.supports(PrinterMode.HTML_FRAGMENT) ) {
+                handler.print(PrinterMode.HTML_FRAGMENT, pw, false);
+            } else if ( handler.supports(PrinterMode.TEXT) ) {
+                pw.enableFilter( true );
+                handler.print(PrinterMode.TEXT, pw, false);
+                pw.enableFilter( false );
             } else {
                 pw.enableFilter( true );
-                handler.print(PrinterMode.TEXT, pw);
+                handler.print(PrinterMode.JSON, pw, false);
                 pw.enableFilter( false );
             }
             pw.println( "</div></body></html>" );
@@ -218,20 +220,18 @@
             if ( handler.supports(PrinterMode.JSON) ) {
                 pw.print("<button type=\"button\" class=\"downloadJson\" style=\"float: right; margin-right: 30px; margin-top: 5px;\">Download As JSON</button>");
             }
-            if ( handler.supports(PrinterMode.ZIP_FILE_TEXT) || handler.supports(PrinterMode.ZIP_FILE_JSON) ) {
-                pw.print("<button type=\"button\" class=\"downloadZip\" style=\"float: right; margin-right: 30px; margin-top: 5px;\">Download As Zip</button>");
-            }
+            pw.print("<button type=\"button\" class=\"downloadZip\" style=\"float: right; margin-right: 30px; margin-top: 5px;\">Download As Zip</button>");
             if ( handler.supports(PrinterMode.TEXT ) ) {
                 pw.print("<button type=\"button\" class=\"downloadTxt\" style=\"float: right; margin-right: 30px; margin-top: 5px;\">Download As Text</button>");
             }
 
             pw.println("<br/>&nbsp;</p>"); // status line
             pw.print("<div>");
-            if ( handler.supports(PrinterMode.HTML_BODY) ) {
-                handler.print(PrinterMode.HTML_BODY, pw);
+            if ( handler.supports(PrinterMode.HTML_FRAGMENT) ) {
+                handler.print(PrinterMode.HTML_FRAGMENT, pw, false);
             } else {
                 pw.enableFilter( true );
-                handler.print(PrinterMode.TEXT, pw);
+                handler.print(PrinterMode.TEXT, pw, false);
                 pw.enableFilter( false );
             }
             pw.print("</div>");
@@ -261,7 +261,7 @@
                 final InventoryPrinterHandler handler)
         throws IOException {
             this.title(handler.getTitle());
-            handler.print(mode, this);
+            handler.print(mode, this, false);
             this.end();
         }
     }
@@ -412,54 +412,34 @@
 
         private final ZipOutputStream zip;
 
-        private int counter;
-
         ZipConfigurationWriter( final ZipOutputStream zip ) {
             super( new OutputStreamWriter( zip ) );
             this.zip = zip;
         }
 
-        private String getFormattedTitle(final String title) {
-            return MessageFormat.format( "{0,number,000}-{1}", new Object[]
-                    { new Integer( counter ), title } );
-        }
-
-        protected void title( final String title ) throws IOException {
-            counter++;
-
-            final String name = getFormattedTitle(title).concat(".txt");
-
-            final ZipEntry entry = new ZipEntry( name );
-            zip.putNextEntry( entry );
-        }
-
-        protected void end() throws IOException {
-            flush();
-
-            zip.closeEntry();
-        }
-
         public void printInventory(
                 final PrinterMode mode,
                 final InventoryPrinterHandler handler)
         throws IOException {
-            if ( mode == PrinterMode.ZIP_FILE_TEXT ) {
-                super.printInventory(mode, handler);
-                final String title = getFormattedTitle(handler.getTitle());
-                handler.addAttachments(title.concat("/"), this.zip);
-            } else {
-                counter++;
-                final String title = getFormattedTitle(handler.getTitle());
-                final String name = "json/".concat(title).concat(".json");
+            if ( mode == PrinterMode.TEXT ) {
+                final ZipEntry entry = new ZipEntry( handler.getName().concat(".txt") );
+                zip.putNextEntry( entry );
+                handler.print(mode, this, false);
+                flush();
+                zip.closeEntry();
+
+                handler.addAttachments(handler.getName().concat("/"), this.zip);
+            } else if ( mode == PrinterMode.JSON ) {
+                final String name = "json/".concat(handler.getName()).concat(".json");
 
                 final ZipEntry entry = new ZipEntry( name );
                 zip.putNextEntry( entry );
-                handler.print(PrinterMode.ZIP_FILE_JSON, this);
+                handler.print(PrinterMode.JSON, this, true);
                 flush();
 
                 zip.closeEntry();
-                if ( !handler.supports(PrinterMode.ZIP_FILE_TEXT) ) {
-                    handler.addAttachments(title.concat("/"), this.zip);
+                if ( !handler.supports(PrinterMode.TEXT) ) {
+                    handler.addAttachments(handler.getName().concat("/"), this.zip);
                 }
             }
         }
diff --git a/inventory/src/main/java/org/apache/felix/inventory/impl/DefaultWebConsolePlugin.java b/inventory/src/main/java/org/apache/felix/inventory/impl/DefaultWebConsolePlugin.java
index b77592d..48d5536 100644
--- a/inventory/src/main/java/org/apache/felix/inventory/impl/DefaultWebConsolePlugin.java
+++ b/inventory/src/main/java/org/apache/felix/inventory/impl/DefaultWebConsolePlugin.java
@@ -77,9 +77,9 @@
     }
 
     /**
-     * @see org.apache.felix.inventory.InventoryPrinter#print(org.apache.felix.inventory.PrinterMode, java.io.PrintWriter)
+     * @see org.apache.felix.inventory.InventoryPrinter#print(org.apache.felix.inventory.PrinterMode, java.io.PrintWriter, boolean)
      */
-    public void print(final PrinterMode mode, final PrintWriter printWriter) {
+    public void print(final PrinterMode mode, final PrintWriter printWriter, final boolean isZip) {
         final InventoryPrinterHandler[] handlers = this.inventoryPrinterManager.getAllHandlers();
         printWriter.print("Currently registered ");
         printWriter.print(String.valueOf(handlers.length));
diff --git a/inventory/src/main/java/org/apache/felix/inventory/impl/InventoryPrinterAdapter.java b/inventory/src/main/java/org/apache/felix/inventory/impl/InventoryPrinterAdapter.java
index 29b1f2d..a896647 100644
--- a/inventory/src/main/java/org/apache/felix/inventory/impl/InventoryPrinterAdapter.java
+++ b/inventory/src/main/java/org/apache/felix/inventory/impl/InventoryPrinterAdapter.java
@@ -56,7 +56,7 @@
 
             // print(String, PrintWriter)
             printMethod = ClassUtils.searchMethod(service.getClass(), "print",
-                    new Class[] {String.class, PrintWriter.class});
+                    new Class[] {String.class, PrintWriter.class, Boolean.class});
             if ( printMethod == null ) {
                 return null;
             }
@@ -113,9 +113,11 @@
     }
 
     public void registerConsole(final BundleContext context, final InventoryPrinterManagerImpl manager) {
-        if ( this.registration == null &&
-             (supports(PrinterMode.HTML_BODY) || supports(PrinterMode.TEXT))) {
-            this.registration = WebConsolePlugin.register(context, manager, this.description);
+        if ( this.registration == null ) {
+            final Object value = this.description.getServiceReference().getProperty(InventoryPrinter.CONFIG_WEBCONSOLE);
+            if ( value == null || !"false".equalsIgnoreCase(value.toString()) ) {
+                this.registration = WebConsolePlugin.register(context, manager, this.description);
+            }
         }
     }
 
@@ -176,12 +178,13 @@
      * @see org.apache.felix.inventory.InventoryPrinter#print(org.apache.felix.inventory.PrinterMode, java.io.PrintWriter)
      */
     public void print(final PrinterMode mode,
-            final PrintWriter printWriter) {
+            final PrintWriter printWriter,
+            final boolean isZip) {
         if ( this.supports(mode) ) {
             if ( this.printer instanceof InventoryPrinter ) {
-                ((InventoryPrinter)this.printer).print(mode, printWriter);
+                ((InventoryPrinter)this.printer).print(mode, printWriter, isZip);
             } else {
-                ClassUtils.invoke(this.printer, this.printMethod, new Object[] {mode.toString(), printWriter});
+                ClassUtils.invoke(this.printer, this.printMethod, new Object[] {mode.toString(), printWriter, Boolean.valueOf(isZip)});
             }
         }
     }
diff --git a/inventory/src/main/java/org/apache/felix/inventory/impl/InventoryPrinterDescription.java b/inventory/src/main/java/org/apache/felix/inventory/impl/InventoryPrinterDescription.java
index d8abf59..8b20eff 100644
--- a/inventory/src/main/java/org/apache/felix/inventory/impl/InventoryPrinterDescription.java
+++ b/inventory/src/main/java/org/apache/felix/inventory/impl/InventoryPrinterDescription.java
@@ -43,12 +43,26 @@
         // check modes
         final Object modesCfg = ref.getProperty(InventoryPrinter.CONFIG_PRINTER_MODES);
         if ( modesCfg instanceof String ) {
-            this.modes = new PrinterMode[] { PrinterMode.valueOf((String)modesCfg)};
+            final PrinterMode mode = PrinterMode.valueOf((String)modesCfg);
+            if ( mode != null ) {
+                this.modes = new PrinterMode[] {mode};
+            } else {
+                this.modes = null;
+            }
         } else if ( modesCfg instanceof String[] ) {
             final String[] modesCfgArray = (String[])modesCfg;
-            this.modes = new PrinterMode[modesCfgArray.length];
+            final PrinterMode[] pModes = new PrinterMode[modesCfgArray.length];
+            boolean invalid = false;
             for(int i=0; i<modesCfgArray.length;i++) {
-                this.modes[i] = PrinterMode.valueOf(modesCfgArray[i]);
+                pModes[i] = PrinterMode.valueOf(modesCfgArray[i]);
+                if ( pModes[i] == null ) {
+                    invalid = true;
+                }
+            }
+            if ( invalid ) {
+                this.modes = null;
+            } else {
+                this.modes = pModes;
             }
         } else {
             this.modes = null;
diff --git a/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/ConfigurationPrinterAdapter.java b/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/ConfigurationPrinterAdapter.java
index 11911a9..01c9559 100644
--- a/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/ConfigurationPrinterAdapter.java
+++ b/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/ConfigurationPrinterAdapter.java
@@ -184,11 +184,11 @@
     public String[] getPrinterModes() {
         final Set list = new HashSet();
         if ( this.match(ConsoleConstants.MODE_TXT) || this.match(ConsoleConstants.MODE_ZIP) ) {
-            list.add(PrinterMode.ZIP_FILE_TEXT.name());
+            list.add(PrinterMode.TEXT.name());
         }
         if ( this.match(ConsoleConstants.MODE_WEB) ) {
             if ( !escapeHtml ) {
-                list.add(PrinterMode.HTML_BODY.name());
+                list.add(PrinterMode.HTML_FRAGMENT.name());
             } else {
                 list.add(PrinterMode.TEXT.name());
             }
diff --git a/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/WebConsoleAdapter.java b/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/WebConsoleAdapter.java
index 3949f18..423ed8a 100644
--- a/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/WebConsoleAdapter.java
+++ b/inventory/src/main/java/org/apache/felix/inventory/impl/webconsole/WebConsoleAdapter.java
@@ -162,13 +162,13 @@
         /**
          * @see org.apache.felix.inventory.InventoryPrinter#print(org.apache.felix.inventory.PrinterMode, java.io.PrintWriter)
          */
-        public void print(final PrinterMode mode, final PrintWriter printWriter) {
+        public void print(final PrinterMode mode, final PrintWriter printWriter, final boolean isZip ) {
             final String m;
-            if ( mode == PrinterMode.HTML_BODY ) {
+            if ( !isZip && mode == PrinterMode.HTML_FRAGMENT ) {
                 m = ConsoleConstants.MODE_WEB;
-            } else if ( mode == PrinterMode.TEXT ) {
+            } else if ( !isZip && mode == PrinterMode.TEXT ) {
                 m = ConsoleConstants.MODE_TXT;
-            } else if ( mode == PrinterMode.ZIP_FILE_TEXT ) {
+            } else if (isZip && (mode == PrinterMode.TEXT || mode == PrinterMode.HTML_FRAGMENT) ) {
                 m = ConsoleConstants.MODE_ZIP;
             } else {
                 m = null;
