diff --git a/apps/mlb/src/main/java/org/onosproject/mlb/MastershipLoadBalancer.java b/apps/mlb/src/main/java/org/onosproject/mlb/MastershipLoadBalancer.java
index 6c194f7..0dfa0b6 100644
--- a/apps/mlb/src/main/java/org/onosproject/mlb/MastershipLoadBalancer.java
+++ b/apps/mlb/src/main/java/org/onosproject/mlb/MastershipLoadBalancer.java
@@ -23,8 +23,12 @@
 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.Modified;
+import org.apache.felix.scr.annotations.Property;
 import org.apache.felix.scr.annotations.Reference;
 import org.apache.felix.scr.annotations.ReferenceCardinality;
+import org.onlab.util.Tools;
+import org.onosproject.cfg.ComponentConfigService;
 import org.onosproject.cluster.ClusterService;
 import org.onosproject.cluster.LeadershipEvent;
 import org.onosproject.cluster.LeadershipEventListener;
@@ -34,8 +38,10 @@
 import org.onosproject.mastership.MastershipEvent;
 import org.onosproject.mastership.MastershipListener;
 import org.onosproject.mastership.MastershipService;
+import org.osgi.service.component.ComponentContext;
 import org.slf4j.Logger;
 
+import java.util.Dictionary;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -56,8 +62,11 @@
 
     private final Logger log = getLogger(getClass());
 
-    // TODO: parameterize via component config
-    private static final int SCHEDULE_PERIOD = 5;
+    private static final int DEFAULT_SCHEDULE_PERIOD = 5;
+    @Property(name = "schedulePeriod", intValue = DEFAULT_SCHEDULE_PERIOD,
+            label = "Period to schedule balancing the mastership to be shared as evenly as by all online instances.")
+    private int schedulePeriod = DEFAULT_SCHEDULE_PERIOD;
+
     private static final String REBALANCE_MASTERSHIP = "rebalance/mastership";
 
     private NodeId localId;
@@ -78,6 +87,9 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ClusterService clusterService;
 
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected ComponentConfigService cfgService;
+
     private InnerLeadershipListener leadershipListener = new InnerLeadershipListener();
 
     /* This listener is used to trigger balancing for any mastership event which will include switches changing state
@@ -91,7 +103,9 @@
             listeningDecorator(newSingleThreadScheduledExecutor(groupedThreads("MastershipLoadBalancer", "%d", log)));
 
     @Activate
-    public void activate() {
+    public void activate(ComponentContext context) {
+        cfgService.registerProperties(getClass());
+        modified(context);
         mastershipService.addListener(mastershipListener);
         localId = clusterService.getLocalNode().id();
         leadershipService.addListener(leadershipListener);
@@ -101,6 +115,7 @@
 
     @Deactivate
     public void deactivate() {
+        cfgService.unregisterProperties(getClass(), false);
         mastershipService.removeListener(mastershipListener);
         leadershipService.withdraw(REBALANCE_MASTERSHIP);
         leadershipService.removeListener(leadershipListener);
@@ -109,6 +124,14 @@
         log.info("Stopped");
     }
 
+    @Modified
+    public void modified(ComponentContext context) {
+        readComponentConfiguration(context);
+        cancelBalance();
+        scheduleBalance();
+        log.info("modified");
+    }
+
     private synchronized void processLeaderChange(NodeId newLeader) {
         boolean currLeader = newLeader.equals(localId);
         if (isLeader.getAndSet(currLeader) != currLeader) {
@@ -125,7 +148,7 @@
 
             ListenableScheduledFuture task =
                     executorService.schedule(mastershipAdminService::balanceRoles,
-                            SCHEDULE_PERIOD, TimeUnit.SECONDS);
+                            schedulePeriod, TimeUnit.SECONDS);
             task.addListener(() -> {
                         log.info("Completed balance roles");
                         nextTask.set(null);
@@ -144,6 +167,26 @@
         }
     }
 
+    /**
+     * Extracts properties from the component configuration context.
+     *
+     * @param context the component context
+     */
+    private void readComponentConfiguration(ComponentContext context) {
+        Dictionary<?, ?> properties = context.getProperties();
+
+        Integer newSchedulePeriod = Tools.getIntegerProperty(properties,
+                                                             "schedulePeriod");
+        if (newSchedulePeriod == null) {
+            schedulePeriod = DEFAULT_SCHEDULE_PERIOD;
+            log.info("Schedule period is not configured, default value is {}",
+                     DEFAULT_SCHEDULE_PERIOD);
+        } else {
+            schedulePeriod = newSchedulePeriod;
+            log.info("Configured. Schedule period is configured to {}", schedulePeriod);
+        }
+    }
+
     private class InnerMastershipListener implements MastershipListener {
 
         @Override
