Migrate Optional.get() callers
[transportpce.git] / tapi / src / main / java / org / opendaylight / transportpce / tapi / connectivity / ConnectivityUtils.java
index 58c63893d576766f585eb55204372fa3c3018a87..0087d2462e75ee4375b43a0a5561e74ebc255f1a 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.transportpce.tapi.connectivity;
 
-import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Comparator;
@@ -25,32 +25,35 @@ import org.opendaylight.transportpce.tapi.TapiStringConstants;
 import org.opendaylight.transportpce.tapi.utils.GenericServiceEndpoint;
 import org.opendaylight.transportpce.tapi.utils.ServiceEndpointType;
 import org.opendaylight.transportpce.tapi.utils.TapiContext;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210927.Network;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210927.mapping.Mapping;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210927.mapping.MappingKey;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210927.network.Nodes;
-import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev210927.network.NodesKey;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.equipment.types.rev181130.OpticTypes;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev181130.NodeIdType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.ConnectionType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.RpcActions;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.Service;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.sdnc.request.header.SdncRequestHeaderBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.endpoint.RxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.endpoint.SubrateEthSlaBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.endpoint.TxDirectionBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.lgx.LgxBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.port.PortBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev200529.OpenroadmNodeType;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.ODU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev181130.OTU4;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev190531.ServiceFormat;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceCreateInput;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.ServiceCreateInputBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.create.input.ServiceAEnd;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.create.input.ServiceAEndBuilder;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.create.input.ServiceZEnd;
-import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev190531.service.create.input.ServiceZEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.Network;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.mapping.Mapping;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.mapping.MappingKey;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.network.Nodes;
+import org.opendaylight.yang.gen.v1.http.org.opendaylight.transportpce.portmapping.rev220922.network.NodesKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.equipment.types.rev191129.OpticTypes;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.node.types.rev210528.NodeIdType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ConnectionType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.RpcActions;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.Service;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.ethernet.subrate.attributes.grp.EthernetAttributesBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.sdnc.request.header.SdncRequestHeaderBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.RxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.endpoint.TxDirectionKey;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.lgx.LgxBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.port.PortBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.subrate.eth.sla.SubrateEthSlaBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.network.types.rev211210.OpenroadmNodeType;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.ODU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.otn.common.types.rev210924.OTU4;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.format.rev191129.ServiceFormat;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInput;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.ServiceCreateInputBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceAEnd;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceAEndBuilder;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceZEnd;
+import org.opendaylight.yang.gen.v1.http.org.openroadm.service.rev211210.service.create.input.ServiceZEndBuilder;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.PathDescription;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZ;
 import org.opendaylight.yang.gen.v1.http.org.transportpce.b.c._interface.pathdescription.rev210705.path.description.atoz.direction.AToZKey;
@@ -109,13 +112,14 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
 import org.opendaylight.yangtools.yang.common.Uint32;
 import org.opendaylight.yangtools.yang.common.Uint64;
+import org.opendaylight.yangtools.yang.common.Uint8;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public final class ConnectivityUtils {
 
     private final Uuid tapiTopoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-        .getBytes(Charset.forName("UTF-8"))).toString());
+        .getBytes(StandardCharsets.UTF_8)).toString());
     private static final Logger LOG = LoggerFactory.getLogger(ConnectivityUtils.class);
 
     private final ServiceDataStoreOperations serviceDataStoreOperations;
