diff --git a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
index 2fced48..58c9d49 100644
--- a/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
+++ b/apps/optical-model/src/main/java/org/onosproject/net/optical/intent/impl/compiler/OpticalConnectivityIntentCompiler.java
@@ -306,7 +306,10 @@
         // Sort available lambdas
         List<OchSignal> lambdaList = new ArrayList<>(lambdas);
         lambdaList.sort(new DefaultOchSignalComparator());
-
+        //Means there is only exactly one set of lambdas available
+        if (lambdaList.size() == count) {
+            return lambdaList;
+        }
         // Look ahead by count and ensure spacing multiplier is as expected (i.e., no gaps)
         for (int i = 0; i < lambdaList.size() - count; i++) {
             if (lambdaList.get(i).spacingMultiplier() + 2 * count ==
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceDescriptionDiscovery.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceDescriptionDiscovery.java
index 2c35a29..71e338e 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceDescriptionDiscovery.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceDescriptionDiscovery.java
@@ -54,6 +54,7 @@
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.SUPPORTED_LAYER_PROTOCOL_QUALIFIER;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.UUID;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.getOchSignal;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.removeInitalConnectivityServices;
 import static org.onosproject.net.optical.device.OchPortHelper.ochPortDescription;
 import static org.slf4j.LoggerFactory.getLogger;
 
@@ -119,9 +120,13 @@
                 log.error("Can't discover port details at {}", SIP_REQUEST_DATA_API);
                 return ImmutableList.of();
             }
-            return parseTapiPorts(jsonNode);
+            List<PortDescription> ports = parseTapiPorts(jsonNode);
+            //Removing any initial connectivity services
+            removeInitalConnectivityServices(deviceId, handler());
+            return ports;
         } catch (IOException e) {
             log.error("Exception discoverPortDetails() {}", did(), e);
+            removeInitalConnectivityServices(deviceId, handler());
             return ImmutableList.of();
         }
     }
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceHelper.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceHelper.java
index efbc12d..d73daeb 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceHelper.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiDeviceHelper.java
@@ -18,16 +18,30 @@
 package org.onosproject.drivers.odtn.tapi;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
+import com.google.common.collect.ImmutableSet;
+import org.apache.http.HttpStatus;
+import org.onosproject.drivers.odtn.impl.DeviceConnectionCache;
 import org.onosproject.net.ChannelSpacing;
+import org.onosproject.net.DeviceId;
 import org.onosproject.net.GridType;
 import org.onosproject.net.OchSignal;
+import org.onosproject.net.driver.DriverHandler;
+import org.onosproject.protocol.rest.RestSBController;
 import org.slf4j.Logger;
 
+import javax.ws.rs.core.MediaType;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
 import java.util.stream.IntStream;
 
+import static com.google.common.base.Preconditions.checkNotNull;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -55,6 +69,8 @@
     public static final String LOWER_FREQUENCY = "lower-frequency";
     public static final long BASE_FREQUENCY = 193100000;   //Working in Mhz
     public static final String TAPI_CONNECTIVITY_CONNECTIVITY_SERVICE = "tapi-connectivity:connectivity-service";
+    public static final String TAPI_CONNECTIVITY_CONNECTIVITY_CONTEXT = "tapi-connectivity:connectivity-context";
+    public static final String CONNECTIVITY_SERVICE = "connectivity-service";
     public static final String END_POINT = "end-point";
     public static final String SERVICE_LAYER = "service-layer";
     public static final String SERVICE_TYPE = "service-type";
@@ -67,12 +83,20 @@
     public static final String AVAILABLE_SPECTRUM = "available-spectrum";
     protected static final String SUPPORTABLE_SPECTRUM = "supportable-spectrum";
 
