diff --git a/hackfest/commands.txt b/hackfest/commands.txt
index 31558364d74aa1fec729c80c9fab50aa7e0c2313..1b5d03dd4f8b64521401f1ab81bc5c2066eb68c4 100644
--- a/hackfest/commands.txt
+++ b/hackfest/commands.txt
@@ -115,6 +115,9 @@ python3 client_connection.py
 cd ~/tfs-ctrl/hackfest/tapi/server
 pip install -r requirements.txt
 
+cd ~/tfs-ctrl/hackfest/tapi/tapi_app
+./requirements.sh
+
 # (done) Build & Implement methods for the TAPI v2.1.3 server:
 cd ~/tfs-ctrl/hackfest/tapi
 wget https://repo1.maven.org/maven2/io/swagger/codegen/v3/swagger-codegen-cli/3.0.35/swagger-codegen-cli-3.0.35.jar
@@ -134,7 +137,7 @@ cd ~/tfs-ctrl/hackfest/tapi/server
 python3 -m tapi_server 8080 database/mini-ols-context.json
 
 # Run TAPI client using cURL (In a new window):
-$ cd ~/tfs-ctrl/hackfest/tapi/client
+cd ~/tfs-ctrl/hackfest/tapi/client
 
 # Interrogate Context and SIPs:
 curl -X GET -H "Content-Type: application/json" http://127.0.0.1:8080/restconf/data/tapi-common:context/
@@ -163,6 +166,7 @@ curl -X DELETE -H "Content-Type: application/json" http://127.0.0.1:8080/restcon
 
 
 ## EXERCISE
+
 # Exercise: retrieve and draw the topology
 # solution in folder tapi_app
 
@@ -175,24 +179,32 @@ python3 tapi_app.py
 # Deploy TeraFlowSDN
 ################################################################################
 
-# Check status of Kubernetes
+## GUIDED
+
+# Check status of MicroK8s
 microk8s.status --wait-ready
 
+# If not running, start MicroK8s
+microk8s.start
+
+# Periodically inspect status of MicroK8s until all addons are enabled
+watch -n 1 microk8s.status --wait-ready
+
 # Check all resources in Kubernetes
-microk8s.kubectl get all --all-namespaces
+watch -n 1 kubectl get all --all-namespaces
 
 # Deploy TeraFlowSDN
 cd ~/tfs-ctrl
 source my_deploy.sh 
-./deploy.sh 
+./deploy/all.sh 
 
 # Show status of your deployment
 (if new terminal) cd ~/tfs-ctrl && source my_deploy.sh
-./show_deploy.sh 
+./deploy/show.sh
 
 # Show logs of a specific component
 (if new terminal) cd ~/tfs-ctrl && source my_deploy.sh
-scripts/show_logs_device.sh
+./scripts/show_logs_device.sh
 
 
 
@@ -202,6 +214,8 @@ scripts/show_logs_device.sh
 
 # (done) Build a Netconf server supporting basic OpenConfig data model
 
+## GUIDED
+
 # Start the Netconf/OpenConfig server
 cd ~/tfs-ctrl/hackfest/netconf-oc
 python3 server_openconfig.py 8300
@@ -212,7 +226,8 @@ python3 server_openconfig.py 8300
 # Service requests
 ################################################################################
 
-## L3VPN service from JSON descriptors
+## EXERCISE
+# Exercise: L3VPN service from JSON descriptors
 
 # (in a new terminal) Start OLS TAPI server:
 cd ~/tfs-ctrl/hackfest/tapi/server
@@ -236,9 +251,8 @@ python3 server_openconfig.py 8304
 
 
 
-############
-# Mock OSM
-############
+## EXERCISE
+# Exercise: L2VPN slice from Mock OSM
 
 $ cd ~/tfs-ctrl/hackfest/
 $ python -m mock_osm
@@ -262,12 +276,65 @@ Service b8c99e2c-39d8-424d-9833-554634269555 deleted
 (mock-osm) exit
 Bye!
 
+
+
+############
+# gRPC
+############
+
+## GUIDED
+
+# Generate connection messages from .proto
+cd ~/tfs-ctrl/hackfest/grpc
+python -m grpc_tools.protoc -I=. --python_out=connection/ connection.proto
+
+# Create a connection message and save to a file
+cd ~/tfs-ctrl/hackfest/grpc/connection
+python3 create.py connection.txt 
+
+# List a connection from a file
+cd ~/tfs-ctrl/hackfest/grpc/connection
+python3 list.py connection.txt 
+
+# Build ConnectionService from .proto
+cd ~/tfs-ctrl/hackfest/grpc
+python -m grpc_tools.protoc -I=. --python_out=connectionService/ --grpc_python_out=connectionService/ connectionService.proto
+
+# Start ConnectionService server
+cd ~/tfs-ctrl/hackfest/grpc/connectionService
+python3 connectionService_server.py
+
+# Start ConnectionService client (in another terminal)
+cd ~/tfs-ctrl/hackfest/grpc/connectionService
+python3 connectionService_client.py
+
+
+## EXERCISE
+# Exercise: add streams
+
+# Build ConnectionServiceWithNotif from .proto
+cd ~/tfs-ctrl/hackfest/grpc
+python -m grpc_tools.protoc -I=. --python_out=connectionServiceWithNotif/ --grpc_python_out=connectionServiceWithNotif/ connectionServiceWithNotif.proto
+
+## Solution:
+# Run ConnectionServiceWithNotif server
+cd ~/tfs-ctrl/hackfest/grpc/connectionServiceWithNotif
+python3 connectionServiceWithNotif_server.py
+
+# Run ConnectionServiceWithNotif client (in another terminal)
+$ cd ~/tfs-ctrl/hackfest/grpc/connectionServiceWithNotif
+$ python3 connectionServiceWithNotif_client.py
+
+
+
 ############
 # gNMI
 ############
 
+## GUIDED
+
 ## Download and install the latest release
-$ sudo bash -c "$(curl -sL https://get.containerlab.dev)“
+$ sudo bash -c "$(curl -sL https://get.containerlab.dev)"
 
 ## Deploy proposed two SR node scenario
 $ cd tfs-ctrl/hackfest/gnmi
diff --git a/hackfest/gnmi/sonic.clab.yml b/hackfest/gnmi/srlinux.clab.yml
similarity index 83%
rename from hackfest/gnmi/sonic.clab.yml
rename to hackfest/gnmi/srlinux.clab.yml
index 47c1e64643a70e3e0caff12aff8a6796598cea1f..a589292ac5b58664646ab7d3cccebfd62c28a540 100644
--- a/hackfest/gnmi/sonic.clab.yml
+++ b/hackfest/gnmi/srlinux.clab.yml
@@ -12,18 +12,17 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# file: sonic.clab.yml
-name: sonic-vs
+# file: srlinux.clab.yml
+name: srlinux
 
 topology:
   nodes:
     srl1:
-      kind: sonic-vs
-      image: docker-sonic-vs
+      kind: srl
+      image: ghcr.io/nokia/srlinux
     srl2:
-      kind: sonic-vs
-      image: docker-sonic-vs
+      kind: srl
+      image: ghcr.io/nokia/srlinux
 
   links:
     - endpoints: ["srl1:e1-1", "srl2:e1-1"]
-
diff --git a/hackfest/grpc/connection/connection_pb2.py b/hackfest/grpc/connection/connection_pb2.py
index e66b665b22303fbf582de9ec378591fae4e09659..4d642577df514be773ce4dc20df2cf34380410c1 100644
--- a/hackfest/grpc/connection/connection_pb2.py
+++ b/hackfest/grpc/connection/connection_pb2.py
@@ -1,9 +1,9 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: connection.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -14,163 +14,34 @@ _sym_db = _symbol_database.Default()
 
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='connection.proto',
-  package='connection',
-  syntax='proto3',
-  serialized_options=None,
-  serialized_pb=_b('\n\x10\x63onnection.proto\x12\nconnection\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connectionb\x06proto3')
-)
-
-
-
-_CONNECTION_LAYERPROTOCOLNAME = _descriptor.EnumDescriptor(
-  name='LayerProtocolName',
-  full_name='connection.Connection.LayerProtocolName',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='ETH', index=0, number=0,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='OPTICAL', index=1, number=1,
-      serialized_options=None,
-      type=None),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=237,
-  serialized_end=278,
-)
-_sym_db.RegisterEnumDescriptor(_CONNECTION_LAYERPROTOCOLNAME)
-
-
-_CONNECTION = _descriptor.Descriptor(
-  name='Connection',
-  full_name='connection.Connection',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='connectionId', full_name='connection.Connection.connectionId', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='sourceNode', full_name='connection.Connection.sourceNode', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='targetNode', full_name='connection.Connection.targetNode', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='sourcePort', full_name='connection.Connection.sourcePort', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='targetPort', full_name='connection.Connection.targetPort', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='bandwidth', full_name='connection.Connection.bandwidth', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='layerProtocolName', full_name='connection.Connection.layerProtocolName', index=6,
-      number=7, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-    _CONNECTION_LAYERPROTOCOLNAME,
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=33,
-  serialized_end=278,
-)
-
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x10\x63onnection.proto\x12\nconnection\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connectionb\x06proto3')
 
-_CONNECTIONLIST = _descriptor.Descriptor(
-  name='ConnectionList',
-  full_name='connection.ConnectionList',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='connection', full_name='connection.ConnectionList.connection', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=280,
-  serialized_end=340,
-)
 
-_CONNECTION.fields_by_name['layerProtocolName'].enum_type = _CONNECTION_LAYERPROTOCOLNAME
-_CONNECTION_LAYERPROTOCOLNAME.containing_type = _CONNECTION
-_CONNECTIONLIST.fields_by_name['connection'].message_type = _CONNECTION
-DESCRIPTOR.message_types_by_name['Connection'] = _CONNECTION
-DESCRIPTOR.message_types_by_name['ConnectionList'] = _CONNECTIONLIST
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), dict(
-  DESCRIPTOR = _CONNECTION,
-  __module__ = 'connection_pb2'
+_CONNECTION = DESCRIPTOR.message_types_by_name['Connection']
+_CONNECTIONLIST = DESCRIPTOR.message_types_by_name['ConnectionList']
+_CONNECTION_LAYERPROTOCOLNAME = _CONNECTION.enum_types_by_name['LayerProtocolName']
+Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTION,
+  '__module__' : 'connection_pb2'
   # @@protoc_insertion_point(class_scope:connection.Connection)
-  ))
+  })
 _sym_db.RegisterMessage(Connection)
 
-ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), dict(
-  DESCRIPTOR = _CONNECTIONLIST,
-  __module__ = 'connection_pb2'
+ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONLIST,
+  '__module__' : 'connection_pb2'
   # @@protoc_insertion_point(class_scope:connection.ConnectionList)
-  ))
+  })
 _sym_db.RegisterMessage(ConnectionList)
 
+if _descriptor._USE_C_DESCRIPTORS == False:
 
+  DESCRIPTOR._options = None
+  _CONNECTION._serialized_start=33
+  _CONNECTION._serialized_end=278
+  _CONNECTION_LAYERPROTOCOLNAME._serialized_start=237
+  _CONNECTION_LAYERPROTOCOLNAME._serialized_end=278
+  _CONNECTIONLIST._serialized_start=280
+  _CONNECTIONLIST._serialized_end=340
 # @@protoc_insertion_point(module_scope)
diff --git a/hackfest/grpc/connectionService/connectionService_pb2.py b/hackfest/grpc/connectionService/connectionService_pb2.py
index 9f1951fa92a017baf4f44470e833aae8d74e0f3b..a7efb7d21aa948134388dd6918a57d816ba4bcff 100644
--- a/hackfest/grpc/connectionService/connectionService_pb2.py
+++ b/hackfest/grpc/connectionService/connectionService_pb2.py
@@ -1,9 +1,9 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: connectionService.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -15,197 +15,37 @@ _sym_db = _symbol_database.Default()
 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='connectionService.proto',
-  package='connection',
-  syntax='proto3',
-  serialized_options=None,
-  serialized_pb=_b('\n\x17\x63onnectionService.proto\x12\nconnection\x1a\x1bgoogle/protobuf/empty.proto\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connection2\xa1\x01\n\x11\x43onnectionService\x12\x44\n\x10\x43reateConnection\x12\x16.connection.Connection\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x0eListConnection\x12\x16.google.protobuf.Empty\x1a\x1a.connection.ConnectionList\"\x00\x62\x06proto3')
-  ,
-  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
-
-
-
-_CONNECTION_LAYERPROTOCOLNAME = _descriptor.EnumDescriptor(
-  name='LayerProtocolName',
-  full_name='connection.Connection.LayerProtocolName',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='ETH', index=0, number=0,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='OPTICAL', index=1, number=1,
-      serialized_options=None,
-      type=None),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=273,
-  serialized_end=314,
-)
-_sym_db.RegisterEnumDescriptor(_CONNECTION_LAYERPROTOCOLNAME)
-
-
-_CONNECTION = _descriptor.Descriptor(
-  name='Connection',
-  full_name='connection.Connection',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='connectionId', full_name='connection.Connection.connectionId', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='sourceNode', full_name='connection.Connection.sourceNode', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='targetNode', full_name='connection.Connection.targetNode', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='sourcePort', full_name='connection.Connection.sourcePort', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='targetPort', full_name='connection.Connection.targetPort', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='bandwidth', full_name='connection.Connection.bandwidth', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='layerProtocolName', full_name='connection.Connection.layerProtocolName', index=6,
-      number=7, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-    _CONNECTION_LAYERPROTOCOLNAME,
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=69,
-  serialized_end=314,
-)
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x17\x63onnectionService.proto\x12\nconnection\x1a\x1bgoogle/protobuf/empty.proto\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connection2\xa1\x01\n\x11\x43onnectionService\x12\x44\n\x10\x43reateConnection\x12\x16.connection.Connection\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x0eListConnection\x12\x16.google.protobuf.Empty\x1a\x1a.connection.ConnectionList\"\x00\x62\x06proto3')
 
 
-_CONNECTIONLIST = _descriptor.Descriptor(
-  name='ConnectionList',
-  full_name='connection.ConnectionList',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='connection', full_name='connection.ConnectionList.connection', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=316,
-  serialized_end=376,
-)
 