@@ -125,8 +129,10 @@ public final class ConnectivityUtils {
         .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey,
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection>
         connectionFullMap; // this variable is for complete connection objects
-    private Map<String, Map<String, Boolean>> networkMap = new HashMap<>();
     private final NetworkTransactionService networkTransactionService;
+    private Connection topConnRdmRdm;
+    private Connection topConnXpdrXpdrPhtn;
+    private Connection topConnXpdrXpdrOdu;
 
     // TODO -> handle cases for which node id is ROADM-A1 and not ROADMA01 or XPDR-A1 and not XPDRA01
     public ConnectivityUtils(ServiceDataStoreOperations serviceDataStoreOperations,
@@ -137,6 +143,9 @@ public final class ConnectivityUtils {
         this.sipMap = sipMap;
         this.connectionFullMap = new HashMap<>();
         this.networkTransactionService = networkTransactionService;
+        this.topConnRdmRdm = null;
+        this.topConnXpdrXpdrPhtn = null;
+        this.topConnXpdrXpdrOdu = null;
     }
 
     public static ServiceCreateInput buildServiceCreateInput(GenericServiceEndpoint sepA, GenericServiceEndpoint sepZ) {
@@ -168,7 +177,7 @@ public final class ConnectivityUtils {
             .setOpticType(OpticTypes.Gray)
             .setServiceFormat(ServiceFormat.Ethernet)
             .setServiceRate(Uint32.valueOf(100))
-            .setTxDirection(new TxDirectionBuilder()
+            .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO), new TxDirectionBuilder()
                 .setPort(new PortBuilder()
                     .setPortDeviceName(txPortDeviceName)
                     .setPortName(txPortName)
@@ -182,8 +191,8 @@ public final class ConnectivityUtils {
                     .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
                     .setLgxPortShelf("00")
                     .build())
-                .build())
-            .setRxDirection(new RxDirectionBuilder()
+                .build()))
+            .setRxDirection(Map.of(new RxDirectionKey(Uint8.ZERO), new RxDirectionBuilder()
                 .setPort(new PortBuilder()
                     .setPortDeviceName(rxPortDeviceName)
                     .setPortName(rxPortName)
@@ -197,7 +206,7 @@ public final class ConnectivityUtils {
                     .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
                     .setLgxPortShelf("00")
                     .build())
-                .build())
+                .build()))
             .build();
     }
 
@@ -207,7 +216,7 @@ public final class ConnectivityUtils {
             .setOpticType(OpticTypes.Gray)
             .setServiceFormat(ServiceFormat.Ethernet)
             .setServiceRate(Uint32.valueOf(100))
-            .setTxDirection(new TxDirectionBuilder()
+            .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO), new TxDirectionBuilder()
                 .setPort(new PortBuilder()
                     .setPortDeviceName(txPortDeviceName)
                     .setPortName(txPortName)
@@ -221,8 +230,8 @@ public final class ConnectivityUtils {
                     .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
                     .setLgxPortShelf("00")
                     .build())
-                .build())
-            .setRxDirection(new RxDirectionBuilder()
+                .build()))
+            .setRxDirection(Map.of(new RxDirectionKey(Uint8.ZERO), new RxDirectionBuilder()
                 .setPort(new PortBuilder()
                     .setPortDeviceName(rxPortDeviceName)
                     .setPortName(rxPortName)
@@ -236,7 +245,7 @@ public final class ConnectivityUtils {
                     .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
                     .setLgxPortShelf("00")
                     .build())
-                .build())
+                .build()))
             .build();
     }
 
@@ -273,14 +282,14 @@ public final class ConnectivityUtils {
             LOG.error("No service path found for service {}", service.getServiceName());
             return null;
         }
-        ServicePaths servicePaths = optServicePaths.get();
+        ServicePaths servicePaths = optServicePaths.orElseThrow();
         PathDescription pathDescription = servicePaths.getPathDescription();
         LOG.info("Path description of service = {}", pathDescription);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceAEnd serviceAEnd
+        org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEnd serviceAEnd
             = service.getServiceAEnd();
         // Endpoint creation
         EndPoint endPoint1 = mapServiceAEndPoint(serviceAEnd, pathDescription);
-        org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceZEnd serviceZEnd
+        org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEnd serviceZEnd
             = service.getServiceZEnd();
         EndPoint endPoint2 = mapServiceZEndPoint(serviceZEnd, pathDescription);
         Map<EndPointKey, EndPoint> endPointMap = new HashMap<>();
@@ -298,7 +307,7 @@ public final class ConnectivityUtils {
             .setAdministrativeState(AdministrativeState.UNLOCKED)
             .setOperationalState(OperationalState.ENABLED)
             .setLifecycleState(LifecycleState.INSTALLED)
-            .setUuid(new Uuid(UUID.nameUUIDFromBytes(service.getServiceName().getBytes(Charset.forName("UTF-8")))
+            .setUuid(new Uuid(UUID.nameUUIDFromBytes(service.getServiceName().getBytes(StandardCharsets.UTF_8))
                 .toString()))
             .setServiceLayer(mapServiceLayer(serviceAEnd.getServiceFormat(), endPoint1, endPoint2))
             .setServiceType(ServiceType.POINTTOPOINTCONNECTIVITY)
@@ -333,22 +342,22 @@ public final class ConnectivityUtils {
     private OpenroadmNodeType getOpenroadmType(String nodeName) {
         LOG.info("Node name = {}", nodeName);
         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+",nodeName, TapiStringConstants.DSR))
-            .getBytes(Charset.forName("UTF-8"))).toString());
+            .getBytes(StandardCharsets.UTF_8)).toString());
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node tapiNode
             = this.tapiContext.getTapiNode(this.tapiTopoUuid, nodeUuid);
         if (tapiNode != null) {
             return OpenroadmNodeType.forName(tapiNode.getName().get(new NameKey("Node Type"))
-                .getValue()).get();
+                .getValue());
         }
         return null;
     }
 
     private Map<ConnectionKey, Connection> createConnectionsFromService(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceAEnd
-                serviceAEnd,
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceZEnd
-                serviceZEnd,
-        PathDescription pathDescription) {
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEnd
+                    serviceAEnd,
+            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEnd
+                    serviceZEnd,
+            PathDescription pathDescription) {
         Map<ConnectionKey, Connection> connectionServMap = new HashMap<>();
         // build lists with ROADM nodes, XPDR/MUX/SWITCH nodes, ROADM DEG TTPs, ROADM SRG TTPs, XPDR CLIENT TTPs
         //  and XPDR NETWORK TTPs (if any). From the path description. This will help to build the uuid of the CEPs
@@ -361,7 +370,7 @@ public final class ConnectivityUtils {
         List<String> rdmNodelist = new ArrayList<>();
         List<String> xpdrNodelist = new ArrayList<>();
         for (AToZ elem:pathDescription.getAToZDirection().getAToZ().values().stream()
-            .sorted(Comparator.comparing(AToZ::getId)).collect(Collectors.toList())) {
+            .sorted((Comparator.comparing(atoz -> Integer.valueOf(atoz.getId())))).collect(Collectors.toList())) {
             resourceType = elem.getResource().getResource().implementedInterface().getSimpleName();
             switch (resourceType) {
                 case TapiStringConstants.TP:
@@ -463,11 +472,16 @@ public final class ConnectivityUtils {
                 // - XC Connection OTSi betwwen iOTSi y eOTSi of xpdr
                 // - Top connection OTSi between network ports of xpdrs in the Photonic media layer -> i_OTSi
                 connectionServMap.putAll(createXpdrCepsAndConnectionsPht(xpdrNetworkTplist, xpdrNodelist));
+                this.topConnRdmRdm = null;
                 break;
             case ODU:
+                // TODO: verify if this is correct
                 // - XC Connection OTSi betwwen iODU and eODU of xpdr
                 // - Top connection in the ODU layer, between xpdr eODU ports (?)
-                connectionServMap.putAll(createXpdrCepsAndConnectionsOdu(xpdrNetworkTplist, xpdrNodelist));
+                if (openroadmNodeType.equals(OpenroadmNodeType.MUXPDR)) {
+                    connectionServMap.putAll(createXpdrCepsAndConnectionsOdu(xpdrNetworkTplist, xpdrNodelist));
+                    this.topConnXpdrXpdrPhtn = null;
+                }
                 break;
             case Ethernet:
                 // Check if OC, OTU and ODU are created
@@ -476,23 +490,26 @@ public final class ConnectivityUtils {
                     connectionServMap.putAll(createRoadmCepsAndConnections(rdmAddDropTplist, rdmDegTplist, rdmNodelist,
                         edgeRoadm1, edgeRoadm2));
                     connectionServMap.putAll(createXpdrCepsAndConnectionsPht(xpdrNetworkTplist, xpdrNodelist));
+                    this.topConnRdmRdm = null;
                     xpdrClientTplist = getAssociatedClientsPort(xpdrNetworkTplist);
                     LOG.info("Associated client ports = {}", xpdrClientTplist);
                     connectionServMap.putAll(createXpdrCepsAndConnectionsEth(xpdrClientTplist, xpdrNodelist,
                         connectionServMap));
+                    this.topConnXpdrXpdrPhtn = null;
                 }
                 if (openroadmNodeType.equals(OpenroadmNodeType.SWITCH)) {
                     // TODO: We create both ODU and DSR because there is no ODU service creation for the switch
                     // - XC Connection OTSi betwwen iODU and eODU of xpdr
                     // - Top connection in the ODU layer, between xpdr eODU ports (?)
-                    connectionServMap.putAll(createXpdrCepsAndConnectionsOdu(xpdrNetworkTplist, xpdrNodelist));
                     connectionServMap.putAll(createXpdrCepsAndConnectionsDsr(xpdrClientTplist, xpdrNetworkTplist,
                         xpdrNodelist));
+                    this.topConnXpdrXpdrPhtn = null;
                 }
                 if (openroadmNodeType.equals(OpenroadmNodeType.MUXPDR)) {
                     // TODO: OTN service but mux has 3 steps at rendering. Verify that things exist
                     connectionServMap.putAll(createXpdrCepsAndConnectionsDsr(xpdrClientTplist, xpdrNetworkTplist,
                         xpdrNodelist));
+                    this.topConnXpdrXpdrOdu = null;
                 }
                 break;
             default:
@@ -518,8 +535,8 @@ public final class ConnectivityUtils {
         // 1 top connection DSR between the CLIENT xpdrs
         for (String xpdr:xpdrNodelist) {
             LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrClient = xpdrClientTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
-
+            String spcXpdrClient = xpdrClientTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst()
+                .orElseThrow();
             ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR,
                 LayerProtocolName.DSR);
             putXpdrCepInTopologyContext(xpdr, spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR, netCep1);
@@ -527,14 +544,14 @@ public final class ConnectivityUtils {
             cepMapDsr.put(netCep1.key(), netCep1);
         }
         String spcXpdr1 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
+            .get(0))).findFirst().orElseThrow();
         String spcXpdr2 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
+            .get(xpdrNodelist.size() - 1))).findFirst().orElseThrow();
 
         // DSR top connection between edge xpdr CLIENT DSR
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
             connectionDsr = createTopConnection(spcXpdr1, spcXpdr2, cepMapDsr, TapiStringConstants.DSR,
-            LayerProtocolName.DSR, xcMap);
+            LayerProtocolName.DSR, xcMap, this.topConnXpdrXpdrPhtn);
         this.connectionFullMap.put(connectionDsr.key(), connectionDsr);
 
         // DSR top connection that will be added to the service object
@@ -560,8 +577,8 @@ public final class ConnectivityUtils {
         // 1 top connection between eODU and a top connection DSR between the CLIENT xpdrs
         for (String xpdr:xpdrNodelist) {
             LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrClient = xpdrClientTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
-
+            String spcXpdrClient = xpdrClientTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst()
+                .orElseThrow();
             ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR,
                 LayerProtocolName.DSR);
             putXpdrCepInTopologyContext(xpdr, spcXpdrClient, TapiStringConstants.DSR, TapiStringConstants.DSR, netCep1);
@@ -589,13 +606,13 @@ public final class ConnectivityUtils {
 
         // DSR top connection between edge xpdr CLIENT DSR
         String spcXpdr1 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
+            .get(0))).findFirst().orElseThrow();
         String spcXpdr2 = xpdrClientTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
+            .get(xpdrNodelist.size() - 1))).findFirst().orElseThrow();
 
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
             connectionOdu = createTopConnection(spcXpdr1, spcXpdr2, cepMapOdu, TapiStringConstants.E_ODU,
-            LayerProtocolName.ODU, xcMap);
+            LayerProtocolName.ODU, xcMap, this.topConnXpdrXpdrOdu);
         this.connectionFullMap.put(connectionOdu.key(), connectionOdu);
 
         // ODU top connection that will be added to the service object
@@ -606,7 +623,7 @@ public final class ConnectivityUtils {
 
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
             connectionDsr = createTopConnection(spcXpdr1, spcXpdr2, cepMapDsr, TapiStringConstants.DSR,
-                LayerProtocolName.DSR, xcMap);
+            LayerProtocolName.DSR, xcMap, this.topConnXpdrXpdrPhtn);
         this.connectionFullMap.put(connectionDsr.key(), connectionDsr);
 
         // DSR top connection that will be added to the service object
@@ -629,8 +646,8 @@ public final class ConnectivityUtils {
         // connection iODU between the xpdrs
         for (String xpdr:xpdrNodelist) {
             LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrNetwork = xpdrNetworkTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
-
+            String spcXpdrNetwork = xpdrNetworkTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst()
+                .orElseThrow();
             ConnectionEndPoint netCep1 = createCepXpdr(spcXpdrNetwork, TapiStringConstants.I_ODU,
                 TapiStringConstants.DSR, LayerProtocolName.ODU);
             putXpdrCepInTopologyContext(xpdr, spcXpdrNetwork, TapiStringConstants.I_ODU, TapiStringConstants.DSR,
@@ -641,17 +658,18 @@ public final class ConnectivityUtils {
 
         // ODU top connection between edge xpdr i_ODU
         String spcXpdr1 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
+            .get(0))).findFirst().orElseThrow();
         String spcXpdr2 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
+            .get(xpdrNodelist.size() - 1))).findFirst().orElseThrow();
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
             connection = createTopConnection(spcXpdr1, spcXpdr2, cepMap, TapiStringConstants.I_ODU,
-            LayerProtocolName.ODU, xcMap);
+            LayerProtocolName.ODU, xcMap, this.topConnXpdrXpdrPhtn);
         this.connectionFullMap.put(connection.key(), connection);
 
         // ODU top connection that will be added to the service object
         Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
         connServMap.put(conn.key(), conn);
+        this.topConnXpdrXpdrOdu = conn;
 
         return connServMap;
     }