-    private TapiDeviceHelper(){}
+    protected static final String CONN_REQ_POST_API = "/restconf/data/tapi-common:context/" +
+            "tapi-connectivity:connectivity-context/";
+    protected static final String CONN_REQ_REMOVE_DATA_API = "/restconf/data/tapi-common:context/" +
+            "tapi-connectivity:connectivity-context/connectivity-service=";
+    protected static final String CONN_REQ_GET_API = "/restconf/data/tapi-common:context/" +
+            "tapi-connectivity:connectivity-context/";
+
+    private TapiDeviceHelper() {
+    }
 
     /**
      * Returns the slot granularity corresponding to a channelSpacing.
      *
-     * @param chSpacing      OchSingal channel spacing {@link ChannelSpacing}
+     * @param chSpacing OchSingal channel spacing {@link ChannelSpacing}
      * @return OchSignal slot width granularity
      */
     public static int getSlotGranularity(ChannelSpacing chSpacing) {
@@ -113,10 +137,10 @@
     }
 
     /**
-     *  To Mbps conversion from Hz.
+     * To Mbps conversion from Hz.
      *
-     *  @param speed the speed in Hz
-     *  @return the speed in Mbps
+     * @param speed the speed in Hz
+     * @return the speed in Mbps
      */
     public static long toMbpsFromHz(long speed) {
         return speed / 1000000;
@@ -148,22 +172,41 @@
             JsonNode availableSpec = iterAvailable.next();
             availableUpperFrec = availableSpec.get(UPPER_FREQUENCY).asLong();
             availableLowerFrec = availableSpec.get(LOWER_FREQUENCY).asLong();
-            log.info("availableUpperFrec {}, availableLowerFrec {}", availableUpperFrec,
+            log.debug("availableUpperFrec {}, availableLowerFrec {}", availableUpperFrec,
                     availableLowerFrec);
             availableAdjustmentGranularity = availableSpec.get(FREQUENCY_CONSTRAINT)
                     .get(ADJUSTMENT_GRANULARITY).textValue();
             availableGridType = availableSpec.get(FREQUENCY_CONSTRAINT).get(GRID_TYPE).textValue();
-
+            log.debug("adjustment {}, availableLowerFrec {}", availableUpperFrec,
+                    availableLowerFrec);
             int slotGranularity;
             ChannelSpacing chSpacing = getChannelSpacing(availableAdjustmentGranularity);
-            double spacingFrequency = chSpacing.frequency().asGHz();
+            double spacingFrequency = chSpacing.frequency().asMHz();
             int lambdaCount = (int) ((availableUpperFrec - availableLowerFrec) / spacingFrequency);
             GridType gridType = GridType.valueOf(availableGridType);
             if (gridType == GridType.DWDM) {
                 slotGranularity = getSlotGranularity(chSpacing);
                 int finalSlotGranularity = slotGranularity;
-                IntStream.range(0, lambdaCount).forEach(x -> lambdas.add(new OchSignal(GridType.DWDM, chSpacing,
-                        x - (lambdaCount / 2), finalSlotGranularity)));
+                long finalAvailableUpperFrec = availableUpperFrec;
+                long finalAvailableLowerFrec = availableLowerFrec;
+                IntStream.range(0, lambdaCount).forEach(x -> {
+                    int spacingMultiplier = 0;
+                    if (finalAvailableUpperFrec > BASE_FREQUENCY) {
+                        spacingMultiplier = (int) (((finalAvailableUpperFrec -
+                                (chSpacing.frequency().asMHz() * lambdaCount * x) - slotGranularity / 2)
+                                - BASE_FREQUENCY) / (chSpacing.frequency().asMHz()));
+                    } else {
+                        spacingMultiplier = (int) ((BASE_FREQUENCY - (finalAvailableLowerFrec +
+                                (chSpacing.frequency().asMHz() * lambdaCount * x) + slotGranularity / 2))
+                                / (chSpacing.frequency().asMHz()));
+                    }
+                    OchSignal ochSignal = new OchSignal(GridType.DWDM, chSpacing,
+                            spacingMultiplier, finalSlotGranularity);
+                    log.debug("Spacing Freq {}, LambdaCount {}, FinalSlotGran {}, Spacing mult {}, CentralFreq {}",
+                            spacingFrequency, lambdaCount, finalSlotGranularity, spacingMultiplier,
+                            ochSignal.centralFrequency());
+                    lambdas.add(ochSignal);
+                });
             } else if (gridType == GridType.CWDM) {
                 log.warn("GridType CWDM. Not implemented");
             } else if (gridType == GridType.FLEX) {
@@ -174,4 +217,73 @@
         }
         return lambdas;
     }
+
+    static DeviceConnectionCache getConnectionCache() {
+        return DeviceConnectionCache.init();
+    }
+
+    protected static Set<String> getUuids(DeviceId deviceId, DriverHandler handler) {
+        RestSBController controller = checkNotNull(handler.get(RestSBController.class));
+        ObjectMapper om = new ObjectMapper();
+        final ObjectReader reader = om.reader();
+        InputStream response = controller.get(deviceId, CONN_REQ_GET_API, MediaType.APPLICATION_JSON_TYPE);
+        JsonNode jsonNode;
+        try {
+            jsonNode = reader.readTree(response);
+            if (jsonNode == null) {
+                log.error("JsonNode is null for response {}", response);
+                return ImmutableSet.of();
+            }
+            return parseTapiGetConnectivityRequest(jsonNode);
+        } catch (IOException e) {
+            log.error("Exception while reading response {}", response, e);
+            return ImmutableSet.of();
+        }
+    }
+
+    protected static Set<String> parseTapiGetConnectivityRequest(JsonNode tapiConnectivityReply) {
+        /*
+         {
+            "tapi-connectivity:connectivity-context": {
+                "connectivity-service": [
+                    {
+                        "uuid": "f4088e82-e8bd-4d00-a96c-40d9fcfa1d4d",
+                        ......
+                 ]
+             }
+          }
+         */
+        Set<String> uuids = new HashSet<>();
+        if (tapiConnectivityReply.has(TAPI_CONNECTIVITY_CONNECTIVITY_CONTEXT)
+                && tapiConnectivityReply.get(TAPI_CONNECTIVITY_CONNECTIVITY_CONTEXT).has(CONNECTIVITY_SERVICE)) {
+            tapiConnectivityReply.get(TAPI_CONNECTIVITY_CONNECTIVITY_CONTEXT).get(CONNECTIVITY_SERVICE).elements()
+                    .forEachRemaining(node -> uuids.add(node.get(TapiDeviceHelper.UUID).asText()));
+        } else {
+            log.warn("Can't retrieve connectivity UUID from {}", tapiConnectivityReply);
+        }
+        //This is only one uuid or empty in case of failures
+        return uuids;
+    }
+
+    protected static void removeInitalConnectivityServices(DeviceId deviceId, DriverHandler handler) {
+        RestSBController controller = checkNotNull(handler.get(RestSBController.class));
+        //If no connections are there removing all previous (if any) connections during first installation
+        if (getConnectionCache().size(deviceId) == 0) {
+            Set<String> uuids = getUuids(deviceId, handler);
+            uuids.forEach(uuid -> {
+                CompletableFuture<Integer> flowRemoval =
+                        CompletableFuture.supplyAsync(() -> controller.delete(deviceId,
+                                CONN_REQ_REMOVE_DATA_API + uuid,
+                                null, MediaType.APPLICATION_JSON_TYPE));
+                flowRemoval.thenApply(result -> {
+                    if (result == HttpStatus.SC_NO_CONTENT || result == HttpStatus.SC_OK) {
+                        log.info("Removed connectivity service {} from {}, result {}", uuid, deviceId, result);
+                    } else {
+                        log.error("Can't remove connectivity service {}, result {}", uuid, result);
+                    }
+                    return result;
+                });
+            });
+        }
+    }
 }