-_CONNECTION.fields_by_name['layerProtocolName'].enum_type = _CONNECTION_LAYERPROTOCOLNAME
-_CONNECTION_LAYERPROTOCOLNAME.containing_type = _CONNECTION
-_CONNECTIONLIST.fields_by_name['connection'].message_type = _CONNECTION
-DESCRIPTOR.message_types_by_name['Connection'] = _CONNECTION
-DESCRIPTOR.message_types_by_name['ConnectionList'] = _CONNECTIONLIST
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), dict(
-  DESCRIPTOR = _CONNECTION,
-  __module__ = 'connectionService_pb2'
+_CONNECTION = DESCRIPTOR.message_types_by_name['Connection']
+_CONNECTIONLIST = DESCRIPTOR.message_types_by_name['ConnectionList']
+_CONNECTION_LAYERPROTOCOLNAME = _CONNECTION.enum_types_by_name['LayerProtocolName']
+Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTION,
+  '__module__' : 'connectionService_pb2'
   # @@protoc_insertion_point(class_scope:connection.Connection)
-  ))
+  })
 _sym_db.RegisterMessage(Connection)
 
-ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), dict(
-  DESCRIPTOR = _CONNECTIONLIST,
-  __module__ = 'connectionService_pb2'
+ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONLIST,
+  '__module__' : 'connectionService_pb2'
   # @@protoc_insertion_point(class_scope:connection.ConnectionList)
-  ))
+  })
 _sym_db.RegisterMessage(ConnectionList)
 
-
-
-_CONNECTIONSERVICE = _descriptor.ServiceDescriptor(
-  name='ConnectionService',
-  full_name='connection.ConnectionService',
-  file=DESCRIPTOR,
-  index=0,
-  serialized_options=None,
-  serialized_start=379,
-  serialized_end=540,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='CreateConnection',
-    full_name='connection.ConnectionService.CreateConnection',
-    index=0,
-    containing_service=None,
-    input_type=_CONNECTION,
-    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='ListConnection',
-    full_name='connection.ConnectionService.ListConnection',
-    index=1,
-    containing_service=None,
-    input_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
-    output_type=_CONNECTIONLIST,
-    serialized_options=None,
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_CONNECTIONSERVICE)
-
-DESCRIPTOR.services_by_name['ConnectionService'] = _CONNECTIONSERVICE
-
+_CONNECTIONSERVICE = DESCRIPTOR.services_by_name['ConnectionService']
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _CONNECTION._serialized_start=69
+  _CONNECTION._serialized_end=314
+  _CONNECTION_LAYERPROTOCOLNAME._serialized_start=273
+  _CONNECTION_LAYERPROTOCOLNAME._serialized_end=314
+  _CONNECTIONLIST._serialized_start=316
+  _CONNECTIONLIST._serialized_end=376
+  _CONNECTIONSERVICE._serialized_start=379
+  _CONNECTIONSERVICE._serialized_end=540
 # @@protoc_insertion_point(module_scope)
diff --git a/hackfest/grpc/connectionService/connectionService_pb2_grpc.py b/hackfest/grpc/connectionService/connectionService_pb2_grpc.py
index 94ffffbf7fd3c90b541f36bd1aac6f23e1b5913b..0278d6fa443960a5fcfdb166e5dbeea3b31b6cc2 100644
--- a/hackfest/grpc/connectionService/connectionService_pb2_grpc.py
+++ b/hackfest/grpc/connectionService/connectionService_pb2_grpc.py
@@ -1,4 +1,5 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 import connectionService_pb2 as connectionService__pb2
@@ -6,59 +7,94 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
 class ConnectionServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def __init__(self, channel):
