diff --git a/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java b/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
index cea8322..c4bb8c8 100644
--- a/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
+++ b/src/main/java/org/onosproject/segmentrouting/DeviceConfiguration.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Open Networking Laboratory
+ * Copyright 2014-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.
@@ -18,15 +18,13 @@
 import com.google.common.collect.Lists;
 import org.onlab.packet.Ip4Address;
 import org.onlab.packet.Ip4Prefix;
-import org.onlab.packet.IpPrefix;
 import org.onlab.packet.MacAddress;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.segmentrouting.config.SegmentRoutingConfig;
+import org.onosproject.segmentrouting.config.SegmentRoutingConfig.AdjacencySid;
 import org.onosproject.segmentrouting.grouphandler.DeviceProperties;
 import org.onosproject.net.DeviceId;
 import org.onosproject.net.PortNumber;
-import org.onosproject.segmentrouting.config.NetworkConfig.SwitchConfig;
-import org.onosproject.segmentrouting.config.NetworkConfigManager;
-import org.onosproject.segmentrouting.config.SegmentRouterConfig;
-import org.onosproject.segmentrouting.config.SegmentRouterConfig.Subnet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,6 +34,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * Segment Routing configuration component that reads the
@@ -50,7 +49,7 @@
             .getLogger(DeviceConfiguration.class);
     private final List<Integer> allSegmentIds = new ArrayList<>();
     private final HashMap<DeviceId, SegmentRouterInfo> deviceConfigMap = new HashMap<>();
-    private final NetworkConfigManager configService;
+    private final NetworkConfigRegistry configService;
 
     private class SegmentRouterInfo {
         int nodeSid;
@@ -60,48 +59,39 @@
         boolean isEdge;
         HashMap<PortNumber, Ip4Address> gatewayIps;
         HashMap<PortNumber, Ip4Prefix> subnets;
-        List<SegmentRouterConfig.AdjacencySid> adjacencySids;
+        List<AdjacencySid> adjacencySids;
     }
 
     /**
      * Constructor. Reads all the configuration for all devices of type
      * Segment Router and organizes into various maps for easier access.
      *
-     * @param configService handle to network configuration manager
+     * @param cfgService handle to network configuration manager
      * component from where the relevant configuration is retrieved.
      */
