diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ComponentsServlet.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ComponentsServlet.java
index 38b728f..1481b25 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ComponentsServlet.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/compendium/ComponentsServlet.java
@@ -20,9 +20,10 @@
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Comparator;
 import java.util.Dictionary;
 import java.util.Iterator;
-import java.util.TreeMap;
 import java.util.TreeSet;
 
 import javax.servlet.ServletException;
@@ -190,22 +191,18 @@
                 else
                 {
                     // order components by name
-                    TreeMap componentMap = new TreeMap();
-                    for ( int i = 0; i < components.length; i++ )
-                    {
-                        Component c = components[i];
-                        componentMap.put( c.getName(), c );
-                    }
+                    sortComponents( components );
 
                     final StringBuffer buffer = new StringBuffer();
-                    buffer.append(componentMap.size());
-                    buffer.append(" component");
-                    if ( componentMap.size() != 1 ) {
-                        buffer.append('s');
+                    buffer.append( components.length );
+                    buffer.append( " component" );
+                    if ( components.length != 1 )
+                    {
+                        buffer.append( 's' );
                     }
-                    buffer.append(" installed.");
-                    jw.key("status");
-                    jw.value(componentMap.size());
+                    buffer.append( " installed." );
+                    jw.key( "status" );
+                    jw.value( components.length );
 
                     // render components
                     jw.key( "data" );
@@ -216,9 +213,9 @@
                     }
                     else
                     {
-                        for ( Iterator ci = componentMap.values().iterator(); ci.hasNext(); )
+                        for ( int i = 0; i < components.length; i++ )
                         {
-                            component( jw, ( Component ) ci.next(), false );
+                            component( jw, components[i], false );
                         }
                     }
                     jw.endArray();
@@ -233,6 +230,26 @@
         }
     }
 
+
+    private void sortComponents( Component[] components )
+    {
+        Arrays.sort( components, new Comparator()
+        {
+            public int compare( Object o0, Object o1 )
+            {
+                final Component c0 = ( Component ) o0;
+                final Component c1 = ( Component ) o1;
+                final int nameCmp = c0.getName().compareTo( c1.getName() );
+                if ( nameCmp != 0 )
+                {
+                    return nameCmp;
+                }
+                return ( c0.getId() < c1.getId() ) ? -1 : ( ( c0.getId() > c1.getId() ) ? 1 : 0 );
+            }
+        } );
+    }
+
+
     private void component( JSONWriter jw, Component component, boolean details ) throws JSONException
     {
         String id = String.valueOf( component.getId() );