@@ -668,7 +686,8 @@ public final class ConnectivityUtils {
         // create ceps and x connections within xpdr
         for (String xpdr:xpdrNodelist) {
             LOG.info("Creating ceps and xc for xpdr {}", xpdr);
-            String spcXpdrNetwork = xpdrNetworkTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst().get();
+            String spcXpdrNetwork = xpdrNetworkTplist.stream().filter(netp -> netp.contains(xpdr)).findFirst()
+                .orElseThrow();
             // There should be 1 network tp per xpdr
             // TODO photonic media model should be updated to have the corresponding CEPs. I will just create
             //  3 different MC CEPs giving different IDs to show that they are different
@@ -701,18 +720,18 @@ public final class ConnectivityUtils {
         }
         // OTSi top connection between edge I_OTSI Xpdr
         String spcXpdr1 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(0))).findFirst().get();
+            .get(0))).findFirst().orElseThrow();
         String spcXpdr2 = xpdrNetworkTplist.stream().filter(adp -> adp.contains(xpdrNodelist
-            .get(xpdrNodelist.size() - 1))).findFirst().get();
+            .get(xpdrNodelist.size() - 1))).findFirst().orElseThrow();
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
             connection = createTopConnection(spcXpdr1, spcXpdr2, cepMap, TapiStringConstants.I_OTSI,
-            LayerProtocolName.PHOTONICMEDIA, xcMap);
+            LayerProtocolName.PHOTONICMEDIA, xcMap, this.topConnRdmRdm);
         this.connectionFullMap.put(connection.key(), connection);
 
         // OTSi top connection that will be added to the service object
         Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
         connServMap.put(conn.key(), conn);
-
+        this.topConnXpdrXpdrPhtn = conn;
 
         return connServMap;
     }
@@ -721,106 +740,151 @@ public final class ConnectivityUtils {
                                                                          List<String> rdmDegTplist,
                                                                          List<String> rdmNodelist,
                                                                          String edgeRoadm1, String edgeRoadm2) {
-        // TODO: when the number of roadms between 2 SPDR/XPDR is more thatn 1, we need to refine this code
-        Map<ConnectionKey, Connection> connServMap = new HashMap<>();
+        // TODO: will need to check if things exist already or not
         Map<org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
             ConnectionEndPoint> cepMap = new HashMap<>();
-        Map<LowerConnectionKey, LowerConnection> xcMap = new HashMap<>();
         // create ceps and x connections within roadm
+        Map<LowerConnectionKey, LowerConnection> xcLowerMap = new HashMap<>();
         for (String roadm : rdmNodelist) {
             LOG.info("Creating ceps and xc for roadm {}", roadm);
-            String spcRdmAD = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().get();
-            LOG.info("AD port of ROADm {} = {}", roadm, spcRdmAD);
-            // There should be only 1 AD and 1 DEG per roadm
-            // TODO photonic media model should be updated to have the corresponding CEPs. I will just create
-            //  3 different MC CEPs giving different IDs to show that they are different
-            // Create 3 CEPs for each AD and DEG and the corresponding cross connections, matching the NEPs
-            // created in the topology creation
-            // add CEPs to the topology to the corresponding ONEP
-            ConnectionEndPoint adCep1 = createCepRoadm(spcRdmAD, TapiStringConstants.PHTNC_MEDIA);
-            putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.PHTNC_MEDIA, adCep1);
-            ConnectionEndPoint adCep2 = createCepRoadm(spcRdmAD, TapiStringConstants.MC);
-            putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.MC, adCep2);
-            ConnectionEndPoint adCep3 = createCepRoadm(spcRdmAD, TapiStringConstants.OTSI_MC);
-            putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.OTSI_MC, adCep3);
-            cepMap.put(adCep1.key(), adCep1);
-            cepMap.put(adCep2.key(), adCep2);
-            cepMap.put(adCep3.key(), adCep3);
-
-            String spcRdmDEG = rdmDegTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().get();
-            LOG.info("Degree port of ROADm {} = {}", roadm, spcRdmDEG);
-
-            ConnectionEndPoint degCep1 = createCepRoadm(spcRdmDEG, TapiStringConstants.PHTNC_MEDIA);
-            putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.PHTNC_MEDIA, degCep1);
-            ConnectionEndPoint degCep2 = createCepRoadm(spcRdmDEG, TapiStringConstants.MC);
-            putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.MC, degCep2);
-            ConnectionEndPoint degCep3 = createCepRoadm(spcRdmDEG, TapiStringConstants.OTSI_MC);
-            putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.OTSI_MC, degCep3);
-            cepMap.put(degCep1.key(), degCep1);
-            cepMap.put(degCep2.key(), degCep2);
-            cepMap.put(degCep3.key(), degCep3);
-
-            LOG.info("Going to create cross connections for ROADM {}", roadm);
-            // Create X connections between MC and OTSi_MC for full map
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection1 = createXCBetweenCeps(adCep2, degCep2, spcRdmAD, spcRdmDEG, TapiStringConstants.MC,
-                LayerProtocolName.PHOTONICMEDIA);
-            LOG.info("Cross connection 1 created = {}", connection1);
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection2 = createXCBetweenCeps(adCep3, degCep3, spcRdmAD, spcRdmDEG, TapiStringConstants.OTSI_MC,
-                LayerProtocolName.PHOTONICMEDIA);
-            LOG.info("Cross connection 2 created = {}", connection2);
-            this.connectionFullMap.put(connection1.key(), connection1);
-            this.connectionFullMap.put(connection2.key(), connection2);
-
-            // Create X connections that will be added to the service object
-            LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection1.getUuid()).build();
-            LowerConnection conn2 = new LowerConnectionBuilder().setConnectionUuid(connection2.getUuid()).build();
-
-            xcMap.put(conn1.key(), conn1);
-            xcMap.put(conn2.key(), conn2);
-        }
-        LOG.info("Going to create top connections betwee roadms");
-        // create top connections between roadms: MC connections between AD MC CEPs of roadms
-        for (int i = 0; i < rdmNodelist.size(); i++) {
-            if (rdmNodelist.size() <= (i + 1)) {
-                LOG.info("Reached last roadm. No more MC connections");
-                break;
+            if (roadm.equals(edgeRoadm1) || roadm.equals(edgeRoadm2)) {
+                LOG.info("EDGE ROADM, cross connections needed between SRG and DEG");
+                String spcRdmAD = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm)).findFirst()
+                    .orElseThrow();
+                LOG.info("AD port of ROADm {} = {}", roadm, spcRdmAD);
+                // There should be only 1 AD and 1 DEG per roadm
+                // TODO photonic media model should be updated to have the corresponding CEPs. I will just create
+                //  3 different MC CEPs giving different IDs to show that they are different
+                // Create 3 CEPs for each AD and DEG and the corresponding cross connections, matching the NEPs
+                // created in the topology creation
+                // add CEPs to the topology to the corresponding ONEP
+                ConnectionEndPoint adCep1 = createCepRoadm(spcRdmAD, TapiStringConstants.PHTNC_MEDIA);
+                putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.PHTNC_MEDIA, adCep1);
+                ConnectionEndPoint adCep2 = createCepRoadm(spcRdmAD, TapiStringConstants.MC);
+                putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.MC, adCep2);
+                ConnectionEndPoint adCep3 = createCepRoadm(spcRdmAD, TapiStringConstants.OTSI_MC);
+                putRdmCepInTopologyContext(roadm, spcRdmAD, TapiStringConstants.OTSI_MC, adCep3);
+                cepMap.put(adCep1.key(), adCep1);
+                cepMap.put(adCep2.key(), adCep2);
+                cepMap.put(adCep3.key(), adCep3);
+
+                String spcRdmDEG = rdmDegTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().orElseThrow();
+                LOG.info("Degree port of ROADm {} = {}", roadm, spcRdmDEG);
+
+                ConnectionEndPoint degCep1 = createCepRoadm(spcRdmDEG, TapiStringConstants.PHTNC_MEDIA);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.PHTNC_MEDIA, degCep1);
+                ConnectionEndPoint degCep2 = createCepRoadm(spcRdmDEG, TapiStringConstants.MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.MC, degCep2);
+                ConnectionEndPoint degCep3 = createCepRoadm(spcRdmDEG, TapiStringConstants.OTSI_MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG, TapiStringConstants.OTSI_MC, degCep3);
+                cepMap.put(degCep1.key(), degCep1);
+                cepMap.put(degCep2.key(), degCep2);
+                cepMap.put(degCep3.key(), degCep3);
+
+                LOG.info("Going to create cross connections for ROADM {}", roadm);
+                // Create X connections between MC and OTSi_MC for full map
+                org.opendaylight.yang.gen.v1.urn
+                        .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection connection1
+                    = createXCBetweenCeps(adCep2, degCep2, spcRdmAD, spcRdmDEG, TapiStringConstants.MC,
+                        LayerProtocolName.PHOTONICMEDIA);
+                LOG.info("Cross connection 1 created = {}", connection1.toString());
+                org.opendaylight.yang.gen.v1.urn
+                    .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection connection2
+                    = createXCBetweenCeps(adCep3, degCep3, spcRdmAD, spcRdmDEG, TapiStringConstants.OTSI_MC,
+                    LayerProtocolName.PHOTONICMEDIA);
+                LOG.info("Cross connection 2 created = {}", connection2.toString());
+                this.connectionFullMap.put(connection1.key(), connection1);
+                this.connectionFullMap.put(connection2.key(), connection2);
+
+                // Create X connections that will be added to the service object
+                LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection1.getUuid()).build();
+                LowerConnection conn2 = new LowerConnectionBuilder().setConnectionUuid(connection2.getUuid()).build();
+
+                xcLowerMap.put(conn1.key(), conn1);
+                xcLowerMap.put(conn2.key(), conn2);
+            } else {
+                LOG.info("MIDDLE ROADM, cross connections needed between DEG and DEG");
+                String spcRdmDEG1 = rdmDegTplist.stream().filter(adp -> adp.contains(roadm)).findFirst().orElseThrow();
+                LOG.info("Degree 1 port of ROADm {} = {}", roadm, spcRdmDEG1);
+
+                ConnectionEndPoint deg1Cep1 = createCepRoadm(spcRdmDEG1, TapiStringConstants.PHTNC_MEDIA);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG1, TapiStringConstants.PHTNC_MEDIA, deg1Cep1);
+                ConnectionEndPoint deg1Cep2 = createCepRoadm(spcRdmDEG1, TapiStringConstants.MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG1, TapiStringConstants.MC, deg1Cep2);
+                ConnectionEndPoint deg1Cep3 = createCepRoadm(spcRdmDEG1, TapiStringConstants.OTSI_MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG1, TapiStringConstants.OTSI_MC, deg1Cep3);
+                cepMap.put(deg1Cep1.key(), deg1Cep1);
+                cepMap.put(deg1Cep2.key(), deg1Cep2);
+                cepMap.put(deg1Cep3.key(), deg1Cep3);
+
+                String spcRdmDEG2 = rdmDegTplist.stream().filter(adp -> adp.contains(roadm)).skip(1).findFirst()
+                    .orElseThrow();
+                LOG.info("Degree 2 port of ROADm {} = {}", roadm, spcRdmDEG2);
+
+                ConnectionEndPoint deg2Cep1 = createCepRoadm(spcRdmDEG2, TapiStringConstants.PHTNC_MEDIA);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG2, TapiStringConstants.PHTNC_MEDIA, deg2Cep1);
+                ConnectionEndPoint deg2Cep2 = createCepRoadm(spcRdmDEG2, TapiStringConstants.MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG2, TapiStringConstants.MC, deg2Cep2);
+                ConnectionEndPoint deg2Cep3 = createCepRoadm(spcRdmDEG2, TapiStringConstants.OTSI_MC);
+                putRdmCepInTopologyContext(roadm, spcRdmDEG2, TapiStringConstants.OTSI_MC, deg2Cep3);
+                cepMap.put(deg2Cep1.key(), deg2Cep1);
+                cepMap.put(deg2Cep2.key(), deg2Cep2);
+                cepMap.put(deg2Cep3.key(), deg2Cep3);
+
+                LOG.info("Going to create cross connections for ROADM {}", roadm);
+                // Create X connections between MC and OTSi_MC for full map
+                org.opendaylight.yang.gen.v1.urn
+                    .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection connection1
+                    = createXCBetweenCeps(deg1Cep2, deg2Cep2, spcRdmDEG1, spcRdmDEG2,
+                    TapiStringConstants.MC, LayerProtocolName.PHOTONICMEDIA);
+                LOG.info("Cross connection 1 created = {}", connection1.toString());
+                org.opendaylight.yang.gen.v1.urn
+                    .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection connection2
+                    = createXCBetweenCeps(deg1Cep3, deg2Cep3, spcRdmDEG1, spcRdmDEG2,
+                    TapiStringConstants.OTSI_MC, LayerProtocolName.PHOTONICMEDIA);
+                LOG.info("Cross connection 2 created = {}", connection2.toString());
+                this.connectionFullMap.put(connection1.key(), connection1);
+                this.connectionFullMap.put(connection2.key(), connection2);
+
+                // Create X connections that will be added to the service object
+                LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection1.getUuid()).build();
+                LowerConnection conn2 = new LowerConnectionBuilder().setConnectionUuid(connection2.getUuid()).build();
+
+                xcLowerMap.put(conn1.key(), conn1);
+                xcLowerMap.put(conn2.key(), conn2);
             }