-    public DeviceConfiguration(NetworkConfigManager configService) {
-        this.configService = checkNotNull(configService);
-        List<SwitchConfig> allSwitchCfg =
-                this.configService.getConfiguredAllowedSwitches();
-        for (SwitchConfig cfg : allSwitchCfg) {
-            if (!(cfg instanceof SegmentRouterConfig)) {
-                continue;
-            }
+    public DeviceConfiguration(NetworkConfigRegistry cfgService) {
+        this.configService = checkNotNull(cfgService);
+
+        Set<DeviceId> subjectSet =
+                cfgService.getSubjects(DeviceId.class, SegmentRoutingConfig.class);
+
+        subjectSet.forEach(subject -> {
+            SegmentRoutingConfig config =
+                cfgService.getConfig(subject, SegmentRoutingConfig.class);
             SegmentRouterInfo info = new SegmentRouterInfo();
-            info.nodeSid = ((SegmentRouterConfig) cfg).getNodeSid();
-            info.deviceId = cfg.getDpid();
-            info.mac = MacAddress.valueOf(((
-                    SegmentRouterConfig) cfg).getRouterMac());
-            String routerIp = ((SegmentRouterConfig) cfg).getRouterIp();
-            Ip4Prefix prefix = checkNotNull(IpPrefix.valueOf(routerIp).getIp4Prefix());
-            info.ip = prefix.address();
-            info.isEdge = ((SegmentRouterConfig) cfg).isEdgeRouter();
-            info.subnets = new HashMap<>();
+            info.nodeSid = config.getSid();
+            info.deviceId = subject;
+            info.ip = config.getIp();
+            info.mac = config.getMac();
+            info.isEdge = config.isEdgeRouter();
+            // TODO fecth subnet and gateway information via port subject
             info.gatewayIps = new HashMap<>();
-            for (Subnet s: ((SegmentRouterConfig) cfg).getSubnets()) {
-                info.subnets.put(PortNumber.portNumber(s.getPortNo()),
-                                 Ip4Prefix.valueOf(s.getSubnetIp()));
-                String gatewayIp = s.getSubnetIp().
-                        substring(0, s.getSubnetIp().indexOf('/'));
-                info.gatewayIps.put(PortNumber.portNumber(s.getPortNo()),
-                                    Ip4Address.valueOf(gatewayIp));
-            }
-            info.adjacencySids = ((SegmentRouterConfig) cfg).getAdjacencySids();
+            info.subnets = new HashMap<>();
+            info.adjacencySids = config.getAdjacencySids();
+
             this.deviceConfigMap.put(info.deviceId, info);
             this.allSegmentIds.add(info.nodeSid);
-
-        }
+        });
     }
 
     /**
@@ -379,8 +369,8 @@
      */
     public List<Integer> getPortsForAdjacencySid(DeviceId deviceId, int sid) {
         if (deviceConfigMap.get(deviceId) != null) {
-            for (SegmentRouterConfig.AdjacencySid asid : deviceConfigMap.get(deviceId).adjacencySids) {
-                if (asid.getAdjSid() == sid) {
+            for (AdjacencySid asid : deviceConfigMap.get(deviceId).adjacencySids) {
+                if (asid.getSid() == sid) {
                     return asid.getPorts();
                 }
             }
@@ -402,9 +392,9 @@
             if (deviceConfigMap.get(deviceId).adjacencySids.isEmpty()) {
                 return false;
             } else {
-                for (SegmentRouterConfig.AdjacencySid asid:
+                for (AdjacencySid asid:
                         deviceConfigMap.get(deviceId).adjacencySids) {
-                    if (asid.getAdjSid() == sid) {
+                    if (asid.getSid() == sid) {
                         return true;
                     }
                 }
@@ -414,4 +404,4 @@
 
         return false;
     }
-}
+}
\ No newline at end of file
diff --git a/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java b/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
index 874faab..764bed3 100644
--- a/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
+++ b/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
@@ -27,6 +27,12 @@
 import org.onosproject.core.ApplicationId;
 import org.onosproject.core.CoreService;
 import org.onosproject.event.Event;
+import org.onosproject.net.config.ConfigFactory;
+import org.onosproject.net.config.NetworkConfigEvent;
+import org.onosproject.net.config.NetworkConfigRegistry;
+import org.onosproject.net.config.NetworkConfigListener;
+import org.onosproject.net.config.basics.SubjectFactories;
+import org.onosproject.segmentrouting.config.SegmentRoutingConfig;
 import org.onosproject.segmentrouting.grouphandler.DefaultGroupHandler;
 import org.onosproject.segmentrouting.grouphandler.NeighborSet;
 import org.onosproject.segmentrouting.grouphandler.NeighborSetNextObjectiveStoreKey;
@@ -50,7 +56,6 @@
 import org.onosproject.net.packet.PacketProcessor;
 import org.onosproject.net.packet.PacketService;
 import org.onosproject.net.topology.TopologyService;
-import org.onosproject.segmentrouting.config.NetworkConfigManager;
 import org.onosproject.store.service.EventuallyConsistentMap;
 import org.onosproject.store.service.EventuallyConsistentMapBuilder;
 import org.onosproject.store.service.StorageService;
@@ -133,7 +138,19 @@
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected StorageService storageService;
 
-    private NetworkConfigManager networkConfigService = new NetworkConfigManager();;
+    @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
+    protected NetworkConfigRegistry cfgService;
+
+    private final InternalConfigListener cfgListener = new InternalConfigListener();
+    private final ConfigFactory cfgFactory =
+            new ConfigFactory(SubjectFactories.DEVICE_SUBJECT_FACTORY,
+                              SegmentRoutingConfig.class,
+                              "segmentrouting") {
+                @Override
+                public SegmentRoutingConfig createConfig() {
+                    return new SegmentRoutingConfig();
+                }
+            };
 
     private Object threadSchedulerLock = new Object();
     private static int numOfEventsQueued = 0;
@@ -192,8 +209,10 @@
                 .withTimestampProvider((k, v) -> new WallClockTimestamp())
                 .build();
 
-        networkConfigService.init();
-        deviceConfiguration = new DeviceConfiguration(networkConfigService);
+        cfgService.addListener(cfgListener);
+        cfgService.registerConfigFactory(cfgFactory);
+        deviceConfiguration = new DeviceConfiguration(cfgService);
+
         arpHandler = new ArpHandler(this);
         icmpHandler = new IcmpHandler(this);
         ipHandler = new IpHandler(this);
@@ -230,6 +249,9 @@
 
     @Deactivate
     protected void deactivate() {
+        cfgService.removeListener(cfgListener);
+        cfgService.unregisterConfigFactory(cfgFactory);
+
         packetService.removeProcessor(processor);
         processor = null;
         log.info("Stopped");
@@ -512,6 +534,15 @@
         }
     }
 
-
-
+    private class InternalConfigListener implements NetworkConfigListener {
+        @Override
+        public void event(NetworkConfigEvent event) {
+            if ((event.type() == NetworkConfigEvent.Type.CONFIG_ADDED ||
+                    event.type() == NetworkConfigEvent.Type.CONFIG_UPDATED) &&
+                    event.configClass().equals(SegmentRoutingConfig.class)) {
+                // TODO Support dynamic configuration in the future
+                return;
+            }
+        }
+    }
 }
diff --git a/src/main/java/org/onosproject/segmentrouting/config/NetworkConfig.java b/src/main/java/org/onosproject/segmentrouting/config/NetworkConfig.java
deleted file mode 100644
index 0c7749e..0000000
--- a/src/main/java/org/onosproject/segmentrouting/config/NetworkConfig.java
+++ /dev/null
@@ -1,351 +0,0 @@
-/*
- * 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.segmentrouting.config;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.onosproject.net.DeviceId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.JsonNode;
-
-/**
- * Public class corresponding to JSON described data model. Defines the network
- * configuration at startup.
- */
-public class NetworkConfig {
-    protected static final Logger log = LoggerFactory.getLogger(NetworkConfig.class);
-
-    @SuppressWarnings("unused")
-    private String comment;
-
-    private Boolean restrictSwitches;
-    private Boolean restrictLinks;
-    private List<SwitchConfig> switches;
-    private List<LinkConfig> links;
-
-    /**
-     * Default constructor.
-     */
-    public NetworkConfig() {
-        switches = new ArrayList<>();
-        links = new ArrayList<>();
-    }
-
-    @JsonProperty("comment")
-    public void setComment(String c) {
-        log.trace("NetworkConfig: comment={}", c);
-        comment = c;
-    }
-
-    @JsonProperty("restrictSwitches")
-    public void setRestrictSwitches(boolean rs) {
-        log.trace("NetworkConfig: restrictSwitches={}", rs);
-        restrictSwitches = rs;
-    }
-
-    /**
-     * Returns default restrict configuration for switches.
-     *
-     * @return boolean
-     */
-    public Boolean getRestrictSwitches() {
-        return restrictSwitches;
-    }
-
-    @JsonProperty("restrictLinks")
-    public void setRestrictLinks(boolean rl) {
-        log.trace("NetworkConfig: restrictLinks={}", rl);
-        restrictLinks = rl;
-    }
-
-    /**
-     * Returns default restrict configuration for links.
-     *
-     * @return boolean
-     */
-    public Boolean getRestrictLinks() {
-        return restrictLinks;
-    }
-
-    /**
-     * Returns configuration for switches.
-     *
-     * @return list of switch configuration
-     */
-    public List<SwitchConfig> getSwitchConfig() {
-        return switches;
-    }
-
-    @JsonProperty("switchConfig")
-    public void setSwitchConfig(List<SwitchConfig> switches2) {
-        log.trace("NetworkConfig: switchConfig={}", switches2);
-        this.switches = switches2;
-    }
-
-    /**
-     * Java class corresponding to JSON described switch
-     * configuration data model.
-     */
-    public static class SwitchConfig {
-        protected String nodeDpid;
-        protected String name;
-        protected String type;
-        protected boolean allowed;
-        protected double latitude;
-        protected double longitude;
-        protected Map<String, JsonNode> params;
-        protected Map<String, String> publishAttributes;
-        protected DeviceId dpid;
-
-        /**
-         * Returns the configured "name" of a switch.
-         *
-         * @return string
-         */
-        public String getName() {
-            return name;
-        }
-
-        @JsonProperty("name")
-        public void setName(String name) {
-            log.trace("SwitchConfig: name={}", name);
-            this.name = name;
-        }
-
-        /**
-         * Returns the data plane identifier of a switch.
-         *
-         * @return ONOS device identifier
-         */
-        public DeviceId getDpid() {
-            return dpid;
-        }
-
-        public void setDpid(DeviceId dpid) {
-            this.dpid = dpid;
-            this.nodeDpid = dpid.toString();
-        }
-
-        /**
-         * Returns the data plane identifier of a switch.
-         *
-         * @return string
-         */
-        public String getNodeDpid() {
-            return nodeDpid;
-        }
-
-        // mapper sets both DeviceId and string fields for dpid
-        @JsonProperty("nodeDpid")
-        public void setNodeDpid(String nodeDpid) {
-            log.trace("SwitchConfig: nodeDpid={}", nodeDpid);
-            this.nodeDpid = nodeDpid;
-            this.dpid = DeviceId.deviceId(nodeDpid);
-        }
-
-        /**
-         * Returns the type of a switch.
-         *
-         * @return string
-         */
-        public String getType() {
-            return type;
-        }
-
-        @JsonProperty("type")
-        public void setType(String type) {
-            log.trace("SwitchConfig: type={}", type);
-            this.type = type;
-        }
-
-        /**
-         * Returns the latitude of a switch.
-         *
-         * @return double
-         */
-        public double getLatitude() {
-            return latitude;
-        }
-
-        @JsonProperty("latitude")
-        public void setLatitude(double latitude) {
-            log.trace("SwitchConfig: latitude={}", latitude);
-            this.latitude = latitude;
-        }
-
-        /**
-         * Returns the longitude of a switch.
-         *
-         * @return double
-         */
-        public double getLongitude() {
-            return longitude;
-        }
-
-        @JsonProperty("longitude")
-        public void setLongitude(double longitude) {
-            log.trace("SwitchConfig: longitude={}", longitude);
-            this.longitude = longitude;
-        }
-
-        /**
-         * Returns the allowed flag for a switch.
-         *
-         * @return boolean
-         */
-        public boolean isAllowed() {
-            return allowed;
-        }
-
-        @JsonProperty("allowed")
-        public void setAllowed(boolean allowed) {
-            this.allowed = allowed;
-        }
-
-        /**
-         * Returns the additional configured parameters of a switch.
-         *
-         * @return key value map
-         */
-        public Map<String, JsonNode> getParams() {
-            return params;
-        }
-
-        @JsonProperty("params")
-        public void setParams(Map<String, JsonNode> params) {
-            this.params = params;
-        }
-
-        /**
-         * Reserved for future use.
-         *
-         * @return key value map
-         */
-        public Map<String, String> getPublishAttributes() {
-            return publishAttributes;
-        }
-
-        @JsonProperty("publishAttributes")
-        public void setPublishAttributes(Map<String, String> publishAttributes) {
-            this.publishAttributes = publishAttributes;
-        }
-
-    }
-
-    @JsonProperty("linkConfig")
-    public void setLinkConfig(List<LinkConfig> links2) {
-        this.links = links2;
-    }
-
-    /**
-     * Reserved for future use.
-     *
-     * @return list of configured link configuration
-     */
-    public List<LinkConfig> getLinkConfig() {
-        return links;
-    }
-
-    /**
-     * Reserved for future use.
-     */
-    public static class LinkConfig {
-        protected String type;
-        protected Boolean allowed;
-        protected DeviceId dpid1;
-        protected DeviceId dpid2;
-        protected String nodeDpid1;
-        protected String nodeDpid2;
-        protected Map<String, JsonNode> params;
-        protected Map<String, String> publishAttributes;
-
-        public String getType() {
-            return type;
-        }
-
-        public void setType(String type) {
-            this.type = type;
-        }
-
-        public Boolean isAllowed() {
-            return allowed;
-        }
-
-        public void setAllowed(Boolean allowed) {
-            this.allowed = allowed;
-        }
-
-        public String getNodeDpid1() {
-            return nodeDpid1;
-        }
-
-        // mapper sets both long and string fields for dpid
-        public void setNodeDpid1(String nodeDpid1) {
-            this.nodeDpid1 = nodeDpid1;
-            this.dpid1 = DeviceId.deviceId(nodeDpid1);
-        }
-
-        public String getNodeDpid2() {
-            return nodeDpid2;
-        }
-
-        // mapper sets both long and string fields for dpid
-        public void setNodeDpid2(String nodeDpid2) {
-            this.nodeDpid2 = nodeDpid2;
-            this.dpid2 = DeviceId.deviceId(nodeDpid2);
-        }
-
-        public DeviceId getDpid1() {
-            return dpid1;
-        }
-
-        public void setDpid1(DeviceId dpid1) {
-            this.dpid1 = dpid1;
-            this.nodeDpid1 = dpid1.toString();
-        }
-
-        public DeviceId getDpid2() {
-            return dpid2;
-        }
-
-        public void setDpid2(DeviceId dpid2) {
-            this.dpid2 = dpid2;
-            this.nodeDpid2 = dpid2.toString();
-        }
-
-        public Map<String, JsonNode> getParams() {
-            return params;
-        }
-
-        public void setParams(Map<String, JsonNode> params) {
-            this.params = params;
-        }
-
-        public Map<String, String> getPublishAttributes() {
-            return publishAttributes;
-        }
-
-        public void setPublishAttributes(Map<String, String> publishAttributes) {
-            this.publishAttributes = publishAttributes;
-        }
-    }
-}
-
diff --git a/src/main/java/org/onosproject/segmentrouting/config/NetworkConfigException.java b/src/main/java/org/onosproject/segmentrouting/config/NetworkConfigException.java
deleted file mode 100644
index 0c0dac8..0000000
--- a/src/main/java/org/onosproject/segmentrouting/config/NetworkConfigException.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * 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.segmentrouting.config;
-
-import org.onosproject.net.DeviceId;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * NetworkConfigExceptions specifies a set of unchecked runtime exceptions that
- * can be thrown by the {@link NetworkConfigManager}. It indicates errors that
- * must be fixed in the config file before controller execution can proceed.
- */
-public class NetworkConfigException extends RuntimeException {
-
-    private static final long serialVersionUID = 4959684709803000652L;
-    protected static final Logger log = LoggerFactory
-            .getLogger(NetworkConfigException.class);
-
-    /**
-     * Exception for duplicate device identifier configuration.
-     */
-    public static class DuplicateDpid extends RuntimeException {
-        private static final long serialVersionUID = 5491113234592145335L;
-
-        public DuplicateDpid(DeviceId dpid) {
-            super();
-            log.error("Duplicate dpid found in switch-config Dpid:{}",
-                    dpid);
-        }
-    }
-
-    /**
-     * Exception for duplicate device name configuration.
-     */
-    public static class DuplicateName extends RuntimeException {
-        private static final long serialVersionUID = -4090171438031376129L;
-
-        public DuplicateName(String name) {
-            super();
-            log.error("Duplicate name found in switch-config name:{}", name);
-        }
-    }
-
-    /**
-     * Exception for unspecified device identifier for a switch.
-     */
-    public static class DpidNotSpecified extends RuntimeException {
-        private static final long serialVersionUID = -8494418855597117254L;
-
-        public DpidNotSpecified(String name) {
-            super();
-            log.error("Dpid not specified for switch-config name:{}", name);
-        }
-    }
-
-    /**
-     * Exception for unspecified device name for a switch.
-     */
-    public static class NameNotSpecified extends RuntimeException {
-        private static final long serialVersionUID = -3518881744110422891L;
-
-        public NameNotSpecified(DeviceId dpid) {
-            super();
-            log.error("Name not specified for switch-config dpid:{}",
-                    dpid);
-        }
-    }
-
-    /**
-     * Exception for unspecified device type for a switch.
-     */
-    public static class SwitchTypeNotSpecified extends RuntimeException {
-        private static final long serialVersionUID = 2527453336226053753L;
-
-        public SwitchTypeNotSpecified(DeviceId dpid) {
-            super();
-            log.error("Switch type not specified for switch-config dpid:{}",
-                    dpid);
-        }
-    }
-
-    /**
-     * Exception for unknown device type configured for a switch.
-     */
-    public static class UnknownSwitchType extends RuntimeException {
-        private static final long serialVersionUID = 7758418165512249170L;
-
-        public UnknownSwitchType(String type, String name) {
-            super();
-            log.error("Unknown switch type {} for switch name:{}", type, name);
-        }
-    }
-
-    /**
-     * Exception for missing required parameter configuration for a switch.
-     */
-    public static class ParamsNotSpecified extends RuntimeException {
-        private static final long serialVersionUID = 6247582323691265513L;
-
-        public ParamsNotSpecified(String name) {
-            super();
-            log.error("Params required - not specified for switch:{}", name);
-        }
-    }
-
-    /**
-     * Reserved for future use.
-     */
-    public static class LinkTypeNotSpecified extends RuntimeException {
-        private static final long serialVersionUID = -2089470389588542215L;
-
-        public LinkTypeNotSpecified(String dpid1, String dpid2) {
-            super();
-            log.error("Link type not specified for link-config between "
-                    + "dpid1:{} and dpid2:{}", dpid1, dpid2);
-        }
-    }
-
-    /**
-     * Reserved for future use.
-     */
-    public static class LinkDpidNotSpecified extends RuntimeException {
-        private static final long serialVersionUID = -5701825916378616004L;
-
-        public LinkDpidNotSpecified(String dpid1, String dpid2) {
-            super();
-            if (dpid1 == null) {
-                log.error("nodeDpid1 not specified for link-config ");
-            }
-            if (dpid2 == null) {
-                log.error("nodeDpid2 not specified for link-config ");
-            }
-        }
-    }
-
-    /**
-     * Reserved for future use.
-     */
-    public static class LinkForUnknownSwitchConfig extends RuntimeException {
-        private static final long serialVersionUID = -2910458439881964094L;
-
-        public LinkForUnknownSwitchConfig(String dpid) {
-            super();
-            log.error("Link configuration was specified for a switch-dpid {} "
-                    + "that has not been configured", dpid);
-        }
-    }
-
-    /**
-     * Reserved for future use.
-     */
-    public static class UnknownLinkType extends RuntimeException {
-        private static final long serialVersionUID = -5505376193106542305L;
-
-        public UnknownLinkType(String linktype, String dpid1, String dpid2) {
-            super();
-            log.error("unknown link type {} for links between dpid1:{} "
-                    + "and dpid2:{}", linktype, dpid1, dpid2);
-        }
-    }
-
-    /**
-     * Exception for generic configuration errors.
-     */
-    public static class ErrorConfig extends RuntimeException {
-        private static final long serialVersionUID = -2827406314700193147L;
-
-        public ErrorConfig(String errorMsg) {
-            super();
-            log.error(errorMsg);
-        }
-
-    }
-
-    /**
-     * Reserved for future use.
-     */
-    public static class SwitchDpidNotConverted extends RuntimeException {
-        private static final long serialVersionUID = 5640347104590170426L;
-
-        public SwitchDpidNotConverted(String name) {
-            super();
-            log.error("Switch dpid specified as a HexString {} does not match "
-                    + "with long value", name);
-        }
-    }
-
-    /**
-     * Reserved for future use.
-     */
-    public static class LinkDpidNotConverted extends RuntimeException {
-        private static final long serialVersionUID = 2397245646094080774L;
-
-        public LinkDpidNotConverted(String dpid1, String dpid2) {
-            log.error("Dpids expressed as HexStrings for links between dpid1:{} "
-                    + "and dpid2:{} do not match with long values", dpid1, dpid2);
-        }
-    }
-
-}
-
diff --git a/src/main/java/org/onosproject/segmentrouting/config/NetworkConfigManager.java b/src/main/java/org/onosproject/segmentrouting/config/NetworkConfigManager.java
deleted file mode 100644
index f034f37..0000000
--- a/src/main/java/org/onosproject/segmentrouting/config/NetworkConfigManager.java
+++ /dev/null
@@ -1,338 +0,0 @@
-/*
- * 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.segmentrouting.config;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link;
-import org.onosproject.segmentrouting.config.NetworkConfig.LinkConfig;
-import org.onosproject.segmentrouting.config.NetworkConfig.SwitchConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/**
- * NetworkConfigManager manages all network configuration for switches, links
- * and any other state that needs to be configured for correct network
- * operation.
- *
- */
-public class NetworkConfigManager implements NetworkConfigService {
-    protected static final Logger log = LoggerFactory
-            .getLogger(NetworkConfigManager.class);
-    private static final String CONFIG_DIR = "../config";
-    private static final String DEFAULT_CONFIG_FILE = "segmentrouting.conf";
-    private final String configFileName = DEFAULT_CONFIG_FILE;
-    /**
-     * JSON Config file needs to use one of the following types for defining the
-     * kind of switch or link it wishes to configure.
-     */
-    public static final String SEGMENT_ROUTER = "Router_SR";
-
-    public static final String PKT_LINK = "pktLink";
-
-    NetworkConfig networkConfig;
-    private ConcurrentMap<DeviceId, SwitchConfig> configuredSwitches;
-    private ConcurrentMap<Link, LinkConfig> configuredLinks;
-    private Map<String, DeviceId> nameToDpid;
-
-    @Override
-    public SwitchConfigStatus checkSwitchConfig(DeviceId dpid) {
-        SwitchConfig swc = configuredSwitches.get(dpid);
-        if (networkConfig.getRestrictSwitches()) {
-            // default deny behavior
-            if (swc == null) {
-                // switch is not configured - we deny this switch
-                return new SwitchConfigStatus(NetworkConfigState.DENY, null,
-                        "Switch not configured, in network denying switches by default.");
-            }
-            if (swc.isAllowed()) {
-                // switch is allowed in config, return configured attributes
-                return new SwitchConfigStatus(NetworkConfigState.ACCEPT_ADD, swc);
-            } else {
-                // switch has been configured off (administratively down)
-                return new SwitchConfigStatus(NetworkConfigState.DENY, null,
-                        "Switch configured down (allowed=false).");
-            }
-        } else {
-            // default allow behavior
-            if (swc == null) {
-                // no config to add
-                return new SwitchConfigStatus(NetworkConfigState.ACCEPT, null);
-            }
-            if (swc.isAllowed()) {
-                // switch is allowed in config, return configured attributes
-                return new SwitchConfigStatus(NetworkConfigState.ACCEPT_ADD, swc);
-            } else {
-                // switch has been configured off (administratively down)
-                return new SwitchConfigStatus(NetworkConfigState.DENY, null,
-                        "Switch configured down (allowed=false).");
-            }
-        }
-
-    }
-
-    @Override
-    public LinkConfigStatus checkLinkConfig(Link linkTuple) {
-        LinkConfig lkc = getConfiguredLink(linkTuple);
-        // links are always disallowed if any one of the nodes that make up the
-        // link are disallowed
-        DeviceId linkNode1 = linkTuple.src().deviceId();
-        SwitchConfigStatus scs1 = checkSwitchConfig(linkNode1);
-        if (scs1.getConfigState() == NetworkConfigState.DENY) {
-            return new LinkConfigStatus(NetworkConfigState.DENY, null,
-                    "Link-node: " + linkNode1 + " denied by config: " + scs1.getMsg());
-        }
-        DeviceId linkNode2 = linkTuple.dst().deviceId();
-        SwitchConfigStatus scs2 = checkSwitchConfig(linkNode2);
-        if (scs2.getConfigState() == NetworkConfigState.DENY) {
-            return new LinkConfigStatus(NetworkConfigState.DENY, null,
-                    "Link-node: " + linkNode2 + " denied by config: " + scs2.getMsg());
-        }
-        if (networkConfig.getRestrictLinks()) {
-            // default deny behavior
-            if (lkc == null) {
-                // link is not configured - we deny this link
-                return new LinkConfigStatus(NetworkConfigState.DENY, null,
-                        "Link not configured, in network denying links by default.");
-            }
-            if (lkc.isAllowed()) {
-                // link is allowed in config, return configured attributes
-                return new LinkConfigStatus(NetworkConfigState.ACCEPT_ADD, lkc);
-            } else {
-                // link has been configured off (administratively down)
-                return new LinkConfigStatus(NetworkConfigState.DENY, null,
-                        "Link configured down (allowed=false).");
-            }
-        } else {
-            // default allow behavior
-            if (lkc == null) {
-                // no config to add
-                return new LinkConfigStatus(NetworkConfigState.ACCEPT, null);
-            }
-            if (lkc.isAllowed()) {
-                // link is allowed in config, return configured attributes
-                return new LinkConfigStatus(NetworkConfigState.ACCEPT_ADD, lkc);
-            } else {
-                // link has been configured off (administratively down)
-                return new LinkConfigStatus(NetworkConfigState.DENY, null,
-                        "Link configured down (allowed=false).");
-            }
-        }
-
-    }
-
-    @Override
-    public List<SwitchConfig> getConfiguredAllowedSwitches() {
-        List<SwitchConfig> allowed = new ArrayList<>();
-        for (SwitchConfig swc : configuredSwitches.values()) {
-            if (swc.isAllowed()) {
-                allowed.add(swc);
-            }
-        }
-        return allowed;
-    }
-
-    @Override
-    public List<LinkConfig> getConfiguredAllowedLinks() {
-        List<LinkConfig> allowed = new ArrayList<>();
-        for (LinkConfig lkc : configuredLinks.values()) {
-            if (lkc.isAllowed()) {
-                allowed.add(lkc);
-            }
-        }
-        return allowed;
-    }
-
-    @Override
-    public DeviceId getDpidForName(String name) {
-        if (nameToDpid.get(name) != null) {
-            return nameToDpid.get(name);
-        }
-        return null;
-    }
-
-    // **************
-    // Private methods
-    // **************
-
-    private void loadNetworkConfig() {
-        File configFile = new File(CONFIG_DIR, configFileName);
-        ObjectMapper mapper = new ObjectMapper();
-        networkConfig = new NetworkConfig();
-
-        try {
-            networkConfig = mapper.readValue(configFile,
-                                             NetworkConfig.class);
-        } catch (JsonParseException e) {
-            String err = String.format("JsonParseException while loading network "
-                    + "config from file: %s: %s", configFileName,
-                    e.getMessage());
-            throw new NetworkConfigException.ErrorConfig(err);
-        } catch (JsonMappingException e) {
-            String err = String.format(
-                    "JsonMappingException while loading network config "
-                            + "from file: %s: %s",
-                            configFileName,
-                            e.getMessage());
-            throw new NetworkConfigException.ErrorConfig(err);
-        } catch (IOException e) {
-            String err = String.format("IOException while loading network config "
-                    + "from file: %s %s", configFileName, e.getMessage());
-            throw new NetworkConfigException.ErrorConfig(err);
-        }
-
-        log.info("Network config specifies: {} switches and {} links",
-                (networkConfig.getRestrictSwitches())
-                        ? networkConfig.getSwitchConfig().size() : "default allow",
-                        (networkConfig.getRestrictLinks())
-                        ? networkConfig.getLinkConfig().size() : "default allow");
-    }
-
-    private void parseNetworkConfig() {
-        List<SwitchConfig> swConfList = networkConfig.getSwitchConfig();
-        List<LinkConfig> lkConfList = networkConfig.getLinkConfig();
-        validateSwitchConfig(swConfList);
-        createTypeSpecificSwitchConfig(swConfList);
-        validateLinkConfig(lkConfList);
-        createTypeSpecificLinkConfig(lkConfList);
-        // TODO validate reachability matrix 'names' for configured dpids
-    }
-
-    private void createTypeSpecificSwitchConfig(List<SwitchConfig> swConfList) {
-        for (SwitchConfig swc : swConfList) {
-            nameToDpid.put(swc.getName(), swc.getDpid());
-            String swtype = swc.getType();
-            switch (swtype) {
-            case SEGMENT_ROUTER:
-                SwitchConfig sr = new SegmentRouterConfig(swc);
-                configuredSwitches.put(sr.getDpid(), sr);
-                break;
-            default:
-                throw new NetworkConfigException.UnknownSwitchType(swtype,
-                        swc.getName());
-            }
-        }
-    }
-
-    private void createTypeSpecificLinkConfig(List<LinkConfig> lkConfList) {
-        for (LinkConfig lkc : lkConfList) {
-            String lktype = lkc.getType();
-            switch (lktype) {
-            case PKT_LINK:
-                PktLinkConfig pk = new PktLinkConfig(lkc);
-                for (Link lt : pk.getLinkTupleList()) {
-                    configuredLinks.put(lt, pk);
-                }
-                break;
-            default:
-                throw new NetworkConfigException.UnknownLinkType(lktype,
-                        lkc.getNodeDpid1(), lkc.getNodeDpid2());
-            }
-        }
-    }
-
-    private void validateSwitchConfig(List<SwitchConfig> swConfList) {
-        Set<DeviceId> swDpids = new HashSet<>();
-        Set<String> swNames = new HashSet<>();
-        for (SwitchConfig swc : swConfList) {
-            if (swc.getNodeDpid() == null || swc.getDpid() == null) {
-                throw new NetworkConfigException.DpidNotSpecified(swc.getName());
-            }
-            // ensure both String and DeviceId values of dpid are set
-            if (!swc.getDpid().equals(DeviceId.deviceId(swc.getNodeDpid()))) {
-                throw new NetworkConfigException.SwitchDpidNotConverted(
-                        swc.getName());
-            }
-            if (swc.getName() == null) {
-                throw new NetworkConfigException.NameNotSpecified(swc.getDpid());
-            }
-            if (swc.getType() == null) {
-                throw new NetworkConfigException.SwitchTypeNotSpecified(
-                        swc.getDpid());
-            }
-            if (!swDpids.add(swc.getDpid())) {
-                throw new NetworkConfigException.DuplicateDpid(swc.getDpid());
-            }
-            if (!swNames.add(swc.getName())) {
-                throw new NetworkConfigException.DuplicateName(swc.getName());
-            }
-            // TODO Add more validations
-        }
-    }
-
-    private void validateLinkConfig(List<LinkConfig> lkConfList) {
-        for (LinkConfig lkc : lkConfList) {
-            if (lkc.getNodeDpid1() == null || lkc.getNodeDpid2() == null) {
-                throw new NetworkConfigException.LinkDpidNotSpecified(
-                        lkc.getNodeDpid1(), lkc.getNodeDpid2());
-            }
-            // ensure both String and Long values are set
-            if (!lkc.getDpid1().equals(DeviceId.deviceId(lkc.getNodeDpid1())) ||
-                    !lkc.getDpid2().equals(DeviceId.deviceId(lkc.getNodeDpid2()))) {
-                throw new NetworkConfigException.LinkDpidNotConverted(
-                        lkc.getNodeDpid1(), lkc.getNodeDpid2());
-            }
-            if (lkc.getType() == null) {
-                throw new NetworkConfigException.LinkTypeNotSpecified(
-                        lkc.getNodeDpid1(), lkc.getNodeDpid2());
-            }
-            if (configuredSwitches.get(lkc.getDpid1()) == null) {
-                throw new NetworkConfigException.LinkForUnknownSwitchConfig(
-                        lkc.getNodeDpid1());
-            }
-            if (configuredSwitches.get(lkc.getDpid2()) == null) {
-                throw new NetworkConfigException.LinkForUnknownSwitchConfig(
-                        lkc.getNodeDpid2());
-            }
-            // TODO add more validations
-        }
-
-    }
-
-    private LinkConfig getConfiguredLink(Link linkTuple) {
-        LinkConfig lkc = null;
-        // first try the unidirectional link with the ports assigned
-        lkc = configuredLinks.get(linkTuple);
-        return lkc;
-    }
-
-
-    /**
-     * Initializes the network configuration manager module by
-     * loading and parsing the network configuration file.
-     */
-    public void init() {
-        loadNetworkConfig();
-        configuredSwitches = new ConcurrentHashMap<>();
-        configuredLinks = new ConcurrentHashMap<>();
-        nameToDpid = new HashMap<>();
-        parseNetworkConfig();
-    }
-}
diff --git a/src/main/java/org/onosproject/segmentrouting/config/NetworkConfigService.java b/src/main/java/org/onosproject/segmentrouting/config/NetworkConfigService.java
deleted file mode 100644
index afbb0fc..0000000
--- a/src/main/java/org/onosproject/segmentrouting/config/NetworkConfigService.java
+++ /dev/null
@@ -1,271 +0,0 @@
-/*
- * 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.segmentrouting.config;
-
-import java.util.List;
-
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.Link;
-import org.onosproject.segmentrouting.config.NetworkConfig.LinkConfig;
-import org.onosproject.segmentrouting.config.NetworkConfig.SwitchConfig;
-
-/**
- * Exposes methods to retrieve network configuration.
- *
- * TODO: currently only startup-configuration is exposed and such configuration
- * cannot be changed at runtime. Need to add runtime support for changes to
- * configuration (via REST/CLI) in future releases.
- *
- * TODO: return immutable objects or defensive copies of network config so that
- * users of this API do not inadvertently or maliciously change network config.
- *
- * @deprecated in Drake; see org.onosproject.net.config
- */
-@Deprecated
-public interface NetworkConfigService {
-
-    /**
-     * Suggests the action to be taken by the caller given the configuration
-     * associated with the queried network-object (eg. switch, link etc.).
-     */
-    enum NetworkConfigState {
-        /**
-         * Associated network object has been configured to not be allowed in
-         * the network.
-         */
-        DENY,
-
-        /**
-         * Associated network object has been configured to be allowed in the
-         * network.
-         */
-        ACCEPT,
-
-        /**
-         * Associated network object has been configured to be allowed in the
-         * network. In addition, there are configured parameters that should be
-         * added to the object.
-         */
-        ACCEPT_ADD,
-    }
-
-    /**
-     * Returns the configuration outcome (accept, deny etc.), and any configured
-     * parameters to the caller, in response to a query for the configuration
-     * associated with a switch.
-     */
-    class SwitchConfigStatus {
-        private NetworkConfigState configState;
-        private SwitchConfig switchConfig;
-        private String msg;
-
-        SwitchConfigStatus(NetworkConfigState configState,
-                SwitchConfig switchConfig, String msg) {
-            this.configState = configState;
-            this.switchConfig = switchConfig;
-            this.msg = msg;
-        }
-
-        SwitchConfigStatus(NetworkConfigState configState,
-                SwitchConfig switchConfig) {
-            this.configState = configState;
-            this.switchConfig = switchConfig;
-            this.msg = "";
-        }
-
-        /**
-         * Returns the configuration state for the switch.
-         *
-         * @return non-null NetworkConfigState
-         */
-        public NetworkConfigState getConfigState() {
-            return configState;
-        }
-
-        /**
-         * Returns the switch configuration, which may be null if no
-         * configuration exists, or if the configuration state disallows the
-         * switch.
-         *
-         * @return SwitchConfig, the switch configuration, or null
-         */
-        public SwitchConfig getSwitchConfig() {
-            return switchConfig;
-        }
-
-        /**
-         * User readable string typically used to specify the reason why a
-         * switch is being disallowed.
-         *
-         * @return A non-null but possibly empty String
-         */
-        public String getMsg() {
-            return msg;
-        }
-
-    }
-
-    /**
-     * Reserved for future use.
-     *
-     * Returns the configuration outcome (accept, deny etc.), and any configured
-     * parameters to the caller, in response to a query for the configuration
-     * associated with a link.
-     */
-    class LinkConfigStatus {
-        private NetworkConfigState configState;
-        private LinkConfig linkConfig;
-        private String msg;
-
-        LinkConfigStatus(NetworkConfigState configState,
-                LinkConfig linkConfig, String msg) {
-            this.configState = configState;
-            this.linkConfig = linkConfig;
-            this.msg = msg;
-        }
-
-        LinkConfigStatus(NetworkConfigState configState,
-                LinkConfig linkConfig) {
-            this.configState = configState;
-            this.linkConfig = linkConfig;
-            this.msg = "";
-        }
-
-        /**
-         * Returns the configuration state for the link.
-         *
-         * @return non-null NetworkConfigState
-         */
-        public NetworkConfigState getConfigState() {
-            return configState;
-        }
-
-        /**
-         * Returns the link configuration, which may be null if no configuration
-         * exists, or if the configuration state disallows the link.
-         *
-         * @return SwitchConfig, the switch configuration, or null
-         */
-        public LinkConfig getLinkConfig() {
-            return linkConfig;
-        }
-
-        /**
-         * User readable string typically used to specify the reason why a link
-         * is being disallowed.
-         *
-         * @return msg A non-null but possibly empty String
-         */
-        public String getMsg() {
-            return msg;
-        }
-
-    }
-
-    /**
-     * Checks the switch configuration (if any) associated with the 'dpid'.
-     * Determines if the switch should be allowed or denied according to
-     * configuration rules.
-     *
-     * The method always returns a non-null SwitchConfigStatus. The enclosed
-     * ConfigState contains the result of the check. The enclosed SwitchConfig
-     * may or may not be null, depending on the outcome of the check.
-     *
-     * @param dpid device id of the switch to be queried
-     * @return SwitchConfigStatus with outcome of check and associated config.
-     */
-    SwitchConfigStatus checkSwitchConfig(DeviceId dpid);
-
-    /**
-     * Reserved for future use.
-     *
-     * Checks the link configuration (if any) associated with the 'link'.
-     * Determines if the link should be allowed or denied according to
-     * configuration rules. Note that the 'link' is a unidirectional link which
-     * checked against configuration that is typically defined for a
-     * bidirectional link. The caller may make a second call if it wishes to
-     * check the 'reverse' direction.
-     *
-     * Also note that the configuration may not specify ports for a given
-     * bidirectional link. In such cases, the configuration applies to all links
-     * between the two switches. This method will check the given 'link' against
-     * such configuration.
-
-     * The method always returns a non-null LinkConfigStatus. The enclosed
-     * ConfigState contains the result of the check. The enclosed LinkConfig may
-     * or may not be null, depending on the outcome of the check.
-     *
-     * @param linkTuple unidirectional link to be queried
-     * @return LinkConfigStatus with outcome of check and associated config.
-     */
-    LinkConfigStatus checkLinkConfig(Link linkTuple);
-
-    /**
-     * Retrieves a list of switches that have been configured, and have been
-     * determined to be 'allowed' in the network, according to configuration
-     * rules.
-     *
-     * Note that it is possible that there are other switches that are allowed
-     * in the network that have NOT been configured. Such switches will not be a
-     * part of the returned list.
-     *
-     * Also note that it is possible that some switches will not be discovered
-     * and the only way the controller can know about these switches is via
-     * configuration. Such switches will be included in this list. It is up to
-     * the caller to determine which SwitchConfig applies to non-discovered
-     * switches.
-     *
-     * @return a non-null List of SwitchConfig which may be empty
-     */
-    List<SwitchConfig> getConfiguredAllowedSwitches();
-
-    /**
-     * Reserved for future use.
-     *
-     * Retrieves a list of links that have been configured, and have been
-     * determined to be 'allowed' in the network, according to configuration
-     * rules.
-     *
-     * Note that it is possible that there are other links that are allowed in
-     * the network that have NOT been configured. Such links will not be a part
-     * of the returned list.
-     *
-     * Also note that it is possible that some links will not be discovered and
-     * the only way the controller can know about these links is via
-     * configuration. Such links will be included in this list. It is up to the
-     * caller to determine which LinkConfig applies to non-discovered links.
-     *
-     * In addition, note that the LinkConfig applies to the configured
-     * bi-directional link, which may or may not have declared ports. The
-     * associated unidirectional LinkTuple can be retrieved from the
-     * getLinkTupleList() method in the LinkConfig object.
-     *
-     * @return a non-null List of LinkConfig which may be empty
-     */
-    List<LinkConfig> getConfiguredAllowedLinks();
-
-    /**
-     * Retrieves the Dpid associated with a 'name' for a configured switch
-     * object. This method does not check of the switches are 'allowed' by
-     * config.
-     *
-     * @param name device name
-     * @return the Dpid corresponding to a given 'name', or null if no
-     *         configured switch was found for the given 'name'.
-     */
-    DeviceId getDpidForName(String name);
-
-}
diff --git a/src/main/java/org/onosproject/segmentrouting/config/PktLinkConfig.java b/src/main/java/org/onosproject/segmentrouting/config/PktLinkConfig.java
deleted file mode 100644
index 3c51fa9..0000000
--- a/src/main/java/org/onosproject/segmentrouting/config/PktLinkConfig.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * 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.segmentrouting.config;
-
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.onosproject.net.Link;
-import org.onosproject.segmentrouting.config.NetworkConfig.LinkConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.databind.JsonNode;
-
-/**
- * Reserved for future use.
- * Configuration for a link between two packet-switches.
- */
-public class PktLinkConfig extends LinkConfig {
-    protected static final Logger log = LoggerFactory
-            .getLogger(PktLinkConfig.class);
-    private int port1;
-    private int port2;
-    private String nodeName1;
-    private String nodeName2;
-    private List<Link> linkTupleList;
-
-    public PktLinkConfig(LinkConfig lkc) {
-        nodeDpid1 = lkc.getNodeDpid1();
-        nodeDpid2 = lkc.getNodeDpid2();
-        dpid1 = lkc.getDpid1();
-        dpid2 = lkc.getDpid2();
-        type = lkc.getType();
-        allowed = lkc.isAllowed();
-        params = lkc.getParams();
-        publishAttributes = new ConcurrentHashMap<>();
-        parseParams();
-        validateParams();
-        setPublishAttributes();
-    }
-
-    // ********************
-    // Packet Link Configuration
-    // ********************
-
-    public int getPort1() {
-        return port1;
-    }
-
-    public void setPort1(int port1) {
-        this.port1 = port1;
-    }
-
-    public int getPort2() {
-        return port2;
-    }
-
-    public void setPort2(int port2) {
-        this.port2 = port2;
-    }
-
-    public String getNodeName1() {
-        return nodeName1;
-    }
-
-    public void setNodeName1(String nodeName1) {
-        this.nodeName1 = nodeName1;
-    }
-
-    public String getNodeName2() {
-        return nodeName2;
-    }
-
-    public void setNodeName2(String nodeName2) {
-        this.nodeName2 = nodeName2;
-    }
-
-    /**
-     * Returns the two unidirectional links corresponding to the packet-link
-     * configuration. It is possible that the ports in the LinkTuple have
-     * portnumber '0', implying that the configuration applies to all links
-     * between the two switches.
-     *
-     * @return a list of LinkTuple with exactly 2 unidirectional links
-     */
-    public List<Link> getLinkTupleList() {
-        return linkTupleList;
-    }
-
-    private void setPublishAttributes() {
-
-    }
-
-    private void parseParams() {
-        if (params == null) {
-            throw new PktLinkParamsNotSpecified(nodeDpid1, nodeDpid2);
-        }
-        Set<Entry<String, JsonNode>> m = params.entrySet();
-        for (Entry<String, JsonNode> e : m) {
-            String key = e.getKey();
-            JsonNode j = e.getValue();
-            if (key.equals("nodeName1")) {
-                setNodeName1(j.asText());
-            } else if (key.equals("nodeName2")) {
-                setNodeName2(j.asText());
-            } else if (key.equals("port1")) {
-                setPort1(j.asInt());
-            } else if (key.equals("port2")) {
-                setPort2(j.asInt());
-            } else {
-                throw new UnknownPktLinkConfig(key, nodeDpid1, nodeDpid2);
-            }
-        }
-    }
-
-    private void validateParams() {
-        // TODO - wrong-names, duplicate links,
-        // duplicate use of port, is switch-allowed for which link is allowed?
-        // valid port numbers
-    }
-
-    public static class PktLinkParamsNotSpecified extends RuntimeException {
-        private static final long serialVersionUID = 6247582323691265513L;
-
-        public PktLinkParamsNotSpecified(String dpidA, String dpidB) {
-            super();
-            log.error("Params required for packet link - not specified "
-                    + "for link between switch1:{} and switch2:{}",
-                    dpidA, dpidB);
-        }
-    }
-
-    public static class UnknownPktLinkConfig extends RuntimeException {
-        private static final long serialVersionUID = -5750132094884129179L;
-
-        public UnknownPktLinkConfig(String key, String dpidA, String dpidB) {
-            super();
-            log.error("Unknown packet-link config {} for link between"
-                    + " dpid1: {} and dpid2: {}", key,
-                    dpidA, dpidB);
-        }
-    }
-
-}
diff --git a/src/main/java/org/onosproject/segmentrouting/config/SegmentRouterConfig.java b/src/main/java/org/onosproject/segmentrouting/config/SegmentRouterConfig.java
deleted file mode 100644
index c8d4a54..0000000
--- a/src/main/java/org/onosproject/segmentrouting/config/SegmentRouterConfig.java
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- * 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.segmentrouting.config;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-
-import org.onosproject.net.DeviceId;
-import org.onosproject.segmentrouting.config.NetworkConfig.SwitchConfig;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-/**
- * Manages additional configuration for switches configured as Segment Routers.
- */
-public class SegmentRouterConfig extends SwitchConfig {
-    protected static final Logger log = LoggerFactory
-            .getLogger(SegmentRouterConfig.class);
-    private String routerIp;
-    private String routerMac;
-    private int nodeSid;
-    private boolean isEdgeRouter;
-    private List<AdjacencySid> adjacencySids;
-    private List<Subnet> subnets;
-
-    public static final String ROUTER_IP = "routerIp";
-    public static final String ROUTER_MAC = "routerMac";
-    public static final String NODE_SID = "nodeSid";
-    public static final String ADJACENCY_SIDS = "adjacencySids";
-    public static final String SUBNETS = "subnets";
-    public static final String ISEDGE = "isEdgeRouter";
-    private static final int SRGB_MAX = 1000;
-
-    /**
-     * Parses and validates the additional configuration parameters applicable
-     * to segment routers.
-     *
-     * @param swc switch configuration
-     */
-    public SegmentRouterConfig(SwitchConfig swc) {
-        this.setName(swc.getName());
-        this.setDpid(swc.getDpid());
-        this.setType(swc.getType());
-        this.setLatitude(swc.getLatitude());
-        this.setLongitude(swc.getLongitude());
-        this.setParams(swc.getParams());
-        this.setAllowed(swc.isAllowed());
-        publishAttributes = new ConcurrentHashMap<>();
-        adjacencySids = new ArrayList<>();
-        subnets = new ArrayList<>();
-        parseParams();
-        validateParams();
-        setPublishAttributes();
-    }
-
-    /**
-     * Returns the configured segment router IP address.
-     *
-     * @return ip address in string format
-     */
-    public String getRouterIp() {
-        return routerIp;
-    }
-
-    public void setRouterIp(String routerIp) {
-        this.routerIp = routerIp;
-    }
-
-    /**
-     * Returns the configured segment router mac address.
-     *
-     * @return mac address in string format
-     */
-    public String getRouterMac() {
-        return routerMac;
-    }
-
-    public void setRouterMac(String routerMac) {
-        this.routerMac = routerMac;
-    }
-
-    /**
-     * Returns the configured sID for a segment router.
-     *
-     * @return segment identifier
-     */
-    public int getNodeSid() {
-        return nodeSid;
-    }
-
-    public void setNodeSid(int nodeSid) {
-        this.nodeSid = nodeSid;
-    }
-
-    /**
-     * Returns the flag that indicates the configured segment router
-     * is edge or backbone router.
-     *
-     * @return boolean
-     */
-    public boolean isEdgeRouter() {
-        return isEdgeRouter;
-    }
-
-    public void setIsEdgeRouter(boolean isEdge) {
-        this.isEdgeRouter = isEdge;
-    }
-
-    /**
-     * Class representing segment router adjacency identifier.
-     */
-    public static class AdjacencySid {
-        private int adjSid;
-        private List<Integer> ports;
-
-        public AdjacencySid(int adjSid, List<Integer> ports) {
-            this.ports = ports;
-            this.adjSid = adjSid;
-        }
-
-        /**
-         * Returns the list of ports part of a segment
-         * router adjacency identifier.
-         *
-         * @return list of integers
-         */
-        public List<Integer> getPorts() {
-            return ports;
-        }
-
-        public void setPorts(List<Integer> ports) {
-            this.ports = ports;
-        }
-
-        /**
-         * Returns the configured adjacency id of a segment router.
-         *
-         * @return integer
-         */
-        public int getAdjSid() {
-            return adjSid;
-        }
-
-        public void setAdjSid(int adjSid) {
-            this.adjSid = adjSid;
-        }
-    }
-
-    /**
-     * Returns the configured adjacent segment IDs for a segment router.
-     *
-     * @return list of adjacency identifier
-     */
-    public List<AdjacencySid> getAdjacencySids() {
-        return adjacencySids;
-    }
-
-    public void setAdjacencySids(List<AdjacencySid> adjacencySids) {
-        this.adjacencySids = adjacencySids;
-    }
-
-    /**
-     * Class representing a subnet attached to a segment router.
-     */
-    public static class Subnet {
-        private int portNo;
-        private String subnetIp;
-
-        public Subnet(int portNo, String subnetIp) {
-            this.portNo = portNo;
-            this.subnetIp = subnetIp;
-        }
-
-        /**
-         * Returns the port number of segment router on
-         * which subnet is attached.
-         *
-         * @return integer
-         */
-        public int getPortNo() {
-            return portNo;
-        }
-
-        public void setPortNo(int portNo) {
-            this.portNo = portNo;
-        }
-
-        /**
-         * Returns the configured subnet address.
-         *
-         * @return subnet ip address in string format
-         */
-        public String getSubnetIp() {
-            return subnetIp;
-        }
-
-        public void setSubnetIp(String subnetIp) {
-            this.subnetIp = subnetIp;
-        }
-    }
-
-    /**
-     * Returns the configured subnets for a segment router.
-     *
-     * @return list of subnets
-     */
-    public List<Subnet> getSubnets() {
-        return subnets;
-    }
-
-    public void setSubnets(List<Subnet> subnets) {
-        this.subnets = subnets;
-    }
-
-    // ********************
-    // Helper methods
-    // ********************
-
-    private void parseParams() {
-        if (params == null) {
-            throw new NetworkConfigException.ParamsNotSpecified(name);
-        }
-
-        Set<Entry<String, JsonNode>> m = params.entrySet();
-        for (Entry<String, JsonNode> e : m) {
-            String key = e.getKey();
-            JsonNode j = e.getValue();
-            if (key.equals("routerIp")) {
-                setRouterIp(j.asText());
-            } else if (key.equals("routerMac")) {
-                setRouterMac(j.asText());
-            } else if (key.equals("nodeSid")) {
-                setNodeSid(j.asInt());
-            } else if (key.equals("isEdgeRouter")) {
-                setIsEdgeRouter(j.asBoolean());
-            } else if (key.equals("adjacencySids") || key.equals("subnets")) {
-                getInnerParams(j, key);
-            } else {
-                throw new UnknownSegmentRouterConfig(key, dpid);
-            }
-        }
-    }
-
-    private void getInnerParams(JsonNode j, String innerParam) {
-        Iterator<JsonNode> innerList = j.elements();
-        while (innerList.hasNext()) {
-            Iterator<Entry<String, JsonNode>> f = innerList.next().fields();
-            int portNo = -1;
-            int adjSid = -1;
-            String subnetIp = null;
-            List<Integer> ports = null;
-            while (f.hasNext()) {
-                Entry<String, JsonNode> fe = f.next();
-                if (fe.getKey().equals("portNo")) {
-                    portNo = fe.getValue().asInt();
-                } else if (fe.getKey().equals("adjSid")) {
-                    adjSid = fe.getValue().asInt();
-                } else if (fe.getKey().equals("subnetIp")) {
-                    subnetIp = fe.getValue().asText();
-                } else if (fe.getKey().equals("ports")) {
-                    if (fe.getValue().isArray()) {
-                        Iterator<JsonNode> i = fe.getValue().elements();
-                        ports = new ArrayList<>();
-                        while (i.hasNext()) {
-                            ports.add(i.next().asInt());
-                        }
-                    }
-                } else {
-                    throw new UnknownSegmentRouterConfig(fe.getKey(), dpid);
-                }
-            }
-            if (innerParam.equals("adjacencySids")) {
-                AdjacencySid ads = new AdjacencySid(adjSid, ports);
-                adjacencySids.add(ads);
-            } else {
-                Subnet sip = new Subnet(portNo, subnetIp);
-                subnets.add(sip);
-            }
-        }
-    }
-
-    private void validateParams() {
-        if (routerIp == null) {
-            throw new IpNotSpecified(dpid);
-        }
-        if (routerMac == null) {
-            throw new MacNotSpecified(dpid);
-        }
-        if (isEdgeRouter && subnets.isEmpty()) {
-            throw new SubnetNotSpecifiedInEdgeRouter(dpid);
-        }
-        if (!isEdgeRouter && !subnets.isEmpty()) {
-            throw new SubnetSpecifiedInBackboneRouter(dpid);
-        }
-        if (nodeSid > SRGB_MAX) {
-            throw new NodeLabelNotInSRGB(nodeSid, dpid);
-        }
-        for (AdjacencySid as : adjacencySids) {
-            int label = as.getAdjSid();
-            List<Integer> plist = as.getPorts();
-            if (label <= SRGB_MAX) {
-                throw new AdjacencyLabelInSRGB(label, dpid);
-            }
-            if (plist.size() <= 1) {
-                throw new AdjacencyLabelNotEnoughPorts(label, dpid);
-            }
-        }
-
-
-        // TODO more validations
-    }
-
-    /**
-     * Setting publishAttributes implies that this is the configuration that
-     * will be added to Topology.Switch object before it is published on the
-     * channel to other controller instances.
-     */
-    private void setPublishAttributes() {
-        publishAttributes.put(ROUTER_IP, routerIp);
-        publishAttributes.put(ROUTER_MAC, routerMac);
-        publishAttributes.put(NODE_SID, String.valueOf(nodeSid));
-        publishAttributes.put(ISEDGE, String.valueOf(isEdgeRouter));
-        ObjectMapper mapper = new ObjectMapper();
-        try {
-            publishAttributes.put(ADJACENCY_SIDS,
-                    mapper.writeValueAsString(adjacencySids));
-            publishAttributes.put(SUBNETS,
-                    mapper.writeValueAsString(subnets));
-        } catch (JsonProcessingException e) {
-            log.error("Error while writing SR config: {}", e.getCause());
-        } catch (IOException e) {
-            log.error("Error while writing SR config: {}", e.getCause());
-        }
-    }
-
-    // ********************
-    // Exceptions
-    // ********************
-
-    public static class IpNotSpecified extends RuntimeException {
-        private static final long serialVersionUID = -3001502553646331686L;
-
-        public IpNotSpecified(DeviceId dpid) {
-            super();
-            log.error("Router IP address not specified for SR config dpid:{}",
-                    dpid);
-        }
-    }
-
-    public static class MacNotSpecified extends RuntimeException {
-        private static final long serialVersionUID = -5850132094884129179L;
-
-        public MacNotSpecified(DeviceId dpid) {
-            super();
-            log.error("Router Mac address not specified for SR config dpid:{}",
-                    dpid);
-        }
-    }
-
-    public static class UnknownSegmentRouterConfig extends RuntimeException {
-        private static final long serialVersionUID = -5750132094884129179L;
-
-        public UnknownSegmentRouterConfig(String key, DeviceId dpid) {
-            super();
-            log.error("Unknown Segment Router config {} in dpid: {}", key,
-                    dpid);
-        }
-    }
-
-    public static class SubnetNotSpecifiedInEdgeRouter extends RuntimeException {
-        private static final long serialVersionUID = -5855458472668581268L;
-
-        public SubnetNotSpecifiedInEdgeRouter(DeviceId dpid) {
-            super();
-            log.error("Subnet was not specified for edge router in dpid: {}",
-                    dpid);
-        }
-    }
-
-    public static class SubnetSpecifiedInBackboneRouter extends RuntimeException {
-        private static final long serialVersionUID = 1L;
-
-        public SubnetSpecifiedInBackboneRouter(DeviceId dpid) {
-            super();
-            log.error("Subnet was specified in backbone router in dpid: {}",
-                    dpid);
-        }
-    }
-
-    public static class NodeLabelNotInSRGB extends RuntimeException {
-        private static final long serialVersionUID = -8482670903748519526L;
-
-        public NodeLabelNotInSRGB(int label, DeviceId dpid) {
-            super();
-            log.error("Node sif {} specified in not in global label-base "
-                    + "in dpid: {}", label,
-                    dpid);
-        }
-    }
-
-    public static class AdjacencyLabelInSRGB extends RuntimeException {
-        private static final long serialVersionUID = -8482670903748519526L;
-
-        public AdjacencyLabelInSRGB(int label, DeviceId dpid) {
-            super();
-            log.error("Adjaceny label {} specified from global label-base "
-                    + "in dpid: {}", label,
-                    dpid);
-        }
-    }
-
-    public static class AdjacencyLabelNotEnoughPorts extends RuntimeException {
-        private static final long serialVersionUID = -8482670903748519526L;
-
-        public AdjacencyLabelNotEnoughPorts(int label, DeviceId dpid) {
-            super();
-            log.error("Adjaceny label {} must be specified for at least 2 ports. "
-                    + "Adjacency labels for single ports are auto-generated "
-                    + "in dpid: {}", label,
-                    dpid);
-        }
-    }
-}
diff --git a/src/main/java/org/onosproject/segmentrouting/config/SegmentRoutingConfig.java b/src/main/java/org/onosproject/segmentrouting/config/SegmentRoutingConfig.java
new file mode 100644
index 0000000..618ebbc
--- /dev/null
+++ b/src/main/java/org/onosproject/segmentrouting/config/SegmentRoutingConfig.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2014-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.segmentrouting.config;
+
+import org.onlab.packet.Ip4Address;
+import org.onlab.packet.MacAddress;
+import org.onosproject.net.DeviceId;
+import org.onosproject.net.config.Config;
+import org.onosproject.net.config.basics.BasicElementConfig;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * Configuration object for Segment Routing Application.
+ */
+public class SegmentRoutingConfig extends Config<DeviceId> {
+    private static final String NAME = "name";
+    private static final String IP = "routerIp";
+    private static final String MAC = "routerMac";
+    private static final String SID = "nodeSid";
+    private static final String EDGE = "isEdgeRouter";
+
+    public Optional<String> getName() {
+        String name = get(NAME, null);
+        return name != null ? Optional.of(name) : Optional.empty();
+    }
+
+    public BasicElementConfig setName(String name) {
+        return (BasicElementConfig) setOrClear(NAME, name);
+    }
+
+    public Ip4Address getIp() {
+        String ip = get(IP, null);
+        return ip != null ? Ip4Address.valueOf(ip) : null;
+    }
+
+    public BasicElementConfig setIp(String ip) {
+        return (BasicElementConfig) setOrClear(IP, ip);
+    }
+
+    public MacAddress getMac() {
+        String mac = get(MAC, null);
+        return mac != null ? MacAddress.valueOf(mac) : null;
+    }
+
+    public BasicElementConfig setMac(String mac) {
+        return (BasicElementConfig) setOrClear(MAC, mac);
+    }
+
+    public int getSid() {
+        return get(SID, -1);
+    }
+
+    public BasicElementConfig setSid(int sid) {
+        return (BasicElementConfig) setOrClear(SID, sid);
+    }
+
+    public boolean isEdgeRouter() {
+        return get(EDGE, false);
+    }
+
+    public BasicElementConfig setEdgeRouter(boolean isEdgeRouter) {
+        return (BasicElementConfig) setOrClear(EDGE, isEdgeRouter);
+    }
+
+    // TODO extract array from JsonNode
+    public List<AdjacencySid> getAdjacencySids() {
+        return new ArrayList<AdjacencySid>();
+    }
+
+    public class AdjacencySid {
+        int sid;
+        List<Integer> ports;
+
+        public AdjacencySid(int sid, List<Integer> ports) {
+            this.sid = sid;
+            this.ports = ports;
+        }
+
+        public int getSid() {
+            return sid;
+        }
+
+        public List<Integer> getPorts() {
+            return ports;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/main/java/org/onosproject/segmentrouting/config/package-info.java b/src/main/java/org/onosproject/segmentrouting/config/package-info.java
index fdae9c9..95f7e24 100644
--- a/src/main/java/org/onosproject/segmentrouting/config/package-info.java
+++ b/src/main/java/org/onosproject/segmentrouting/config/package-info.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Open Networking Laboratory
+ * Copyright 2014-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.
diff --git a/src/main/java/org/onosproject/segmentrouting/grouphandler/DeviceProperties.java b/src/main/java/org/onosproject/segmentrouting/grouphandler/DeviceProperties.java
index 816ca7b..497f525 100644
--- a/src/main/java/org/onosproject/segmentrouting/grouphandler/DeviceProperties.java
+++ b/src/main/java/org/onosproject/segmentrouting/grouphandler/DeviceProperties.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2015 Open Networking Laboratory
+ * Copyright 2014-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.