diff --git a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammable.java b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammable.java
index ce09453..36e0e6c 100644
--- a/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammable.java
+++ b/drivers/odtn-driver/src/main/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammable.java
@@ -20,7 +20,6 @@
 import com.fasterxml.jackson.core.JsonEncoding;
 import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.core.JsonGenerator;
-import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.collect.ImmutableList;
 import org.apache.http.HttpStatus;
 import org.onosproject.drivers.odtn.impl.DeviceConnection;
@@ -45,13 +44,14 @@
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.CONN_REQ_POST_API;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.CONN_REQ_REMOVE_DATA_API;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.END_POINT;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.LAYER_PROTOCOL_NAME;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.LAYER_PROTOCOL_QUALIFIER;
@@ -64,6 +64,8 @@
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.SERVICE_TYPE;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.TAPI_CONNECTIVITY_CONNECTIVITY_SERVICE;
 import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.TAPI_PHOTONIC_MEDIA_PHOTONIC_LAYER_QUALIFIER_NMC;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.getConnectionCache;
+import static org.onosproject.drivers.odtn.tapi.TapiDeviceHelper.getUuids;
 import static org.slf4j.LoggerFactory.getLogger;
 
 /**
@@ -75,47 +77,13 @@
         implements FlowRuleProgrammable {
 
     private static final Logger log = getLogger(TapiFlowRuleProgrammable.class);
-    private static final String CONN_REQ_POST_API = "/restconf/data/tapi-common:context/" +
-            "tapi-connectivity:connectivity-context/";
-    private static final String CONN_REQ_REMOVE_DATA_API = "/restconf/data/tapi-common:context/" +
-            "tapi-connectivity:connectivity-context/connectivity-service=";
-    private static final String CONN_REQ_GET_API = "/restconf/data/tapi-common:context/" +
-            "tapi-connectivity:connectivity-context/";
 
 
     @Override
     public Collection<FlowEntry> getFlowEntries() {
         DeviceId deviceId = did();
         //TODO this is a blocking call on ADVA OLS, right now using cache.
-//        RestSBController controller = checkNotNull(handler().get(RestSBController.class));
-//        ObjectMapper om = new ObjectMapper();
-//        final ObjectReader reader = om.reader();
-//        InputStream response = controller.get(deviceId, CONN_REQ_GET_API, MediaType.APPLICATION_JSON_TYPE);
-//        JsonNode jsonNode = null;
-//        try {
-//            jsonNode = reader.readTree(response);
-//            if (jsonNode == null) {
-//                log.error("JsonNode is null for response {}", response);
-//                return ImmutableList.of();
-//            }
-//            Set<String> uuids = parseTapiGetConnectivityRequest(jsonNode);
-//            DeviceConnectionCache cache = getConnectionCache();
-//            if (cache.get(deviceId) == null) {
-//                return ImmutableList.of();
-//            }
-//            List<FlowEntry> entries = new ArrayList<>();
-//            uuids.forEach(uuid -> {
-//                FlowRule rule = cache.get(deviceId, uuid);
-//                if (rule != null) {
-//                    entries.add(new DefaultFlowEntry(rule, FlowEntry.FlowEntryState.ADDED, 0, 0, 0));
-//                } else {
-//                    log.info("Non existing rule for uuid {}", uuid);
-//                }
-//            });
-//            return entries;
-//        } catch (IOException e) {
-//            return ImmutableList.of();
-//        }
+        //return getFlowsFromConnectivityServices(deviceId);
         List<FlowEntry> entries = new ArrayList<>();
         Set<FlowRule> rules = getConnectionCache().get(deviceId);
         if (rules != null) {
@@ -135,21 +103,23 @@
             String uuid = createUuid();
             ByteArrayOutputStream applyConnectivityRequest = createConnectivityRequest(uuid, flowRule);
             if (applyConnectivityRequest.size() != 0) {
-                CompletableFuture<Integer>  flowInstallation =
+                log.debug("Connectivity request {}", applyConnectivityRequest.toString());
+                CompletableFuture<Integer> flowInstallation =
                         CompletableFuture.supplyAsync(() -> controller.post(deviceId, CONN_REQ_POST_API,
-                        new ByteArrayInputStream(applyConnectivityRequest.toByteArray()),
-                        MediaType.APPLICATION_JSON_TYPE));
+                                new ByteArrayInputStream(applyConnectivityRequest.toByteArray()),
+                                MediaType.APPLICATION_JSON_TYPE));
+                log.debug("Added {} to {}", flowRule, deviceId);
+                getConnectionCache().add(deviceId, uuid, flowRule);
+                added.add(flowRule);
                 flowInstallation.thenApply(result -> {
-                    if (result == HttpStatus.SC_CREATED) {
-                        getConnectionCache().add(deviceId, uuid, flowRule);
-                        added.add(flowRule);
+                    if (result == HttpStatus.SC_CREATED || result == HttpStatus.SC_OK) {
+                        log.info("Added {} to deviceId {}", flowRule, deviceId);
                     } else {
-                       log.error("Can't add flow {}, result {}", flowRule, result);
+                        log.error("Can't add flow {}, result {}", flowRule, result);
+                        getConnectionCache().remove(deviceId, flowRule);
                     }
                     return result;
                 });
-                // TODO retrieve the UUID from the location and store with that identifier
-                // at the moment is implied that the sent one is the same used by the TAPI server.
             }
         });
         //TODO workaround for blocking call on ADVA OLS should return added
@@ -168,11 +138,11 @@
                         flowRule.id(), deviceId);
                 return;
             }
-            CompletableFuture<Integer>  flowInstallation =
+            CompletableFuture<Integer> flowRemoval =
                     CompletableFuture.supplyAsync(() -> controller.delete(deviceId,
                             CONN_REQ_REMOVE_DATA_API + conn.getId(),
                             null, MediaType.APPLICATION_JSON_TYPE));
-            flowInstallation.thenApply(result -> {
+            flowRemoval.thenApply(result -> {
                 if (result == HttpStatus.SC_NO_CONTENT) {
                     getConnectionCache().remove(deviceId, flowRule);
                     removed.add(flowRule);
@@ -195,31 +165,28 @@
         return handler().data().deviceId();
     }
 
-    private DeviceConnectionCache getConnectionCache() {
-        return DeviceConnectionCache.init();
+    //Currently uused because get is a blocking call on ADVA
+    private Collection<FlowEntry> getFlowsFromConnectivityServices(DeviceId deviceId) {
+        Set<String> uuids = getUuids(deviceId, handler());
+        if (uuids.isEmpty()) {
+            return ImmutableList.of();
+        }
+        DeviceConnectionCache cache = getConnectionCache();
+        if (cache.get(deviceId) == null) {
+            return ImmutableList.of();
+        }
+        List<FlowEntry> entries = new ArrayList<>();
+        uuids.forEach(uuid -> {
+            FlowRule rule = cache.get(deviceId, uuid);
+            if (rule != null) {
+                entries.add(new DefaultFlowEntry(rule, FlowEntry.FlowEntryState.ADDED, 0, 0, 0));
+            } else {
+                log.info("Non existing rule for uuid {}", uuid);
+            }
+        });
+        return entries;
     }
 
-    protected Set<String> parseTapiGetConnectivityRequest(JsonNode tapiConnectivityReply) {
-        /*
-         {
-            "tapi-connectivity:connectivity-service":[
-                {
-                    "uuid":"ffb006d4-349e-4d2f-817e-0906c88458d0",
-                    <other fields>
-                }
-            ]
-          }
-         */
-        Set<String> uuids = new HashSet<>();
-        if (tapiConnectivityReply.has(TAPI_CONNECTIVITY_CONNECTIVITY_SERVICE)) {
-            tapiConnectivityReply.get(TAPI_CONNECTIVITY_CONNECTIVITY_SERVICE).elements()
-                    .forEachRemaining(node -> uuids.add(node.get(TapiDeviceHelper.UUID).asText()));
-        } else {
-            log.warn("Can't retrieve connectivity UUID from {}", tapiConnectivityReply);
-        }
-        //This is only one uuid or empty in case of failures
-        return uuids;
-    }
 
     ByteArrayOutputStream createConnectivityRequest(String uuid, FlowRule rule) {
         /*
@@ -272,8 +239,9 @@
             generator.writeStringField(SERVICE_LAYER, PHOTONIC_MEDIA);
             generator.writeStringField(SERVICE_TYPE, POINT_TO_POINT_CONNECTIVITY);
             generator.writeArrayFieldStart(END_POINT);
-            addEndPoint(generator, inputPortUuid);
-            addEndPoint(generator, outputPortUuid);
+            //ADVA OLS requires these to be 1,2 for every connection
+            addEndPoint(generator, inputPortUuid, 1);
+            addEndPoint(generator, outputPortUuid, 2);
             generator.writeEndArray();
             generator.writeEndObject();
             generator.writeEndArray();
@@ -290,6 +258,7 @@
         JsonFactory factory = new JsonFactory();
         return factory.createGenerator(stream, JsonEncoding.UTF8);
     }
+
     /*
     {
           "local-id":"1",
@@ -300,9 +269,10 @@
          }
      }
      */
-    private void addEndPoint(JsonGenerator generator, String sipUuid) throws IOException {
+    private void addEndPoint(JsonGenerator generator, String sipUuid, int localId) throws IOException {
         generator.writeStartObject();
-        generator.writeStringField(LOCAL_ID, sipUuid);
+        //ADVA OLS requires Local-id to be integer incremental numbers
+        generator.writeStringField(LOCAL_ID, Integer.toString(localId));
         generator.writeStringField(LAYER_PROTOCOL_NAME, PHOTONIC_MEDIA);
         generator.writeStringField(LAYER_PROTOCOL_QUALIFIER,
                 TAPI_PHOTONIC_MEDIA_PHOTONIC_LAYER_QUALIFIER_NMC);
diff --git a/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammableTest.java b/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammableTest.java
index a3128af..c0fdff4 100644
--- a/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammableTest.java
+++ b/drivers/odtn-driver/src/test/java/org/onosproject/drivers/odtn/tapi/TapiFlowRuleProgrammableTest.java
@@ -113,16 +113,16 @@
 
     private static final String CONNECTIVITY_REQUEST = "{\"tapi-connectivity:connectivity-service\":" +
             "[{\"uuid\":\"" + CONNECTION_UUID + "\",\"service-layer\":\"PHOTONIC_MEDIA\",\"service-type\"" +
-            ":\"POINT_TO_POINT_CONNECTIVITY\",\"end-point\":[{\"local-id\":\"" + END_POINT_1_UUID + "\"," +
+            ":\"POINT_TO_POINT_CONNECTIVITY\",\"end-point\":[{\"local-id\":\"" + 1 + "\"," +
             "\"layer-protocol-name\":" + "\"PHOTONIC_MEDIA\",\"layer-protocol-qualifier\":" +
             "\"tapi-photonic-media:PHOTONIC_LAYER_QUALIFIER_NMC\"," + "\"service-interface-point\":" +
             "{\"service-interface-point-uuid\":\"" + END_POINT_1_UUID + "\"}}," +
-            "{\"local-id\":\"" + END_POINT_2_UUID + "\",\"layer-protocol-name\":\"PHOTONIC_MEDIA\"," +
+            "{\"local-id\":\"" + 2 + "\",\"layer-protocol-name\":\"PHOTONIC_MEDIA\"," +
             "\"layer-protocol-qualifier\":" + "\"tapi-photonic-media:PHOTONIC_LAYER_QUALIFIER_NMC\"," +
             "\"service-interface-point\":{" + "\"service-interface-point-uuid\":\"" + END_POINT_2_UUID + "\"}}]}]}";
 
-    private static final String GET_CONNECTIVITY_REQUEST_REPLY = "{\"tapi-connectivity:connectivity-service\" : " +
-            "[{\"uuid\" : \"" + CONNECTION_UUID + "\"}]}";
+    private static final String GET_CONNECTIVITY_REQUEST_REPLY = "{\"tapi-connectivity:connectivity-context\": " +
+            "{\"connectivity-service\" : [{\"uuid\" : \"" + CONNECTION_UUID + "\"}]}}}";
 
     private static final Set<String> CONNECTION_UUIDS = ImmutableSet.of(CONNECTION_UUID);
 
@@ -144,10 +144,9 @@
 
     @Test
     public void parseConnReply() throws IOException {
-        TapiFlowRuleProgrammable tapiFrp = new TapiFlowRuleProgrammable();
         ObjectMapper mapper = new ObjectMapper();
         JsonNode jsonReply = mapper.readTree(GET_CONNECTIVITY_REQUEST_REPLY);
-        Set<String> output = tapiFrp.parseTapiGetConnectivityRequest(jsonReply);
+        Set<String> output = TapiDeviceHelper.parseTapiGetConnectivityRequest(jsonReply);
         assertEquals("Wrong Tapi UUIDS", CONNECTION_UUIDS, output);
     }
 