-            // Current roadm with roadm i + 1 --> MC
-            String roadm1 = rdmNodelist.get(i);
-            String spcRdmAD1 = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm1)).findFirst().get();
-            String roadm2 = rdmNodelist.get(i + 1);
-            String spcRdmAD2 = rdmAddDropTplist.stream().filter(adp -> adp.contains(roadm2)).findFirst().get();
-            LOG.info("Creating top connection from {} to {} between tps: {}-{}", roadm1, roadm2, spcRdmAD1, spcRdmAD2);
-
-            // Create top connections between MC for full map
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-                connection = createTopConnection(spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.MC,
-                LayerProtocolName.PHOTONICMEDIA, xcMap);
-            this.connectionFullMap.put(connection.key(), connection);
-            LOG.info("Top connection created = {}", connection);
-
-            // Create top connections that will be added to the service object
-            Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-            connServMap.put(conn.key(), conn);
-            LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
-            xcMap.put(conn1.key(), conn1);
         }
-
-        // OTSiMC top connection between edge roadms
-        LOG.info("Going to created top connection between OTSiMC");
-        String spcRdmAD1 = rdmAddDropTplist.stream().filter(adp -> adp.contains(edgeRoadm1)).findFirst().get();
-        String spcRdmAD2 = rdmAddDropTplist.stream().filter(adp -> adp.contains(edgeRoadm2)).findFirst().get();
+        LOG.info("Going to create top connections between roadms");
+        String spcRdmAD1 = rdmAddDropTplist.stream().filter(adp -> adp.contains(edgeRoadm1)).findFirst().orElseThrow();
+        String spcRdmAD2 = rdmAddDropTplist.stream().filter(adp -> adp.contains(edgeRoadm2)).findFirst().orElseThrow();
+        // MC top connection between edge roadms
+        LOG.info("Going to created top connection between MC");
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
-            connection = createTopConnection(spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.OTSI_MC,
-            LayerProtocolName.PHOTONICMEDIA, xcMap);
+            connection = createTopConnection(spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.MC,
+            LayerProtocolName.PHOTONICMEDIA, xcLowerMap, null);
         this.connectionFullMap.put(connection.key(), connection);
-        LOG.info("Top connection created = {}", connection);
+        LOG.info("Top connection created = {}", connection.toString());
 
+        Map<ConnectionKey, Connection> connServMap = new HashMap<>();
         // OTSiMC top connections that will be added to the service object
         Connection conn = new ConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
         connServMap.put(conn.key(), conn);
+        LowerConnection conn1 = new LowerConnectionBuilder().setConnectionUuid(connection.getUuid()).build();
+        Map<LowerConnectionKey, LowerConnection> topLowerMap = new HashMap<>();
+        topLowerMap.put(conn1.key(), conn1);
+
+        // OTSiMC top connection between edge roadms
+        LOG.info("Going to created top connection between OTSiMC");
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection
+            connection1 = createTopConnection(spcRdmAD1, spcRdmAD2, cepMap, TapiStringConstants.OTSI_MC,
+            LayerProtocolName.PHOTONICMEDIA, topLowerMap, null);
+        this.connectionFullMap.put(connection1.key(), connection1);
+        LOG.info("Top connection created = {}", connection1.toString());
+
+        // OTSiMC top connections that will be added to the service object
+        Connection conn2 = new ConnectionBuilder().setConnectionUuid(connection1.getUuid()).build();
+        connServMap.put(conn2.key(), conn2);
+        this.topConnRdmRdm = conn2;
         return connServMap;
     }
 
@@ -829,14 +893,14 @@ public final class ConnectivityUtils {
                         Map<org.opendaylight.yang.gen.v1.urn
                             .onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey,
                             ConnectionEndPoint> cepMap, String qual, LayerProtocolName topPortocol,
-                                Map<LowerConnectionKey, LowerConnection> xcMap) {
+                        Map<LowerConnectionKey, LowerConnection> xcMap, Connection additionalLowerConn) {
         // find cep for each AD MC of roadm 1 and 2
         LOG.info("Top connection name = {}", String.join("+", "TOP", tp1, tp2, qual));
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ConnectionEndPoint adCep1 =
             cepMap.get(new org.opendaylight.yang.gen.v1.urn
                 .onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey(
                 new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", tp1.split("\\+")[0],
-                    qual, tp1.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
+                        qual, tp1.split("\\+")[1])).getBytes(StandardCharsets.UTF_8))
                     .toString())));
         LOG.info("ADCEP1 = {}", adCep1);
         org.opendaylight.yang.gen.v1.urn
@@ -844,18 +908,18 @@ public final class ConnectivityUtils {
             new org.opendaylight.yang.gen.v1.urn
                 .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
                 .setNodeEdgePointUuid(adCep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
+                    .values().stream().findFirst().orElseThrow().getNodeEdgePointUuid())
                 .setTopologyUuid(adCep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
+                    .values().stream().findFirst().orElseThrow().getTopologyUuid())
                 .setNodeUuid(adCep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
+                    .values().stream().findFirst().orElseThrow().getNodeUuid())
                 .setConnectionEndPointUuid(adCep1.getUuid())
                 .build();
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.ConnectionEndPoint adCep2 =
             cepMap.get(new org.opendaylight.yang.gen.v1.urn
                 .onf.otcc.yang.tapi.connectivity.rev181210.cep.list.ConnectionEndPointKey(
                 new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", tp2.split("\\+")[0],
-                    qual, tp2.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
+                        qual, tp2.split("\\+")[1])).getBytes(StandardCharsets.UTF_8))
                     .toString())));
         LOG.info("ADCEP2 = {}", adCep2);
         org.opendaylight.yang.gen.v1.urn
