diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigAdminSupport.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigAdminSupport.java
index f8bc2e5..ad6fd7a 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigAdminSupport.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigAdminSupport.java
@@ -31,12 +31,12 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Set;
 import java.util.SortedMap;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 import java.util.Vector;
-import java.util.Map.Entry;
 
 import javax.servlet.http.HttpServletRequest;
 
@@ -61,7 +61,7 @@
 
 class ConfigAdminSupport
 {
-    
+
     private static final String PROPERTY_FACTORYCONFIG_NAMEHINT = "webconsole.configurationFactory.nameHint";
     private static final Set CONFIG_PROPERTIES_HIDE = new HashSet();
     static {
@@ -200,10 +200,10 @@
                 String paramName = "action".equals(propName) //$NON-NLS-1$
                     || ConfigManager.ACTION_DELETE.equals(propName)
                     || ConfigManager.ACTION_APPLY.equals(propName)
-                    || ConfigManager.PROPERTY_LIST.equals(propName) 
+                    || ConfigManager.PROPERTY_LIST.equals(propName)
                     ? '$' + propName : propName;
                 propsToKeep.add(propName);
-                
+
                 PropertyDescriptor ad = (PropertyDescriptor) adMap.get( propName );
 
                 // try to derive from current value
@@ -593,7 +593,7 @@
             configManager.log("listConfigurations: Unexpected problem encountered", e);
         }
     }
-    
+
     /**
      * Builds a "name hint" for factory configuration based on other property
      * values of the config and a "name hint template" defined as hidden
@@ -845,4 +845,9 @@
         }
 
     }
+
+    public Configuration[] listConfigurations(String filter) throws IOException, InvalidSyntaxException
+    {
+        return this.service.listConfigurations(filter);
+    }
 }
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
index 0cc826e..d00532a 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/configuration/ConfigManager.java
@@ -19,9 +19,7 @@
 
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.util.Iterator;
 import java.util.Locale;
-import java.util.Map;
 
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
@@ -33,6 +31,7 @@
 import org.apache.felix.webconsole.internal.OsgiManagerPlugin;
 import org.json.JSONException;
 import org.json.JSONObject;
+import org.osgi.framework.Constants;
 import org.osgi.framework.InvalidSyntaxException;
 import org.osgi.service.cm.Configuration;
 
@@ -273,28 +272,58 @@
             final ConfigAdminSupport ca = this.getConfigurationAdminSupport();
             if ( ca != null )
             {
+                // create filter
+                final StringBuffer sb = new StringBuffer();
+                if ( pid != null && pidFilter != null)
+                {
+                    sb.append("(&");
+                }
+                if ( pid != null )
+                {
+                    sb.append('(');
+                    sb.append(Constants.SERVICE_PID);
+                    sb.append('=');
+                    sb.append(pid);
+                    sb.append(')');
+                }
+                if ( pidFilter != null )
+                {
+                    sb.append(pidFilter);
+                }
+                if ( pid != null && pidFilter != null)
+                {
+                    sb.append(')');
+                }
+                final String filter = sb.toString();
                 try
                 {
-                    final Map services = ca.getServices( pid, pidFilter, locale, false );
+                    // we use listConfigurations to not create configuration
+                    // objects persistently without the user providing actual
+                    // configuration
+                    final Configuration[] configs = ca.listConfigurations( filter );
                     boolean printComma = false;
-                    for ( Iterator spi = services.keySet().iterator(); spi.hasNext(); )
+                    for(int i=0; i<configs.length; i++)
                     {
-                        final String servicePid = ( String ) spi.next();
-                        final Configuration config = ca.getConfiguration( servicePid );
+                        final Configuration config = configs[i];
                         if ( config != null )
                         {
                             if ( printComma )
                             {
                                 pw.print( ',' );
                             }
-                            ca.printConfigurationJson( pw, servicePid, config, pidFilter, locale );
+                            ca.printConfigurationJson( pw, config.getPid(), config, null, locale );
                             printComma = true;
                         }
                     }
                 }
-                catch ( InvalidSyntaxException e )
+                catch ( final InvalidSyntaxException ise )
                 {
-                    // this should not happened as we checked the filter before
+                    // should print message
+                    // however this should not happen as we checked the filter before
+                }
+                catch ( final IOException ioe )
+                {
+                    // should print message
                 }
             }
             pw.write( "]" ); //$NON-NLS-1$
