diff --git a/.context.log.swn b/.context.log.swn
new file mode 100644
index 0000000000000000000000000000000000000000..438f657217b971861a154b8bd3b81b1b02507337
Binary files /dev/null and b/.context.log.swn differ
diff --git a/my_deploy.sh b/my_deploy.sh
index bb78bece5387532d46ea18dea9c2972e532c0cd8..68b6bb044f25f7bdc4091327ade6850b5d6db565 100755
--- a/my_deploy.sh
+++ b/my_deploy.sh
@@ -20,7 +20,7 @@
 export TFS_REGISTRY_IMAGES="http://localhost:32000/tfs/"
 
 # Set the list of components, separated by spaces, you want to build images for, and deploy.
-export TFS_COMPONENTS="context device pathcomp opticalcontroller service slice  webui nbi "
+export TFS_COMPONENTS="context device pathcomp opticalcontroller qkd_app service slice  webui nbi "
 
 # Uncomment to activate Monitoring (old)
 #export TFS_COMPONENTS="${TFS_COMPONENTS} monitoring"
diff --git a/src/context/service/database/OpticalConfig.py b/src/context/service/database/OpticalConfig.py
index d502a0a43680a908664a1c8377b576d914b63240..b370375d3654432b0da4a476ad2e8dcda7814e44 100644
--- a/src/context/service/database/OpticalConfig.py
+++ b/src/context/service/database/OpticalConfig.py
@@ -22,9 +22,10 @@ from sqlalchemy_cockroachdb import run_transaction
 from common.proto.context_pb2 import OpticalConfig, OpticalConfigId , Empty , EventTypeEnum
 from .models.OpticalConfig.OpticalConfigModel import OpticalConfigModel 
 from .models.OpticalConfig.TransponderModel import  TransponderTypeModel ,OpticalChannelModel
-from .models.OpticalConfig.RoadmModel import RoadmTypeModel, ChannelModel
+from .models.OpticalConfig.RoadmModel import RoadmTypeModel, ChannelModel , ORInterfaceModel
 from context.service.database.uuids.OpticalConfig import (
-    channel_get_uuid , opticalconfig_get_uuid ,transponder_get_uuid,roadm_get_uuid
+    channel_get_uuid , opticalconfig_get_uuid ,transponder_get_uuid,roadm_get_uuid,
+    interface_get_uuid
     )
 from .Events import notify_event_opticalconfig
 
@@ -55,6 +56,7 @@ def set_opticalconfig(db_engine : Engine, request : OpticalConfig):
     device_id = request.device_id
     device_uuid =  request.device_id.device_uuid.uuid
     channels = []
+    interfaces=[]
 
     transponder=[]
     roadms=[]
@@ -165,7 +167,29 @@ def set_opticalconfig(db_engine : Engine, request : OpticalConfig):
                     "roadm_uuid":roadm_get_uuid(device_id),
                     "opticalconfig_uuid":opticalconfig_uuid,
                 })
+                
             if    config_type == DeviceTypeEnum.OPEN_ROADM._value_: 
+                if 'interfaces' in config :
+                    for interface in config['interfaces']:
+                        interfaces.append({
+                            "interface_uuid"      :interface_get_uuid(interface['name']),
+                            'name'                : interface["name"],
+                            "type"                : interface["type"],
+                            "administrative_state": interface["administrative_state"],
+                            "circuit_pack_name"   : interface["circuit_pack_name"],
+                            "port"                : interface["port"],
+                            "interface_list"      : interface["interface_list"],
+                            "frequency"           : interface["frequency"],
+                            "width"               : interface["width"],
+                            "roadm_uuid"          : roadm_get_uuid(device_id),
+             
+                        }
+                                          )
+                roadms.append({
+                    "roadm_uuid":roadm_get_uuid(device_id),
+                    "opticalconfig_uuid":opticalconfig_uuid,
+                })          
+                        
                 LOGGER.info(f"open_roadm")
                 
                  
