diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
index 07dbb7f..2c74992 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationListener2.java
@@ -22,6 +22,7 @@
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Locale;
+import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.TreeMap;
 
@@ -113,13 +114,14 @@
         ObjectClassDefinition xocd = null;
         final Locale localeObj = Util.parseLocaleString(locale);
         final ResourceBundle rb = osgiManager.resourceBundleManager.getResourceBundle(osgiManager.getBundleContext().getBundle(), localeObj);
+        final Map<String, String> defaultConfig = osgiManager.getDefaultConfiguration();
 
         // simple configuration properties
         final ArrayList<AttributeDefinition> adList = new ArrayList<AttributeDefinition>();
         for (int i = 0; i < CONF_PROPS.length; i++)
         {
             final String key = CONF_PROPS[i++];
-            final String defaultValue = CONF_PROPS[i];
+            final String defaultValue = ConfigurationUtil.getProperty( defaultConfig, key, CONF_PROPS[i] );
             final String name = getString(rb, "metadata." + key + ".name", key); //$NON-NLS-1$ //$NON-NLS-2$
             final String descr = getString(rb, "metadata." + key + ".description", key); //$NON-NLS-1$ //$NON-NLS-2$
             adList.add( new AttributeDefinitionImpl(key, name, descr, defaultValue) );
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationUtil.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationUtil.java
index 7d743ff..edf6567 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationUtil.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/ConfigurationUtil.java
@@ -17,10 +17,12 @@
 package org.apache.felix.webconsole.internal.servlet;
 
 import java.util.Collection;
-import java.util.Dictionary;
 import java.util.Iterator;
+import java.util.Map;
 import java.util.StringTokenizer;
 
+import org.osgi.framework.BundleContext;
+
 /**
  * A helper class to get configuration properties.
  */
@@ -32,6 +34,24 @@
         // prevent instantiation
     }
 
+
+    /**
+     * Returns the named property from the framework. If the property does
+     * not exist, the default value <code>def</code> is returned.
+     *
+     * @param context The BundleContext providing framework properties
+     * @param name The name of the property to return
+     * @param def The default value if the named property does not exist
+     * @return The value of the named property or <code>def</code>
+     *         if the property does not exist
+     */
+    public static final String getProperty( BundleContext context, String name, String def )
+    {
+        String value = context.getProperty( name );
+        return ( value == null ) ? def : value;
+    }
+
+
     /**
      * Returns the named property from the configuration. If the property does
      * not exist, the default value <code>def</code> is returned.
@@ -42,7 +62,7 @@
      * @return The value of the named property as a string or <code>def</code>
      *         if the property does not exist
      */
