diff --git a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
new file mode 100644
index 0000000..bab7ac1
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
@@ -0,0 +1,241 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.cfg.impl;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Maps;
+import org.apache.felix.scr.annotations.Activate;
+import org.apache.felix.scr.annotations.Component;
+import org.apache.felix.scr.annotations.Deactivate;
+import org.apache.felix.scr.annotations.Reference;
+import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.apache.felix.scr.annotations.Service;
+import org.onosproject.cfg.ComponentConfigEvent;
+import org.onosproject.cfg.ComponentConfigService;
+import org.onosproject.cfg.ComponentConfigStore;
+import org.onosproject.cfg.ComponentConfigStoreDelegate;
+import org.onosproject.cfg.ConfigProperty;
+import org.osgi.service.cm.Configuration;
+import org.osgi.service.cm.ConfigurationAdmin;
+import org.slf4j.Logger;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Dictionary;
+import java.util.Enumeration;
+import java.util.Hashtable;
+import java.util.Map;
+import java.util.Set;
+
+import static com.google.common.base.Preconditions.checkArgument;
+import static com.google.common.base.Preconditions.checkNotNull;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Implementation of the centralized component configuration service.
+ */
+@Component(immediate = true)
+@Service
+public class ComponentConfigManager implements ComponentConfigService {
+
+    private static final String COMPONENT_NULL = "Component name cannot be null";
+    private static final String PROPERTY_NULL = "Property name cannot be null";
+
+    private static final String RESOURCE_EXT = ".cfgdef";
+
+    private final Logger log = getLogger(getClass());
+
+    private final ComponentConfigStoreDelegate delegate = new InternalStoreDelegate();
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ComponentConfigStore store;
+
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ConfigurationAdmin cfgAdmin;
+
+    // Locally maintained catalog of definitions.
+    private final Map<String, Map<String, ConfigProperty>> properties =
+            Maps.newConcurrentMap();
+
+    @Activate
+    public void activate() {
+        store.setDelegate(delegate);
+        log.info("Started");
+    }
+
+    @Deactivate
+    public void deactivate() {
+        store.unsetDelegate(delegate);
+        log.info("Stopped");
+    }
+
+    @Override
+    public Set<String> getComponentNames() {
+        return ImmutableSet.copyOf(properties.keySet());
+    }
+
+    @Override
+    public void registerProperties(Class<?> componentClass) {
+        String componentName = componentClass.getName();
+        String resourceName = componentClass.getSimpleName() + RESOURCE_EXT;
+        try (InputStream ris = componentClass.getResourceAsStream(resourceName)) {
+            checkArgument(ris != null, "Property definitions not found at resource %s",
+                          resourceName);
+
+            // Read the definitions
+            Set<ConfigProperty> defs = ConfigPropertyDefinitions.read(ris);
+
+            // Produce a new map of the properties and register it.
+            Map<String, ConfigProperty> map = Maps.newConcurrentMap();
+            defs.forEach(p -> map.put(p.name(), p));
+
+            properties.put(componentName, map);
+            loadExistingValues(componentName);
+        } catch (IOException e) {
+            log.error("Unable to read property definitions from resource " + resourceName, e);
+        }
+    }
+
+    @Override
+    public void unregisterProperties(Class<?> componentClass, boolean clear) {
+        String componentName = componentClass.getName();
+        checkNotNull(componentName, COMPONENT_NULL);
+        Map<String, ConfigProperty> cps = properties.remove(componentName);
+        if (cps != null) {
+            cps.keySet().forEach(name -> store.unsetProperty(componentName, name));
+        }
+
+        if (clear) {
+            clearExistingValues(componentName);
+        }
+    }
+
+    // Clears any existing values that may have been set.
+    private void clearExistingValues(String componentName) {
+        triggerUpdate(componentName);
+    }
+
+    @Override
+    public Set<ConfigProperty> getProperties(String componentName) {
+        return ImmutableSet.copyOf(properties.get(componentName).values());
+    }
+
+    @Override
+    public void setProperty(String componentName, String name, String value) {
+        checkNotNull(componentName, COMPONENT_NULL);
+        checkNotNull(name, PROPERTY_NULL);
+        store.setProperty(componentName, name, value);
+    }
+
+    @Override
+    public void unsetProperty(String componentName, String name) {
+        checkNotNull(componentName, COMPONENT_NULL);
+        checkNotNull(name, PROPERTY_NULL);
+        store.unsetProperty(componentName, name);
+    }
+
+    private class InternalStoreDelegate implements ComponentConfigStoreDelegate {
+
+        @Override
+        public void notify(ComponentConfigEvent event) {
+            String componentName = event.subject();
+            String name = event.name();
+            String value = event.value();
+
+            switch (event.type()) {
+                case PROPERTY_SET:
+                    set(componentName, name, value);
+                    break;
+                case PROPERTY_UNSET:
+                    reset(componentName, name);
+                    break;
+                default:
+                    break;
+            }
+        }
+    }
+
+    // Locates the property in the component map and replaces it with an
+    // updated copy.
+    private void set(String componentName, String name, String value) {
+        Map<String, ConfigProperty> map = properties.get(componentName);
+        if (map != null) {
+            ConfigProperty prop = map.get(name);
+            if (prop != null) {
+                map.put(name, ConfigProperty.setProperty(prop, value));
+                triggerUpdate(componentName);
+                return;
+            }
+        }
+        log.warn("Unable to set non-existent property {} for component {}",
+                 name, componentName);
+    }
+
+    // Locates the property in the component map and replaces it with an
+    // reset copy.
+    private void reset(String componentName, String name) {
+        Map<String, ConfigProperty> map = properties.get(componentName);
+        if (map != null) {
+            ConfigProperty prop = map.get(name);
+            if (prop != null) {
+                map.put(name, ConfigProperty.resetProperty(prop));
+                triggerUpdate(componentName);
+                return;
+            }
+        }
+        log.warn("Unable to reset non-existent property {} for component {}",
+                 name, componentName);
+    }
+
+    // Loads existing property values that may have been set.
+    private void loadExistingValues(String componentName) {
+        // FIXME: implement this by talking to the config admin.
+        try {
+            Configuration cfg = cfgAdmin.getConfiguration(componentName);
+            Map<String, ConfigProperty> map = properties.get(componentName);
+            Dictionary<String, Object> props = cfg.getProperties();
+            if (props != null) {
+                Enumeration<String> it = props.keys();
+                while (it.hasMoreElements()) {
+                    String name = it.nextElement();
+                    ConfigProperty p = map.get(name);
+                    if (p != null) {
+                        map.put(name, ConfigProperty.setProperty(p, (String) props.get(name)));
+                    }
+                }
+            }
+        } catch (IOException e) {
+            log.error("Unable to get configuration for " + componentName, e);
+        }
+
+    }
+
+    // FIXME: This should be a slightly deferred execution to allow changing
+    // values just once per component when a number of updates arrive shortly
+    // after each other.
+    private void triggerUpdate(String componentName) {
+        try {
+            Configuration cfg = cfgAdmin.getConfiguration(componentName);
+            Map<String, ConfigProperty> map = properties.get(componentName);
+            Dictionary<String, Object> props = new Hashtable<>();
+            map.values().forEach(p -> props.put(p.name(), p.value()));
+            cfg.update(props);
+        } catch (IOException e) {
+            log.warn("Unable to update configuration for " + componentName, e);
+        }
+    }
+
+}
diff --git a/core/net/src/main/java/org/onosproject/cfg/impl/ConfigPropertyDefinitions.java b/core/net/src/main/java/org/onosproject/cfg/impl/ConfigPropertyDefinitions.java
new file mode 100644
index 0000000..0f416c7
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/cfg/impl/ConfigPropertyDefinitions.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onosproject.cfg.impl;
+
+import com.google.common.collect.ImmutableSet;
+import org.onosproject.cfg.ConfigProperty;
+import org.onosproject.cfg.ConfigProperty.Type;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.util.Set;
+
+import static org.onosproject.cfg.ConfigProperty.defineProperty;
+
+/**
+ * Utility for writing and reading configuration property definition file.
+ */
+public final class ConfigPropertyDefinitions {
+
+    private static final String FMT = "%s|%s|%s|%s\n";
+    private static final String SEP = "\\|";
+    private static final String COMMENT = "#";
+
+    private ConfigPropertyDefinitions() {
+    }
+
+    /**
+     * Writes the specified set of property definitions into the given output
+     * stream.
+     *
+     * @param stream output stream
+     * @param props  properties whose definitions are to be written
+     * @throws java.io.IOException if unable to write the stream
+     */
+    public static void write(OutputStream stream, Set<ConfigProperty> props) throws IOException {
+        try (PrintWriter pw = new PrintWriter(new OutputStreamWriter(stream))) {
+            props.forEach(p -> pw.format(FMT, p.name(), p.type(), p.description(), p.defaultValue()));
+        }
+    }
+
+    /**
+     * Reads the specified input stream and creates from its contents a
+     * set of property definitions.
+     *
+     * @param stream input stream
+     * @return properties whose definitions are contained in the stream
+     * @throws java.io.IOException if unable to read the stream
+     */
+    public static Set<ConfigProperty> read(InputStream stream) throws IOException {
+        ImmutableSet.Builder<ConfigProperty> builder = ImmutableSet.builder();
+        try (BufferedReader br = new BufferedReader(new InputStreamReader(stream))) {
+            String line;
+            while ((line = br.readLine()) != null) {
+                if (!line.isEmpty() && !line.startsWith(COMMENT)) {
+                    String[] f = line.split(SEP, 4);
+                    builder.add(defineProperty(f[0], Type.valueOf(f[1]), f[2], f[3]));
+                }
+            }
+        }
+        return builder.build();
+    }
+
+}
diff --git a/core/net/src/main/java/org/onosproject/cfg/impl/package-info.java b/core/net/src/main/java/org/onosproject/cfg/impl/package-info.java
new file mode 100644
index 0000000..4f76c31
--- /dev/null
+++ b/core/net/src/main/java/org/onosproject/cfg/impl/package-info.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright 2015 Open Networking Laboratory
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * Subsystem for central management of component configurations.
+ */
+package org.onosproject.cfg.impl;
\ No newline at end of file
diff --git a/core/net/src/main/java/org/onosproject/net/topology/impl/DefaultTopologyProvider.java b/core/net/src/main/java/org/onosproject/net/topology/impl/DefaultTopologyProvider.java
index af40595..03a7169 100644
--- a/core/net/src/main/java/org/onosproject/net/topology/impl/DefaultTopologyProvider.java
+++ b/core/net/src/main/java/org/onosproject/net/topology/impl/DefaultTopologyProvider.java
@@ -40,6 +40,7 @@
 import org.apache.felix.scr.annotations.Service;
 import org.onlab.util.AbstractAccumulator;
 import org.onlab.util.Accumulator;