@@ -258,13 +282,46 @@ def set_opticalconfig(db_engine : Engine, request : OpticalConfig):
                             src_port=stmt.excluded.src_port,
                             channel_index=stmt.excluded.channel_index,
                             optical_band_parent = stmt.excluded.optical_band_parent
+                            
 
                         )
                         
                     )
                     stmt = stmt.returning(ChannelModel.channel_uuid)
                     opticalChannel_id = session.execute(stmt).fetchone()
-                           
+         
+        if    config_type == DeviceTypeEnum.OPEN_ROADM._value_:
+             
+             if (len(roadms)>0):
+                stmt = insert(RoadmTypeModel).values(roadms)
+            
+                stmt = stmt.on_conflict_do_update(
+                        index_elements=[RoadmTypeModel.roadm_uuid],
+                        set_=dict(
+                            interfaces=stmt.excluded.interfaces
+                        )
+                    )
+                stmt = stmt.returning(RoadmTypeModel.roadm_uuid)
+                roadm_id = session.execute(stmt).fetchone() 
+                
+             if len(interface) >0 :      
+                stmt = insert(ORInterfaceModel).values(interface)
+                stmt = stmt.on_conflict_do_update(
+                        index_elements=[ORInterfaceModel.interface_uuid ],
+                        set_=dict(
+                            name= stmt.excluded.name ,
+                            frequency = stmt.excluded.frequency,
+                            administrative_state = stmt.excluded.administrative_state,
+                            type=stmt.excluded.type,
+                            circuit_pack_name=stmt.excluded.circuit_pack_name,
+                            port=stmt.excluded.port,
+                            interface_list=stmt.excluded.interface_list,
+                            width=stmt.excluded.width,
+                        )
+                        
+                    )
+                stmt = stmt.returning(ORInterfaceModel.interface_uuid)
+                opticalChannel_id = session.execute(stmt).fetchone()            
                    
                 
     opticalconfig_id = run_transaction(sessionmaker(bind=db_engine), callback)
diff --git a/src/context/service/database/models/OpticalConfig/RoadmModel.py b/src/context/service/database/models/OpticalConfig/RoadmModel.py
index 6a3add33524f0b01731e53bf828679c97ae4f9eb..6d1ec19fafd7ed801534da09e0b715eb577d201a 100644
--- a/src/context/service/database/models/OpticalConfig/RoadmModel.py
+++ b/src/context/service/database/models/OpticalConfig/RoadmModel.py
@@ -28,7 +28,7 @@ class RoadmTypeModel (_Base):
     roadm_uuid                = Column(String, primary_key=True)
 
     channels                  = relationship("ChannelModel")
-    circuits                   = Column (String,nullable=True)
+    interfaces                   = relationship ("ORInterfaceModel")
     
     opticalconfig_uuid        = Column(ForeignKey('optical_config.opticalconfig_uuid',  ondelete='CASCADE' ),index=True ,nullable=False)
     opticalconfig             = relationship('OpticalConfigModel',     back_populates='roadms')
@@ -41,7 +41,8 @@ class RoadmTypeModel (_Base):
     def dump (self):
         return {
             "channels"          : [channel.dump() for channel in self.channels],
-            "roadm_uuid"        : self.dump_id()
+            "roadm_uuid"        : self.dump_id(),
+            "interfaces"       :[]
         }
 
 class ChannelModel(_Base):
@@ -81,3 +82,38 @@ class ChannelModel(_Base):
             "channel_index":self.channel_index
         }
         