@@ -863,11 +927,11 @@ public final class ConnectivityUtils {
             new org.opendaylight.yang.gen.v1.urn
                 .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
                 .setNodeEdgePointUuid(adCep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
+                    .values().stream().findFirst().orElseThrow().getNodeEdgePointUuid())
                 .setTopologyUuid(adCep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
+                    .values().stream().findFirst().orElseThrow().getTopologyUuid())
                 .setNodeUuid(adCep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
+                    .values().stream().findFirst().orElseThrow().getNodeUuid())
                 .setConnectionEndPointUuid(adCep1.getUuid())
                 .build();
         Map<ConnectionEndPointKey, org.opendaylight.yang.gen.v1.urn
@@ -879,10 +943,14 @@ public final class ConnectivityUtils {
             .setValue(String.join("+", "TOP", tp1, tp2, qual))
             .build();
         // TODO: lower connection, supported link.......
+        if (additionalLowerConn != null) {
+            xcMap.putIfAbsent(new LowerConnectionKey(additionalLowerConn.getConnectionUuid()),
+                new LowerConnectionBuilder().setConnectionUuid(additionalLowerConn.getConnectionUuid()).build());
+        }
         return new org.opendaylight.yang.gen.v1.urn
             .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionBuilder()
             .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "TOP", tp1, tp2, qual))
-                .getBytes(Charset.forName("UTF-8"))).toString()))
+                .getBytes(StandardCharsets.UTF_8)).toString()))
             .setName(Map.of(connName.key(), connName))
             .setConnectionEndPoint(ceps)
             .setOperationalState(OperationalState.ENABLED)
@@ -905,11 +973,11 @@ public final class ConnectivityUtils {
             new org.opendaylight.yang.gen.v1.urn
                 .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
                 .setNodeEdgePointUuid(cep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
+                    .values().stream().findFirst().orElseThrow().getNodeEdgePointUuid())
                 .setTopologyUuid(cep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
+                    .values().stream().findFirst().orElseThrow().getTopologyUuid())
                 .setNodeUuid(cep1.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
+                    .values().stream().findFirst().orElseThrow().getNodeUuid())
                 .setConnectionEndPointUuid(cep1.getUuid())
                 .build();
         org.opendaylight.yang.gen.v1.urn
@@ -917,11 +985,11 @@ public final class ConnectivityUtils {
             new org.opendaylight.yang.gen.v1.urn
                 .onf.otcc.yang.tapi.connectivity.rev181210.connection.ConnectionEndPointBuilder()
                 .setNodeEdgePointUuid(cep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeEdgePointUuid())
+                    .values().stream().findFirst().orElseThrow().getNodeEdgePointUuid())
                 .setTopologyUuid(cep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getTopologyUuid())
+                    .values().stream().findFirst().orElseThrow().getTopologyUuid())
                 .setNodeUuid(cep2.getClientNodeEdgePoint()
-                    .values().stream().findFirst().get().getNodeUuid())
+                    .values().stream().findFirst().orElseThrow().getNodeUuid())
                 .setConnectionEndPointUuid(cep2.getUuid())
                 .build();
         Map<ConnectionEndPointKey, org.opendaylight.yang.gen.v1.urn
@@ -936,7 +1004,7 @@ public final class ConnectivityUtils {
         return new org.opendaylight.yang.gen.v1.urn
             .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionBuilder()
             .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "XC", tp1, tp2, qual))
-                .getBytes(Charset.forName("UTF-8"))).toString()))
+                .getBytes(StandardCharsets.UTF_8)).toString()))
             .setName(Map.of(connName.key(), connName))
             .setConnectionEndPoint(ceps)
             .setOperationalState(OperationalState.ENABLED)
@@ -955,19 +1023,19 @@ public final class ConnectivityUtils {
             .build();
         ClientNodeEdgePoint cnep = new ClientNodeEdgePointBuilder()
             .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
+                    qualifier, id.split("\\+")[1])).getBytes(StandardCharsets.UTF_8))
                 .toString()))
             .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+",id.split("\\+")[0],
-                qualifier)).getBytes(Charset.forName("UTF-8")))
+                    qualifier)).getBytes(StandardCharsets.UTF_8))
                 .toString()))
             .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-                .getBytes(Charset.forName("UTF-8"))).toString()))
+                .getBytes(StandardCharsets.UTF_8)).toString()))
             .build();
         // TODO: add augmentation with the corresponding cep-spec (i.e. MC, OTSiMC...)
         // TODO: add parent ONEP??
         ConnectionEndPointBuilder cepBldr = new ConnectionEndPointBuilder()
             .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
+                    qualifier, id.split("\\+")[1])).getBytes(StandardCharsets.UTF_8))
                 .toString()))
             .setClientNodeEdgePoint(Map.of(cnep.key(), cnep))
             .setName(Map.of(cepName.key(), cepName))
@@ -988,19 +1056,19 @@ public final class ConnectivityUtils {
             .build();
         ClientNodeEdgePoint cnep = new ClientNodeEdgePointBuilder()
             .setNodeEdgePointUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
+                    qualifier, id.split("\\+")[1])).getBytes(StandardCharsets.UTF_8))
                 .toString()))
             .setNodeUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+",id.split("\\+")[0],
-                nodeLayer)).getBytes(Charset.forName("UTF-8")))
+                    nodeLayer)).getBytes(StandardCharsets.UTF_8))
                 .toString()))
             .setTopologyUuid(new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-                .getBytes(Charset.forName("UTF-8"))).toString()))
+                .getBytes(StandardCharsets.UTF_8)).toString()))
             .build();
         // TODO: add augmentation with the corresponding cep-spec (i.e. MC, OTSiMC...)
         // TODO: add parent ONEP??
         ConnectionEndPointBuilder cepBldr = new ConnectionEndPointBuilder()
             .setUuid(new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP", id.split("\\+")[0],
-                qualifier, id.split("\\+")[1])).getBytes(Charset.forName("UTF-8")))
+                    qualifier, id.split("\\+")[1])).getBytes(StandardCharsets.UTF_8))
                 .toString()))
             .setClientNodeEdgePoint(Map.of(cnep.key(), cnep))
             .setName(Map.of(cepName.key(), cepName))
@@ -1013,8 +1081,8 @@ public final class ConnectivityUtils {
     }
 
     private EndPoint mapServiceZEndPoint(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceZEnd
-                serviceZEnd, PathDescription pathDescription) {
+        org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceZEnd
+            serviceZEnd, PathDescription pathDescription) {
         EndPointBuilder endPointBuilder = new EndPointBuilder();
         // 1. Service Format: ODU, OTU, ETH
         ServiceFormat serviceFormat = serviceZEnd.getServiceFormat();
@@ -1040,8 +1108,11 @@ public final class ConnectivityUtils {
         }
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.Name name =
             new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.NameBuilder()
-                .setValueName("OpenROADM node id")
-                .setValue(serviceZEnd.getTxDirection().getPort().getPortDeviceName())
+                .setValueName("OpenROADM info")
+                .setValue(String.join("-", serviceZEnd.getClli(),
+                    serviceZEnd.getTxDirection().values().stream().findFirst().orElseThrow().getPort()
+                        .getPortDeviceName(),
+                    serviceZEnd.getTxDirection().values().stream().findFirst().orElseThrow().getPort().getPortName()))
                 .build();
         return endPointBuilder
             .setServiceInterfacePoint(new ServiceInterfacePointBuilder()
@@ -1062,13 +1133,14 @@ public final class ConnectivityUtils {
                 .build())
             .setProtectionRole(ProtectionRole.WORK)
             .setRole(PortRole.SYMMETRIC)
-            .setLocalId(serviceZEnd.getTxDirection().getPort().getPortDeviceName())
+            .setLocalId(serviceZEnd.getTxDirection().values().stream().findFirst().orElseThrow()
+                .getPort().getPortDeviceName())
             .build();
     }
 
     private EndPoint mapServiceAEndPoint(
-            org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev190531.service.ServiceAEnd
-                serviceAEnd, PathDescription pathDescription) {
+        org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.service.ServiceAEnd
+            serviceAEnd, PathDescription pathDescription) {
         EndPointBuilder endPointBuilder = new EndPointBuilder();
         // 1. Service Format: ODU, OTU, ETH
         ServiceFormat serviceFormat = serviceAEnd.getServiceFormat();
@@ -1094,8 +1166,11 @@ public final class ConnectivityUtils {
         }
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.Name name =
             new org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.common.rev181210.local._class.NameBuilder()
-                .setValueName("OpenROADM node id")
-                .setValue(serviceAEnd.getTxDirection().getPort().getPortDeviceName())
+                .setValueName("OpenROADM info")
+                .setValue(String.join("-", serviceAEnd.getClli(),
+                    serviceAEnd.getTxDirection().values().stream().findFirst().orElseThrow().getPort()
+                        .getPortDeviceName(),
+                    serviceAEnd.getTxDirection().values().stream().findFirst().orElseThrow().getPort().getPortName()))
                 .build();
         return endPointBuilder
             .setServiceInterfacePoint(new ServiceInterfacePointBuilder()
@@ -1116,7 +1191,8 @@ public final class ConnectivityUtils {
                 .build())
             .setProtectionRole(ProtectionRole.WORK)
             .setRole(PortRole.SYMMETRIC)
-            .setLocalId(serviceAEnd.getTxDirection().getPort().getPortDeviceName())
+            .setLocalId(serviceAEnd.getTxDirection().values().stream().findFirst().orElseThrow().getPort()
+                    .getPortDeviceName())
             .build();
     }
 
@@ -1125,10 +1201,11 @@ public final class ConnectivityUtils {
         if (serviceNodeId.contains("ROADM")) {
             // Service from ROADM to ROADM
             // AddDrop-AddDrop ports --> MC layer SIPs
-            ZToA firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("0")).findFirst().get();
+            ZToA firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("0")).findFirst()
+                    .orElseThrow();
             TerminationPoint tp = (TerminationPoint) firstElement.getResource().getResource();
             Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
+                    tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId())).getBytes(StandardCharsets.UTF_8))
                 .toString());
             LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId()));
             for (ServiceInterfacePoint sip:this.sipMap.values()) {
@@ -1146,33 +1223,33 @@ public final class ConnectivityUtils {
             Uuid sipUuid;
             switch (serviceFormat) {
                 case ODU:
-                    firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("2")).findFirst().get();
+                    firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("2")).findFirst()
+                            .orElseThrow();
                     tp = (TerminationPoint) firstElement.getResource().getResource();
                     // Network-Network ports --> iODU layer SIPs TODO --> updated to E_ODU
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.I_ODU, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
+                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", tp.getTpNodeId(),
+                            TapiStringConstants.I_ODU, tp.getTpId())).getBytes(StandardCharsets.UTF_8)).toString());
                     LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.I_ODU,
                         tp.getTpId()));
                     break;
                 case OTU:
