diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ConfigurationAdminConfigurationPrinter.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ConfigurationAdminConfigurationPrinter.java
index 05acf2e..72220c3 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ConfigurationAdminConfigurationPrinter.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ConfigurationAdminConfigurationPrinter.java
@@ -16,11 +16,12 @@
  */
 package org.apache.felix.webconsole.internal.compendium;
 
-
 import java.io.PrintWriter;
 import java.util.Dictionary;
 import java.util.Enumeration;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Set;
 import java.util.SortedMap;
 import java.util.SortedSet;
 import java.util.TreeMap;
@@ -32,7 +33,6 @@
 import org.osgi.service.cm.Configuration;
 import org.osgi.service.cm.ConfigurationAdmin;
 
-
 /**
  * ConfigurationAdminConfigurationPrinter uses the {@link ConfigurationAdmin} service
  * to print the available configurations.
@@ -42,7 +42,6 @@
 
     private static final String TITLE = "Configurations";
 
-
     /**
      * @see org.apache.felix.webconsole.ConfigurationPrinter#getTitle()
      */
@@ -51,79 +50,97 @@
         return TITLE;
     }
 
-
     /**
      * @see org.apache.felix.webconsole.ConfigurationPrinter#printConfiguration(java.io.PrintWriter)
      */
-    public void printConfiguration( PrintWriter pw )
+    public void printConfiguration(PrintWriter pw)
     {
-        ServiceReference sr = getBundleContext().getServiceReference( ConfigurationAdmin.class.getName() );
-        if ( sr == null )
+        ServiceReference sr = getBundleContext().getServiceReference(
+            ConfigurationAdmin.class.getName());
+        if (sr == null)
         {
-            pw.println( "  Configuration Admin Service not registered" );
+            pw.println("Status: Configuration Admin Service not available");
         }
         else
         {
 
-            ConfigurationAdmin ca = ( ConfigurationAdmin ) getBundleContext().getService( sr );
+            ConfigurationAdmin ca = (ConfigurationAdmin) getBundleContext().getService(sr);
             try
             {
-                Configuration[] configs = ca.listConfigurations( null );
-                if ( configs != null && configs.length > 0 )
-                {
-                    SortedMap sm = new TreeMap();
-                    for ( int i = 0; i < configs.length; i++ )
-                    {
-                        sm.put( configs[i].getPid(), configs[i] );
-                    }
+                Configuration[] configs = ca.listConfigurations(null);
 
-                    for ( Iterator mi = sm.values().iterator(); mi.hasNext(); )
+                if (configs != null && configs.length > 0)
+                {
+                    Set factories = new HashSet();
+                    SortedMap sm = new TreeMap();
+                    for (int i = 0; i < configs.length; i++)
                     {
-                        this.printConfiguration( pw, ( Configuration ) mi.next() );
+                        sm.put(configs[i].getPid(), configs[i]);
+                        String fpid = configs[i].getFactoryPid();
+                        if (null != fpid)
+                        {
+                            factories.add(fpid);
+                        }
+                    }
+                    if (factories.isEmpty())
+                    {
+                        pw.println("Status: " + configs.length
+                            + " configurations available");
+                    }
+                    else
+                    {
+                        pw.println("Status: " + configs.length + " configurations and "
+                            + factories.size() + " factories available");
+                    }
+                    pw.println();
+
+                    for (Iterator mi = sm.values().iterator(); mi.hasNext();)
+                    {
+                        this.printConfiguration(pw, (Configuration) mi.next());
                     }
                 }
                 else
                 {
-                    pw.println( "  No Configurations available" );
+                    pw.println("Status: No Configurations available");
                 }
             }
-            catch ( Exception e )
+            catch (Exception e)
             {
-                // todo or not :-)
+                pw.println("Status: Configuration Admin Service not accessible");
             }
             finally
             {
-                getBundleContext().ungetService( sr );
+                getBundleContext().ungetService(sr);
             }
         }
     }
 
-
-    private void printConfiguration( PrintWriter pw, Configuration config )
+    private void printConfiguration(PrintWriter pw, Configuration config)
     {
-        ConfigurationRender.infoLine( pw, "", "PID", config.getPid() );
+        ConfigurationRender.infoLine(pw, "", "PID", config.getPid());
 
-        if ( config.getFactoryPid() != null )
+        if (config.getFactoryPid() != null)
         {
-            ConfigurationRender.infoLine( pw, "  ", "Factory PID", config.getFactoryPid() );
+            ConfigurationRender.infoLine(pw, "  ", "Factory PID", config.getFactoryPid());
         }
 
-        String loc = ( config.getBundleLocation() != null ) ? config.getBundleLocation() : "Unbound";
-        ConfigurationRender.infoLine( pw, "  ", "BundleLocation", loc );
+        String loc = (config.getBundleLocation() != null) ? config.getBundleLocation()
+            : "Unbound";
+        ConfigurationRender.infoLine(pw, "  ", "BundleLocation", loc);
 
         Dictionary props = config.getProperties();
-        if ( props != null )
+        if (props != null)
         {
             SortedSet keys = new TreeSet();
-            for ( Enumeration ke = props.keys(); ke.hasMoreElements(); )
+            for (Enumeration ke = props.keys(); ke.hasMoreElements();)
             {
-                keys.add( ke.nextElement() );
+                keys.add(ke.nextElement());
             }
 
-            for ( Iterator ki = keys.iterator(); ki.hasNext(); )
+            for (Iterator ki = keys.iterator(); ki.hasNext();)
             {
-                String key = ( String ) ki.next();
-                ConfigurationRender.infoLine( pw, "  ", key, props.get( key ) );
+                String key = (String) ki.next();
+                ConfigurationRender.infoLine(pw, "  ", key, props.get(key));
             }
         }
 
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/PreferencesConfigurationPrinter.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/PreferencesConfigurationPrinter.java
index 1898041..cf0b00d 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/PreferencesConfigurationPrinter.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/PreferencesConfigurationPrinter.java
@@ -16,7 +16,6 @@
  */
 package org.apache.felix.webconsole.internal.compendium;
 
-
 import java.io.PrintWriter;
 
 import org.apache.felix.webconsole.internal.AbstractConfigurationPrinter;
@@ -26,7 +25,6 @@
 import org.osgi.service.prefs.Preferences;
 import org.osgi.service.prefs.PreferencesService;
 
-
 /**
  * PreferencesConfigurationPrinter uses the {@link Preferences} service
  * to print the store bundle preferences.
@@ -36,7 +34,6 @@
 
     private static final String TITLE = "Preferences";
 
-
     /**
      * @see org.apache.felix.webconsole.ConfigurationPrinter#getTitle()
      */
@@ -45,64 +42,64 @@
         return TITLE;
     }
 
-
     /**
      * @see org.apache.felix.webconsole.ConfigurationPrinter#printConfiguration(java.io.PrintWriter)
      */
-    public void printConfiguration( PrintWriter printWriter )
+    public void printConfiguration(PrintWriter printWriter)
     {
-        ServiceReference sr = getBundleContext().getServiceReference( PreferencesService.class.getName() );
-        if ( sr == null )
+        ServiceReference sr = getBundleContext().getServiceReference(
+            PreferencesService.class.getName());
+        if (sr == null)
         {
-            printWriter.println( "  Preferences Service not registered" );
+            printWriter.println("Status: Preferences Service not available");
         }
         else
         {
-            PreferencesService ps = ( PreferencesService ) getBundleContext().getService( sr );
+            PreferencesService ps = (PreferencesService) getBundleContext().getService(sr);
             try
             {
-                printPreferences( printWriter, ps.getSystemPreferences() );
+                printPreferences(printWriter, ps.getSystemPreferences());
 
                 String[] users = ps.getUsers();
-                for ( int i = 0; users != null && i < users.length; i++ )
+                for (int i = 0; users != null && i < users.length; i++)
                 {
-                    printWriter.println( "*** User Preferences " + users[i] + ":" );
-                    printPreferences( printWriter, ps.getUserPreferences( users[i] ) );
+                    printWriter.println("*** User Preferences " + users[i] + ":");
+                    printPreferences(printWriter, ps.getUserPreferences(users[i]));
                 }
             }
-            catch ( BackingStoreException bse )
+            catch (BackingStoreException bse)
             {
                 // todo or not :-)
             }
             finally
             {
-                getBundleContext().ungetService( sr );
+                getBundleContext().ungetService(sr);
             }
         }
     }
 
-
-    private static final void printPreferences( PrintWriter pw, Preferences prefs ) throws BackingStoreException
+    private static final void printPreferences(PrintWriter pw, Preferences prefs)
+        throws BackingStoreException
     {
 
         final String[] children = prefs.childrenNames();
         final String[] keys = prefs.keys();
 
-        if ( children.length == 0 && keys.length == 0 )
+        if (children.length == 0 && keys.length == 0)
         {
-            pw.println( "No Preferences available" );
+            pw.println("Status: No Preferences available");
         }
         else
         {
-            for ( int i = 0; i < children.length; i++ )
+            for (int i = 0; i < children.length; i++)
             {
-                printPreferences( pw, prefs.node( children[i] ) );
+                printPreferences(pw, prefs.node(children[i]));
             }
 
-            for ( int i = 0; i < keys.length; i++ )
+            for (int i = 0; i < keys.length; i++)
             {
-                ConfigurationRender
-                    .infoLine( pw, null, prefs.absolutePath() + "/" + keys[i], prefs.get( keys[i], null ) );
+                ConfigurationRender.infoLine(pw, null, prefs.absolutePath() + "/"
+                    + keys[i], prefs.get(keys[i], null));
             }
         }
 
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/WireAdminConfigurationPrinter.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/WireAdminConfigurationPrinter.java
index acf26d5..c7d8e26 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/WireAdminConfigurationPrinter.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/WireAdminConfigurationPrinter.java
@@ -64,7 +64,7 @@
             final Object service = ref != null ? bc.getService(ref) : null;
             if (service == null)
             {
-                pw.println("No Wire Admin service available");
+                pw.println("Status: Wire Admin service not available");
             }
             else
             {
@@ -73,7 +73,7 @@
 
                 if (null == wires || 0 == wires.length)
                 {
-                    pw.println("No wires available");
+                    pw.println("Status: No wires available");
                 }
                 else
                 {
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesConfigurationPrinter.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesConfigurationPrinter.java
index d1abb70..b7cd16c 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesConfigurationPrinter.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/BundlesConfigurationPrinter.java
@@ -144,7 +144,7 @@
 
         }
         final StringBuffer buffer = new StringBuffer();
-        buffer.append("Bundlelist: ");
+        buffer.append("Status: ");
         appendBundleInfoCount(buffer, "in total", bundles.length);
         if ( active == bundles.length || active + fragments == bundles.length )
         {
@@ -175,7 +175,7 @@
             }
         }
         pw.println(buffer.toString());
-        pw.println("-----------------------------------------------------------------------------");
+        pw.println();
         final Iterator i = bundlesMap.entrySet().iterator();
         while ( i.hasNext() )
         {
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java
index 2771c72..512f674 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/core/ServicesServlet.java
@@ -170,7 +170,6 @@
     {
         final int count = services.length;
         final StringBuffer buffer = new StringBuffer();
-        buffer.append( "Services information: " );
         buffer.append( count );
         buffer.append( " service" );
         if ( count != 1 )
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/ThreadPrinter.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/ThreadPrinter.java
index 2fb49d4..8e8c89e 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/ThreadPrinter.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/misc/ThreadPrinter.java
@@ -19,6 +19,7 @@
 package org.apache.felix.webconsole.internal.misc;
 
 import java.io.PrintWriter;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Comparator;
 
@@ -30,7 +31,7 @@
     private static final String TITLE = "Threads";
 
     private static final String LABEL = "_threads";
-
+    
     public String getTitle()
     {
         return TITLE;
@@ -45,18 +46,78 @@
             rootGroup = rootGroup.getParent();
         }
 
-        printThreadGroup(pw, rootGroup);
-
         int numGroups = rootGroup.activeGroupCount();
         ThreadGroup[] groups = new ThreadGroup[2 * numGroups];
         rootGroup.enumerate(groups);
         Arrays.sort(groups, ThreadGroupComparator.getInstance());
+
+        printStatusLine(pw, rootGroup, groups);
+        printThreadGroup(pw, rootGroup);
+
         for (int i = 0; i < groups.length; i++)
         {
             printThreadGroup(pw, groups[i]);
         }
     }
 
+    private void printStatusLine(PrintWriter pw, ThreadGroup rootGroup,
+        ThreadGroup[] groups)
+    {
+        int alive = 0;
+        int daemon = 0;
+        int interrupted = 0;
+
+        int threadCount = 0;
+        int threadGroupCount = 0;
+        int threadGroupDestroyed = 0;
+
+        ArrayList/*<ThreadGroup>*/list = new ArrayList(groups.length + 1);
+        list.add(rootGroup);
+        list.addAll(Arrays.asList(groups));
+        for (int j = 0; j < list.size(); j++)
+        {
+            ThreadGroup group = (ThreadGroup) list.get(j);
+            if (null == group)
+            {
+                continue;
+            }
+            threadGroupCount++;
+            if (group.isDestroyed())
+            {
+                threadGroupDestroyed++;
+            }
+
+            Thread[] threads = new Thread[group.activeCount()];
+            group.enumerate(threads);
+            for (int i = 0, size = threads.length; i < size; i++)
+            {
+                Thread thread = threads[i];
+                if (null != thread)
+                {
+                    if (thread.isAlive())
+                    {
+                        alive++;
+                    }
+                    if (thread.isDaemon())
+                    {
+                        daemon++;
+                    }
+                    if (thread.isInterrupted())
+                    {
+                        interrupted++;
+                    }
+                    threadCount++;
+                }
+            }
+        }
+
+        ConfigurationRender.infoLine(pw, "", null, "Status: " + threadCount
+            + " threads (" + alive + " alive/" + daemon + " daemon/" + interrupted
+            + " interrupted) in " + threadGroupCount + " groups ("
+            + threadGroupDestroyed + " destroyed).");
+        pw.println();
+    }
+
     private static final void printThreadGroup(PrintWriter pw, ThreadGroup group)
     {
         if (group != null)
@@ -131,7 +192,8 @@
 
     public int compare(Object thread1, Object thread2)
     {
-        if (null == thread1 || null == thread2) return -1;
+        if (null == thread1 || null == thread2)
+            return -1;
         String t1 = ((Thread) thread1).getName();
         String t2 = ((Thread) thread2).getName();
         if (null == t1)
@@ -165,7 +227,8 @@
 
     public int compare(Object thread1, Object thread2)
     {
-        if (null == thread1 || null == thread2) return -1;
+        if (null == thread1 || null == thread2)
+            return -1;
         String t1 = ((ThreadGroup) thread1).getName();
         String t2 = ((ThreadGroup) thread2).getName();
         if (null == t1)
@@ -180,4 +243,4 @@
         return t1.compareTo(t2);
     }
 
-}
\ No newline at end of file
+}