+class ORInterfaceModel (_Base): 
+    
+    __tablename__        =  'open_roadm_interface'
+    interface_uuid       =  Column(String, primary_key=True)
+    name                 =  Column(String, nullable=False ,unique=True )
+    type                 =  Column(String , nullable=True)
+    administrative_state =  Column(String,nullable=True)
+    circuit_pack_name    =  Column(String,nullable=True)
+    port                 =  Column(String,nullable=True)
+    interface_list       =  Column(String ,nullable=True)
+    frequency            =  Column(Integer ,nullable=True)
+    width                =  Column(Integer ,nullable=True)
+    
+    roadm_uuid           =       Column(ForeignKey('roadm_type.roadm_uuid', ondelete='CASCADE' ),nullable=False)
+    roadm                =       relationship('RoadmTypeModel',back_populates='interfaces')
+
+    
+    def dump_id (self ):
+        return {
+            "interface_uuid":self.interface_uuid
+        }
+
+    def dump(self):
+        return {
+            "name"                         : self.name,
+            "type"                         : self.type,
+            "administrative_state"         : self.administrative_state,
+            "circuit_pack_name"            : self.circuit_pack_name,
+            "port"                         : self.port,
+            "interface_list"               : self.interface_list,
+          
+            "frequency"                    : self.frequency,
+            "width"                        : self.width
+            
+        }
\ No newline at end of file
diff --git a/src/context/service/database/uuids/OpticalConfig.py b/src/context/service/database/uuids/OpticalConfig.py
index 7bf75a9a259639cd354b9056eba93806a4844051..398e8d73157c3a9041a4044a3cf500784825a8f9 100644
--- a/src/context/service/database/uuids/OpticalConfig.py
+++ b/src/context/service/database/uuids/OpticalConfig.py
@@ -17,6 +17,21 @@ def channel_get_uuid(
        
     ], extra_details=['Channel name is required to produce a channel UUID'])
 
