diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
index c8c88c7..98ee40c 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/SegmentRoutingManager.java
@@ -96,7 +96,6 @@
 import org.onosproject.segmentrouting.config.DeviceConfiguration;
 import org.onosproject.segmentrouting.config.SegmentRoutingAppConfig;
 import org.onosproject.segmentrouting.config.SegmentRoutingDeviceConfig;
-import org.onosproject.segmentrouting.config.XConnectConfig;
 import org.onosproject.segmentrouting.grouphandler.DefaultGroupHandler;
 import org.onosproject.segmentrouting.grouphandler.DestinationSet;
 import org.onosproject.segmentrouting.grouphandler.NextNeighbors;
@@ -303,7 +302,6 @@
     private InternalLinkListener linkListener = null;
     private InternalDeviceListener deviceListener = null;
     private AppConfigHandler appCfgHandler = null;
-    public XConnectHandler xConnectHandler = null;
     McastHandler mcastHandler = null;
     HostHandler hostHandler = null;
     private RouteHandler routeHandler = null;
@@ -392,16 +390,6 @@
                 }
             };
 
-    private final ConfigFactory<ApplicationId, XConnectConfig> xConnectConfigFactory =
-            new ConfigFactory<ApplicationId, XConnectConfig>(
-                    SubjectFactories.APP_SUBJECT_FACTORY,
-                    XConnectConfig.class, "xconnect") {
-                @Override
-                public XConnectConfig createConfig() {
-                    return new XConnectConfig();
-                }
-            };
-
     private ConfigFactory<ApplicationId, McastConfig> mcastConfigFactory =
             new ConfigFactory<ApplicationId, McastConfig>(
                     SubjectFactories.APP_SUBJECT_FACTORY,
@@ -556,7 +544,6 @@
         linkListener = new InternalLinkListener();
         deviceListener = new InternalDeviceListener();
         appCfgHandler = new AppConfigHandler(this);
-        xConnectHandler = new XConnectHandler(this);
         mcastHandler = new McastHandler(this);
         hostHandler = new HostHandler(this);
         linkHandler = new LinkHandler(this);
@@ -568,7 +555,6 @@
         cfgService.addListener(cfgListener);
         cfgService.registerConfigFactory(deviceConfigFactory);
         cfgService.registerConfigFactory(appConfigFactory);
-        cfgService.registerConfigFactory(xConnectConfigFactory);
         cfgService.registerConfigFactory(mcastConfigFactory);
         log.info("Configuring network before adding listeners");
 
@@ -644,7 +630,6 @@
         cfgService.removeListener(cfgListener);
         cfgService.unregisterConfigFactory(deviceConfigFactory);
         cfgService.unregisterConfigFactory(appConfigFactory);
-        cfgService.unregisterConfigFactory(xConnectConfigFactory);
         cfgService.unregisterConfigFactory(mcastConfigFactory);
         compCfgService.unregisterProperties(getClass(), false);
 
@@ -1548,8 +1533,6 @@
                     } else if (configClass.equals(SegmentRoutingDeviceConfig.class)) {
                         log.info("Segment Routing Device Config added for {}", event.subject());
                         cfgListener.configureNetwork();
-                    } else if (configClass.equals(XConnectConfig.class)) {
-                        xConnectHandler.processXConnectConfigAdded(netcfgEvent);
                     } else if (configClass.equals(InterfaceConfig.class)) {
                         log.info("Interface Config added for {}", event.subject());
                         cfgListener.configureNetwork();
@@ -1566,8 +1549,6 @@
                     } else if (configClass.equals(SegmentRoutingDeviceConfig.class)) {
                         log.info("Segment Routing Device Config updated for {}", event.subject());
                         createOrUpdateDeviceConfiguration();
-                    } else if (configClass.equals(XConnectConfig.class)) {
-                        xConnectHandler.processXConnectConfigUpdated(netcfgEvent);
                     } else if (configClass.equals(InterfaceConfig.class)) {
                         log.info("Interface Config updated for {}", event.subject());
                         createOrUpdateDeviceConfiguration();
@@ -1586,8 +1567,6 @@
                     } else if (configClass.equals(SegmentRoutingDeviceConfig.class)) {
                         // TODO Handle sr device config removal
                         log.info("SegmentRoutingDeviceConfig removal is not handled in current implementation");
-                    } else if (configClass.equals(XConnectConfig.class)) {
-                        xConnectHandler.processXConnectConfigRemoved(netcfgEvent);
                     } else if (configClass.equals(InterfaceConfig.class)) {
                         // TODO Handle interface removal
                         log.info("InterfaceConfig removal is not handled in current implementation");
@@ -1658,7 +1637,6 @@
 
         if (mastershipService.isLocalMaster(deviceId)) {
             defaultRoutingHandler.populatePortAddressingRules(deviceId);
-            xConnectHandler.init(deviceId);
             DefaultGroupHandler groupHandler = groupHandlerMap.get(deviceId);
             groupHandler.createGroupsFromVlanConfig();
             routingRulePopulator.populateSubnetBroadcastRule(deviceId);
@@ -1697,7 +1675,6 @@
         defaultRoutingHandler
             .populateRoutingRulesForLinkStatusChange(null, null, device.id(), true);
         defaultRoutingHandler.purgeEcmpGraph(device.id());
-        xConnectHandler.removeDevice(device.id());
 
         // Cleanup all internal groupHandler stores for this device. Should be
         // done after all rerouting or rehashing has been completed
@@ -1897,7 +1874,6 @@
                 return;
             }
             checkState(appCfgHandler != null, "NetworkConfigEventHandler is not initialized");
-            checkState(xConnectHandler != null, "XConnectHandler is not initialized");
             switch (event.type()) {
                 case CONFIG_ADDED:
                 case CONFIG_UPDATED:
@@ -1924,8 +1900,7 @@
 
             if (!event.configClass().equals(SegmentRoutingDeviceConfig.class) &&
                     !event.configClass().equals(SegmentRoutingAppConfig.class) &&
-                    !event.configClass().equals(InterfaceConfig.class) &&
-                    !event.configClass().equals(XConnectConfig.class)) {
+                    !event.configClass().equals(InterfaceConfig.class)) {
                 log.debug("Ignore event {} due to class mismatch", event);
                 return false;
             }
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/XConnectHandler.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/XConnectHandler.java
deleted file mode 100644
index 5dafb3f..0000000
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/XConnectHandler.java
+++ /dev/null
@@ -1,553 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * 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;
-
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-import org.onlab.packet.MacAddress;
-import org.onlab.packet.VlanId;
-import org.onlab.util.KryoNamespace;
-import org.onosproject.net.ConnectPoint;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.config.NetworkConfigEvent;
-import org.onosproject.net.flow.DefaultTrafficSelector;
-import org.onosproject.net.flow.DefaultTrafficTreatment;
-import org.onosproject.net.flow.TrafficSelector;
-import org.onosproject.net.flow.TrafficTreatment;
-import org.onosproject.net.flow.criteria.Criteria;
-import org.onosproject.net.flowobjective.DefaultFilteringObjective;
-import org.onosproject.net.flowobjective.DefaultForwardingObjective;
-import org.onosproject.net.flowobjective.DefaultNextObjective;
-import org.onosproject.net.flowobjective.DefaultObjectiveContext;
-import org.onosproject.net.flowobjective.FilteringObjective;
-import org.onosproject.net.flowobjective.ForwardingObjective;
-import org.onosproject.net.flowobjective.NextObjective;
-import org.onosproject.net.flowobjective.Objective;
-import org.onosproject.net.flowobjective.ObjectiveContext;
-import org.onosproject.net.flowobjective.ObjectiveError;
-import org.onosproject.segmentrouting.config.XConnectConfig;
-import org.onosproject.segmentrouting.storekey.XConnectStoreKey;
-import org.onosproject.store.serializers.KryoNamespaces;
-import org.onosproject.store.service.ConsistentMap;
-import org.onosproject.store.service.Serializer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Set;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-
-/**
- * Handles cross connect related events.
- *
- * @deprecated in ONOS 1.12. Replaced by {@link org.onosproject.segmentrouting.xconnect.impl.XconnectManager}
- */
-@Deprecated
-public class XConnectHandler {
-    private static final Logger log = LoggerFactory.getLogger(XConnectHandler.class);
-    private static final String CONFIG_NOT_FOUND = "XConnect config not found";
-    private static final String NOT_MASTER = "Not master controller";
-    private final SegmentRoutingManager srManager;
-    private final ConsistentMap<XConnectStoreKey, NextObjective> xConnectNextObjStore;
-
-    XConnectHandler(SegmentRoutingManager srManager) {
-        this.srManager = srManager;
-        KryoNamespace.Builder xConnectKryo = new KryoNamespace.Builder()
-                .register(KryoNamespaces.API)
-                .register(XConnectStoreKey.class)
-                .register(NextObjContext.class);
-        xConnectNextObjStore = srManager.storageService
-                .<XConnectStoreKey, NextObjective>consistentMapBuilder()
-                .withName("onos-xconnect-nextobj-store")
-                .withSerializer(Serializer.using(xConnectKryo.build()))
-                .build();
-    }
-
-    /**
-     * Read initial XConnect for given device.
-     *
-     * @param deviceId ID of the device to be initialized
-     */
-    public void init(DeviceId deviceId) {
-        // Try to read XConnect config
-        XConnectConfig config =
-                srManager.cfgService.getConfig(srManager.appId, XConnectConfig.class);
-        if (config == null) {
-            log.info("Skip XConnect initialization: {}", CONFIG_NOT_FOUND);
-            return;
-        }
-
-        config.getXconnects(deviceId).forEach(key -> populateXConnect(key, config.getPorts(key)));
-    }
-
-    /**
-     * Processes Segment Routing App Config added event.
-     *
-     * @param event network config added event
-     */
-    void processXConnectConfigAdded(NetworkConfigEvent event) {
-        log.info("Processing XConnect CONFIG_ADDED");
-        XConnectConfig config = (XConnectConfig) event.config().get();
-        config.getXconnects().forEach(key -> populateXConnect(key, config.getPorts(key)));
-    }
-
-    /**
-     * Processes Segment Routing App Config updated event.
-     *
-     * @param event network config updated event
-     */
-    void processXConnectConfigUpdated(NetworkConfigEvent event) {
-        log.info("Processing XConnect CONFIG_UPDATED");
-        XConnectConfig prevConfig = (XConnectConfig) event.prevConfig().get();
-        XConnectConfig config = (XConnectConfig) event.config().get();
-        Set<XConnectStoreKey> prevKeys = prevConfig.getXconnects();
-        Set<XConnectStoreKey> keys = config.getXconnects();
-
-        Set<XConnectStoreKey> pendingRemove = prevKeys.stream()
-                .filter(key -> !keys.contains(key)).collect(Collectors.toSet());
-        Set<XConnectStoreKey> pendingAdd = keys.stream()
-                .filter(key -> !prevKeys.contains(key)).collect(Collectors.toSet());
-        Set<XConnectStoreKey> pendingUpdate = keys.stream()
-                .filter(key -> prevKeys.contains(key) &&
-                        !config.getPorts(key).equals(prevConfig.getPorts(key)))
-                .collect(Collectors.toSet());
-
-        pendingRemove.forEach(key -> revokeXConnect(key, prevConfig.getPorts(key)));
-        pendingAdd.forEach(key -> populateXConnect(key, config.getPorts(key)));
-        pendingUpdate.forEach(key ->
-                updateXConnect(key, prevConfig.getPorts(key), config.getPorts(key)));
-    }
-
-    /**
-     * Processes Segment Routing App Config removed event.
-     *
-     * @param event network config removed event
-     */
-    void processXConnectConfigRemoved(NetworkConfigEvent event) {
-        log.info("Processing XConnect CONFIG_REMOVED");
-        XConnectConfig prevConfig = (XConnectConfig) event.prevConfig().get();
-        prevConfig.getXconnects().forEach(key -> {
-            revokeXConnect(key, prevConfig.getPorts(key));
-        });
-    }
-
-    /**
-     * Checks if there is any XConnect configured on given connect point.
-     *
-     * @param cp connect point
-     * @return true if there is XConnect configured on given connect point.
-     */
-    public boolean hasXConnect(ConnectPoint cp) {
-        // Try to read XConnect config
-        XConnectConfig config =
-                srManager.cfgService.getConfig(srManager.appId, XConnectConfig.class);
-        if (config == null) {
-            log.warn("Failed to read XConnect config: {}", CONFIG_NOT_FOUND);
-            return false;
-        }
-        return config.getXconnects(cp.deviceId()).stream()
-                .anyMatch(key -> config.getPorts(key).contains(cp.port()));
-    }
-
-    /**
-     * Populates XConnect groups and flows for given key.
-     *
-     * @param key XConnect key
-     * @param ports a set of ports to be cross-connected
-     */
-    private void populateXConnect(XConnectStoreKey key, Set<PortNumber> ports) {
-        if (!srManager.mastershipService.isLocalMaster(key.deviceId())) {
-            log.info("Abort populating XConnect {}: {}", key, NOT_MASTER);
-            return;
-        }
-
-        ports = addPairPort(key.deviceId(), ports);
-        populateFilter(key, ports);
-        populateFwd(key, populateNext(key, ports));
-        populateAcl(key);
-    }
-
-    /**
-     * Populates filtering objectives for given XConnect.
-     *
-     * @param key XConnect store key
-     * @param ports XConnect ports
-     */
-    private void populateFilter(XConnectStoreKey key, Set<PortNumber> ports) {
-        ports.forEach(port -> {
-            FilteringObjective.Builder filtObjBuilder = filterObjBuilder(key, port);
-            ObjectiveContext context = new DefaultObjectiveContext(
-                    (objective) -> log.debug("XConnect FilterObj for {} on port {} populated",
-                            key, port),
-                    (objective, error) ->
-                            log.warn("Failed to populate XConnect FilterObj for {} on port {}: {}",
-                                    key, port, error));
-            srManager.flowObjectiveService.filter(key.deviceId(), filtObjBuilder.add(context));
-        });
-    }
-
-    /**
-     * Populates next objectives for given XConnect.
-     *
-     * @param key XConnect store key
-     * @param ports XConnect ports
-     */
-    private NextObjective populateNext(XConnectStoreKey key, Set<PortNumber> ports) {
-        NextObjective nextObj;
-        if (xConnectNextObjStore.containsKey(key)) {
-            nextObj = xConnectNextObjStore.get(key).value();
-            log.debug("NextObj for {} found, id={}", key, nextObj.id());
-        } else {
-            NextObjective.Builder nextObjBuilder = nextObjBuilder(key, ports);
-            ObjectiveContext nextContext = new NextObjContext(Objective.Operation.ADD, key);
-            nextObj = nextObjBuilder.add(nextContext);
-            srManager.flowObjectiveService.next(key.deviceId(), nextObj);
-            xConnectNextObjStore.put(key, nextObj);
-            log.debug("NextObj for {} not found. Creating new NextObj with id={}", key, nextObj.id());
-        }
-        return nextObj;
-    }
-
-    /**
-     * Populates bridging forwarding objectives for given XConnect.
-     *
-     * @param key XConnect store key
-     * @param nextObj next objective
-     */
-    private void populateFwd(XConnectStoreKey key, NextObjective nextObj) {
-        ForwardingObjective.Builder fwdObjBuilder = fwdObjBuilder(key, nextObj.id());
-        ObjectiveContext fwdContext = new DefaultObjectiveContext(
-                (objective) -> log.debug("XConnect FwdObj for {} populated", key),
-                (objective, error) ->
-                        log.warn("Failed to populate XConnect FwdObj for {}: {}", key, error));
-        srManager.flowObjectiveService.forward(key.deviceId(), fwdObjBuilder.add(fwdContext));
-    }
-
-    /**
-     * Populates ACL forwarding objectives for given XConnect.
-     *
-     * @param key XConnect store key
-     */
-    private void populateAcl(XConnectStoreKey key) {
-        ForwardingObjective.Builder aclObjBuilder = aclObjBuilder(key.vlanId());
-        ObjectiveContext aclContext = new DefaultObjectiveContext(
-                (objective) -> log.debug("XConnect AclObj for {} populated", key),
-                (objective, error) ->
-                        log.warn("Failed to populate XConnect AclObj for {}: {}", key, error));
-        srManager.flowObjectiveService.forward(key.deviceId(), aclObjBuilder.add(aclContext));
-    }
-
-    /**
-     * Revokes XConnect groups and flows for given key.
-     *
-     * @param key XConnect key
-     * @param ports XConnect ports
-     */
-    private void revokeXConnect(XConnectStoreKey key, Set<PortNumber> ports) {
-        if (!srManager.mastershipService.isLocalMaster(key.deviceId())) {
-            log.info("Abort populating XConnect {}: {}", key, NOT_MASTER);
-            return;
-        }
-
-        ports = addPairPort(key.deviceId(), ports);
-        revokeFilter(key, ports);
-        if (xConnectNextObjStore.containsKey(key)) {
-            NextObjective nextObj = xConnectNextObjStore.get(key).value();
-            revokeFwd(key, nextObj, null);
-            revokeNext(key, nextObj, null);
-        } else {
-            log.warn("NextObj for {} does not exist in the store.", key);
-        }
-        revokeAcl(key);
-    }
-
-    /**
-     * Revokes filtering objectives for given XConnect.
-     *
-     * @param key XConnect store key
-     * @param ports XConnect ports
-     */
-    private void revokeFilter(XConnectStoreKey key, Set<PortNumber> ports) {
-        ports.forEach(port -> {
-            FilteringObjective.Builder filtObjBuilder = filterObjBuilder(key, port);
-            ObjectiveContext context = new DefaultObjectiveContext(
-                    (objective) -> log.debug("XConnect FilterObj for {} on port {} revoked",
-                            key, port),
-                    (objective, error) ->
-                            log.warn("Failed to revoke XConnect FilterObj for {} on port {}: {}",
-                                    key, port, error));
-            srManager.flowObjectiveService.filter(key.deviceId(), filtObjBuilder.remove(context));
-        });
-    }
-
-    /**
-     * Revokes next objectives for given XConnect.
-     *
-     * @param key XConnect store key
-     * @param nextObj next objective
-     * @param nextFuture completable future for this next objective operation
-     */
-    private void revokeNext(XConnectStoreKey key, NextObjective nextObj,
-            CompletableFuture<ObjectiveError> nextFuture) {
-        ObjectiveContext context = new ObjectiveContext() {
-            @Override
-            public void onSuccess(Objective objective) {
-                log.debug("Previous NextObj for {} removed", key);
-                if (nextFuture != null) {
-                    nextFuture.complete(null);
-                }
-            }
-
-            @Override
-            public void onError(Objective objective, ObjectiveError error) {
-                log.warn("Failed to remove previous NextObj for {}: {}", key, error);
-                if (nextFuture != null) {
-                    nextFuture.complete(error);
-                }
-            }
-        };
-        srManager.flowObjectiveService.next(key.deviceId(),
-                (NextObjective) nextObj.copy().remove(context));
-        xConnectNextObjStore.remove(key);
-    }
-
-    /**
-     * Revokes bridging forwarding objectives for given XConnect.
-     *
-     * @param key XConnect store key
-     * @param nextObj next objective
-     * @param fwdFuture completable future for this forwarding objective operation
-     */
-    private void revokeFwd(XConnectStoreKey key, NextObjective nextObj,
-            CompletableFuture<ObjectiveError> fwdFuture) {
-        ForwardingObjective.Builder fwdObjBuilder = fwdObjBuilder(key, nextObj.id());
-        ObjectiveContext context = new ObjectiveContext() {
-            @Override
-            public void onSuccess(Objective objective) {
-                log.debug("Previous FwdObj for {} removed", key);
-                if (fwdFuture != null) {
-                    fwdFuture.complete(null);
-                }
-            }
-
-            @Override
-            public void onError(Objective objective, ObjectiveError error) {
-                log.warn("Failed to remove previous FwdObj for {}: {}", key, error);
-                if (fwdFuture != null) {
-                    fwdFuture.complete(error);
-                }
-            }
-        };
-        srManager.flowObjectiveService
-                .forward(key.deviceId(), fwdObjBuilder.remove(context));
-    }
-
-    /**
-     * Revokes ACL forwarding objectives for given XConnect.
-     *
-     * @param key XConnect store key
-     */
-    private void revokeAcl(XConnectStoreKey key) {
-        ForwardingObjective.Builder aclObjBuilder = aclObjBuilder(key.vlanId());
-        ObjectiveContext aclContext = new DefaultObjectiveContext(
-                (objective) -> log.debug("XConnect AclObj for {} populated", key),
-                (objective, error) ->
-                        log.warn("Failed to populate XConnect AclObj for {}: {}", key, error));
-        srManager.flowObjectiveService
-                .forward(key.deviceId(), aclObjBuilder.remove(aclContext));
-    }
-
-    /**
-     * Updates XConnect groups and flows for given key.
-     *
-     * @param key XConnect key
-     * @param prevPorts previous XConnect ports
-     * @param ports new XConnect ports
-     */
-    private void updateXConnect(XConnectStoreKey key, Set<PortNumber> prevPorts,
-            Set<PortNumber> ports) {
-        // NOTE: ACL flow doesn't include port information. No need to update it.
-        //       Pair port is built-in and thus not going to change. No need to update it.
-
-        // remove old filter
-        prevPorts.stream().filter(port -> !ports.contains(port)).forEach(port ->
-            revokeFilter(key, ImmutableSet.of(port)));
-        // install new filter
-        ports.stream().filter(port -> !prevPorts.contains(port)).forEach(port ->
-            populateFilter(key, ImmutableSet.of(port)));
-
-        CompletableFuture<ObjectiveError> fwdFuture = new CompletableFuture<>();
-        CompletableFuture<ObjectiveError> nextFuture = new CompletableFuture<>();
-
-        if (xConnectNextObjStore.containsKey(key)) {
-            NextObjective nextObj = xConnectNextObjStore.get(key).value();
-            revokeFwd(key, nextObj, fwdFuture);
-
-            fwdFuture.thenAcceptAsync(fwdStatus -> {
-                if (fwdStatus == null) {
-                    log.debug("Fwd removed. Now remove group {}", key);
-                    revokeNext(key, nextObj, nextFuture);
-                }
-            });
-
-            nextFuture.thenAcceptAsync(nextStatus -> {
-                if (nextStatus == null) {
-                    log.debug("Installing new group and flow for {}", key);
-                    populateFwd(key, populateNext(key, ports));
-                }
-            });
-        } else {
-            log.warn("NextObj for {} does not exist in the store.", key);
-        }
-    }
-
-    /**
-     * Remove all groups on given device.
-     *
-     * @param deviceId device ID
-     */
-    void removeDevice(DeviceId deviceId) {
-        xConnectNextObjStore.entrySet().stream()
-                .filter(entry -> entry.getKey().deviceId().equals(deviceId))
-                .forEach(entry -> xConnectNextObjStore.remove(entry.getKey()));
-        log.debug("{} is removed from xConnectNextObjStore", deviceId);
-    }
-
-    /**
-     * Creates a next objective builder for XConnect.
-     *
-     * @param key XConnect key
-     * @param ports set of XConnect ports
-     * @return next objective builder
-     */
-    private NextObjective.Builder nextObjBuilder(XConnectStoreKey key, Set<PortNumber> ports) {
-        int nextId = srManager.flowObjectiveService.allocateNextId();
-        TrafficSelector metadata =
-                DefaultTrafficSelector.builder().matchVlanId(key.vlanId()).build();
-        NextObjective.Builder nextObjBuilder = DefaultNextObjective
-                .builder().withId(nextId)
-                .withType(NextObjective.Type.BROADCAST).fromApp(srManager.appId)
-                .withMeta(metadata);
-        ports.forEach(port -> {
-            TrafficTreatment.Builder tBuilder = DefaultTrafficTreatment.builder();
-            tBuilder.setOutput(port);
-            nextObjBuilder.addTreatment(tBuilder.build());
-        });
-        return nextObjBuilder;
-    }
-
-    /**
-     * Creates a bridging forwarding objective builder for XConnect.
-     *
-     * @param key XConnect key
-     * @param nextId next ID of the broadcast group for this XConnect key
-     * @return forwarding objective builder
-     */
-    private ForwardingObjective.Builder fwdObjBuilder(XConnectStoreKey key, int nextId) {
-        /*
-         * Driver should treat objectives with MacAddress.NONE and !VlanId.NONE
-         * as the VLAN cross-connect broadcast rules
-         */
-        TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
-        sbuilder.matchVlanId(key.vlanId());
-        sbuilder.matchEthDst(MacAddress.NONE);
-
-        ForwardingObjective.Builder fob = DefaultForwardingObjective.builder();
-        fob.withFlag(ForwardingObjective.Flag.SPECIFIC)
-                .withSelector(sbuilder.build())
-                .nextStep(nextId)
-                .withPriority(SegmentRoutingService.XCONNECT_PRIORITY)
-                .fromApp(srManager.appId)
-                .makePermanent();
-        return fob;
-    }
-
-    /**
-     * Creates an ACL forwarding objective builder for XConnect.
-     *
-     * @param vlanId cross connect VLAN id
-     * @return forwarding objective builder
-     */
-    private ForwardingObjective.Builder aclObjBuilder(VlanId vlanId) {
-        TrafficSelector.Builder sbuilder = DefaultTrafficSelector.builder();
-        sbuilder.matchVlanId(vlanId);
-
-        TrafficTreatment.Builder tbuilder = DefaultTrafficTreatment.builder();
-
-        ForwardingObjective.Builder fob = DefaultForwardingObjective.builder();
-        fob.withFlag(ForwardingObjective.Flag.VERSATILE)
-                .withSelector(sbuilder.build())
-                .withTreatment(tbuilder.build())
-                .withPriority(SegmentRoutingService.XCONNECT_ACL_PRIORITY)
-                .fromApp(srManager.appId)
-                .makePermanent();
-        return fob;
-    }
-
-    /**
-     * Creates a filtering objective builder for XConnect.
-     *
-     * @param key XConnect key
-     * @param port XConnect ports
-     * @return next objective builder
-     */
-    private FilteringObjective.Builder filterObjBuilder(XConnectStoreKey key, PortNumber port) {
-        FilteringObjective.Builder fob = DefaultFilteringObjective.builder();
-        fob.withKey(Criteria.matchInPort(port))
-                .addCondition(Criteria.matchVlanId(key.vlanId()))
-                .addCondition(Criteria.matchEthDst(MacAddress.NONE))
-                .withPriority(SegmentRoutingService.XCONNECT_PRIORITY);
-        return fob.permit().fromApp(srManager.appId);
-    }
-
-    /**
-     * Add pair port to the given set of port.
-     *
-     * @param deviceId device Id
-     * @param ports ports specified in the xconnect config
-     * @return port specified in the xconnect config plus the pair port (if configured)
-     */
-    private Set<PortNumber> addPairPort(DeviceId deviceId, Set<PortNumber> ports) {
-        Set<PortNumber> newPorts = Sets.newHashSet(ports);
-        srManager.getPairLocalPort(deviceId).ifPresent(newPorts::add);
-        return newPorts;
-    }
-
-    // TODO: Lambda closure in DefaultObjectiveContext cannot be serialized properly
-    //       with Kryo 3.0.3. It will be fixed in 3.0.4. By then we can use
-    //       DefaultObjectiveContext again.
-    private final class NextObjContext implements ObjectiveContext {
-        Objective.Operation op;
-        XConnectStoreKey key;
-
-        private NextObjContext(Objective.Operation op, XConnectStoreKey key) {
-            this.op = op;
-            this.key = key;
-        }
-
-        @Override
-        public void onSuccess(Objective objective) {
-            log.debug("XConnect NextObj for {} {}ED", key, op);
-        }
-
-        @Override
-        public void onError(Objective objective, ObjectiveError error) {
-            log.warn("Failed to {} XConnect NextObj for {}: {}", op, key, error);
-        }
-    }
-}
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/config/XConnectConfig.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/config/XConnectConfig.java
deleted file mode 100644
index 6689b93..0000000
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/config/XConnectConfig.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * 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 com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.google.common.collect.ImmutableSet;
-import org.onlab.packet.VlanId;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.config.Config;
-import org.onosproject.segmentrouting.storekey.XConnectStoreKey;
-
-import java.util.Set;
-
-import static com.google.common.base.Preconditions.checkArgument;
-
-/**
- * Configuration object for cross-connect.
- *
- * @deprecated in ONOS 1.12. Replaced by {@link org.onosproject.segmentrouting.xconnect.impl.XconnectManager}
- */
-@Deprecated
-public class XConnectConfig extends Config<ApplicationId> {
-    private static final String VLAN = "vlan";
-    private static final String PORTS = "ports";
-    private static final String NAME = "name"; // dummy field for naming
-
-    private static final String UNEXPECTED_FIELD_NAME = "Unexpected field name";
-
-    @Override
-    public boolean isValid() {
-        try {
-            getXconnects().forEach(this::getPorts);
-        } catch (IllegalArgumentException e) {
-            return false;
-        }
-        return true;
-    }
-
-    /**
-     * Returns all xconnect keys.
-     *
-     * @return all keys (device/vlan pairs)
-     * @throws IllegalArgumentException if wrong format
-     */
-    public Set<XConnectStoreKey> getXconnects() {
-        ImmutableSet.Builder<XConnectStoreKey> builder = ImmutableSet.builder();
-        object.fields().forEachRemaining(entry -> {
-            DeviceId deviceId = DeviceId.deviceId(entry.getKey());
-            builder.addAll(getXconnects(deviceId));
-        });
-        return builder.build();
-    }
-
-    /**
-     * Returns xconnect keys of given device.
-     *
-     * @param deviceId ID of the device from which we want to get XConnect info
-     * @return xconnect keys (device/vlan pairs) of given device
-     * @throws IllegalArgumentException if wrong format
-     */
-    public Set<XConnectStoreKey> getXconnects(DeviceId deviceId) {
-        ImmutableSet.Builder<XConnectStoreKey> builder = ImmutableSet.builder();
-        JsonNode vlanPortPair = object.get(deviceId.toString());
-        if (vlanPortPair != null) {
-            vlanPortPair.forEach(jsonNode -> {
-                if (!hasOnlyFields((ObjectNode) jsonNode, VLAN, PORTS, NAME)) {
-                    throw new IllegalArgumentException(UNEXPECTED_FIELD_NAME);
-                }
-                VlanId vlanId = VlanId.vlanId((short) jsonNode.get(VLAN).asInt());
-                builder.add(new XConnectStoreKey(deviceId, vlanId));
-            });
-        }
-        return builder.build();
-    }
-
-    /**
-     * Returns ports of given xconnect key.
-     *
-     * @param xconnect xconnect key
-     * @return set of two ports associated with given xconnect key
-     * @throws IllegalArgumentException if wrong format
-     */
-    public Set<PortNumber> getPorts(XConnectStoreKey xconnect) {
-        ImmutableSet.Builder<PortNumber> builder = ImmutableSet.builder();
-        object.get(xconnect.deviceId().toString()).forEach(vlanPortsPair -> {
-            if (xconnect.vlanId().toShort() == vlanPortsPair.get(VLAN).asInt()) {
-                int portCount = vlanPortsPair.get(PORTS).size();
-                checkArgument(portCount == 2,
-                        "Expect 2 ports but found " + portCount + " on " + xconnect);
-                vlanPortsPair.get(PORTS).forEach(portNode -> {
-                    builder.add(PortNumber.portNumber(portNode.asInt()));
-                });
-            }
-        });
-        return builder.build();
-    }
-}
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectCodec.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectCodec.java
index 1154e40..83421bc 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectCodec.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectCodec.java
@@ -32,9 +32,9 @@
  * Codec for Xconnect.
  */
 public class XconnectCodec extends JsonCodec<XconnectDesc> {
-    private static final String DEVICE_ID = "deviceId";
-    private static final String VLAN_ID = "vlanId";
-    private static final String ENDPOINTS = "endpoints";
+    static final String DEVICE_ID = "deviceId";
+    static final String VLAN_ID = "vlanId";
+    static final String ENDPOINTS = "endpoints";
 
     private static Logger log = LoggerFactory.getLogger(XconnectCodec.class);
 
@@ -42,7 +42,7 @@
     public ObjectNode encode(XconnectDesc desc, CodecContext context) {
         final ObjectNode result = context.mapper().createObjectNode();
         result.put(DEVICE_ID, desc.key().deviceId().toString());
-        result.put(VLAN_ID, desc.key().vlanId().toString());
+        result.put(VLAN_ID, desc.key().vlanId().toShort());
         final ArrayNode portNode = result.putArray(ENDPOINTS);
         desc.endpoints().forEach(endpoint -> portNode.add(endpoint.toString()));
 
@@ -57,8 +57,7 @@
         Set<XconnectEndpoint> endpoints = Sets.newHashSet();
         JsonNode endpointNodes = json.get(ENDPOINTS);
         if (endpointNodes != null) {
-            XconnectEndpoint endpoint = XconnectEndpoint.fromString(endpointNodes.asText());
-            endpointNodes.forEach(endpointNode -> endpoints.add(endpoint));
+            endpointNodes.forEach(endpointNode -> endpoints.add(XconnectEndpoint.fromString(endpointNode.asText())));
         }
 
         XconnectKey key = new XconnectKey(deviceId, vlanId);
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectDesc.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectDesc.java
index 1e7a3b2..a47823a 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectDesc.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectDesc.java
@@ -61,9 +61,6 @@
         if (this == obj) {
             return true;
         }
-        if (!super.equals(obj)) {
-            return false;
-        }
         if (!(obj instanceof XconnectDesc)) {
             return false;
         }
diff --git a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectKey.java b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectKey.java
index 1f2d446..7d433cd 100644
--- a/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectKey.java
+++ b/apps/segmentrouting/app/src/main/java/org/onosproject/segmentrouting/xconnect/api/XconnectKey.java
@@ -62,9 +62,6 @@
         if (this == obj) {
             return true;
         }
-        if (!super.equals(obj)) {
-            return false;
-        }
         if (!(obj instanceof XconnectKey)) {
             return false;
         }
diff --git a/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/config/XConnectConfigTest.java b/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/config/XConnectConfigTest.java
deleted file mode 100644
index 62d2d86..0000000
--- a/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/config/XConnectConfigTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Foundation
- *
- * 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 com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.Before;
-import org.junit.Test;
-import org.onlab.packet.VlanId;
-import org.onosproject.TestApplicationId;
-import org.onosproject.core.ApplicationId;
-import org.onosproject.net.DeviceId;
-import org.onosproject.net.PortNumber;
-import org.onosproject.net.config.Config;
-import org.onosproject.net.config.ConfigApplyDelegate;
-import org.onosproject.segmentrouting.SegmentRoutingManager;
-import org.onosproject.segmentrouting.storekey.XConnectStoreKey;
-import java.io.InputStream;
-import java.util.Set;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertThat;
-import static org.hamcrest.Matchers.is;
-
-/**
- * Tests for class {@link XConnectConfig}.
- */
-public class XConnectConfigTest {
-    private static final DeviceId DEV1 = DeviceId.deviceId("of:0000000000000001");
-    private static final DeviceId DEV2 = DeviceId.deviceId("of:0000000000000002");
-    private static final VlanId VLAN10 = VlanId.vlanId((short) 10);
-    private static final VlanId VLAN20 = VlanId.vlanId((short) 20);
-    private static final PortNumber PORT3 = PortNumber.portNumber(3);
-    private static final PortNumber PORT4 = PortNumber.portNumber(4);
-    private static final PortNumber PORT5 = PortNumber.portNumber(5);
-    private static final XConnectStoreKey KEY1 = new XConnectStoreKey(DEV1, VLAN10);
-    private static final XConnectStoreKey KEY2 = new XConnectStoreKey(DEV2, VLAN10);
-    private static final XConnectStoreKey KEY3 = new XConnectStoreKey(DEV2, VLAN20);
-    private static final XConnectStoreKey KEY4 = new XConnectStoreKey(DEV2, VlanId.NONE);
-
-    private XConnectConfig config;
-    private XConnectConfig invalidConfig;
-
-    @Before
-    public void setUp() throws Exception {
-        InputStream jsonStream = SegmentRoutingAppConfigTest.class
-                .getResourceAsStream("/xconnect.json");
-        InputStream invalidJsonStream = SegmentRoutingAppConfigTest.class
-                .getResourceAsStream("/xconnect-invalid.json");
-
-        String key = SegmentRoutingManager.APP_NAME;
-        ApplicationId subject = new TestApplicationId(key);
-        ObjectMapper mapper = new ObjectMapper();
-        JsonNode jsonNode = mapper.readTree(jsonStream);
-        JsonNode invalidJsonNode = mapper.readTree(invalidJsonStream);
-        ConfigApplyDelegate delegate = new XConnectConfigTest.MockDelegate();
-
-        config = new XConnectConfig();
-        config.init(subject, key, jsonNode, mapper, delegate);
-        invalidConfig = new XConnectConfig();
-        invalidConfig.init(subject, key, invalidJsonNode, mapper, delegate);
-    }
-
-    /**
-     * Tests config validity.
-     */
-    @Test
-    public void testIsValid() {
-        assertTrue(config.isValid());
-        assertFalse(invalidConfig.isValid());
-    }
-
-    /**
-     * Tests getXconnects.
-     */
-    @Test
-    public void testGetXconnects() {
-        Set<XConnectStoreKey> xconnects = config.getXconnects();
-        assertThat(xconnects.size(), is(3));
-        assertTrue(xconnects.contains(KEY1));
-        assertTrue(xconnects.contains(KEY2));
-        assertTrue(xconnects.contains(KEY3));
-        assertFalse(xconnects.contains(KEY4));
-    }
-
-    /**
-     * Tests getPorts.
-     */
-    @Test
-    public void testGetPorts() {
-        Set<PortNumber> ports;
-
-        ports = config.getPorts(KEY1);
-        assertThat(ports.size(), is(2));
-        assertTrue(ports.contains(PORT3));
-        assertTrue(ports.contains(PORT4));
-
-        ports = config.getPorts(KEY2);
-        assertThat(ports.size(), is(2));
-        assertTrue(ports.contains(PORT3));
-        assertTrue(ports.contains(PORT4));
-
-        ports = config.getPorts(KEY3);
-        assertThat(ports.size(), is(2));
-        assertTrue(ports.contains(PORT4));
-        assertTrue(ports.contains(PORT5));
-    }
-
-    private class MockDelegate implements ConfigApplyDelegate {
-        @Override
-        public void onApply(Config config) {
-        }
-    }
-}
\ No newline at end of file
diff --git a/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/xconnect/api/XconnectCodecTest.java b/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/xconnect/api/XconnectCodecTest.java
new file mode 100644
index 0000000..bac9ff4
--- /dev/null
+++ b/apps/segmentrouting/app/src/test/java/org/onosproject/segmentrouting/xconnect/api/XconnectCodecTest.java
@@ -0,0 +1,111 @@
+/*
+ * Copyright 2019-present Open Networking Foundation
+ *
+ * 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.xconnect.api;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+import com.google.common.collect.Sets;
+import org.junit.Before;
+import org.junit.Test;
+import org.onlab.packet.VlanId;
+import org.onosproject.codec.CodecContext;
+import org.onosproject.codec.JsonCodec;
+import org.onosproject.codec.impl.MockCodecContext;
+import org.onosproject.net.DeviceId;
+
+import java.io.InputStream;
+import java.util.Set;
+
+import static org.junit.Assert.*;
+
+public class XconnectCodecTest {
+    private static final DeviceId DEVICE_ID = DeviceId.deviceId("of:1");
+    private static final VlanId VLAN_VID = VlanId.vlanId((short) 10);
+    private static final XconnectKey KEY = new XconnectKey(DEVICE_ID, VLAN_VID);
+    private static final XconnectEndpoint EP1 = XconnectEndpoint.fromString("1");
+    private static final XconnectEndpoint EP2 = XconnectEndpoint.fromString("2");
+    private static final XconnectEndpoint EP3 = XconnectEndpoint.fromString("LB:5");
+
+    private CodecContext context;
+    private JsonCodec<XconnectDesc> codec;
+
+    @Before
+    public void setUp() throws Exception {
+        context = new MockCodecContext();
+        codec = new XconnectCodec();
+    }
+
+    @Test
+    public void testEncodePort() throws Exception {
+        Set<XconnectEndpoint> endpoints1 = Sets.newHashSet(EP1, EP2);
+        XconnectDesc desc1 = new XconnectDesc(KEY, endpoints1);
+
+        ObjectMapper mapper = new ObjectMapper();
+        InputStream jsonStream1 = XconnectCodecTest.class.getResourceAsStream("/xconnect1.json");
+        JsonNode expected = mapper.readTree(jsonStream1);
+
+        JsonNode actual = codec.encode(desc1, context);
+
+        assertEquals(expected.get(XconnectCodec.DEVICE_ID), actual.get(XconnectCodec.DEVICE_ID));
+        assertEquals(expected.get(XconnectCodec.VLAN_ID).asInt(), actual.get(XconnectCodec.VLAN_ID).asInt());
+        assertEquals(expected.get(XconnectCodec.ENDPOINTS), actual.get(XconnectCodec.ENDPOINTS));
+    }
+
+    @Test
+    public void testDecodePort() throws Exception {
+        Set<XconnectEndpoint> endpoints1 = Sets.newHashSet(EP1, EP2);
+        XconnectDesc expected = new XconnectDesc(KEY, endpoints1);
+
+        ObjectMapper mapper = new ObjectMapper();
+        InputStream jsonStream1 = XconnectCodecTest.class.getResourceAsStream("/xconnect1.json");
+        ObjectNode objectNode = mapper.readTree(jsonStream1).deepCopy();
+
+        XconnectDesc actual = codec.decode(objectNode, context);
+
+        assertEquals(expected, actual);
+    }
+
+    @Test
+    public void testEncodeLb() throws Exception {
+        Set<XconnectEndpoint> endpoints1 = Sets.newHashSet(EP1, EP3);
+        XconnectDesc desc1 = new XconnectDesc(KEY, endpoints1);
+
+        ObjectMapper mapper = new ObjectMapper();
+        InputStream jsonStream1 = XconnectCodecTest.class.getResourceAsStream("/xconnect2.json");
+        JsonNode expected = mapper.readTree(jsonStream1);
+
+        JsonNode actual = codec.encode(desc1, context);
+
+        assertEquals(expected.get(XconnectCodec.DEVICE_ID), actual.get(XconnectCodec.DEVICE_ID));
+        assertEquals(expected.get(XconnectCodec.VLAN_ID).asInt(), actual.get(XconnectCodec.VLAN_ID).asInt());
+        assertEquals(expected.get(XconnectCodec.ENDPOINTS), actual.get(XconnectCodec.ENDPOINTS));
+    }
+
+    @Test
+    public void testDecodeLb() throws Exception {
+        Set<XconnectEndpoint> endpoints1 = Sets.newHashSet(EP1, EP3);
+        XconnectDesc expected = new XconnectDesc(KEY, endpoints1);
+
+        ObjectMapper mapper = new ObjectMapper();
+        InputStream jsonStream1 = XconnectCodecTest.class.getResourceAsStream("/xconnect2.json");
+        ObjectNode objectNode = mapper.readTree(jsonStream1).deepCopy();
+
+        XconnectDesc actual = codec.decode(objectNode, context);
+
+        assertEquals(expected, actual);
+    }
+}
\ No newline at end of file
diff --git a/apps/segmentrouting/app/src/test/resources/xconnect-invalid.json b/apps/segmentrouting/app/src/test/resources/xconnect-invalid.json
deleted file mode 100644
index e468271..0000000
--- a/apps/segmentrouting/app/src/test/resources/xconnect-invalid.json
+++ /dev/null
@@ -1,18 +0,0 @@
-{
-  "of:0000000000000001": [
-    {
-      "vlan": 10,
-      "ports": [3, 4]
-    }
-  ],
-  "of:0000000000000002": [
-    {
-      "vlan": 10,
-      "ports": [3, 4]
-    },
-    {
-      "vlan": 20,
-      "ports": [4, 5, 6]
-    }
-  ]
-}
diff --git a/apps/segmentrouting/app/src/test/resources/xconnect.json b/apps/segmentrouting/app/src/test/resources/xconnect.json
deleted file mode 100644
index ebd61b3..0000000
--- a/apps/segmentrouting/app/src/test/resources/xconnect.json
+++ /dev/null
@@ -1,19 +0,0 @@
-{
-  "of:0000000000000001": [
-    {
-      "vlan": 10,
-      "ports": [3, 4],
-      "name": "OLT1"
-    }
-  ],
-  "of:0000000000000002": [
-    {
-      "vlan": 10,
-      "ports": [3, 4]
-    },
-    {
-      "vlan": 20,
-      "ports": [4, 5]
-    }
-  ]
-}
diff --git a/apps/segmentrouting/app/src/test/resources/xconnect1.json b/apps/segmentrouting/app/src/test/resources/xconnect1.json
new file mode 100644
index 0000000..d8990d4
--- /dev/null
+++ b/apps/segmentrouting/app/src/test/resources/xconnect1.json
@@ -0,0 +1,5 @@
+{
+  "deviceId": "of:1",
+  "vlanId": 10,
+  "endpoints": ["1", "2"]
+}
diff --git a/apps/segmentrouting/app/src/test/resources/xconnect2.json b/apps/segmentrouting/app/src/test/resources/xconnect2.json
new file mode 100644
index 0000000..61919da
--- /dev/null
+++ b/apps/segmentrouting/app/src/test/resources/xconnect2.json
@@ -0,0 +1,5 @@
+{
+  "deviceId": "of:1",
+  "vlanId": 10,
+  "endpoints": ["1", "LB:5"]
+}