+import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.event.Event;
 import org.onosproject.net.device.DeviceEvent;
 import org.onosproject.net.device.DeviceListener;
@@ -59,13 +60,14 @@
 import com.google.common.collect.ImmutableList;
 
 /**
- * Default implementation of a network topology provider that feeds off device
- * and link subsystem events to trigger assembly and computation of new topology
- * snapshots.
+ * Default implementation of a network topology provider that feeds off
+ * device and link subsystem events to trigger assembly and computation of
+ * new topology snapshots.
  */
 @Component(immediate = true)
 @Service
-public class DefaultTopologyProvider extends AbstractProvider implements TopologyProvider {
+public class DefaultTopologyProvider extends AbstractProvider
+        implements TopologyProvider {
 
     private static final int MAX_THREADS = 8;
     private static final int DEFAULT_MAX_EVENTS = 1000;
@@ -73,8 +75,7 @@
     private static final int DEFAULT_MAX_BATCH_MS = 50;
 
     // FIXME: Replace with a system-wide timer instance;
-    // TODO: Convert to use HashedWheelTimer or produce a variant of that; then
-    // decide which we want to adopt
+    // TODO: Convert to use HashedWheelTimer or produce a variant of that; then decide which we want to adopt
     private static final Timer TIMER = new Timer("onos-topo-event-batching");
 
     @Property(name = "maxEvents", intValue = DEFAULT_MAX_EVENTS,
@@ -100,6 +101,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected LinkService linkService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ComponentConfigService cfgService;
+
     private volatile boolean isStarted = false;
 
     private TopologyProviderService providerService;
@@ -118,8 +122,8 @@
 
     @Activate
     public synchronized void activate(ComponentContext context) {
-        executor = newFixedThreadPool(MAX_THREADS,
-                groupedThreads("onos/topo", "build-%d"));
+        cfgService.registerProperties(DefaultTopologyProvider.class);
+        executor = newFixedThreadPool(MAX_THREADS, groupedThreads("onos/topo", "build-%d"));
         accumulator = new TopologyChangeAccumulator();
         logConfig("Configured");
 
@@ -136,6 +140,7 @@
 
     @Deactivate
     public synchronized void deactivate(ComponentContext context) {
+        cfgService.unregisterProperties(DefaultTopologyProvider.class, false);
         isStarted = false;
 
         deviceService.removeListener(deviceListener);
@@ -175,23 +180,21 @@
             newMaxIdleMs = DEFAULT_MAX_IDLE_MS;
         }
 
-        if ((newMaxEvents != maxEvents) || (newMaxBatchMs != maxBatchMs)
-                || (newMaxIdleMs != maxIdleMs)) {
+        if (newMaxEvents != maxEvents || newMaxBatchMs != maxBatchMs || newMaxIdleMs != maxIdleMs) {
             maxEvents = newMaxEvents;
             maxBatchMs = newMaxBatchMs;
             maxIdleMs = newMaxIdleMs;
-            accumulator = maxEvents > 1 ? new TopologyChangeAccumulator()
-            : null;
+            accumulator = maxEvents > 1 ? new TopologyChangeAccumulator() : null;
             logConfig("Reconfigured");
         }
     }
 
     private void logConfig(String prefix) {
-        log.info(
-                "{} with maxEvents = {}; maxBatchMs = {}; maxIdleMs = {}; accumulator={}",
-                prefix, maxEvents, maxBatchMs, maxIdleMs, accumulator != null);
+        log.info("{} with maxEvents = {}; maxBatchMs = {}; maxIdleMs = {}; accumulator={}",
+                 prefix, maxEvents, maxBatchMs, maxIdleMs, accumulator != null);
     }
 
+
     @Override
     public void triggerRecompute() {
         triggerTopologyBuild(Collections.<Event>emptyList());
@@ -201,8 +204,7 @@
      * Triggers assembly of topology data citing the specified events as the
      * reason.
      *
-     * @param reasons
-     *            events which triggered the topology change
+     * @param reasons events which triggered the topology change
      */
     private synchronized void triggerTopologyBuild(List<Event> reasons) {
         if (executor != null) {
@@ -216,9 +218,9 @@
         if (isStarted) {
             GraphDescription desc =
                     new DefaultGraphDescription(System.nanoTime(),
-                            System.currentTimeMillis(),
-                            deviceService.getAvailableDevices(),
-                            linkService.getActiveLinks());
+                                                System.currentTimeMillis(),
+                                                deviceService.getAvailableDevices(),
+                                                linkService.getActiveLinks());
             providerService.topologyChanged(desc, reasons);
         }
     }
@@ -236,8 +238,8 @@
         @Override
         public void event(DeviceEvent event) {
             DeviceEvent.Type type = event.type();
-            if ((type == DEVICE_ADDED) || (type == DEVICE_REMOVED) ||
-                    (type == DEVICE_AVAILABILITY_CHANGED)) {
+            if (type == DEVICE_ADDED || type == DEVICE_REMOVED ||
+                    type == DEVICE_AVAILABILITY_CHANGED) {
                 processEvent(event);
             }
         }
@@ -276,8 +278,7 @@
             try {
                 buildTopology(reasons);
             } catch (Exception e) {
-                log.warn("Unable to compute topology due to: {}",
-                        e.getMessage());
+                log.warn("Unable to compute topology due to: {}", e.getMessage());
                 log.debug("Unable to compute topology", e);
             }
         }