-    """Constructor.
+    def __init__(self, channel):
+        """Constructor.
 
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.CreateConnection = channel.unary_unary(
-        '/connection.ConnectionService/CreateConnection',
-        request_serializer=connectionService__pb2.Connection.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
-        )
-    self.ListConnection = channel.unary_unary(
-        '/connection.ConnectionService/ListConnection',
-        request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
-        response_deserializer=connectionService__pb2.ConnectionList.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.CreateConnection = channel.unary_unary(
+                '/connection.ConnectionService/CreateConnection',
+                request_serializer=connectionService__pb2.Connection.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ListConnection = channel.unary_unary(
+                '/connection.ConnectionService/ListConnection',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=connectionService__pb2.ConnectionList.FromString,
+                )
 
 
 class ConnectionServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def CreateConnection(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def CreateConnection(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
-  def ListConnection(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    def ListConnection(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_ConnectionServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'CreateConnection': grpc.unary_unary_rpc_method_handler(
-          servicer.CreateConnection,
-          request_deserializer=connectionService__pb2.Connection.FromString,
-          response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
-      ),
-      'ListConnection': grpc.unary_unary_rpc_method_handler(
-          servicer.ListConnection,
-          request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
-          response_serializer=connectionService__pb2.ConnectionList.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'connection.ConnectionService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'CreateConnection': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateConnection,
+                    request_deserializer=connectionService__pb2.Connection.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ListConnection': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListConnection,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=connectionService__pb2.ConnectionList.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'connection.ConnectionService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ConnectionService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def CreateConnection(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/connection.ConnectionService/CreateConnection',
+            connectionService__pb2.Connection.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListConnection(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/connection.ConnectionService/ListConnection',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            connectionService__pb2.ConnectionList.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2.py b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2.py
index 403dd0ce409700875e8fc80b011564d055c5c4cb..f6ce23ef00c01aab9463e122198a91bd66051100 100644
--- a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2.py
+++ b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2.py
@@ -1,9 +1,9 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: connectionServiceWithNotif.proto
-
-import sys
-_b=sys.version_info[0]<3 and (lambda x:x) or (lambda x:x.encode('latin1'))
+"""Generated protocol buffer code."""
 from google.protobuf import descriptor as _descriptor
+from google.protobuf import descriptor_pool as _descriptor_pool
 from google.protobuf import message as _message
 from google.protobuf import reflection as _reflection
 from google.protobuf import symbol_database as _symbol_database
@@ -15,245 +15,47 @@ _sym_db = _symbol_database.Default()
 from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
-DESCRIPTOR = _descriptor.FileDescriptor(
-  name='connectionServiceWithNotif.proto',
-  package='connection',
-  syntax='proto3',
-  serialized_options=None,
-  serialized_pb=_b('\n connectionServiceWithNotif.proto\x12\nconnection\x1a\x1bgoogle/protobuf/empty.proto\"\x14\n\x03\x42\x65r\x12\r\n\x05value\x18\x01 \x01(\x01\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connection2\xe1\x01\n\x1a\x43onnectionServiceWithNotif\x12\x44\n\x10\x43reateConnection\x12\x16.connection.Connection\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x0eListConnection\x12\x16.google.protobuf.Empty\x1a\x1a.connection.ConnectionList\"\x00\x12\x35\n\x06GetBer\x12\x16.connection.Connection\x1a\x0f.connection.Ber\"\x00\x30\x01\x62\x06proto3')
-  ,
-  dependencies=[google_dot_protobuf_dot_empty__pb2.DESCRIPTOR,])
-
-
-
-_CONNECTION_LAYERPROTOCOLNAME = _descriptor.EnumDescriptor(
-  name='LayerProtocolName',
-  full_name='connection.Connection.LayerProtocolName',
-  filename=None,
-  file=DESCRIPTOR,
-  values=[
-    _descriptor.EnumValueDescriptor(
-      name='ETH', index=0, number=0,
-      serialized_options=None,
-      type=None),
-    _descriptor.EnumValueDescriptor(
-      name='OPTICAL', index=1, number=1,
-      serialized_options=None,
-      type=None),
-  ],
-  containing_type=None,
-  serialized_options=None,
-  serialized_start=304,
-  serialized_end=345,
-)
-_sym_db.RegisterEnumDescriptor(_CONNECTION_LAYERPROTOCOLNAME)
-
-
-_BER = _descriptor.Descriptor(
-  name='Ber',
-  full_name='connection.Ber',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='value', full_name='connection.Ber.value', index=0,
-      number=1, type=1, cpp_type=5, label=1,
-      has_default_value=False, default_value=float(0),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=77,
-  serialized_end=97,
-)
-
+DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n connectionServiceWithNotif.proto\x12\nconnection\x1a\x1bgoogle/protobuf/empty.proto\"\x14\n\x03\x42\x65r\x12\r\n\x05value\x18\x01 \x01(\x01\"\xf5\x01\n\nConnection\x12\x14\n\x0c\x63onnectionId\x18\x01 \x01(\t\x12\x12\n\nsourceNode\x18\x02 \x01(\t\x12\x12\n\ntargetNode\x18\x03 \x01(\t\x12\x12\n\nsourcePort\x18\x04 \x01(\t\x12\x12\n\ntargetPort\x18\x05 \x01(\t\x12\x11\n\tbandwidth\x18\x06 \x01(\r\x12\x43\n\x11layerProtocolName\x18\x07 \x01(\x0e\x32(.connection.Connection.LayerProtocolName\")\n\x11LayerProtocolName\x12\x07\n\x03\x45TH\x10\x00\x12\x0b\n\x07OPTICAL\x10\x01\"<\n\x0e\x43onnectionList\x12*\n\nconnection\x18\x01 \x03(\x0b\x32\x16.connection.Connection2\xe1\x01\n\x1a\x43onnectionServiceWithNotif\x12\x44\n\x10\x43reateConnection\x12\x16.connection.Connection\x1a\x16.google.protobuf.Empty\"\x00\x12\x46\n\x0eListConnection\x12\x16.google.protobuf.Empty\x1a\x1a.connection.ConnectionList\"\x00\x12\x35\n\x06GetBer\x12\x16.connection.Connection\x1a\x0f.connection.Ber\"\x00\x30\x01\x62\x06proto3')
 
-_CONNECTION = _descriptor.Descriptor(
-  name='Connection',
-  full_name='connection.Connection',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='connectionId', full_name='connection.Connection.connectionId', index=0,
-      number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='sourceNode', full_name='connection.Connection.sourceNode', index=1,
-      number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='targetNode', full_name='connection.Connection.targetNode', index=2,
-      number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='sourcePort', full_name='connection.Connection.sourcePort', index=3,
-      number=4, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='targetPort', full_name='connection.Connection.targetPort', index=4,
-      number=5, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='bandwidth', full_name='connection.Connection.bandwidth', index=5,
-      number=6, type=13, cpp_type=3, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-    _descriptor.FieldDescriptor(
-      name='layerProtocolName', full_name='connection.Connection.layerProtocolName', index=6,
-      number=7, type=14, cpp_type=8, label=1,
-      has_default_value=False, default_value=0,
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-    _CONNECTION_LAYERPROTOCOLNAME,
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=100,
-  serialized_end=345,
-)
 
 
-_CONNECTIONLIST = _descriptor.Descriptor(
-  name='ConnectionList',
-  full_name='connection.ConnectionList',
-  filename=None,
-  file=DESCRIPTOR,
-  containing_type=None,
-  fields=[
-    _descriptor.FieldDescriptor(
-      name='connection', full_name='connection.ConnectionList.connection', index=0,
-      number=1, type=11, cpp_type=10, label=3,
-      has_default_value=False, default_value=[],
-      message_type=None, enum_type=None, containing_type=None,
-      is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
-  ],
-  extensions=[
-  ],
-  nested_types=[],
-  enum_types=[
-  ],
-  serialized_options=None,
-  is_extendable=False,
-  syntax='proto3',
-  extension_ranges=[],
-  oneofs=[
-  ],
-  serialized_start=347,
-  serialized_end=407,
-)
-
-_CONNECTION.fields_by_name['layerProtocolName'].enum_type = _CONNECTION_LAYERPROTOCOLNAME
-_CONNECTION_LAYERPROTOCOLNAME.containing_type = _CONNECTION
-_CONNECTIONLIST.fields_by_name['connection'].message_type = _CONNECTION
-DESCRIPTOR.message_types_by_name['Ber'] = _BER
-DESCRIPTOR.message_types_by_name['Connection'] = _CONNECTION
-DESCRIPTOR.message_types_by_name['ConnectionList'] = _CONNECTIONLIST
-_sym_db.RegisterFileDescriptor(DESCRIPTOR)
-
-Ber = _reflection.GeneratedProtocolMessageType('Ber', (_message.Message,), dict(
-  DESCRIPTOR = _BER,
-  __module__ = 'connectionServiceWithNotif_pb2'
+_BER = DESCRIPTOR.message_types_by_name['Ber']
+_CONNECTION = DESCRIPTOR.message_types_by_name['Connection']
+_CONNECTIONLIST = DESCRIPTOR.message_types_by_name['ConnectionList']
+_CONNECTION_LAYERPROTOCOLNAME = _CONNECTION.enum_types_by_name['LayerProtocolName']
+Ber = _reflection.GeneratedProtocolMessageType('Ber', (_message.Message,), {
+  'DESCRIPTOR' : _BER,
+  '__module__' : 'connectionServiceWithNotif_pb2'
   # @@protoc_insertion_point(class_scope:connection.Ber)
-  ))
+  })
 _sym_db.RegisterMessage(Ber)
 
-Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), dict(
-  DESCRIPTOR = _CONNECTION,
-  __module__ = 'connectionServiceWithNotif_pb2'
+Connection = _reflection.GeneratedProtocolMessageType('Connection', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTION,
+  '__module__' : 'connectionServiceWithNotif_pb2'
   # @@protoc_insertion_point(class_scope:connection.Connection)
-  ))
+  })
 _sym_db.RegisterMessage(Connection)
 
-ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), dict(
-  DESCRIPTOR = _CONNECTIONLIST,
-  __module__ = 'connectionServiceWithNotif_pb2'
+ConnectionList = _reflection.GeneratedProtocolMessageType('ConnectionList', (_message.Message,), {
+  'DESCRIPTOR' : _CONNECTIONLIST,
+  '__module__' : 'connectionServiceWithNotif_pb2'
   # @@protoc_insertion_point(class_scope:connection.ConnectionList)
-  ))
+  })
 _sym_db.RegisterMessage(ConnectionList)
 
-
-
-_CONNECTIONSERVICEWITHNOTIF = _descriptor.ServiceDescriptor(
-  name='ConnectionServiceWithNotif',
-  full_name='connection.ConnectionServiceWithNotif',
-  file=DESCRIPTOR,
-  index=0,
-  serialized_options=None,
-  serialized_start=410,
-  serialized_end=635,
-  methods=[
-  _descriptor.MethodDescriptor(
-    name='CreateConnection',
-    full_name='connection.ConnectionServiceWithNotif.CreateConnection',
-    index=0,
-    containing_service=None,
-    input_type=_CONNECTION,
-    output_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='ListConnection',
-    full_name='connection.ConnectionServiceWithNotif.ListConnection',
-    index=1,
-    containing_service=None,
-    input_type=google_dot_protobuf_dot_empty__pb2._EMPTY,
-    output_type=_CONNECTIONLIST,
-    serialized_options=None,
-  ),
-  _descriptor.MethodDescriptor(
-    name='GetBer',
-    full_name='connection.ConnectionServiceWithNotif.GetBer',
-    index=2,
-    containing_service=None,
-    input_type=_CONNECTION,
-    output_type=_BER,
-    serialized_options=None,
-  ),
-])
-_sym_db.RegisterServiceDescriptor(_CONNECTIONSERVICEWITHNOTIF)
-
-DESCRIPTOR.services_by_name['ConnectionServiceWithNotif'] = _CONNECTIONSERVICEWITHNOTIF
-
+_CONNECTIONSERVICEWITHNOTIF = DESCRIPTOR.services_by_name['ConnectionServiceWithNotif']
+if _descriptor._USE_C_DESCRIPTORS == False:
+
+  DESCRIPTOR._options = None
+  _BER._serialized_start=77
+  _BER._serialized_end=97
+  _CONNECTION._serialized_start=100
+  _CONNECTION._serialized_end=345
+  _CONNECTION_LAYERPROTOCOLNAME._serialized_start=304
+  _CONNECTION_LAYERPROTOCOLNAME._serialized_end=345
+  _CONNECTIONLIST._serialized_start=347
+  _CONNECTIONLIST._serialized_end=407
+  _CONNECTIONSERVICEWITHNOTIF._serialized_start=410
+  _CONNECTIONSERVICEWITHNOTIF._serialized_end=635
 # @@protoc_insertion_point(module_scope)
diff --git a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2_grpc.py b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2_grpc.py
index 9a88a22b4bd9055f1d2e905abaa2496faadb5533..9a5a844c8d10e0fa9087d97050c1bc92de8a868d 100644
--- a/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2_grpc.py
+++ b/hackfest/grpc/connectionServiceWithNotif/connectionServiceWithNotif_pb2_grpc.py
@@ -1,4 +1,5 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
 import connectionServiceWithNotif_pb2 as connectionServiceWithNotif__pb2
@@ -6,76 +7,127 @@ from google.protobuf import empty_pb2 as google_dot_protobuf_dot_empty__pb2
 
 
 class ConnectionServiceWithNotifStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.CreateConnection = channel.unary_unary(
-        '/connection.ConnectionServiceWithNotif/CreateConnection',
-        request_serializer=connectionServiceWithNotif__pb2.Connection.SerializeToString,
-        response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
-        )
-    self.ListConnection = channel.unary_unary(
-        '/connection.ConnectionServiceWithNotif/ListConnection',
-        request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
-        response_deserializer=connectionServiceWithNotif__pb2.ConnectionList.FromString,
-        )
-    self.GetBer = channel.unary_stream(
-        '/connection.ConnectionServiceWithNotif/GetBer',
-        request_serializer=connectionServiceWithNotif__pb2.Connection.SerializeToString,
-        response_deserializer=connectionServiceWithNotif__pb2.Ber.FromString,
-        )
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.CreateConnection = channel.unary_unary(
+                '/connection.ConnectionServiceWithNotif/CreateConnection',
+                request_serializer=connectionServiceWithNotif__pb2.Connection.SerializeToString,
+                response_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                )
+        self.ListConnection = channel.unary_unary(
+                '/connection.ConnectionServiceWithNotif/ListConnection',
+                request_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+                response_deserializer=connectionServiceWithNotif__pb2.ConnectionList.FromString,
+                )
+        self.GetBer = channel.unary_stream(
+                '/connection.ConnectionServiceWithNotif/GetBer',
+                request_serializer=connectionServiceWithNotif__pb2.Connection.SerializeToString,
+                response_deserializer=connectionServiceWithNotif__pb2.Ber.FromString,
+                )
 
 
 class ConnectionServiceWithNotifServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def CreateConnection(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def ListConnection(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
-
-  def GetBer(self, request, context):
-    # missing associated documentation comment in .proto file
-    pass
-    context.set_code(grpc.StatusCode.UNIMPLEMENTED)
-    context.set_details('Method not implemented!')
-    raise NotImplementedError('Method not implemented!')
+    """Missing associated documentation comment in .proto file."""
+
+    def CreateConnection(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def ListConnection(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
+
+    def GetBer(self, request, context):
+        """Missing associated documentation comment in .proto file."""
+        context.set_code(grpc.StatusCode.UNIMPLEMENTED)
+        context.set_details('Method not implemented!')
+        raise NotImplementedError('Method not implemented!')
 
 
 def add_ConnectionServiceWithNotifServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'CreateConnection': grpc.unary_unary_rpc_method_handler(
-          servicer.CreateConnection,
-          request_deserializer=connectionServiceWithNotif__pb2.Connection.FromString,
-          response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
-      ),
-      'ListConnection': grpc.unary_unary_rpc_method_handler(
-          servicer.ListConnection,
-          request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
-          response_serializer=connectionServiceWithNotif__pb2.ConnectionList.SerializeToString,
-      ),
-      'GetBer': grpc.unary_stream_rpc_method_handler(
-          servicer.GetBer,
-          request_deserializer=connectionServiceWithNotif__pb2.Connection.FromString,
-          response_serializer=connectionServiceWithNotif__pb2.Ber.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'connection.ConnectionServiceWithNotif', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'CreateConnection': grpc.unary_unary_rpc_method_handler(
+                    servicer.CreateConnection,
+                    request_deserializer=connectionServiceWithNotif__pb2.Connection.FromString,
+                    response_serializer=google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            ),
+            'ListConnection': grpc.unary_unary_rpc_method_handler(
+                    servicer.ListConnection,
+                    request_deserializer=google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+                    response_serializer=connectionServiceWithNotif__pb2.ConnectionList.SerializeToString,
+            ),
+            'GetBer': grpc.unary_stream_rpc_method_handler(
+                    servicer.GetBer,
+                    request_deserializer=connectionServiceWithNotif__pb2.Connection.FromString,
+                    response_serializer=connectionServiceWithNotif__pb2.Ber.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'connection.ConnectionServiceWithNotif', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ConnectionServiceWithNotif(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def CreateConnection(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/connection.ConnectionServiceWithNotif/CreateConnection',
+            connectionServiceWithNotif__pb2.Connection.SerializeToString,
+            google_dot_protobuf_dot_empty__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def ListConnection(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_unary(request, target, '/connection.ConnectionServiceWithNotif/ListConnection',
+            google_dot_protobuf_dot_empty__pb2.Empty.SerializeToString,
+            connectionServiceWithNotif__pb2.ConnectionList.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetBer(request,
+            target,
+            options=(),
+            channel_credentials=None,
+            call_credentials=None,
+            insecure=False,
+            compression=None,
+            wait_for_ready=None,
+            timeout=None,
+            metadata=None):
+        return grpc.experimental.unary_stream(request, target, '/connection.ConnectionServiceWithNotif/GetBer',
+            connectionServiceWithNotif__pb2.Connection.SerializeToString,
+            connectionServiceWithNotif__pb2.Ber.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/hackfest/tfs-descriptors/context-topology.json b/hackfest/tfs-descriptors/context-topology.json
index 36b3c44fd61fdec9d208a82a11d5a16c3671d004..afc2cc258889b445cb8d5f21b7e5fddac6a56db1 100644
--- a/hackfest/tfs-descriptors/context-topology.json
+++ b/hackfest/tfs-descriptors/context-topology.json
@@ -1,19 +1,13 @@
 {
     "contexts": [
-        {
-            "context_id": {"context_uuid": {"uuid": "admin"}},
-            "topology_ids": [],
-            "service_ids": []
-        }
+        {"context_id": {"context_uuid": {"uuid": "admin"}}}
     ],
     "topologies": [
         {
             "topology_id": {
                 "context_id": {"context_uuid": {"uuid": "admin"}},
                 "topology_uuid": {"uuid": "admin"}
-            },
-            "device_ids": [],
-            "link_ids": []
+            }
         }
     ]
 }
diff --git a/hackfest/tfs-descriptors/device-all.json b/hackfest/tfs-descriptors/device-all.json
index 36a93fe98d253dbc5e6db7f91b3b890e529c2ffc..0c5fb7e56ce3552c7d196b32b1a8b4dc62a3c0e4 100644
--- a/hackfest/tfs-descriptors/device-all.json
+++ b/hackfest/tfs-descriptors/device-all.json
@@ -4,7 +4,7 @@
             "device_id": {"device_uuid": {"uuid": "R1"}},
             "device_type": "packet-router",
             "device_config": {"config_rules": [
-                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}},
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8301"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
                     "username": "admin", "password": "admin",
@@ -21,7 +21,7 @@
             "device_id": {"device_uuid": {"uuid": "R2"}},
             "device_type": "packet-router",
             "device_config": {"config_rules": [
-                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}},
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8302"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
                     "username": "admin", "password": "admin",
@@ -38,7 +38,7 @@
             "device_id": {"device_uuid": {"uuid": "R3"}},
             "device_type": "packet-router",
             "device_config": {"config_rules": [
-                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}},
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8303"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
                     "username": "admin", "password": "admin",
@@ -55,7 +55,7 @@
             "device_id": {"device_uuid": {"uuid": "R4"}},
             "device_type": "packet-router",
             "device_config": {"config_rules": [
-                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}},
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8304"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {
                     "username": "admin", "password": "admin",
@@ -72,7 +72,7 @@
             "device_id": {"device_uuid": {"uuid": "OLS"}},
             "device_type": "open-line-system",
             "device_config": {"config_rules": [
-                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.15"}},
+                {"action": 1, "custom": {"resource_key": "_connect/address", "resource_value": "10.0.2.10"}},
                 {"action": 1, "custom": {"resource_key": "_connect/port", "resource_value": "8080"}},
                 {"action": 1, "custom": {"resource_key": "_connect/settings", "resource_value": {"timeout": 120}}}
             ]},
diff --git a/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py b/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py
index 670757d76b7d21ecf28f6ead4e8bc4e21951d18e..cf41f186f4f35c45cbb1ce836196272327f6048f 100644
--- a/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py
+++ b/src/pathcomp/frontend/service/algorithms/tools/EroPathToHops.py
@@ -48,9 +48,52 @@ from common.proto.context_pb2 import Link
 
 LOGGER = logging.getLogger(__name__)
 
+MAP_TAPI_UUIDS = {
+    "c3dbaa44-9cda-5d54-8f99-0f282362be65": "5b835e46-53f7-52e8-9c8a-077322679e36", # node-1-port-13-input => node-1-port-13-output
+    "1fb9ac86-b7ad-5d6d-87b1-a09d995f1ddd": "c9df6ece-1650-5078-876a-1e488a453625", # node-1-port-14-input => node-1-port-14-output
+    "aa109937-8291-5a09-853a-97bff463e569": "b245480f-027c-53a0-9320-fca5b9d7a1e1", # node-1-port-15-input => node-1-port-15-output
+    "6653ae16-42a3-56b5-adf3-71adda024a61": "ac356900-ce2f-5c15-b038-1b05e6f50bf7", # node-1-port-17-input => node-1-port-17-output
+    "d782ef85-a473-50b4-93b5-2af86024a42a": "dcfeedd3-2d47-5bc8-b31c-ed9f973d8b76", # node-2-port-13-input => node-2-port-13-output
+    "bbbd83ef-6053-55dc-ab08-06fb0c2bd081": "57bcf45b-eb47-5a9c-86d1-d9cff0c910fd", # node-2-port-14-input => node-2-port-14-output
+    "27cdf70d-4e48-53ff-bc4f-20addf6524c0": "fd31eff5-392e-5fb5-a6f4-6dfca583344d", # node-2-port-15-input => node-2-port-15-output
+    "55ac2364-fad8-5a05-ac2b-5003997ff89e": "d12a2591-7f4a-575d-8fda-0bc3d6b7ca32", # node-2-port-17-input => node-2-port-17-output
+    "59f44a3c-32a5-5abf-af58-45e6fa7ca657": "1977ef5c-4383-5195-9221-0cdf8ee26cb7", # node-3-port-13-input => node-3-port-13-output
+    "1be3f905-d553-5291-9906-47c0772d45aa": "9def067b-9a75-54df-8867-853f35a42e87", # node-3-port-14-input => node-3-port-14-output
+    "fb4ece7a-2dd1-593a-b6ca-a787b3b59fc5": "1f294257-132a-54ad-b653-ef8b7517c9d8", # node-3-port-15-input => node-3-port-15-output
+    "a571d2fe-c7f8-5ac8-b2af-8e5b92a558b0": "5b60a688-deac-567a-8e36-0d52e56fd4fc", # node-3-port-16-input => node-3-port-16-output
+    "9ea9dc53-2d6a-5f28-b81a-e930f7cbedf9": "2aec14c1-3a84-5cba-8f22-783bd0273cd0", # node-3-port-17-input => node-3-port-17-output
+    "9ec8e0f3-3378-55e0-bed1-be1fe120a1a9": "ece2ed55-ce16-59d3-8137-3f4cf17e67ab", # node-3-port-18-input => node-3-port-18-output
+    "a7e114aa-a3b6-52ae-b7b7-0e5fe4dd4d1c": "0a05e43d-a13c-5276-9839-613600f3ff28", # node-4-port-13-input => node-4-port-13-output
+    "4ca8357a-3468-51e6-bba8-65137486666f": "18926fdf-de5c-5a52-be88-cccc065e5e03", # node-4-port-14-input => node-4-port-14-output
+    "a7e9f06f-6fd2-594e-8a0c-25bfe8c652d7": "1adb9e17-e499-58dc-8aa2-881ed5ce9670", # node-4-port-15-input => node-4-port-15-output
+    "9f6a23b2-c71c-5559-8fb3-f76421bea1d9": "049bb1f1-cc04-5b72-8c0f-43891d9637bf", # node-4-port-16-input => node-4-port-16-output
+    "f1d74c96-41f5-5eb9-a160-a38463184934": "2206440b-ef66-5d3e-8da5-40608fb00a10", # node-4-port-17-input => node-4-port-17-output
+
+    "5b835e46-53f7-52e8-9c8a-077322679e36": "c3dbaa44-9cda-5d54-8f99-0f282362be65", # node-1-port-13-output => node-1-port-13-input
+    "c9df6ece-1650-5078-876a-1e488a453625": "1fb9ac86-b7ad-5d6d-87b1-a09d995f1ddd", # node-1-port-14-output => node-1-port-14-input
+    "b245480f-027c-53a0-9320-fca5b9d7a1e1": "aa109937-8291-5a09-853a-97bff463e569", # node-1-port-15-output => node-1-port-15-input
+    "ac356900-ce2f-5c15-b038-1b05e6f50bf7": "6653ae16-42a3-56b5-adf3-71adda024a61", # node-1-port-17-output => node-1-port-17-input
+    "dcfeedd3-2d47-5bc8-b31c-ed9f973d8b76": "d782ef85-a473-50b4-93b5-2af86024a42a", # node-2-port-13-output => node-2-port-13-input
+    "57bcf45b-eb47-5a9c-86d1-d9cff0c910fd": "bbbd83ef-6053-55dc-ab08-06fb0c2bd081", # node-2-port-14-output => node-2-port-14-input
+    "fd31eff5-392e-5fb5-a6f4-6dfca583344d": "27cdf70d-4e48-53ff-bc4f-20addf6524c0", # node-2-port-15-output => node-2-port-15-input
+    "d12a2591-7f4a-575d-8fda-0bc3d6b7ca32": "55ac2364-fad8-5a05-ac2b-5003997ff89e", # node-2-port-17-output => node-2-port-17-input
+    "1977ef5c-4383-5195-9221-0cdf8ee26cb7": "59f44a3c-32a5-5abf-af58-45e6fa7ca657", # node-3-port-13-output => node-3-port-13-input
+    "9def067b-9a75-54df-8867-853f35a42e87": "1be3f905-d553-5291-9906-47c0772d45aa", # node-3-port-14-output => node-3-port-14-input
+    "1f294257-132a-54ad-b653-ef8b7517c9d8": "fb4ece7a-2dd1-593a-b6ca-a787b3b59fc5", # node-3-port-15-output => node-3-port-15-input
+    "5b60a688-deac-567a-8e36-0d52e56fd4fc": "a571d2fe-c7f8-5ac8-b2af-8e5b92a558b0", # node-3-port-16-output => node-3-port-16-input
+    "2aec14c1-3a84-5cba-8f22-783bd0273cd0": "9ea9dc53-2d6a-5f28-b81a-e930f7cbedf9", # node-3-port-17-output => node-3-port-17-input
+    "ece2ed55-ce16-59d3-8137-3f4cf17e67ab": "9ec8e0f3-3378-55e0-bed1-be1fe120a1a9", # node-3-port-18-output => node-3-port-18-input
+    "0a05e43d-a13c-5276-9839-613600f3ff28": "a7e114aa-a3b6-52ae-b7b7-0e5fe4dd4d1c", # node-4-port-13-output => node-4-port-13-input
+    "18926fdf-de5c-5a52-be88-cccc065e5e03": "4ca8357a-3468-51e6-bba8-65137486666f", # node-4-port-14-output => node-4-port-14-input
+    "1adb9e17-e499-58dc-8aa2-881ed5ce9670": "a7e9f06f-6fd2-594e-8a0c-25bfe8c652d7", # node-4-port-15-output => node-4-port-15-input
+    "049bb1f1-cc04-5b72-8c0f-43891d9637bf": "9f6a23b2-c71c-5559-8fb3-f76421bea1d9", # node-4-port-16-output => node-4-port-16-input
+    "2206440b-ef66-5d3e-8da5-40608fb00a10": "f1d74c96-41f5-5eb9-a160-a38463184934", # node-4-port-17-output => node-4-port-17-input
+}
+
 def eropath_to_hops(
     ero_path : List[Dict], endpoint_to_link_dict : Dict[Tuple[str, str, str], Tuple[Dict, Link]]
 ) -> List[Dict]:
+    LOGGER.debug('ero_path = {:s}'.format(str(ero_path)))
     try:
         path_hops = []
         num_ero_hops = len(ero_path)
@@ -68,13 +111,22 @@ def eropath_to_hops(
 
             if num_ero_hops - 1 == len(path_hops): break
 
-            link_tuple = endpoint_to_link_dict[(device_uuid, endpoint_uuid, 'src')]
-            if link_tuple is None: raise Exception('Malformed path')
-            ingress = link_tuple[0]['link_endpoint_ids'][-1]
+            endpoint_key = (last_hop['device'], last_hop['egress_ep'])
+            link_tuple = endpoint_to_link_dict.get(endpoint_key)
+            ingress = next(iter([
+                ep_id for ep_id in link_tuple[0]['link_endpoint_ids']
+                if (ep_id['endpoint_id']['device_id'] == device_uuid) and\
+                    (ep_id['endpoint_id']['endpoint_uuid'] != endpoint_uuid)
+            ]), None)
+            if ingress['endpoint_id']['device_id'] != device_uuid: raise Exception('Malformed path')
+            ingress_ep = ingress['endpoint_id']['endpoint_uuid']
+            ingress_ep = MAP_TAPI_UUIDS.get(ingress_ep, ingress_ep)
             path_hops.append({
                 'device': ingress['endpoint_id']['device_id'],
-                'ingress_ep': ingress['endpoint_id']['endpoint_uuid']
+                'ingress_ep': ingress_ep,
+                'egress_ep': endpoint_uuid,
             })
+        LOGGER.debug('path_hops = {:s}'.format(str(path_hops)))
         return path_hops
     except:
         LOGGER.exception('Unhandled exception: ero_path={:s} endpoint_to_link_dict={:s}'.format(
diff --git a/src/policy/src/main/java/eu/teraflow/policy/Serializer.java b/src/policy/src/main/java/eu/teraflow/policy/Serializer.java
index 5ca1098444d6ec6f926ca3a844553606c97f0278..5a95f0e6edd200251a27b1e3571b719ebd102e1b 100644
--- a/src/policy/src/main/java/eu/teraflow/policy/Serializer.java
+++ b/src/policy/src/main/java/eu/teraflow/policy/Serializer.java
@@ -1837,6 +1837,10 @@ public class Serializer {
                 return PolicyAction.PolicyRuleActionEnum.POLICYRULE_ACTION_ADD_SERVICE_CONSTRAINT;
             case POLICY_RULE_ACTION_NO_ACTION:
                 return PolicyAction.PolicyRuleActionEnum.POLICYRULE_ACTION_NO_ACTION;
+            case POLICY_RULE_ACTION_CALL_SERVICE_RPC:
+                return PolicyAction.PolicyRuleActionEnum.POLICY_RULE_ACTION_CALL_SERVICE_RPC;
+            case POLICY_RULE_ACTION_RECALCULATE_PATH:
+                return PolicyAction.PolicyRuleActionEnum.POLICY_RULE_ACTION_RECALCULATE_PATH;
             default:
                 return PolicyAction.PolicyRuleActionEnum.UNRECOGNIZED;
         }
@@ -1851,6 +1855,10 @@ public class Serializer {
                 return PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONFIGRULE;
             case POLICYRULE_ACTION_ADD_SERVICE_CONSTRAINT:
                 return PolicyRuleActionEnum.POLICY_RULE_ACTION_ADD_SERVICE_CONSTRAINT;
+            case POLICY_RULE_ACTION_CALL_SERVICE_RPC:
+                return PolicyRuleActionEnum.POLICY_RULE_ACTION_CALL_SERVICE_RPC;
+            case POLICY_RULE_ACTION_RECALCULATE_PATH:
+                return PolicyRuleActionEnum.POLICY_RULE_ACTION_RECALCULATE_PATH;
             case POLICYRULE_ACTION_NO_ACTION:
             case UNRECOGNIZED:
             default:
diff --git a/src/tests/ecoc22/descriptors_emulated.json b/src/tests/ecoc22/descriptors_emulated.json
index f55954d92fbe3cf75b3464286f897c3f931c0c39..da36a6ae995941f8dbbf998df31f8d7258decbaf 100644
--- a/src/tests/ecoc22/descriptors_emulated.json
+++ b/src/tests/ecoc22/descriptors_emulated.json
@@ -136,6 +136,55 @@
                 {"device_id": {"device_uuid": {"uuid": "CS2-GW2"}}, "endpoint_uuid": {"uuid": "1/1"}},
                 {"device_id": {"device_uuid": {"uuid": "OLS"}}, "endpoint_uuid": {"uuid": "50296d99-58cc-5ce7-82f5-fc8ee4eec2ec"}}
             ]
+        },
+
+        {
+            "link_id": {"link_uuid": {"uuid": "CS1-GW1/10/1==DC1-GW/eth1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "CS1-GW1"}}, "endpoint_uuid": {"uuid": "10/1"}},
+                {"device_id": {"device_uuid": {"uuid": "DC1-GW"}}, "endpoint_uuid": {"uuid": "eth1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "CS1-GW2/10/1==DC1-GW/eth2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "CS1-GW2"}}, "endpoint_uuid": {"uuid": "10/1"}},
+                {"device_id": {"device_uuid": {"uuid": "DC1-GW"}}, "endpoint_uuid": {"uuid": "eth2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "CS2-GW1/10/1==DC2-GW/eth1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "CS2-GW1"}}, "endpoint_uuid": {"uuid": "10/1"}},
+                {"device_id": {"device_uuid": {"uuid": "DC2-GW"}}, "endpoint_uuid": {"uuid": "eth1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "CS2-GW2/10/1==DC2-GW/eth2"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "CS2-GW2"}}, "endpoint_uuid": {"uuid": "10/1"}},
+                {"device_id": {"device_uuid": {"uuid": "DC2-GW"}}, "endpoint_uuid": {"uuid": "eth2"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "OLS/aade6001-f00b-5e2f-a357-6a0a9d3de870==CS1-GW1/1/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "OLS"}}, "endpoint_uuid": {"uuid": "aade6001-f00b-5e2f-a357-6a0a9d3de870"}},
+                {"device_id": {"device_uuid": {"uuid": "CS1-GW1"}}, "endpoint_uuid": {"uuid": "1/1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "OLS/eb287d83-f05e-53ec-ab5a-adf6bd2b5418==CS1-GW2/1/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "OLS"}}, "endpoint_uuid": {"uuid": "eb287d83-f05e-53ec-ab5a-adf6bd2b5418"}},
+                {"device_id": {"device_uuid": {"uuid": "CS1-GW2"}}, "endpoint_uuid": {"uuid": "1/1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "OLS/0ef74f99-1acc-57bd-ab9d-4b958b06c513==CS2-GW1/1/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "OLS"}}, "endpoint_uuid": {"uuid": "0ef74f99-1acc-57bd-ab9d-4b958b06c513"}},
+                {"device_id": {"device_uuid": {"uuid": "CS2-GW1"}}, "endpoint_uuid": {"uuid": "1/1"}}
+            ]
+        },
+        {
+            "link_id": {"link_uuid": {"uuid": "OLS/50296d99-58cc-5ce7-82f5-fc8ee4eec2ec==CS2-GW2/1/1"}}, "link_endpoint_ids": [
+                {"device_id": {"device_uuid": {"uuid": "OLS"}}, "endpoint_uuid": {"uuid": "50296d99-58cc-5ce7-82f5-fc8ee4eec2ec"}},
+                {"device_id": {"device_uuid": {"uuid": "CS2-GW2"}}, "endpoint_uuid": {"uuid": "1/1"}}
+            ]
         }
     ]
 }