diff --git a/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java b/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java
index a311002..408a893 100644
--- a/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java
+++ b/core/api/src/main/java/org/onosproject/cfg/ComponentConfigService.java
@@ -63,6 +63,16 @@
     void setProperty(String componentName, String name, String value);
 
     /**
+     * Presets the value of the specified configuration property, regardless
+     * of the component's state.
+     *
+     * @param componentName component name
+     * @param name          property name
+     * @param value         new property value
+     */
+    void preSetProperty(String componentName, String name, String value);
+
+    /**
      * Clears the value of the specified configuration property thus making
      * the property take on its default value.
      *
@@ -72,3 +82,4 @@
     void unsetProperty(String componentName, String name);
 
 }
+
diff --git a/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java b/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java
index bff4195..0fccef8 100644
--- a/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java
+++ b/core/api/src/test/java/org/onosproject/cfg/ComponentConfigAdapter.java
@@ -50,6 +50,10 @@
     }
 
     @Override
+    public void preSetProperty(String componentName, String name, String value) {
+    }
+
+    @Override
     public void unsetProperty(String componentName, String name) {
 
     }
diff --git a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java
index 74ba193..6678db2 100644
--- a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java
+++ b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigLoader.java
@@ -18,19 +18,14 @@
 
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
 import org.apache.felix.scr.annotations.Activate;
 import org.apache.felix.scr.annotations.Component;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
-import org.onlab.util.SharedExecutors;
 import org.onosproject.cfg.ComponentConfigService;
 import org.slf4j.Logger;
 
 import java.io.File;
-import java.util.Set;
-import java.util.TimerTask;
 
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -44,50 +39,31 @@
     private static final String CFG_JSON = "../config/component-cfg.json";
     static File cfgFile = new File(CFG_JSON);
 
-    protected int retryDelay = 5_000; // millis between retries
-    protected int stopRetryTime = 60_000; // deadline in millis
-
     private final Logger log = getLogger(getClass());
 
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ComponentConfigService configService;
 
     private ObjectNode root;
-    private final Set<String> pendingComponents = Sets.newHashSet();
-    private long initialTimestamp;
-
-    // TimerTask object that calls the load configuration for each component
-    // in the pending components set and cancels itself if the set is empty or
-    // after a set period of time.
-    protected final TimerTask loader = new TimerTask() {
-
-        @Override
-        public void run() {
-            ImmutableSet.copyOf(pendingComponents)
-                    .forEach(k -> loadConfig(k, (ObjectNode) root.path(k)));
-            if (pendingComponents.isEmpty()
-                    || System.currentTimeMillis() - initialTimestamp >= stopRetryTime) {
-                this.cancel();
-            }
-        }
-    };
 
     @Activate
     protected void activate() {
-        initialTimestamp = System.currentTimeMillis();
         this.loadConfigs();
         log.info("Started");
     }
 
     // Loads the configurations for each component from the file in
-    // ../config/component-cfg.json, adds them to a set and schedules a task
-    // to try and load them.
+    // ../config/component-cfg.json, using the preSetProperty method.
     private void loadConfigs() {
         try {
             if (cfgFile.exists()) {
                 root = (ObjectNode) new ObjectMapper().readTree(cfgFile);
-                root.fieldNames().forEachRemaining(pendingComponents::add);
-                SharedExecutors.getTimer().schedule(loader, 0, retryDelay);
+                root.fieldNames().
+                        forEachRemaining(component -> root.path(component).fieldNames()
+                                .forEachRemaining(k -> configService
+                                        .preSetProperty(component, k,
+                                                        root.path(component).path(k)
+                                                                .asText())));
                 log.info("Loaded initial component configuration from {}", cfgFile);
             }
         } catch (Exception e) {
@@ -95,15 +71,4 @@
                      cfgFile, e);
         }
     }
-
-    // Loads a configuration for a single component and removes it from the
-    // components set.
-    private void loadConfig(String component, ObjectNode config) {
-        if (configService.getComponentNames().contains(component)) {
-            config.fieldNames()
-                    .forEachRemaining(k -> configService.setProperty(component, k,
-                                                                     config.path(k).asText()));
-            pendingComponents.remove(component);
-        }
-    }
 }
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
index 5d5d73f..b3b22c7 100644
--- a/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
+++ b/core/net/src/main/java/org/onosproject/cfg/impl/ComponentConfigManager.java
@@ -172,6 +172,17 @@
     }
 
     @Override
+    public void preSetProperty(String componentName, String name, String value) {
+
+        checkPermission(CONFIG_WRITE);
+
+        checkNotNull(componentName, COMPONENT_NULL);
+        checkNotNull(name, PROPERTY_NULL);
+
+        store.setProperty(componentName, name, value);
+    }
+
+    @Override
     public void unsetProperty(String componentName, String name) {
         checkPermission(CONFIG_WRITE);
 
diff --git a/core/net/src/test/java/org/onosproject/cfg/impl/ComponentConfigLoaderTest.java b/core/net/src/test/java/org/onosproject/cfg/impl/ComponentConfigLoaderTest.java
index 03e2184..0320cf7 100644
--- a/core/net/src/test/java/org/onosproject/cfg/impl/ComponentConfigLoaderTest.java
+++ b/core/net/src/test/java/org/onosproject/cfg/impl/ComponentConfigLoaderTest.java
@@ -21,17 +21,17 @@
 import org.junit.Before;
 import org.junit.Test;
 import org.onosproject.cfg.ComponentConfigAdapter;
+import org.slf4j.Logger;
 
 import java.io.File;
 import java.io.IOException;
-import java.lang.reflect.Field;
 import java.util.Set;
-import java.util.TimerTask;
 
 import static com.google.common.io.ByteStreams.toByteArray;
 import static com.google.common.io.Files.write;
-import static org.junit.Assert.*;
-import static org.onlab.junit.TestTools.assertAfter;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.slf4j.LoggerFactory.getLogger;
 
 /**
  * UnitTest for ComponentLoader.
@@ -46,6 +46,8 @@
 
     private TestConfigService service;
 
+    private final Logger log = getLogger(getClass());
+
     /*
      * Method to SetUp the test environment with test file, a config loader a service,
      * and assign it to the loader.configService for the test.
@@ -56,8 +58,6 @@
         loader = new ComponentConfigLoader();
         service = new TestConfigService();
         loader.configService = service;
-        loader.retryDelay = 50;
-        loader.stopRetryTime = 200;
     }
 
     /*
@@ -67,7 +67,7 @@
     public void basics() throws IOException {
         stageTestResource("basic.json");
         loader.activate();
-        assertAfter(1_000, () -> assertEquals("incorrect component", FOO_COMPONENT, service.component));
+        assertEquals("incorrect component", FOO_COMPONENT, service.component);
     }
 
     /*
@@ -79,28 +79,7 @@
     public void badConfig() throws IOException {
         stageTestResource("badConfig.json");
         loader.activate();
-        assertAfter(1_000, () -> assertNull("incorrect configuration", service.component));
-
-    }
-
-    /*
-     * Tests that tasks stops itself after the stopRetryTime if the component was
-     * not loaded.
-     */
-    @Test
-    public void noComponentForConfig() throws IOException {
-        stageTestResource("badComponent.json");
-        loader.activate();
-        assertAfter(loader.stopRetryTime + loader.retryDelay, () -> {
-            try {
-                Field state = TimerTask.class.getDeclaredField("state");
-                state.setAccessible(true);
-                assertEquals("incorrect component", state.getInt(loader.loader), 3);
-            } catch (Exception e) {
-                e.printStackTrace();
-                fail();
-            }
-        });
+        assertNull("incorrect configuration", service.component);
 
     }
 
@@ -117,9 +96,9 @@
      */
     private class TestConfigService extends ComponentConfigAdapter {
 
-        private String component;
-        private String name;
-        private String value;
+        protected String component;
+        protected String name;
+        protected String value;
 
         @Override
         public Set<String> getComponentNames() {
@@ -127,7 +106,17 @@
         }
 
         @Override
+        public void preSetProperty(String componentName, String name, String value) {
+            log.info("preSet");
+            this.component = componentName;
+            this.name = name;
+            this.value = value;
+
+        }
+
+        @Override
         public void setProperty(String componentName, String name, String value) {
+            log.info("Set");
             this.component = componentName;
             this.name = name;
             this.value = value;