-                    firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("2")).findFirst().get();
+                    firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("2")).findFirst()
+                            .orElseThrow();
                     tp = (TerminationPoint) firstElement.getResource().getResource();
                     // Network-Network ports --> iOTSi layer SIPs
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.I_OTSI, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
+                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", tp.getTpNodeId(),
+                            TapiStringConstants.I_OTSI, tp.getTpId())).getBytes(StandardCharsets.UTF_8)).toString());
                     LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.I_OTSI,
                         tp.getTpId()));
                     break;
                 case Ethernet:
                     LOG.info("Elements ZA = {}", mapztoa.values().toString());
-                    firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("0")).findFirst().get();
+                    firstElement = mapztoa.values().stream().filter(ztoa -> ztoa.getId().equals("0")).findFirst()
+                            .orElseThrow();
                     tp = (TerminationPoint) firstElement.getResource().getResource();
                     // Client-client ports --> DSR layer SIPs
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.DSR, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
+                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", tp.getTpNodeId(),
+                            TapiStringConstants.DSR, tp.getTpId())).getBytes(StandardCharsets.UTF_8)).toString());
                     LOG.info("SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.DSR,
                         tp.getTpId()));
                     break;
@@ -1199,11 +1276,12 @@ public final class ConnectivityUtils {
         if (serviceNodeId.contains("ROADM")) {
             // Service from ROADM to ROADM
             // AddDrop-AddDrop ports --> MC layer SIPs
-            AToZ firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("0")).findFirst().get();
+            AToZ firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("0")).findFirst()
+                    .orElseThrow();
             LOG.info("First element of service path = {}", firstElement.getResource().getResource());
             TerminationPoint tp = (TerminationPoint) firstElement.getResource().getResource();
             Uuid sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
+                    tp.getTpNodeId(), TapiStringConstants.MC, tp.getTpId())).getBytes(StandardCharsets.UTF_8))
                 .toString());
             LOG.info("ROADM SIP name = {}", String.join("+", tp.getTpNodeId(), TapiStringConstants.MC,
                 tp.getTpId()));
@@ -1222,33 +1300,33 @@ public final class ConnectivityUtils {
             Uuid sipUuid;
             switch (serviceFormat) {
                 case ODU:
-                    firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("2")).findFirst().get();
+                    firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("2")).findFirst()
+                            .orElseThrow();
                     tp = (TerminationPoint) firstElement.getResource().getResource();
                     // Network-Network ports --> iODU layer SIPs. TODO -> updated to eODU
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.I_ODU, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
+                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", tp.getTpNodeId(),
+                            TapiStringConstants.I_ODU, tp.getTpId())).getBytes(StandardCharsets.UTF_8)).toString());
                     LOG.info("ODU XPDR SIP name = {}", String.join("+", tp.getTpNodeId(),
                         TapiStringConstants.I_ODU, tp.getTpId()));
                     break;
                 case OTU:
-                    firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("2")).findFirst().get();
+                    firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("2")).findFirst()
+                            .orElseThrow();
                     tp = (TerminationPoint) firstElement.getResource().getResource();
                     // Network-Network ports --> iOTSi layer SIPs
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.I_OTSI, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
+                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", tp.getTpNodeId(),
+                            TapiStringConstants.I_OTSI, tp.getTpId())).getBytes(StandardCharsets.UTF_8)).toString());
                     LOG.info("OTU XPDR SIP name = {}", String.join("+", tp.getTpNodeId(),
                         TapiStringConstants.I_OTSI, tp.getTpId()));
                     break;
                 case Ethernet:
                     LOG.info("Elements AZ = {}", mapatoz.values().toString());
-                    firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("0")).findFirst().get();
+                    firstElement = mapatoz.values().stream().filter(atoz -> atoz.getId().equals("0")).findFirst()
+                            .orElseThrow();
                     tp = (TerminationPoint) firstElement.getResource().getResource();
                     // Client-client ports --> DSR layer SIPs
-                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP",
-                        tp.getTpNodeId(), TapiStringConstants.DSR, tp.getTpId())).getBytes(Charset.forName("UTF-8")))
-                        .toString());
+                    sipUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "SIP", tp.getTpNodeId(),
+                            TapiStringConstants.DSR, tp.getTpId())).getBytes(StandardCharsets.UTF_8)).toString());
                     LOG.info("DSR XPDR SIP name = {}", String.join("+", tp.getTpNodeId(),
                         TapiStringConstants.DSR, tp.getTpId()));
                     break;
@@ -1273,11 +1351,11 @@ public final class ConnectivityUtils {
         LOG.info("Node of NEP id before Merge = {}", String.join("+", node, TapiStringConstants.PHTNC_MEDIA));
         // Give uuids so that it is easier to look for things: topology uuid, node uuid, nep uuid, cep
         Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
+            .getBytes(StandardCharsets.UTF_8)).toString());
         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, TapiStringConstants.PHTNC_MEDIA)
-            .getBytes(Charset.forName("UTF-8"))).toString());
+            .getBytes(StandardCharsets.UTF_8)).toString());
         Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, qual, spcRdmAD.split("\\+")[1])
-            .getBytes(Charset.forName("UTF-8"))).toString());
+            .getBytes(StandardCharsets.UTF_8)).toString());
         this.tapiContext.updateTopologyWithCep(topoUuid, nodeUuid, nepUuid, cep);
     }
 
@@ -1285,17 +1363,17 @@ public final class ConnectivityUtils {
                                              ConnectionEndPoint cep) {
         // Give uuids so that it is easier to look for things: topology uuid, node uuid, nep uuid, cep
         Uuid topoUuid = new Uuid(UUID.nameUUIDFromBytes(TapiStringConstants.T0_FULL_MULTILAYER
-            .getBytes(Charset.forName("UTF-8"))).toString());
+            .getBytes(StandardCharsets.UTF_8)).toString());
         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, nodeLayer)
-            .getBytes(Charset.forName("UTF-8"))).toString());
+            .getBytes(StandardCharsets.UTF_8)).toString());
         Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes(String.join("+", node, qual, spcXpdrNet.split("\\+")[1])
-            .getBytes(Charset.forName("UTF-8"))).toString());
+            .getBytes(StandardCharsets.UTF_8)).toString());
         this.tapiContext.updateTopologyWithCep(topoUuid, nodeUuid, nepUuid, cep);
     }
 
     public Map<org.opendaylight.yang.gen.v1.urn
-            .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey,
-            org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection>
+        .onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.ConnectionKey,
+        org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.connectivity.rev181210.connectivity.context.Connection>
             getConnectionFullMap() {
         return this.connectionFullMap;
     }