-    public static final String getProperty(Dictionary<String, ?> config, String name, String def)
+    public static final String getProperty(Map<String, ?> config, String name, String def)
     {
         Object value = config.get(name);
         if (value instanceof String)
@@ -68,7 +88,7 @@
      * @return The value of the named property as a string or <code>def</code>
      *         if the property does not exist
      */
-    public static final int getProperty(Dictionary<String, ?> config, String name, int def)
+    public static final int getProperty(Map<String, ?> config, String name, int def)
     {
         Object value = config.get(name);
         if (value instanceof Number)
@@ -100,7 +120,7 @@
      * @param name The name of the property to return
      * @return the property value as string array - no matter if originally it was other kind of array, collection or comma-separated string. Returns <code>null</code> if the property is not set.
      */
-    public static final String[] getStringArrayProperty(Dictionary<String, ?> config, String name)
+    public static final String[] getStringArrayProperty(Map<String, ?> config, String name)
     {
         Object value = config.get(name);
         if (value == null)
diff --git a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
index b778a72..ef4fdeb 100644
--- a/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
+++ b/webconsole/src/main/java/org/apache/felix/webconsole/internal/servlet/OsgiManager.java
@@ -30,6 +30,7 @@
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.ResourceBundle;
 import java.util.Set;
 
@@ -109,6 +110,14 @@
      */
     private static final String COOKIE_LOCALE = "felix.webconsole.locale"; //$NON-NLS-1$
 
+    private final String FRAMEWORK_PROP_MANAGER_ROOT = "felix.webconsole.manager.root"; //$NON-NLS-1$
+
+    private static final String FRAMEWORK_PROP_REALM = "felix.webconsole.realm"; //$NON-NLS-1$
+
+    private static final String FRAMEWORK_PROP_USER_NAME = "felix.webconsole.username"; //$NON-NLS-1$
+
+    private static final String FRAMEWORK_PROP_PASSWORD = "felix.webconsole.password"; //$NON-NLS-1$
+
     static final String PROP_MANAGER_ROOT = "manager.root"; //$NON-NLS-1$
 
     static final String PROP_DEFAULT_RENDER = "default.render"; //$NON-NLS-1$
@@ -190,7 +199,11 @@
     // true if the resources have been registered with the HttpService
     private boolean httpResourcesRegistered;
 
-    private Dictionary<String, ?> configuration;
+    // default configuration from framework properties
+    private HashMap<String, String> defaultConfiguration;
+
+    // configuration from Configuration Admin
+    private HashMap<String, ?> configuration;
 
     // See https://issues.apache.org/jira/browse/FELIX-2267
     private Locale configuredLocale;
@@ -279,6 +292,17 @@
             WebConsoleSecurityProvider.class.getName(), null);
         securityProviderTracker.open();
 
+        // load the default configuration from the framework
+        this.defaultConfiguration = new HashMap<String, String>();
+        this.defaultConfiguration.put( PROP_MANAGER_ROOT,
+            ConfigurationUtil.getProperty( bundleContext, FRAMEWORK_PROP_MANAGER_ROOT, DEFAULT_MANAGER_ROOT ) );
+        this.defaultConfiguration.put( PROP_REALM,
+            ConfigurationUtil.getProperty( bundleContext, FRAMEWORK_PROP_REALM, DEFAULT_REALM ) );
+        this.defaultConfiguration.put( PROP_USER_NAME,
+            ConfigurationUtil.getProperty( bundleContext, FRAMEWORK_PROP_USER_NAME, DEFAULT_USER_NAME ) );
+        this.defaultConfiguration.put( PROP_PASSWORD,
+            ConfigurationUtil.getProperty( bundleContext, FRAMEWORK_PROP_PASSWORD, DEFAULT_PASSWORD ) );
+
         // configure and start listening for configuration
         updateConfiguration(null);
 
@@ -701,7 +725,7 @@
             return;
         }
 
-        Dictionary<String, ?> config = getConfiguration();
+        Map<String, ?> config = getConfiguration();
 
         // get authentication details
         String realm = ConfigurationUtil.getProperty(config, PROP_REALM, DEFAULT_REALM);
@@ -776,16 +800,29 @@
         }
     }
 
-    private Dictionary<String, ?> getConfiguration()
+    private Map<String, ?> getConfiguration()
     {
         return configuration;
     }
 
-    synchronized void updateConfiguration(Dictionary<String, ?> config)
+
+    Map<String, String> getDefaultConfiguration()
     {
-        if (config == null)
+        return defaultConfiguration;
+    }
+
+
+    synchronized void updateConfiguration(Dictionary<String, ?> osgiConfig)
+    {
+        HashMap<String, Object> config = new HashMap<String, Object>(this.defaultConfiguration);
+
+        if ( osgiConfig != null )
         {
-            config = new Hashtable<String, Object>();
+            for ( Enumeration<String> keys = osgiConfig.keys(); keys.hasMoreElements(); )
+            {
+                final String key = keys.nextElement();
+                config.put( key, osgiConfig.get( key ) );
+            }
         }
 
         configuration = config;
@@ -886,13 +923,13 @@
         return enabledPlugins != null && !enabledPlugins.contains(pluginClass);
     }
 
-    private Dictionary<String, String> toStringConfig(Dictionary<String, ?> config)
+
+    private Dictionary<String, String> toStringConfig( Map<String, ?> config )
     {
         Dictionary<String, String> stringConfig = new Hashtable<String, String>();
-        for (Enumeration<String> ke = config.keys(); ke.hasMoreElements();)
+        for ( Entry<String, ?> entry : config.entrySet() )
         {
-            String key = ke.nextElement();
-            stringConfig.put(key, String.valueOf(config.get(key)));
+            stringConfig.put( entry.getKey(), String.valueOf( entry.getValue() ) );
         }
         return stringConfig;
     }