+def interface_get_uuid(
+    interface_name :str , allow_random : bool = False
+) -> str:
+    
+
+    if len(interface_name) > 0:
+        return get_uuid_from_string(interface_name)
+    if allow_random: return get_uuid_random()
+
+    raise InvalidArgumentsException([
+        ('interface uuid', interface_name),
+       
+    ], extra_details=['interface name is required to produce a interface UUID'])
+
+
 
 def transponder_get_uuid(
     opticalconfig_id :str , allow_random : bool = False
diff --git a/src/device/service/drivers/oc_driver/OCDriver.py b/src/device/service/drivers/oc_driver/OCDriver.py
index a94907928e22829e229b99a2c1a83fc85a730236..8959178b8b33a2e8dc0c5b879e9a2741482ef4bc 100644
--- a/src/device/service/drivers/oc_driver/OCDriver.py
+++ b/src/device/service/drivers/oc_driver/OCDriver.py
@@ -39,7 +39,8 @@ from context.client.ContextClient import ContextClient
 from common.proto.context_pb2 import (
     OpticalConfig)
 from .templates.descovery_tool.transponders import  transponder_values_extractor
-from .templates.descovery_tool.roadms import roadm_values_extractor ,openroadm_values_extractor,extract_media_channels
+from .templates.descovery_tool.roadms import roadm_values_extractor ,extract_media_channels
+from .templates.descovery_tool.open_roadm import openroadm_values_extractor
 DEBUG_MODE = False
 logging.getLogger('ncclient.manager').setLevel(logging.DEBUG if DEBUG_MODE else logging.WARNING)
 logging.getLogger('ncclient.transport.ssh').setLevel(logging.DEBUG if DEBUG_MODE else logging.WARNING)
@@ -290,6 +291,8 @@ class OCDriver(_Driver):
                 elif (self.__type =='openroadm')    :
                    extracted_values=openroadm_values_extractor(data_xml=xml_data,resource_keys=[],dic=oc_values)
                    ports_result = extracted_values[1]
+                   oc_values['interfaces']=extracted_values[0]['interfaces']
+                   
 
                     
                     
diff --git a/src/device/service/drivers/oc_driver/templates/descovery_tool/open_roadm.py b/src/device/service/drivers/oc_driver/templates/descovery_tool/open_roadm.py
new file mode 100644
index 0000000000000000000000000000000000000000..337207072849a24f5419416a9a19555d1cfd3ab5
--- /dev/null
+++ b/src/device/service/drivers/oc_driver/templates/descovery_tool/open_roadm.py
@@ -0,0 +1,199 @@
+  
+# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/)
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+import re,logging
+import json
+import lxml.etree as ET
+from typing import Collection, Dict, Any
+ 
+def extract_roadm_circuits_pack (xml_data:str):
+  
+   
+    xml_bytes = xml_data.encode("utf-8")
+    root = ET.fromstring(xml_bytes)
+    # with open('xml.log', 'w') as f:
+    #      print(xml_bytes, file=f)
+    
+    
+    namespace = {'oc': "http://org/openroadm/device"}
+    
+    circuits = root.findall('.//oc:circuit-packs',namespace)
+  
+    circuits_list =[]
+    # print(f"component {components}")
+    
+    if (circuits is not None):
+        for circuit  in circuits:
+            circuit_info ={}
+            circuit_ports=[]
+            circuit_name = circuit.find(".//oc:circuit-pack-name",namespace)
+            circuit_type=circuit.find(".//oc:circuit-pack-type",namespace)
+            circuit_adminstrative_status=circuit.find(".//oc:administrative-state",namespace)
+            circuit_equipment_state=circuit.find("./oc:equipment-state",namespace)
+            circuit_mode=circuit.find("./oc:circuit-pack-mode",namespace)
+            slot= circuit.find("./oc:slot",namespace)
+            shelf= circuit.find("./oc:shelf",namespace)
+            ports = circuit.findall("./oc:ports",namespace)
+           
+            
+            if (ports is not None):
+                
+                for port in ports :
+                    port_info={}
+                    port_name=port.find('./oc:port-name',namespace)
+                    port_qual= port.find("./oc:port-qual",namespace)
+                   
+                    if port_name is not None :
+                        port_info["port_name"]=port_name.text
+                    if port_qual is not None :
+                        port_info["port_qual"]=port_qual.text
+                    circuit_ports.append(port_info)      
+                    # if port_info["port_qual"] == 'roadm-external':
+                    #    circuit_ports.append(port_info)            
+            if (circuit_name is not None):
+                circuit_info["circuit_name"]=circuit_name.text
+            if (circuit_type is not None):
+                circuit_info["circuit_type"]=circuit_type.text
+            if (circuit_adminstrative_status is not None):
+                circuit_info["circuit_adminstrative_status"]=circuit_adminstrative_status.text
+            if (circuit_equipment_state is not None):
+                circuit_info["circuit_equipment_state"]=circuit_equipment_state.text
+            if (circuit_mode is not None):
+                circuit_info["circuit_mode"]=circuit_mode.text
+            if (slot is not None):
+                circuit_info["slot"]=slot.text
+            if (shelf is not None):
+                circuit_info["shelf"]=shelf.text
+            logging.info(f"circuit_ports {circuit_ports}")        
+            circuit_info["ports"]=circuit_ports 
+                                   
+            circuits_list.append(circuit_info)   
+          
+        
+   
+    return circuits_list            
+
+
+
+def extract_openroadm_info(xml_data:str):
+    roadm_info={"node-id":None,"node-number":None,"node-type":None,'clli':None}
+    xml_bytes = xml_data.encode("utf-8")
+    root = ET.fromstring(xml_bytes)
+    namespace = {'oc': "http://org/openroadm/device"}
+    info = root.findall('.//oc:info',namespace)
+    if info is not None :
+        for i in info :
+            node_id= i.find('.//oc:node-id',namespace)
+            node_number= i.find('.//oc:node-number',namespace)
+            node_type=i.find('.//oc:node-type',namespace)
+            clli=i.find('.//oc:clli',namespace)
+            if (node_id is not None):
+                roadm_info['node-id']=node_id.text
+            if (node_number is not None):
+                roadm_info['node-number']=node_number.text
+            if (node_type is not None):
+                roadm_info['node-type']=node_type.text
+            if (clli is not None):
+                roadm_info['clli']=clli.text
+ 
+    return roadm_info     
+
+
+def extract_openroadm_interface (xml_data:str):
+    or_interfaces=[]
+   
+    xml_bytes = xml_data.encode("utf-8")
+    root = ET.fromstring(xml_bytes)
+    # with open('xml.log', 'w') as f:
+    #      print(xml_bytes, file=f)
+    
+    
+    namespace = {'oc': "http://org/openroadm/device" 
+                 , 'mc':"http://org/openroadm/media-channel-interfaces"
+                 ,'nmc':"http://org/openroadm/network-media-channel-interfaces"}
+    
+    interfaces = root.findall('.//oc:interface',namespace)
+    for interface in interfaces :
+      mc = interface.find('.//mc:mc-ttp',namespace)
+      name = interface.find('.//oc:name',namespace)
+      description = interface.find('.//oc:description',namespace)
+      type=''
+      administrative_state=interface.find('.//oc:administrative-state',namespace)
+      circuit_pack_name=interface.find('.//oc:supporting-circuit-pack-name',namespace)
+      port=interface.find('.//oc:supporting-port',namespace)
+      interface_list =interface.find('.//oc:supporting-interface-list',namespace)
+      
+     
+      if mc is not None :
+        print (mc)
+        frequency = mc.find('.//mc:min-freq',namespace)
+        width=mc.find('.//mc:width',namespace)
+        mc= {
+          'name':name.text if name is not None else None,
+          'description':description.text if description is not None else None ,
+          'type':"media_channel",
+          'administrative_state':administrative_state.text if administrative_state is not None else None,
+          'circuit_pack_name':circuit_pack_name.text if circuit_pack_name is not None else None,
+          'port':port.text if port is not None else None ,
+          'interface_list': interface_list.text if interface_list is not None else None,
+           'frequency': frequency.text if frequency is not None else None,
+           'width':width.text if width is not None else None
+        } 
+        or_interfaces.append(mc)
+        
+      else :
+        nmc = interface.find('.//nmc:nmc-ctp',namespace)
+        if nmc is not None :
+          frequency = nmc.find('.//nmc:frequency',namespace)
+          width=nmc.find('.//nmc:width',namespace)
+          nmc= {
+            'name':name.text if name is not None else None,
+            'description':description.text if description is not None else None ,
+            'type':"network_media_channel",
+            'administrative_state':administrative_state.text if administrative_state is not None else None,
+            'circuit_pack_name':circuit_pack_name.text if circuit_pack_name is not None else None,
+            'port':port.text if port is not None else None ,
+            'interface_list': interface_list.text if interface_list is not None else None,
+            'frequency': frequency.text if frequency is not None else None,
+            'width':width.text if width is not None else None
+          } 
+          or_interfaces.append(nmc)
+    return or_interfaces    
+               
+
+def  openroadm_values_extractor (data_xml:str,resource_keys:list,dic:dict):
+    ports_result=[]
+    openroadm_info= extract_openroadm_info(data_xml)
+    circuits_list = extract_roadm_circuits_pack(data_xml)
+    interfaces = extract_openroadm_interface(data_xml)
+    dic["openroadm_info"]=openroadm_info
+    dic["circuits"]=circuits_list
+    dic['interfaces']=interfaces
+    
+    for circuit in circuits_list :
+ 
+        for port in circuit['ports']:
+            if port is not None and  'port_name' in port :
+                resource_key = '/endpoints/endpoint[{:s}]'.format(port["port_name"])
+                resource_value = {'uuid': port["port_name"], 'type':port["port_qual"] if "port_qual" in port else None}
+                ports_result.append((resource_key, resource_value))
+    return [dic,ports_result]            
+    
+    
+    
+    
+    
+    
+              
\ No newline at end of file
diff --git a/src/device/service/drivers/oc_driver/templates/descovery_tool/roadms.py b/src/device/service/drivers/oc_driver/templates/descovery_tool/roadms.py
index a1ef517b6db5f2f6bf7035f8235c034c494ff5b8..3140d5aa1b5474bd0e793756d8b24ce6c8dc6071 100644
--- a/src/device/service/drivers/oc_driver/templates/descovery_tool/roadms.py
+++ b/src/device/service/drivers/oc_driver/templates/descovery_tool/roadms.py
@@ -208,121 +208,4 @@ def roadm_values_extractor (data_xml:str,resource_keys:list,dic:dict):
      return [ports_result,optical_bands,media_cahannels]   
  
  
- 
- #/////////////// OpenRoadm //////////////
- 
- 
-def extract_roadm_circuits_pack (xml_data:str):
-  
-   
-    xml_bytes = xml_data.encode("utf-8")
-    root = ET.fromstring(xml_bytes)
-    # with open('xml.log', 'w') as f:
-    #      print(xml_bytes, file=f)
-    
-    
-    namespace = {'oc': "http://org/openroadm/device"}
-    
-    circuits = root.findall('.//oc:circuit-packs',namespace)
-  
-    circuits_list =[]
-    # print(f"component {components}")
-    
-    if (circuits is not None):
-        for circuit  in circuits:
-            circuit_info ={}
-            circuit_ports=[]
-            circuit_name = circuit.find(".//oc:circuit-pack-name",namespace)
-            circuit_type=circuit.find(".//oc:circuit-pack-type",namespace)
-            circuit_adminstrative_status=circuit.find(".//oc:administrative-state",namespace)
-            circuit_equipment_state=circuit.find("./oc:equipment-state",namespace)
-            circuit_mode=circuit.find("./oc:circuit-pack-mode",namespace)
-            slot= circuit.find("./oc:slot",namespace)
-            shelf= circuit.find("./oc:shelf",namespace)
-            ports = circuit.findall("./oc:ports",namespace)
-           
-            
-            if (ports is not None):
-                
-                for port in ports :
-                    port_info={}
-                    port_name=port.find('./oc:port-name',namespace)
-                    port_qual= port.find("./oc:port-qual",namespace)
-                   
-                    if port_name is not None :
-                        port_info["port_name"]=port_name.text
-                    if port_qual is not None :
-                        port_info["port_qual"]=port_qual.text
-                    circuit_ports.append(port_info)      
-                    # if port_info["port_qual"] == 'roadm-external':
-                    #    circuit_ports.append(port_info)            
-            if (circuit_name is not None):
-                circuit_info["circuit_name"]=circuit_name.text
-            if (circuit_type is not None):
-                circuit_info["circuit_type"]=circuit_type.text
-            if (circuit_adminstrative_status is not None):
-                circuit_info["circuit_adminstrative_status"]=circuit_adminstrative_status.text
-            if (circuit_equipment_state is not None):
-                circuit_info["circuit_equipment_state"]=circuit_equipment_state.text
-            if (circuit_mode is not None):
-                circuit_info["circuit_mode"]=circuit_mode.text
-            if (slot is not None):
-                circuit_info["slot"]=slot.text
-            if (shelf is not None):
-                circuit_info["shelf"]=shelf.text
-            logging.info(f"circuit_ports {circuit_ports}")        
-            circuit_info["ports"]=circuit_ports 
-                                   
-            circuits_list.append(circuit_info)   
-          
-        
-   
-    return circuits_list            
-
-
-
-def extract_openroadm_info(xml_data:str):
-    roadm_info={"node-id":None,"node-number":None,"node-type":None,'clli':None}
-    xml_bytes = xml_data.encode("utf-8")
-    root = ET.fromstring(xml_bytes)
-    namespace = {'oc': "http://org/openroadm/device"}
-    info = root.findall('.//oc:info',namespace)
-    if info is not None :
-        for i in info :
-            node_id= i.find('.//oc:node-id',namespace)
-            node_number= i.find('.//oc:node-number',namespace)
-            node_type=i.find('.//oc:node-type',namespace)
-            clli=i.find('.//oc:clli',namespace)
-            if (node_id is not None):
-                roadm_info['node-id']=node_id.text
-            if (node_number is not None):
-                roadm_info['node-number']=node_number.text
-            if (node_type is not None):
-                roadm_info['node-type']=node_type.text
-            if (clli is not None):
-                roadm_info['clli']=clli.text
- 
-    return roadm_info             
-
-def  openroadm_values_extractor (data_xml:str,resource_keys:list,dic:dict):
-    ports_result=[]
-    openroadm_info= extract_openroadm_info(data_xml)
-    circuits_list = extract_roadm_circuits_pack(data_xml)
-    dic["openroadm_info"]=openroadm_info
-    dic["circuits"]=circuits_list
-    
-    for circuit in circuits_list :
- 
-        for port in circuit['ports']:
-            if port is not None and  'port_name' in port :
-                resource_key = '/endpoints/endpoint[{:s}]'.format(port["port_name"])
-                resource_value = {'uuid': port["port_name"], 'type':port["port_qual"] if "port_qual" in port else None}
-                ports_result.append((resource_key, resource_value))
-    return [dic,ports_result]            
-    
-    
-    
-    
-    
-    
-              
\ No newline at end of file
+ 
\ No newline at end of file
diff --git a/src/webui/service/__init__.py b/src/webui/service/__init__.py
index 9c04ac749e02711fa4f6d9a500431d7850ad2d9c..6a08fbbbc79791a87576db7ae2bd63da3d4f53d5 100644
--- a/src/webui/service/__init__.py
+++ b/src/webui/service/__init__.py
@@ -19,7 +19,7 @@ from flask_healthz import healthz, HealthError
 from common.tools.grpc.Tools import grpc_message_to_json
 from context.client.ContextClient import ContextClient
 from device.client.DeviceClient import DeviceClient
-#from qkd_app.client.QKDAppClient import QKDAppClient
+from qkd_app.client.QKDAppClient import QKDAppClient
 
 def get_working_context() -> str:
     return session['context_uuid'] if 'context_uuid' in session else '---'
@@ -116,8 +116,8 @@ def create_app(use_config=None, web_app_root=None):
     from webui.service.link.routes import link              # pylint: disable=import-outside-toplevel
     app.register_blueprint(link)
 
-    # from webui.service.qkd_app.routes import qkd_app as _qkd_app             # pylint: disable=import-outside-toplevel
-    # app.register_blueprint(_qkd_app)
+    from webui.service.qkd_app.routes import qkd_app as _qkd_app             # pylint: disable=import-outside-toplevel
+    app.register_blueprint(_qkd_app)
 
     from webui.service.policy_rule.routes import policy_rule # pylint: disable=import-outside-toplevel
     app.register_blueprint(policy_rule)
diff --git a/src/webui/service/qkd_app/routes.py b/src/webui/service/qkd_app/routes.py
index 121c43f0acdb6fc5e3a7ff134957b4db738f459e..39ddd9d4103fc453c6275bc2d0f227f4c814aadf 100644
--- a/src/webui/service/qkd_app/routes.py
+++ b/src/webui/service/qkd_app/routes.py
@@ -12,16 +12,16 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# import grpc, json, logging
+import grpc, json, logging
 
-# from flask import current_app, render_template, Blueprint, flash, session, redirect, url_for
-# from common.proto.context_pb2 import Empty, Link, LinkId, LinkList
-# from common.proto.qkd_app_pb2 import App, QKDAppStatusEnum, QKDAppTypesEnum
-# from common.tools.context_queries.Context import get_context
-# from common.tools.context_queries.Device import get_device
-# from common.tools.context_queries.Topology import get_topology
-# from context.client.ContextClient import ContextClient
-# from qkd_app.client.QKDAppClient import QKDAppClient
+from flask import current_app, render_template, Blueprint, flash, session, redirect, url_for
+from common.proto.context_pb2 import Empty, Link, LinkId, LinkList
+from common.proto.qkd_app_pb2 import App, QKDAppStatusEnum, QKDAppTypesEnum
+from common.tools.context_queries.Context import get_context
+from common.tools.context_queries.Device import get_device
+from common.tools.context_queries.Topology import get_topology
+from context.client.ContextClient import ContextClient
+from qkd_app.client.QKDAppClient import QKDAppClient
 
 
 LOGGER = logging.getLogger(__name__)
diff --git a/test.py b/test.py
index a96de8a65ffd39a6ecce0a87a9b783c107bd306c..4a5d82ee8cc2bdf2d7ee45b4ff4e9efc047d07ce 100644
--- a/test.py
+++ b/test.py
@@ -142,6 +142,71 @@ device = {
 }
 
 
+
+def extract_openroadm_interface (xml_data:str):
+    or_interfaces=[]
+   
+    xml_bytes = xml_data.encode("utf-8")
+    root = ET.fromstring(xml_bytes)
+    # with open('xml.log', 'w') as f:
+    #      print(xml_bytes, file=f)
+    
+    
+    namespace = {'oc': "http://org/openroadm/device" 
+                 , 'mc':"http://org/openroadm/media-channel-interfaces"
+                 ,'nmc':"http://org/openroadm/network-media-channel-interfaces"}
+    
+    interfaces = root.findall('.//oc:interface',namespace)
+    for interface in interfaces :
+      mc = interface.find('.//mc:mc-ttp',namespace)
+      name = interface.find('.//oc:name',namespace)
+      description = interface.find('.//oc:description',namespace)
+      type=''
+      administrative_state=interface.find('.//oc:administrative-state',namespace)
+      circuit_pack_name=interface.find('.//oc:supporting-circuit-pack-name',namespace)
+      port=interface.find('.//oc:supporting-port',namespace)
+      interface_list =interface.find('.//oc:supporting-interface-list',namespace)
+      
+     
+      if mc is not None :
+        print (mc)
+        frequency = mc.find('.//mc:min-freq',namespace)
+        width=mc.find('.//mc:width',namespace)
+        mc= {
+          'name':name.text if name is not None else None,
+          'description':description.text if description is not None else None ,
+          'type':"media_channel",
+          'administrative_state':administrative_state.text if administrative_state is not None else None,
+          'circuit_pack_name':circuit_pack_name.text if circuit_pack_name is not None else None,
+          'port':port.text if port is not None else None ,
+          'interface_list': interface_list.text if interface_list is not None else None,
+           'frequency': frequency.text if frequency is not None else None,
+           'width':width.text if width is not None else None
+        } 
+        or_interfaces.append(mc)
+        
+      else :
+        nmc = interface.find('.//nmc:nmc-ctp',namespace)
+        if nmc is not None :
+          frequency = nmc.find('.//nmc:frequency',namespace)
+          width=nmc.find('.//nmc:width',namespace)
+          nmc= {
+            'name':name.text if name is not None else None,
+            'description':description.text if description is not None else None ,
+            'type':"network_media_channel",
+            'administrative_state':administrative_state.text if administrative_state is not None else None,
+            'circuit_pack_name':circuit_pack_name.text if circuit_pack_name is not None else None,
+            'port':port.text if port is not None else None ,
+            'interface_list': interface_list.text if interface_list is not None else None,
+            'frequency': frequency.text if frequency is not None else None,
+            'width':width.text if width is not None else None
+          } 
+          or_interfaces.append(nmc)
+    return or_interfaces    
+       
+        
+        
+
       
 if __name__ == '__main__':
     
@@ -152,9 +217,10 @@ if __name__ == '__main__':
                           ,hostkey_verify=device['hostkey_verify']
                           ,allow_agent=device['allow_agent']
                           ,look_for_keys=device['look_for_keys']) as m :
-         edit_result = m.edit_config (target="running",config=create_connec )
+         #edit_result = m.edit_config (target="running",config=create_nmc )
          result = m.get_config (source="running").data_xml
-         #ports = extract_roadm_ports(result)
+         interfaces=extract_roadm_interface(result)
+         print(interfaces)
         # optical_band_namespaces="http://flex-scale-project.eu/yang/flex-scale-mg-on"
          #namespaces={"oc":"http://openconfig.net/yang/wavelength-router"}
          #obj=extract_media_channels(result,namespaces)
@@ -167,8 +233,8 @@ if __name__ == '__main__':
          #print(f"optical_bands {obj1}")
 
         #print(f"circuits {circuits}")
-         with open("xml.log","w") as f:
-              print (result,file=f)
+        #  with open("xml.log","w") as f:
+        #       print (result,file=f)