@@ -1315,9 +1393,9 @@ public final class ConnectivityUtils {
         ConnectivityConstraint constraint = input.getConnectivityConstraint();
         ConnectionType connType = null;
         ServiceFormat serviceFormat = null;
-        String nodeAid = String.join("+", endPointMap.values().stream().findFirst().get().getLocalId(),
+        String nodeAid = String.join("+", endPointMap.values().stream().findFirst().orElseThrow().getLocalId(),
             TapiStringConstants.DSR);
-        String nodeZid = String.join("+", endPointMap.values().stream().skip(1).findFirst().get().getLocalId(),
+        String nodeZid = String.join("+", endPointMap.values().stream().skip(1).findFirst().orElseThrow().getLocalId(),
             TapiStringConstants.DSR);
         LOG.debug("Node a = {}", nodeAid);
         LOG.debug("Node z = {}", nodeZid);
@@ -1342,15 +1420,15 @@ public final class ConnectivityUtils {
                 connType = getConnectionTypePhtnc(endPointMap.values());
                 serviceFormat = getServiceFormatPhtnc(endPointMap.values());
                 if (serviceFormat.equals(ServiceFormat.OC)) {
-                    nodeAid = String.join("+", endPointMap.values().stream().findFirst().get().getLocalId(),
-                        TapiStringConstants.PHTNC_MEDIA);
-                    nodeZid = String.join("+", endPointMap.values().stream().skip(1).findFirst().get().getLocalId(),
+                    nodeAid = String.join("+", endPointMap.values().stream().findFirst().orElseThrow().getLocalId(),
                         TapiStringConstants.PHTNC_MEDIA);
+                    nodeZid = String.join("+", endPointMap.values().stream().skip(1).findFirst().orElseThrow()
+                            .getLocalId(), TapiStringConstants.PHTNC_MEDIA);
                 } else {
-                    nodeAid = String.join("+", endPointMap.values().stream().findFirst().get().getLocalId(),
-                        TapiStringConstants.OTSI);
-                    nodeZid = String.join("+", endPointMap.values().stream().skip(1).findFirst().get().getLocalId(),
+                    nodeAid = String.join("+", endPointMap.values().stream().findFirst().orElseThrow().getLocalId(),
                         TapiStringConstants.OTSI);
+                    nodeZid = String.join("+", endPointMap.values().stream().skip(1).findFirst().orElseThrow()
+                            .getLocalId(), TapiStringConstants.OTSI);
                 }
                 LOG.debug("Node a photonic = {}", nodeAid);
                 LOG.debug("Node z photonic = {}", nodeZid);
@@ -1361,10 +1439,10 @@ public final class ConnectivityUtils {
         // Requested Capacity for connectivity service
         Uint64 capacity = input.getConnectivityConstraint().getRequestedCapacity().getTotalSize().getValue();
         // map endpoints into service end points. Map the type of service from TAPI to OR
-        ServiceAEnd serviceAEnd = tapiEndPointToServiceAPoint(endPointMap.values().stream().findFirst().get(),
+        ServiceAEnd serviceAEnd = tapiEndPointToServiceAPoint(endPointMap.values().stream().findFirst().orElseThrow(),
             serviceFormat, nodeAid, capacity, constraint.getServiceLayer());
-        ServiceZEnd serviceZEnd = tapiEndPointToServiceZPoint(endPointMap.values().stream().skip(1).findFirst().get(),
-            serviceFormat, nodeZid, capacity, constraint.getServiceLayer());
+        ServiceZEnd serviceZEnd = tapiEndPointToServiceZPoint(endPointMap.values().stream().skip(1).findFirst()
+                .orElseThrow(), serviceFormat, nodeZid, capacity, constraint.getServiceLayer());
         if (serviceAEnd == null || serviceZEnd == null) {
             LOG.error("Couldnt map endpoints to service end");
             return null;
@@ -1396,7 +1474,7 @@ public final class ConnectivityUtils {
         //  It could be obtained from the SIP which has the NEP and includes all the OR name.
         Uuid sipUuid = endPoint.getServiceInterfacePoint().getServiceInterfacePointUuid();
         // Todo -> need to find the NEP associated to that SIP
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeZid.getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeZid.getBytes(StandardCharsets.UTF_8)).toString());
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node =
             this.tapiContext.getTapiNode(this.tapiTopoUuid, nodeUuid);
         if (node == null) {
@@ -1419,28 +1497,15 @@ public final class ConnectivityUtils {
             LOG.error("Nep not found in datastore");
             return null;
         }
-        String nodeName = endPoint.getName().values().stream().findFirst().get().getValue();
+        String nodeName = endPoint.getName().values().stream().findFirst().orElseThrow().getValue();
         String nodeid = String.join("-", nodeName.split("-")[0], nodeName.split("-")[1]);
-        String nepName = nep.getName().values().stream().findFirst().get().getValue();
+        String nepName = nep.getName().values().stream().findFirst().orElseThrow().getValue();
         String txPortDeviceName = nepName.split("\\+")[0];
         String txPortName = nepName.split("\\+")[2];
         String rxPortDeviceName = txPortDeviceName;
         String rxPortName = txPortName;
         LOG.debug("Node z id = {}, txportDeviceName = {}, txPortName = {}", nodeid, txPortDeviceName, txPortName);
         LOG.debug("Node z id = {}, rxportDeviceName = {}, rxPortName = {}", nodeid, rxPortDeviceName, rxPortName);
-        if (serviceFormat.equals(ServiceFormat.ODU)) {
-            // TODO --> populate network map
-            populateNetworkMap(nodeid, txPortName);
-        }
-        if (serviceFormat.equals(ServiceFormat.Ethernet)) {
-            // TODO --> choose from network Map un network port which hasnt been used yet by another service.
-            //  Set boolean to true and update txportName and so on
-            String updTxName = findFreeConfiguredNetworkPort(nodeid);
-            if (updTxName != null) {
-                txPortName = updTxName;
-                rxPortName = txPortName;
-            }
-        }
         // TODO --> get clli from datastore?
         String clli = "NodeSC";
         LOG.info("Node z id = {}, txportDeviceName = {}, txPortName = {}", nodeid, txPortDeviceName, txPortName);
@@ -1451,7 +1516,12 @@ public final class ConnectivityUtils {
             .setOpticType(OpticTypes.Gray)
             .setServiceFormat(serviceFormat)
             .setServiceRate(Uint32.valueOf(capacity))
-            .setTxDirection(new TxDirectionBuilder()
+            .setEthernetAttributes(new EthernetAttributesBuilder().setSubrateEthSla(new SubrateEthSlaBuilder()
+                    .setCommittedBurstSize(Uint16.valueOf(64))
+                    .setCommittedInfoRate(Uint32.valueOf(100000))
+                    .build())
+                .build())
+            .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO), new TxDirectionBuilder()
                 .setPort(new PortBuilder()
                     .setPortDeviceName(txPortDeviceName)
                     .setPortName(txPortName)
@@ -1465,8 +1535,9 @@ public final class ConnectivityUtils {
                     .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
                     .setLgxPortShelf("00")
                     .build())
-                .build())
-            .setRxDirection(new RxDirectionBuilder()
+                .setIndex(Uint8.ZERO)
+                .build()))
+            .setRxDirection(Map.of(new RxDirectionKey(Uint8.ZERO), new RxDirectionBuilder()
                 .setPort(new PortBuilder()
                     .setPortDeviceName(rxPortDeviceName)
                     .setPortName(rxPortName)
@@ -1480,17 +1551,17 @@ public final class ConnectivityUtils {
                     .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
                     .setLgxPortShelf("00")
                     .build())
-                .build());
+                .setIndex(Uint8.ZERO)
+                .build()));
         if (serviceFormat.equals(ServiceFormat.ODU)) {
-            serviceZEndBuilder.setOduServiceRate(ODU4.class);
+            serviceZEndBuilder.setOduServiceRate(ODU4.VALUE);
         }
         if (serviceFormat.equals(ServiceFormat.OTU)) {
-            serviceZEndBuilder.setOtuServiceRate(OTU4.class);
+            serviceZEndBuilder.setOtuServiceRate(OTU4.VALUE);
         }
         if (!serviceLayer.equals(LayerProtocolName.ETH)) {
             serviceZEndBuilder
-                .setSubrateEthSla(new SubrateEthSlaBuilder().setSubrateEthSla(new org.opendaylight.yang.gen.v1.http
-                    .org.openroadm.common.service.types.rev190531.subrate.eth.sla.SubrateEthSlaBuilder()
+                .setEthernetAttributes(new EthernetAttributesBuilder().setSubrateEthSla(new SubrateEthSlaBuilder()
                         .setCommittedBurstSize(Uint16.valueOf(64))
                         .setCommittedInfoRate(Uint32.valueOf(100000))
                         .build())
@@ -1508,7 +1579,7 @@ public final class ConnectivityUtils {
         //  It could be obtained from the SIP which has the NEP and includes all the OR name.
         Uuid sipUuid = endPoint.getServiceInterfacePoint().getServiceInterfacePointUuid();
         // Todo -> need to find the NEP associated to that SIP
-        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeAid.getBytes(Charset.forName("UTF-8"))).toString());
+        Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes(nodeAid.getBytes(StandardCharsets.UTF_8)).toString());
         org.opendaylight.yang.gen.v1.urn.onf.otcc.yang.tapi.topology.rev181210.topology.Node node =
             this.tapiContext.getTapiNode(this.tapiTopoUuid, nodeUuid);
         if (node == null) {
@@ -1531,28 +1602,15 @@ public final class ConnectivityUtils {
             LOG.error("Nep not found in datastore");
             return null;
         }
-        String nodeName = endPoint.getName().values().stream().findFirst().get().getValue();
+        String nodeName = endPoint.getName().values().stream().findFirst().orElseThrow().getValue();
         String nodeid = String.join("-", nodeName.split("-")[0], nodeName.split("-")[1]);
-        String nepName = nep.getName().values().stream().findFirst().get().getValue();
+        String nepName = nep.getName().values().stream().findFirst().orElseThrow().getValue();
         String txPortDeviceName = nepName.split("\\+")[0];
         String txPortName = nepName.split("\\+")[2];
         String rxPortDeviceName = txPortDeviceName;
         String rxPortName = txPortName;
         LOG.debug("Node a id = {}, txportDeviceName = {}, txPortName = {}", nodeid, txPortDeviceName, txPortName);
         LOG.debug("Node a id = {}, rxportDeviceName = {}, rxPortName = {}", nodeid, rxPortDeviceName, rxPortName);
-        if (serviceFormat.equals(ServiceFormat.ODU)) {
-            // TODO --> populate network map
-            populateNetworkMap(nodeid, txPortName);
-        }
-        if (serviceFormat.equals(ServiceFormat.Ethernet)) {
-            // TODO --> choose from network Map un network port which hasnt been used yet by another service.
-            //  Set boolean to true and update txportName and so on
-            String updTxName = findFreeConfiguredNetworkPort(nodeid);
-            if (updTxName != null) {
-                txPortName = updTxName;
-                rxPortName = txPortName;
-            }
-        }
         // TODO --> get clli from datastore?
         String clli = "NodeSA";
         LOG.info("Node a id = {}, txportDeviceName = {}, txPortName = {}", nodeid, txPortDeviceName, txPortName);
@@ -1563,7 +1621,14 @@ public final class ConnectivityUtils {
             .setOpticType(OpticTypes.Gray)
             .setServiceFormat(serviceFormat)
             .setServiceRate(Uint32.valueOf(capacity))
-            .setTxDirection(new TxDirectionBuilder()
+            .setEthernetAttributes(new EthernetAttributesBuilder().setSubrateEthSla(
+                    new org.opendaylight.yang.gen.v1.http.org.openroadm.common.service.types.rev211210.subrate.eth
+                        .sla.SubrateEthSlaBuilder()
+                        .setCommittedBurstSize(Uint16.valueOf(64))
+                        .setCommittedInfoRate(Uint32.valueOf(100000))
+                        .build())
+                .build())
+            .setTxDirection(Map.of(new TxDirectionKey(Uint8.ZERO), new TxDirectionBuilder()
                 .setPort(new PortBuilder()
                     .setPortDeviceName(txPortDeviceName)
                     .setPortName(txPortName)
@@ -1577,8 +1642,9 @@ public final class ConnectivityUtils {
                     .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
                     .setLgxPortShelf("00")
                     .build())
-                .build())
-            .setRxDirection(new RxDirectionBuilder()
+                .setIndex(Uint8.ZERO)
+                .build()))
+            .setRxDirection(Map.of(new RxDirectionKey(Uint8.ZERO), new RxDirectionBuilder()
                 .setPort(new PortBuilder()
                     .setPortDeviceName(rxPortDeviceName)
                     .setPortName(rxPortName)
@@ -1592,17 +1658,16 @@ public final class ConnectivityUtils {
                     .setLgxPortRack(TapiStringConstants.PORT_RACK_VALUE)
                     .setLgxPortShelf("00")
                     .build())
-                .build());
+                .setIndex(Uint8.ZERO)
+                .build()));
         if (serviceFormat.equals(ServiceFormat.ODU)) {
-            serviceAEndBuilder.setOduServiceRate(ODU4.class);
-        }
-        if (serviceFormat.equals(ServiceFormat.OTU)) {
-            serviceAEndBuilder.setOtuServiceRate(OTU4.class);
+            serviceAEndBuilder.setOduServiceRate(ODU4.VALUE);
+        } else if (serviceFormat.equals(ServiceFormat.OTU)) {
+            serviceAEndBuilder.setOtuServiceRate(OTU4.VALUE);
         }
         if (!serviceLayer.equals(LayerProtocolName.ETH)) {
             serviceAEndBuilder
-                .setSubrateEthSla(new SubrateEthSlaBuilder().setSubrateEthSla(new org.opendaylight.yang.gen.v1.http
-                    .org.openroadm.common.service.types.rev190531.subrate.eth.sla.SubrateEthSlaBuilder()
+                .setEthernetAttributes(new EthernetAttributesBuilder().setSubrateEthSla(new SubrateEthSlaBuilder()
                         .setCommittedBurstSize(Uint16.valueOf(64))
                         .setCommittedInfoRate(Uint32.valueOf(100000))
                         .build())
@@ -1611,30 +1676,6 @@ public final class ConnectivityUtils {
         return serviceAEndBuilder.build();
     }
 
-    private String findFreeConfiguredNetworkPort(String nodeid) {
-        if (!this.networkMap.containsKey(nodeid)) {
-            return null;
-        }
-        Map<String, Boolean> netMap = this.networkMap.get(nodeid);
-        for (Map.Entry<String, Boolean> entry : netMap.entrySet()) {
-            if (!entry.getValue()) {
-                this.networkMap.get(nodeid).put(entry.getKey(), true);
-                return entry.getKey();
-            }
-        }
-        return null;
-    }
-
-    private void populateNetworkMap(String nodeid, String txPortName) {
-        Map<String, Boolean> netMap = new HashMap<>();
-        netMap.put(txPortName, false);
-        if (!this.networkMap.containsKey(nodeid)) {
-            this.networkMap.put(nodeid, netMap);
-        } else if (!this.networkMap.get(nodeid).containsKey(txPortName)) {
-            this.networkMap.get(nodeid).putAll(netMap);
-        }
-    }
-
     private ConnectionType getConnectionTypePhtnc(Collection<org.opendaylight.yang.gen.v1.urn
             .onf.otcc.yang.tapi.connectivity.rev181210.create.connectivity.service.input.EndPoint> endPoints) {
         if (endPoints.stream().anyMatch(ep -> ep.getName().values().stream()
@@ -1659,13 +1700,13 @@ public final class ConnectivityUtils {
 
     private ConnectionEndPoint getAssociatediODUCep(String spcXpdrNetwork) {
         Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", spcXpdrNetwork.split("\\+")[0],
-            TapiStringConstants.DSR).getBytes(Charset.forName("UTF-8")))).toString());
+            TapiStringConstants.DSR).getBytes(StandardCharsets.UTF_8))).toString());
         Uuid nepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", spcXpdrNetwork.split("\\+")[0],
-                TapiStringConstants.I_ODU, spcXpdrNetwork.split("\\+")[1]).getBytes(Charset.forName("UTF-8"))))
+                TapiStringConstants.I_ODU, spcXpdrNetwork.split("\\+")[1]).getBytes(StandardCharsets.UTF_8)))
             .toString());
         Uuid cepUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+", "CEP",
             spcXpdrNetwork.split("\\+")[0], TapiStringConstants.I_ODU, spcXpdrNetwork.split("\\+")[1]))
-            .getBytes(Charset.forName("UTF-8"))).toString());
+            .getBytes(StandardCharsets.UTF_8)).toString());
         return this.tapiContext.getTapiCEP(this.tapiTopoUuid, nodeUuid, nepUuid, cepUuid);
     }
 
@@ -1693,7 +1734,7 @@ public final class ConnectivityUtils {
                 if (!optMapping.isPresent()) {
                     LOG.error("Couldnt find mapping for port {} of node {}", tpId, nodeId);
                 }
-                Mapping mapping = optMapping.get();
+                Mapping mapping = optMapping.orElseThrow();
                 LOG.info("Mapping for node+port {}+{} = {}", nodeId, tpId, mapping);
                 String key = String.join("+", String.join("-", nodeId, tpId.split("\\-")[0]),
                     mapping.getConnectionMapLcp());
@@ -1714,7 +1755,7 @@ public final class ConnectivityUtils {
         List<OpenroadmNodeType> openroadmNodeTypeList = new ArrayList<>();
         for (String xpdrNode:xpdrNodelist) {
             Uuid nodeUuid = new Uuid(UUID.nameUUIDFromBytes((String.join("+",xpdrNode, TapiStringConstants.DSR))
-                .getBytes(Charset.forName("UTF-8"))).toString());
+                .getBytes(StandardCharsets.UTF_8)).toString());
             InstanceIdentifier<org.opendaylight.yang.gen.v1.urn
                 .onf.otcc.yang.tapi.topology.rev181210.topology.Node> nodeIID = InstanceIdentifier.builder(
                     Context.class).augmentation(org.opendaylight.yang.gen.v1.urn
@@ -1728,8 +1769,8 @@ public final class ConnectivityUtils {
                 if (!optNode.isPresent()) {
                     return null;
                 }
-                OpenroadmNodeType openroadmNodeType = OpenroadmNodeType.forName(optNode.get().getName().get(
-                    new NameKey("Node Type")).getValue()).get();
+                OpenroadmNodeType openroadmNodeType = OpenroadmNodeType.forName(optNode.orElseThrow().getName().get(
+                    new NameKey("Node Type")).getValue());
                 if (!openroadmNodeTypeList.contains(openroadmNodeType)) {
                     openroadmNodeTypeList.add(openroadmNodeType);
                 }