diff --git a/src/monitoring/context_pb2.py b/src/monitoring/context_pb2.py
index 5930d483e211a51816f87595ed4bb12848ee9a44..e4acb11a579694017d1ee5572f1f94848731802a 100644
--- a/src/monitoring/context_pb2.py
+++ b/src/monitoring/context_pb2.py
@@ -1,8 +1,7 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: context.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.internal import enum_type_wrapper
 from google.protobuf import descriptor as _descriptor
 from google.protobuf import message as _message
@@ -20,7 +19,8 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   package='context',
   syntax='proto3',
   serialized_options=None,
-  serialized_pb=_b('\n\rcontext.proto\x12\x07\x63ontext\"\x07\n\x05\x45mpty\"T\n\x07\x43ontext\x12\x1f\n\x04topo\x18\x01 \x01(\x0b\x32\x11.context.Topology\x12(\n\x03\x63tl\x18\x02 \x01(\x0b\x32\x1b.context.TeraFlowController\"H\n\x08Topology\x12\x1f\n\x06\x64\x65vice\x18\x01 \x03(\x0b\x32\x0f.context.Device\x12\x1b\n\x04link\x18\x02 \x03(\x0b\x32\r.context.Link\"1\n\x04Link\x12)\n\x0c\x65ndpointList\x18\x01 \x03(\x0b\x32\x13.context.EndPointId\"?\n\nConstraint\x12\x17\n\x0f\x63onstraint_type\x18\x01 \x01(\t\x12\x18\n\x10\x63onstraint_value\x18\x02 \x01(\t\"\xda\x01\n\x06\x44\x65vice\x12$\n\tdevice_id\x18\x01 \x01(\x0b\x32\x11.context.DeviceId\x12\x13\n\x0b\x64\x65vice_type\x18\x02 \x01(\t\x12,\n\rdevice_config\x18\x03 \x01(\x0b\x32\x15.context.DeviceConfig\x12>\n\x14\x64\x65vOperationalStatus\x18\x04 \x01(\x0e\x32 .context.DeviceOperationalStatus\x12\'\n\x0c\x65ndpointList\x18\x05 \x03(\x0b\x32\x11.context.EndPoint\"%\n\x0c\x44\x65viceConfig\x12\x15\n\rdevice_config\x18\x01 \x01(\t\"C\n\x08\x45ndPoint\x12$\n\x07port_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x11\n\tport_type\x18\x02 \x01(\t\"O\n\nEndPointId\x12\x1e\n\x07port_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\x12!\n\x06\x64\x65v_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\",\n\x08\x44\x65viceId\x12 \n\tdevice_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\x14\n\x04Uuid\x12\x0c\n\x04uuid\x18\x01 \x01(\t\"F\n\x12TeraFlowController\x12\x1d\n\x06\x63tl_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\x12\x11\n\tipaddress\x18\x02 \x01(\t\"L\n\x14\x41uthenticationResult\x12\x1d\n\x06\x63tl_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\x12\x15\n\rauthenticated\x18\x02 \x01(\x08*4\n\x17\x44\x65viceOperationalStatus\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x32\x44\n\x0e\x43ontextService\x12\x32\n\x0bGetTopology\x12\x0e.context.Empty\x1a\x11.context.Topology\"\x00\x62\x06proto3')
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\rcontext.proto\x12\x07\x63ontext\"\x07\n\x05\x45mpty\"{\n\x07\x43ontext\x12%\n\tcontextId\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x1f\n\x04topo\x18\x02 \x01(\x0b\x32\x11.context.Topology\x12(\n\x03\x63tl\x18\x03 \x01(\x0b\x32\x1b.context.TeraFlowController\"/\n\tContextId\x12\"\n\x0b\x63ontextUuid\x18\x01 \x01(\x0b\x32\r.context.Uuid\"m\n\x08Topology\x12#\n\x06topoId\x18\x02 \x01(\x0b\x32\x13.context.TopologyId\x12\x1f\n\x06\x64\x65vice\x18\x03 \x03(\x0b\x32\x0f.context.Device\x12\x1b\n\x04link\x18\x04 \x03(\x0b\x32\r.context.Link\"1\n\x04Link\x12)\n\x0c\x65ndpointList\x18\x01 \x03(\x0b\x32\x13.context.EndPointId\"R\n\nTopologyId\x12%\n\tcontextId\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x1d\n\x06topoId\x18\x02 \x01(\x0b\x32\r.context.Uuid\"?\n\nConstraint\x12\x17\n\x0f\x63onstraint_type\x18\x01 \x01(\t\x12\x18\n\x10\x63onstraint_value\x18\x02 \x01(\t\"\xda\x01\n\x06\x44\x65vice\x12$\n\tdevice_id\x18\x01 \x01(\x0b\x32\x11.context.DeviceId\x12\x13\n\x0b\x64\x65vice_type\x18\x02 \x01(\t\x12,\n\rdevice_config\x18\x03 \x01(\x0b\x32\x15.context.DeviceConfig\x12>\n\x14\x64\x65vOperationalStatus\x18\x04 \x01(\x0e\x32 .context.DeviceOperationalStatus\x12\'\n\x0c\x65ndpointList\x18\x05 \x03(\x0b\x32\x11.context.EndPoint\"%\n\x0c\x44\x65viceConfig\x12\x15\n\rdevice_config\x18\x01 \x01(\t\"C\n\x08\x45ndPoint\x12$\n\x07port_id\x18\x01 \x01(\x0b\x32\x13.context.EndPointId\x12\x11\n\tport_type\x18\x02 \x01(\t\"t\n\nEndPointId\x12#\n\x06topoId\x18\x01 \x01(\x0b\x32\x13.context.TopologyId\x12!\n\x06\x64\x65v_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\x12\x1e\n\x07port_id\x18\x03 \x01(\x0b\x32\r.context.Uuid\",\n\x08\x44\x65viceId\x12 \n\tdevice_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\"\x14\n\x04Uuid\x12\x0c\n\x04uuid\x18\x01 \x01(\t\"K\n\x12TeraFlowController\x12\"\n\x06\x63tl_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x11\n\tipaddress\x18\x02 \x01(\t\"Q\n\x14\x41uthenticationResult\x12\"\n\x06\x63tl_id\x18\x01 \x01(\x0b\x32\x12.context.ContextId\x12\x15\n\rauthenticated\x18\x02 \x01(\x08*4\n\x17\x44\x65viceOperationalStatus\x12\x0c\n\x08\x44ISABLED\x10\x00\x12\x0b\n\x07\x45NABLED\x10\x01\x32\x44\n\x0e\x43ontextService\x12\x32\n\x0bGetTopology\x12\x0e.context.Empty\x1a\x11.context.Topology\"\x00\x62\x06proto3'
 )
 
 _DEVICEOPERATIONALSTATUS = _descriptor.EnumDescriptor(
@@ -28,20 +28,23 @@ _DEVICEOPERATIONALSTATUS = _descriptor.EnumDescriptor(
   full_name='context.DeviceOperationalStatus',
   filename=None,
   file=DESCRIPTOR,
+  create_key=_descriptor._internal_create_key,
   values=[
     _descriptor.EnumValueDescriptor(
       name='DISABLED', index=0, number=0,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
     _descriptor.EnumValueDescriptor(
       name='ENABLED', index=1, number=1,
       serialized_options=None,
-      type=None),
+      type=None,
+      create_key=_descriptor._internal_create_key),
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=939,
-  serialized_end=991,
+  serialized_start=1195,
+  serialized_end=1247,
 )
 _sym_db.RegisterEnumDescriptor(_DEVICEOPERATIONALSTATUS)
 
@@ -57,6 +60,7 @@ _EMPTY = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
   ],
   extensions=[
@@ -81,21 +85,29 @@ _CONTEXT = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='topo', full_name='context.Context.topo', index=0,
+      name='contextId', full_name='context.Context.contextId', index=0,
       number=1, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='ctl', full_name='context.Context.ctl', index=1,
+      name='topo', full_name='context.Context.topo', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='ctl', full_name='context.Context.ctl', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -109,7 +121,39 @@ _CONTEXT = _descriptor.Descriptor(
   oneofs=[
   ],
   serialized_start=35,
-  serialized_end=119,
+  serialized_end=158,
+)
+
+
+_CONTEXTID = _descriptor.Descriptor(
+  name='ContextId',
+  full_name='context.ContextId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='contextUuid', full_name='context.ContextId.contextUuid', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=160,
+  serialized_end=207,
 )
 
 
@@ -119,21 +163,29 @@ _TOPOLOGY = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='device', full_name='context.Topology.device', index=0,
-      number=1, type=11, cpp_type=10, label=3,
+      name='topoId', full_name='context.Topology.topoId', index=0,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='device', full_name='context.Topology.device', index=1,
+      number=3, 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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
-      name='link', full_name='context.Topology.link', index=1,
-      number=2, type=11, cpp_type=10, label=3,
+      name='link', full_name='context.Topology.link', index=2,
+      number=4, 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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -146,8 +198,8 @@ _TOPOLOGY = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=121,
-  serialized_end=193,
+  serialized_start=209,
+  serialized_end=318,
 )
 
 
@@ -157,6 +209,7 @@ _LINK = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='endpointList', full_name='context.Link.endpointList', index=0,
@@ -164,7 +217,46 @@ _LINK = _descriptor.Descriptor(
       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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=320,
+  serialized_end=369,
+)
+
+
+_TOPOLOGYID = _descriptor.Descriptor(
+  name='TopologyId',
+  full_name='context.TopologyId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  create_key=_descriptor._internal_create_key,
+  fields=[
+    _descriptor.FieldDescriptor(
+      name='contextId', full_name='context.TopologyId.contextId', index=0,
+      number=1, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='topoId', full_name='context.TopologyId.topoId', index=1,
+      number=2, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -177,8 +269,8 @@ _LINK = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=195,
-  serialized_end=244,
+  serialized_start=371,
+  serialized_end=453,
 )
 
 
@@ -188,21 +280,22 @@ _CONSTRAINT = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='constraint_type', full_name='context.Constraint.constraint_type', index=0,
       number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='constraint_value', full_name='context.Constraint.constraint_value', index=1,
       number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -215,8 +308,8 @@ _CONSTRAINT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=246,
-  serialized_end=309,
+  serialized_start=455,
+  serialized_end=518,
 )
 
 
@@ -226,6 +319,7 @@ _DEVICE = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='device_id', full_name='context.Device.device_id', index=0,
@@ -233,35 +327,35 @@ _DEVICE = _descriptor.Descriptor(
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='device_type', full_name='context.Device.device_type', index=1,
       number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='device_config', full_name='context.Device.device_config', index=2,
       number=3, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='devOperationalStatus', full_name='context.Device.devOperationalStatus', index=3,
       number=4, 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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='endpointList', full_name='context.Device.endpointList', index=4,
       number=5, 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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -274,8 +368,8 @@ _DEVICE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=312,
-  serialized_end=530,
+  serialized_start=521,
+  serialized_end=739,
 )
 
 
@@ -285,14 +379,15 @@ _DEVICECONFIG = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='device_config', full_name='context.DeviceConfig.device_config', index=0,
       number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -305,8 +400,8 @@ _DEVICECONFIG = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=532,
-  serialized_end=569,
+  serialized_start=741,
+  serialized_end=778,
 )
 
 
@@ -316,6 +411,7 @@ _ENDPOINT = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='port_id', full_name='context.EndPoint.port_id', index=0,
@@ -323,14 +419,14 @@ _ENDPOINT = _descriptor.Descriptor(
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='port_type', full_name='context.EndPoint.port_type', index=1,
       number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -343,8 +439,8 @@ _ENDPOINT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=571,
-  serialized_end=638,
+  serialized_start=780,
+  serialized_end=847,
 )
 
 
@@ -354,21 +450,29 @@ _ENDPOINTID = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
-      name='port_id', full_name='context.EndPointId.port_id', index=0,
+      name='topoId', full_name='context.EndPointId.topoId', index=0,
       number=1, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='dev_id', full_name='context.EndPointId.dev_id', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
+    _descriptor.FieldDescriptor(
+      name='port_id', full_name='context.EndPointId.port_id', index=2,
+      number=3, type=11, cpp_type=10, label=1,
+      has_default_value=False, default_value=None,
+      message_type=None, enum_type=None, containing_type=None,
+      is_extension=False, extension_scope=None,
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -381,8 +485,8 @@ _ENDPOINTID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=640,
-  serialized_end=719,
+  serialized_start=849,
+  serialized_end=965,
 )
 
 
@@ -392,6 +496,7 @@ _DEVICEID = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='device_id', full_name='context.DeviceId.device_id', index=0,
@@ -399,7 +504,7 @@ _DEVICEID = _descriptor.Descriptor(
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -412,8 +517,8 @@ _DEVICEID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=721,
-  serialized_end=765,
+  serialized_start=967,
+  serialized_end=1011,
 )
 
 
@@ -423,14 +528,15 @@ _UUID = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='uuid', full_name='context.Uuid.uuid', index=0,
       number=1, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -443,8 +549,8 @@ _UUID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=767,
-  serialized_end=787,
+  serialized_start=1013,
+  serialized_end=1033,
 )
 
 
@@ -454,6 +560,7 @@ _TERAFLOWCONTROLLER = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='ctl_id', full_name='context.TeraFlowController.ctl_id', index=0,
@@ -461,14 +568,14 @@ _TERAFLOWCONTROLLER = _descriptor.Descriptor(
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='ipaddress', full_name='context.TeraFlowController.ipaddress', index=1,
       number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -481,8 +588,8 @@ _TERAFLOWCONTROLLER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=789,
-  serialized_end=859,
+  serialized_start=1035,
+  serialized_end=1110,
 )
 
 
@@ -492,6 +599,7 @@ _AUTHENTICATIONRESULT = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='ctl_id', full_name='context.AuthenticationResult.ctl_id', index=0,
@@ -499,14 +607,14 @@ _AUTHENTICATIONRESULT = _descriptor.Descriptor(
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='authenticated', full_name='context.AuthenticationResult.authenticated', index=1,
       number=2, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -519,29 +627,37 @@ _AUTHENTICATIONRESULT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=861,
-  serialized_end=937,
+  serialized_start=1112,
+  serialized_end=1193,
 )
 
+_CONTEXT.fields_by_name['contextId'].message_type = _CONTEXTID
 _CONTEXT.fields_by_name['topo'].message_type = _TOPOLOGY
 _CONTEXT.fields_by_name['ctl'].message_type = _TERAFLOWCONTROLLER
+_CONTEXTID.fields_by_name['contextUuid'].message_type = _UUID
+_TOPOLOGY.fields_by_name['topoId'].message_type = _TOPOLOGYID
 _TOPOLOGY.fields_by_name['device'].message_type = _DEVICE
 _TOPOLOGY.fields_by_name['link'].message_type = _LINK
 _LINK.fields_by_name['endpointList'].message_type = _ENDPOINTID
+_TOPOLOGYID.fields_by_name['contextId'].message_type = _CONTEXTID
+_TOPOLOGYID.fields_by_name['topoId'].message_type = _UUID
 _DEVICE.fields_by_name['device_id'].message_type = _DEVICEID
 _DEVICE.fields_by_name['device_config'].message_type = _DEVICECONFIG
 _DEVICE.fields_by_name['devOperationalStatus'].enum_type = _DEVICEOPERATIONALSTATUS
 _DEVICE.fields_by_name['endpointList'].message_type = _ENDPOINT
 _ENDPOINT.fields_by_name['port_id'].message_type = _ENDPOINTID
-_ENDPOINTID.fields_by_name['port_id'].message_type = _UUID
+_ENDPOINTID.fields_by_name['topoId'].message_type = _TOPOLOGYID
 _ENDPOINTID.fields_by_name['dev_id'].message_type = _DEVICEID
+_ENDPOINTID.fields_by_name['port_id'].message_type = _UUID
 _DEVICEID.fields_by_name['device_id'].message_type = _UUID
-_TERAFLOWCONTROLLER.fields_by_name['ctl_id'].message_type = _UUID
-_AUTHENTICATIONRESULT.fields_by_name['ctl_id'].message_type = _UUID
+_TERAFLOWCONTROLLER.fields_by_name['ctl_id'].message_type = _CONTEXTID
+_AUTHENTICATIONRESULT.fields_by_name['ctl_id'].message_type = _CONTEXTID
 DESCRIPTOR.message_types_by_name['Empty'] = _EMPTY
 DESCRIPTOR.message_types_by_name['Context'] = _CONTEXT
+DESCRIPTOR.message_types_by_name['ContextId'] = _CONTEXTID
 DESCRIPTOR.message_types_by_name['Topology'] = _TOPOLOGY
 DESCRIPTOR.message_types_by_name['Link'] = _LINK
+DESCRIPTOR.message_types_by_name['TopologyId'] = _TOPOLOGYID
 DESCRIPTOR.message_types_by_name['Constraint'] = _CONSTRAINT
 DESCRIPTOR.message_types_by_name['Device'] = _DEVICE
 DESCRIPTOR.message_types_by_name['DeviceConfig'] = _DEVICECONFIG
@@ -554,95 +670,109 @@ DESCRIPTOR.message_types_by_name['AuthenticationResult'] = _AUTHENTICATIONRESULT
 DESCRIPTOR.enum_types_by_name['DeviceOperationalStatus'] = _DEVICEOPERATIONALSTATUS
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), dict(
-  DESCRIPTOR = _EMPTY,
-  __module__ = 'context_pb2'
+Empty = _reflection.GeneratedProtocolMessageType('Empty', (_message.Message,), {
+  'DESCRIPTOR' : _EMPTY,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.Empty)
-  ))
+  })
 _sym_db.RegisterMessage(Empty)
 
-Context = _reflection.GeneratedProtocolMessageType('Context', (_message.Message,), dict(
-  DESCRIPTOR = _CONTEXT,
-  __module__ = 'context_pb2'
+Context = _reflection.GeneratedProtocolMessageType('Context', (_message.Message,), {
+  'DESCRIPTOR' : _CONTEXT,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.Context)
-  ))
+  })
 _sym_db.RegisterMessage(Context)
 
-Topology = _reflection.GeneratedProtocolMessageType('Topology', (_message.Message,), dict(
-  DESCRIPTOR = _TOPOLOGY,
-  __module__ = 'context_pb2'
+ContextId = _reflection.GeneratedProtocolMessageType('ContextId', (_message.Message,), {
+  'DESCRIPTOR' : _CONTEXTID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ContextId)
+  })
+_sym_db.RegisterMessage(ContextId)
+
+Topology = _reflection.GeneratedProtocolMessageType('Topology', (_message.Message,), {
+  'DESCRIPTOR' : _TOPOLOGY,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.Topology)
-  ))
+  })
 _sym_db.RegisterMessage(Topology)
 
-Link = _reflection.GeneratedProtocolMessageType('Link', (_message.Message,), dict(
-  DESCRIPTOR = _LINK,
-  __module__ = 'context_pb2'
+Link = _reflection.GeneratedProtocolMessageType('Link', (_message.Message,), {
+  'DESCRIPTOR' : _LINK,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.Link)
-  ))
+  })
 _sym_db.RegisterMessage(Link)
 
-Constraint = _reflection.GeneratedProtocolMessageType('Constraint', (_message.Message,), dict(
-  DESCRIPTOR = _CONSTRAINT,
-  __module__ = 'context_pb2'
+TopologyId = _reflection.GeneratedProtocolMessageType('TopologyId', (_message.Message,), {
+  'DESCRIPTOR' : _TOPOLOGYID,
+  '__module__' : 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.TopologyId)
+  })
+_sym_db.RegisterMessage(TopologyId)
+
+Constraint = _reflection.GeneratedProtocolMessageType('Constraint', (_message.Message,), {
+  'DESCRIPTOR' : _CONSTRAINT,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.Constraint)
-  ))
+  })
 _sym_db.RegisterMessage(Constraint)
 
-Device = _reflection.GeneratedProtocolMessageType('Device', (_message.Message,), dict(
-  DESCRIPTOR = _DEVICE,
-  __module__ = 'context_pb2'
+Device = _reflection.GeneratedProtocolMessageType('Device', (_message.Message,), {
+  'DESCRIPTOR' : _DEVICE,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.Device)
-  ))
+  })
 _sym_db.RegisterMessage(Device)
 
-DeviceConfig = _reflection.GeneratedProtocolMessageType('DeviceConfig', (_message.Message,), dict(
-  DESCRIPTOR = _DEVICECONFIG,
-  __module__ = 'context_pb2'
+DeviceConfig = _reflection.GeneratedProtocolMessageType('DeviceConfig', (_message.Message,), {
+  'DESCRIPTOR' : _DEVICECONFIG,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.DeviceConfig)
-  ))
+  })
 _sym_db.RegisterMessage(DeviceConfig)
 
-EndPoint = _reflection.GeneratedProtocolMessageType('EndPoint', (_message.Message,), dict(
-  DESCRIPTOR = _ENDPOINT,
-  __module__ = 'context_pb2'
+EndPoint = _reflection.GeneratedProtocolMessageType('EndPoint', (_message.Message,), {
+  'DESCRIPTOR' : _ENDPOINT,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.EndPoint)
-  ))
+  })
 _sym_db.RegisterMessage(EndPoint)
 
-EndPointId = _reflection.GeneratedProtocolMessageType('EndPointId', (_message.Message,), dict(
-  DESCRIPTOR = _ENDPOINTID,
-  __module__ = 'context_pb2'
+EndPointId = _reflection.GeneratedProtocolMessageType('EndPointId', (_message.Message,), {
+  'DESCRIPTOR' : _ENDPOINTID,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.EndPointId)
-  ))
+  })
 _sym_db.RegisterMessage(EndPointId)
 
-DeviceId = _reflection.GeneratedProtocolMessageType('DeviceId', (_message.Message,), dict(
-  DESCRIPTOR = _DEVICEID,
-  __module__ = 'context_pb2'
+DeviceId = _reflection.GeneratedProtocolMessageType('DeviceId', (_message.Message,), {
+  'DESCRIPTOR' : _DEVICEID,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.DeviceId)
-  ))
+  })
 _sym_db.RegisterMessage(DeviceId)
 
-Uuid = _reflection.GeneratedProtocolMessageType('Uuid', (_message.Message,), dict(
-  DESCRIPTOR = _UUID,
-  __module__ = 'context_pb2'
+Uuid = _reflection.GeneratedProtocolMessageType('Uuid', (_message.Message,), {
+  'DESCRIPTOR' : _UUID,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.Uuid)
-  ))
+  })
 _sym_db.RegisterMessage(Uuid)
 
-TeraFlowController = _reflection.GeneratedProtocolMessageType('TeraFlowController', (_message.Message,), dict(
-  DESCRIPTOR = _TERAFLOWCONTROLLER,
-  __module__ = 'context_pb2'
+TeraFlowController = _reflection.GeneratedProtocolMessageType('TeraFlowController', (_message.Message,), {
+  'DESCRIPTOR' : _TERAFLOWCONTROLLER,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.TeraFlowController)
-  ))
+  })
 _sym_db.RegisterMessage(TeraFlowController)
 
-AuthenticationResult = _reflection.GeneratedProtocolMessageType('AuthenticationResult', (_message.Message,), dict(
-  DESCRIPTOR = _AUTHENTICATIONRESULT,
-  __module__ = 'context_pb2'
+AuthenticationResult = _reflection.GeneratedProtocolMessageType('AuthenticationResult', (_message.Message,), {
+  'DESCRIPTOR' : _AUTHENTICATIONRESULT,
+  '__module__' : 'context_pb2'
   # @@protoc_insertion_point(class_scope:context.AuthenticationResult)
-  ))
+  })
 _sym_db.RegisterMessage(AuthenticationResult)
 
 
@@ -653,8 +783,9 @@ _CONTEXTSERVICE = _descriptor.ServiceDescriptor(
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=993,
-  serialized_end=1061,
+  create_key=_descriptor._internal_create_key,
+  serialized_start=1249,
+  serialized_end=1317,
   methods=[
   _descriptor.MethodDescriptor(
     name='GetTopology',
@@ -664,6 +795,7 @@ _CONTEXTSERVICE = _descriptor.ServiceDescriptor(
     input_type=_EMPTY,
     output_type=_TOPOLOGY,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
 ])
 _sym_db.RegisterServiceDescriptor(_CONTEXTSERVICE)
diff --git a/src/monitoring/context_pb2_grpc.py b/src/monitoring/context_pb2_grpc.py
index d64835e12d21e68616361612e959d3fd6393ab6a..262835313921800de8c293a12820bdec0381a771 100644
--- a/src/monitoring/context_pb2_grpc.py
+++ b/src/monitoring/context_pb2_grpc.py
@@ -1,46 +1,66 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-import context_pb2 as context__pb2
+from . import context_pb2 as context__pb2
 
 
 class ContextServiceStub(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.GetTopology = channel.unary_unary(
-        '/context.ContextService/GetTopology',
-        request_serializer=context__pb2.Empty.SerializeToString,
-        response_deserializer=context__pb2.Topology.FromString,
-        )
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.GetTopology = channel.unary_unary(
+                '/context.ContextService/GetTopology',
+                request_serializer=context__pb2.Empty.SerializeToString,
+                response_deserializer=context__pb2.Topology.FromString,
+                )
 
 
 class ContextServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
+    """Missing associated documentation comment in .proto file."""
 
-  def GetTopology(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 GetTopology(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_ContextServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'GetTopology': grpc.unary_unary_rpc_method_handler(
-          servicer.GetTopology,
-          request_deserializer=context__pb2.Empty.FromString,
-          response_serializer=context__pb2.Topology.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'context.ContextService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'GetTopology': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetTopology,
+                    request_deserializer=context__pb2.Empty.FromString,
+                    response_serializer=context__pb2.Topology.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'context.ContextService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class ContextService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def GetTopology(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, '/context.ContextService/GetTopology',
+            context__pb2.Empty.SerializeToString,
+            context__pb2.Topology.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/src/monitoring/genproto.sh b/src/monitoring/genproto.sh
index e687e882d5f2bc033b43a3e4e482e68cc766dd25..89a6e8db13edd4336d6274f2ed9730891e6f1b4f 100755
--- a/src/monitoring/genproto.sh
+++ b/src/monitoring/genproto.sh
@@ -18,3 +18,8 @@
 
 python -m grpc_tools.protoc -I../../proto --python_out=. --grpc_python_out=. ../../proto/monitoring.proto
 python -m grpc_tools.protoc -I../../proto --python_out=. --grpc_python_out=. ../../proto/context.proto
+
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' monitoring_pb2.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' monitoring_pb2_grpc.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' context_pb2.py
+sed -i -E 's/(import\ .*)_pb2/from . \1_pb2/g' context_pb2_grpc.py
diff --git a/src/monitoring/monitoring_client.py b/src/monitoring/monitoring_client.py
index 905c09adaa43aece5db0f1c476a940141c11517a..a856b7646f6cd76730e6c72cff6b583493fdd453 100644
--- a/src/monitoring/monitoring_client.py
+++ b/src/monitoring/monitoring_client.py
@@ -1,60 +1,58 @@
 import sys
 import grpc
 
-import monitoring_pb2 as monitoring
-import monitoring_pb2_grpc
-import context_pb2
+from . import monitoring_pb2
+from . import monitoring_pb2_grpc
+from . import context_pb2
 
-import json
+#import json
 
-from logger import getJSONLogger
-logger = getJSONLogger('monitoring-client')
-logger.setLevel('DEBUG')
+from .logger import getJSONLogger
+LOGGER = getJSONLogger('monitoring-client')
+LOGGER.setLevel('DEBUG')
 
 class MonitoringClient:
 
-    def __init__(self, server="monitoring", port="7070"):
-        logger.info("init monitoringClient port " + port)
-        self.channel=grpc.insecure_channel(server+':'+port)
-        self.server=monitoring_pb2_grpc.MonitoringServiceStub(self.channel)
+    def __init__(self, server='monitoring', port='7070'):
+        endpoint = '{}:{}'.format(server, port)
+        LOGGER.info('init monitoringClient {}'.format(endpoint))
+        self.channel = grpc.insecure_channel(endpoint)
+        self.server = monitoring_pb2_grpc.MonitoringServiceStub(self.channel)
 
     def IncludeKpi(self, request):
-        logger.info("IncludeKpi: {}".format(request))
+        LOGGER.info('IncludeKpi: {}'.format(request))
         response = self.server.IncludeKpi(request)
-        logger.info("IncludeKpi result: {}".format(response))
+        LOGGER.info('IncludeKpi result: {}'.format(response))
         return context_pb2.Empty()
 
     def MonitorKpi(self, request):
-        logger.info("MonitorKpi: {}".format(request))
+        LOGGER.info('MonitorKpi: {}'.format(request))
         response = self.server.IncludeKpi(request)
-        logger.info("MonitorKpi result: {}".format(response))
+        LOGGER.info('MonitorKpi result: {}'.format(response))
         return context_pb2.Empty()
         
     def GetStream_kpi(self, request):
-        logger.info("GetStream_kpi: {}".format(request))
+        LOGGER.info('GetStream_kpi: {}'.format(request))
         response = self.server.GetStream_kpi(request)
-        logger.info("GetStream_kpi result: {}".format(response))
+        LOGGER.info('GetStream_kpi result: {}'.format(response))
         yield response
 
     def GetInstantKpi(self, request):
-        logger.info("GetInstantKpi: {}".format(request))
+        LOGGER.info('GetInstantKpi: {}'.format(request))
         response = self.server.IncludeKpi(request)
-        logger.info("GetInstantKpi result: {}".format(response))
+        LOGGER.info('GetInstantKpi result: {}'.format(response))
         return response
         
 
-if __name__ == "__main__":
+if __name__ == '__main__':
     # get port
-    if len(sys.argv) > 1:
-        port = sys.argv[1]
-    else:
-        port = "7070"
+    port = sys.argv[1] if len(sys.argv) > 1 else '7070'
 
     # form request
-    kpi = monitoring.Kpi()
-    kpi.kpi_id.kpi_id = "KPIID0000"
-    kpi.kpiDescription = "KPI Desc"
+    kpi = monitoring_pb2.Kpi()
+    kpi.kpi_id.kpi_id = 'KPIID0000'
+    kpi.kpiDescription = 'KPI Desc'
 
     # make call to server
-    client = MonitoringClient(port)
+    client = MonitoringClient(port=port)
     response=client.IncludeKpi(kpi)
diff --git a/src/monitoring/monitoring_pb2.py b/src/monitoring/monitoring_pb2.py
index ec4e1a9560c4b0da040c5645c893eb97d84dd6aa..32394e232c196c4189a1e5c147980a66d6f8d34d 100644
--- a/src/monitoring/monitoring_pb2.py
+++ b/src/monitoring/monitoring_pb2.py
@@ -1,8 +1,7 @@
+# -*- coding: utf-8 -*-
 # Generated by the protocol buffer compiler.  DO NOT EDIT!
 # source: monitoring.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 message as _message
 from google.protobuf import reflection as _reflection
@@ -12,7 +11,7 @@ from google.protobuf import symbol_database as _symbol_database
 _sym_db = _symbol_database.Default()
 
 
-import context_pb2 as context__pb2
+from . import context_pb2 as context__pb2
 
 
 DESCRIPTOR = _descriptor.FileDescriptor(
@@ -20,7 +19,8 @@ DESCRIPTOR = _descriptor.FileDescriptor(
   package='monitoring',
   syntax='proto3',
   serialized_options=None,
-  serialized_pb=_b('\n\x10monitoring.proto\x12\nmonitoring\x1a\rcontext.proto\"|\n\x03Kpi\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x11\n\ttimestamp\x18\x02 \x01(\t\x12\x16\n\x0ekpiDescription\x18\x03 \x01(\t\x12\'\n\tkpi_value\x18\x04 \x01(\x0b\x32\x14.monitoring.KpiValue\"&\n\x05KpiId\x12\x1d\n\x06kpi_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\"T\n\tKpiDevice\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\"+\n\x07KpiList\x12 \n\x07kpiList\x18\x01 \x03(\x0b\x32\x0f.monitoring.Kpi\"M\n\x08KpiValue\x12\x10\n\x06intVal\x18\x01 \x01(\rH\x00\x12\x13\n\tstringVal\x18\x02 \x01(\tH\x00\x12\x11\n\x07\x62oolVal\x18\x03 \x01(\x08H\x00\x42\x07\n\x05value2\xeb\x01\n\x11MonitoringService\x12/\n\nIncludeKpi\x12\x0f.monitoring.Kpi\x1a\x0e.context.Empty\"\x00\x12\x35\n\nMonitorKpi\x12\x15.monitoring.KpiDevice\x1a\x0e.context.Empty\"\x00\x12\x37\n\rGetStream_kpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x30\x01\x12\x35\n\rGetInstantKpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x62\x06proto3')
+  create_key=_descriptor._internal_create_key,
+  serialized_pb=b'\n\x10monitoring.proto\x12\nmonitoring\x1a\rcontext.proto\"|\n\x03Kpi\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12\x11\n\ttimestamp\x18\x02 \x01(\t\x12\x16\n\x0ekpiDescription\x18\x03 \x01(\t\x12\'\n\tkpi_value\x18\x04 \x01(\x0b\x32\x14.monitoring.KpiValue\"&\n\x05KpiId\x12\x1d\n\x06kpi_id\x18\x01 \x01(\x0b\x32\r.context.Uuid\"T\n\tKpiDevice\x12!\n\x06kpi_id\x18\x01 \x01(\x0b\x32\x11.monitoring.KpiId\x12$\n\tdevice_id\x18\x02 \x01(\x0b\x32\x11.context.DeviceId\"+\n\x07KpiList\x12 \n\x07kpiList\x18\x01 \x03(\x0b\x32\x0f.monitoring.Kpi\"M\n\x08KpiValue\x12\x10\n\x06intVal\x18\x01 \x01(\rH\x00\x12\x13\n\tstringVal\x18\x02 \x01(\tH\x00\x12\x11\n\x07\x62oolVal\x18\x03 \x01(\x08H\x00\x42\x07\n\x05value2\xeb\x01\n\x11MonitoringService\x12/\n\nIncludeKpi\x12\x0f.monitoring.Kpi\x1a\x0e.context.Empty\"\x00\x12\x35\n\nMonitorKpi\x12\x15.monitoring.KpiDevice\x1a\x0e.context.Empty\"\x00\x12\x37\n\rGetStream_kpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x30\x01\x12\x35\n\rGetInstantKpi\x12\x11.monitoring.KpiId\x1a\x0f.monitoring.Kpi\"\x00\x62\x06proto3'
   ,
   dependencies=[context__pb2.DESCRIPTOR,])
 
@@ -33,6 +33,7 @@ _KPI = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='kpi_id', full_name='monitoring.Kpi.kpi_id', index=0,
@@ -40,28 +41,28 @@ _KPI = _descriptor.Descriptor(
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='timestamp', full_name='monitoring.Kpi.timestamp', index=1,
       number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='kpiDescription', full_name='monitoring.Kpi.kpiDescription', index=2,
       number=3, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='kpi_value', full_name='monitoring.Kpi.kpi_value', index=3,
       number=4, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -85,6 +86,7 @@ _KPIID = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='kpi_id', full_name='monitoring.KpiId.kpi_id', index=0,
@@ -92,7 +94,7 @@ _KPIID = _descriptor.Descriptor(
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -116,6 +118,7 @@ _KPIDEVICE = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='kpi_id', full_name='monitoring.KpiDevice.kpi_id', index=0,
@@ -123,14 +126,14 @@ _KPIDEVICE = _descriptor.Descriptor(
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='device_id', full_name='monitoring.KpiDevice.device_id', index=1,
       number=2, type=11, cpp_type=10, label=1,
       has_default_value=False, default_value=None,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -154,6 +157,7 @@ _KPILIST = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='kpiList', full_name='monitoring.KpiList.kpiList', index=0,
@@ -161,7 +165,7 @@ _KPILIST = _descriptor.Descriptor(
       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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -185,6 +189,7 @@ _KPIVALUE = _descriptor.Descriptor(
   filename=None,
   file=DESCRIPTOR,
   containing_type=None,
+  create_key=_descriptor._internal_create_key,
   fields=[
     _descriptor.FieldDescriptor(
       name='intVal', full_name='monitoring.KpiValue.intVal', index=0,
@@ -192,21 +197,21 @@ _KPIVALUE = _descriptor.Descriptor(
       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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='stringVal', full_name='monitoring.KpiValue.stringVal', index=1,
       number=2, type=9, cpp_type=9, label=1,
-      has_default_value=False, default_value=_b("").decode('utf-8'),
+      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),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
     _descriptor.FieldDescriptor(
       name='boolVal', full_name='monitoring.KpiValue.boolVal', index=2,
       number=3, type=8, cpp_type=7, label=1,
       has_default_value=False, default_value=False,
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
-      serialized_options=None, file=DESCRIPTOR),
+      serialized_options=None, file=DESCRIPTOR,  create_key=_descriptor._internal_create_key),
   ],
   extensions=[
   ],
@@ -220,7 +225,9 @@ _KPIVALUE = _descriptor.Descriptor(
   oneofs=[
     _descriptor.OneofDescriptor(
       name='value', full_name='monitoring.KpiValue.value',
-      index=0, containing_type=None, fields=[]),
+      index=0, containing_type=None,
+      create_key=_descriptor._internal_create_key,
+    fields=[]),
   ],
   serialized_start=344,
   serialized_end=421,
@@ -248,39 +255,39 @@ DESCRIPTOR.message_types_by_name['KpiList'] = _KPILIST
 DESCRIPTOR.message_types_by_name['KpiValue'] = _KPIVALUE
 _sym_db.RegisterFileDescriptor(DESCRIPTOR)
 
-Kpi = _reflection.GeneratedProtocolMessageType('Kpi', (_message.Message,), dict(
-  DESCRIPTOR = _KPI,
-  __module__ = 'monitoring_pb2'
+Kpi = _reflection.GeneratedProtocolMessageType('Kpi', (_message.Message,), {
+  'DESCRIPTOR' : _KPI,
+  '__module__' : 'monitoring_pb2'
   # @@protoc_insertion_point(class_scope:monitoring.Kpi)
-  ))
+  })
 _sym_db.RegisterMessage(Kpi)
 
-KpiId = _reflection.GeneratedProtocolMessageType('KpiId', (_message.Message,), dict(
-  DESCRIPTOR = _KPIID,
-  __module__ = 'monitoring_pb2'
+KpiId = _reflection.GeneratedProtocolMessageType('KpiId', (_message.Message,), {
+  'DESCRIPTOR' : _KPIID,
+  '__module__' : 'monitoring_pb2'
   # @@protoc_insertion_point(class_scope:monitoring.KpiId)
-  ))
+  })
 _sym_db.RegisterMessage(KpiId)
 
-KpiDevice = _reflection.GeneratedProtocolMessageType('KpiDevice', (_message.Message,), dict(
-  DESCRIPTOR = _KPIDEVICE,
-  __module__ = 'monitoring_pb2'
+KpiDevice = _reflection.GeneratedProtocolMessageType('KpiDevice', (_message.Message,), {
+  'DESCRIPTOR' : _KPIDEVICE,
+  '__module__' : 'monitoring_pb2'
   # @@protoc_insertion_point(class_scope:monitoring.KpiDevice)
-  ))
+  })
 _sym_db.RegisterMessage(KpiDevice)
 
-KpiList = _reflection.GeneratedProtocolMessageType('KpiList', (_message.Message,), dict(
-  DESCRIPTOR = _KPILIST,
-  __module__ = 'monitoring_pb2'
+KpiList = _reflection.GeneratedProtocolMessageType('KpiList', (_message.Message,), {
+  'DESCRIPTOR' : _KPILIST,
+  '__module__' : 'monitoring_pb2'
   # @@protoc_insertion_point(class_scope:monitoring.KpiList)
-  ))
+  })
 _sym_db.RegisterMessage(KpiList)
 
-KpiValue = _reflection.GeneratedProtocolMessageType('KpiValue', (_message.Message,), dict(
-  DESCRIPTOR = _KPIVALUE,
-  __module__ = 'monitoring_pb2'
+KpiValue = _reflection.GeneratedProtocolMessageType('KpiValue', (_message.Message,), {
+  'DESCRIPTOR' : _KPIVALUE,
+  '__module__' : 'monitoring_pb2'
   # @@protoc_insertion_point(class_scope:monitoring.KpiValue)
-  ))
+  })
 _sym_db.RegisterMessage(KpiValue)
 
 
@@ -291,6 +298,7 @@ _MONITORINGSERVICE = _descriptor.ServiceDescriptor(
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
+  create_key=_descriptor._internal_create_key,
   serialized_start=424,
   serialized_end=659,
   methods=[
@@ -302,6 +310,7 @@ _MONITORINGSERVICE = _descriptor.ServiceDescriptor(
     input_type=_KPI,
     output_type=context__pb2._EMPTY,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='MonitorKpi',
@@ -311,6 +320,7 @@ _MONITORINGSERVICE = _descriptor.ServiceDescriptor(
     input_type=_KPIDEVICE,
     output_type=context__pb2._EMPTY,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='GetStream_kpi',
@@ -320,6 +330,7 @@ _MONITORINGSERVICE = _descriptor.ServiceDescriptor(
     input_type=_KPIID,
     output_type=_KPI,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
   _descriptor.MethodDescriptor(
     name='GetInstantKpi',
@@ -329,6 +340,7 @@ _MONITORINGSERVICE = _descriptor.ServiceDescriptor(
     input_type=_KPIID,
     output_type=_KPI,
     serialized_options=None,
+    create_key=_descriptor._internal_create_key,
   ),
 ])
 _sym_db.RegisterServiceDescriptor(_MONITORINGSERVICE)
diff --git a/src/monitoring/monitoring_pb2_grpc.py b/src/monitoring/monitoring_pb2_grpc.py
index 10904ec3785342e05b730de0456cf25b443af7d1..2be807eee81ba23cb335e8830fb196c6f19f1425 100644
--- a/src/monitoring/monitoring_pb2_grpc.py
+++ b/src/monitoring/monitoring_pb2_grpc.py
@@ -1,98 +1,166 @@
 # Generated by the gRPC Python protocol compiler plugin. DO NOT EDIT!
+"""Client and server classes corresponding to protobuf-defined services."""
 import grpc
 
-import context_pb2 as context__pb2
-import monitoring_pb2 as monitoring__pb2
+from . import context_pb2 as context__pb2
+from . import monitoring_pb2 as monitoring__pb2
 
 
 class MonitoringServiceStub(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def __init__(self, channel):
-    """Constructor.
-
-    Args:
-      channel: A grpc.Channel.
-    """
-    self.IncludeKpi = channel.unary_unary(
-        '/monitoring.MonitoringService/IncludeKpi',
-        request_serializer=monitoring__pb2.Kpi.SerializeToString,
-        response_deserializer=context__pb2.Empty.FromString,
-        )
-    self.MonitorKpi = channel.unary_unary(
-        '/monitoring.MonitoringService/MonitorKpi',
-        request_serializer=monitoring__pb2.KpiDevice.SerializeToString,
-        response_deserializer=context__pb2.Empty.FromString,
-        )
-    self.GetStream_kpi = channel.unary_stream(
-        '/monitoring.MonitoringService/GetStream_kpi',
-        request_serializer=monitoring__pb2.KpiId.SerializeToString,
-        response_deserializer=monitoring__pb2.Kpi.FromString,
-        )
-    self.GetInstantKpi = channel.unary_unary(
-        '/monitoring.MonitoringService/GetInstantKpi',
-        request_serializer=monitoring__pb2.KpiId.SerializeToString,
-        response_deserializer=monitoring__pb2.Kpi.FromString,
-        )
+    """Missing associated documentation comment in .proto file."""
+
+    def __init__(self, channel):
+        """Constructor.
+
+        Args:
+            channel: A grpc.Channel.
+        """
+        self.IncludeKpi = channel.unary_unary(
+                '/monitoring.MonitoringService/IncludeKpi',
+                request_serializer=monitoring__pb2.Kpi.SerializeToString,
+                response_deserializer=context__pb2.Empty.FromString,
+                )
+        self.MonitorKpi = channel.unary_unary(
+                '/monitoring.MonitoringService/MonitorKpi',
+                request_serializer=monitoring__pb2.KpiDevice.SerializeToString,
+                response_deserializer=context__pb2.Empty.FromString,
+                )
+        self.GetStream_kpi = channel.unary_stream(
+                '/monitoring.MonitoringService/GetStream_kpi',
+                request_serializer=monitoring__pb2.KpiId.SerializeToString,
+                response_deserializer=monitoring__pb2.Kpi.FromString,
+                )
+        self.GetInstantKpi = channel.unary_unary(
+                '/monitoring.MonitoringService/GetInstantKpi',
+                request_serializer=monitoring__pb2.KpiId.SerializeToString,
+                response_deserializer=monitoring__pb2.Kpi.FromString,
+                )
 
 
 class MonitoringServiceServicer(object):
-  # missing associated documentation comment in .proto file
-  pass
-
-  def IncludeKpi(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 MonitorKpi(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 GetStream_kpi(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 GetInstantKpi(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 IncludeKpi(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 MonitorKpi(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 GetStream_kpi(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 GetInstantKpi(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_MonitoringServiceServicer_to_server(servicer, server):
-  rpc_method_handlers = {
-      'IncludeKpi': grpc.unary_unary_rpc_method_handler(
-          servicer.IncludeKpi,
-          request_deserializer=monitoring__pb2.Kpi.FromString,
-          response_serializer=context__pb2.Empty.SerializeToString,
-      ),
-      'MonitorKpi': grpc.unary_unary_rpc_method_handler(
-          servicer.MonitorKpi,
-          request_deserializer=monitoring__pb2.KpiDevice.FromString,
-          response_serializer=context__pb2.Empty.SerializeToString,
-      ),
-      'GetStream_kpi': grpc.unary_stream_rpc_method_handler(
-          servicer.GetStream_kpi,
-          request_deserializer=monitoring__pb2.KpiId.FromString,
-          response_serializer=monitoring__pb2.Kpi.SerializeToString,
-      ),
-      'GetInstantKpi': grpc.unary_unary_rpc_method_handler(
-          servicer.GetInstantKpi,
-          request_deserializer=monitoring__pb2.KpiId.FromString,
-          response_serializer=monitoring__pb2.Kpi.SerializeToString,
-      ),
-  }
-  generic_handler = grpc.method_handlers_generic_handler(
-      'monitoring.MonitoringService', rpc_method_handlers)
-  server.add_generic_rpc_handlers((generic_handler,))
+    rpc_method_handlers = {
+            'IncludeKpi': grpc.unary_unary_rpc_method_handler(
+                    servicer.IncludeKpi,
+                    request_deserializer=monitoring__pb2.Kpi.FromString,
+                    response_serializer=context__pb2.Empty.SerializeToString,
+            ),
+            'MonitorKpi': grpc.unary_unary_rpc_method_handler(
+                    servicer.MonitorKpi,
+                    request_deserializer=monitoring__pb2.KpiDevice.FromString,
+                    response_serializer=context__pb2.Empty.SerializeToString,
+            ),
+            'GetStream_kpi': grpc.unary_stream_rpc_method_handler(
+                    servicer.GetStream_kpi,
+                    request_deserializer=monitoring__pb2.KpiId.FromString,
+                    response_serializer=monitoring__pb2.Kpi.SerializeToString,
+            ),
+            'GetInstantKpi': grpc.unary_unary_rpc_method_handler(
+                    servicer.GetInstantKpi,
+                    request_deserializer=monitoring__pb2.KpiId.FromString,
+                    response_serializer=monitoring__pb2.Kpi.SerializeToString,
+            ),
+    }
+    generic_handler = grpc.method_handlers_generic_handler(
+            'monitoring.MonitoringService', rpc_method_handlers)
+    server.add_generic_rpc_handlers((generic_handler,))
+
+
+ # This class is part of an EXPERIMENTAL API.
+class MonitoringService(object):
+    """Missing associated documentation comment in .proto file."""
+
+    @staticmethod
+    def IncludeKpi(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, '/monitoring.MonitoringService/IncludeKpi',
+            monitoring__pb2.Kpi.SerializeToString,
+            context__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def MonitorKpi(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, '/monitoring.MonitoringService/MonitorKpi',
+            monitoring__pb2.KpiDevice.SerializeToString,
+            context__pb2.Empty.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetStream_kpi(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, '/monitoring.MonitoringService/GetStream_kpi',
+            monitoring__pb2.KpiId.SerializeToString,
+            monitoring__pb2.Kpi.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
+
+    @staticmethod
+    def GetInstantKpi(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, '/monitoring.MonitoringService/GetInstantKpi',
+            monitoring__pb2.KpiId.SerializeToString,
+            monitoring__pb2.Kpi.FromString,
+            options, channel_credentials,
+            insecure, call_credentials, compression, wait_for_ready, timeout, metadata)
diff --git a/src/monitoring/monitoring_server.py b/src/monitoring/monitoring_server.py
index aaa0d3895d57061133f1dbe83ce937c0994f42aa..7a237bef6c7248f63b5d1eef9f677a6dde5f807f 100644
--- a/src/monitoring/monitoring_server.py
+++ b/src/monitoring/monitoring_server.py
@@ -2,86 +2,94 @@
 
 import os
 from concurrent import futures
+from src.monitoring import context_pb2
 import grpc
 
-import numpy
+#import numpy
 import time
 
-import monitoring_pb2
-import monitoring_pb2_grpc
+from . import monitoring_pb2
+from . import monitoring_pb2_grpc
 
 from grpc_health.v1 import health
 from grpc_health.v1 import health_pb2
 from grpc_health.v1 import health_pb2_grpc
 
 
-from logger import getJSONLogger
-logger = getJSONLogger('monitoringservice-server')
-logger.setLevel('DEBUG')
+from .logger import getJSONLogger
+LOGGER = getJSONLogger('monitoringservice-server')
+LOGGER.setLevel('DEBUG')
 
 import threading
 
 from prometheus_client import start_http_server, Summary
 from prometheus_client import Counter, Gauge
 
+PORT = 7070
+
 MONITORING_GETINSTANTKPI_REQUEST_TIME = Summary('monitoring_getinstantkpi_processing_seconds', 'Time spent processing monitoring instant kpi request')
 MONITORING_INCLUDEKPI_COUNTER = Counter('monitoring_includekpi_counter', 'Monitoring include kpi request counter')
 
 
-class monitoringService(monitoring_pb2_grpc.MonitoringServiceServicer):
+class MonitoringServiceServicerImpl(monitoring_pb2_grpc.MonitoringServiceServicer):
     def __init__(self):
-        logger.info("init monitoringService")
+        LOGGER.info('Init monitoringService')
 
 
     def IncludeKpi(self, request, context):
-        #KPI, returns empty
-        logger.info("IncludeKpi")
+        # receives monitoring.KPI returns context.Empty
+        LOGGER.info('IncludeKpi')
         MONITORING_INCLUDEKPI_COUNTER.inc()
-        return
+        return context_pb2.Empty()
 
 
     def MonitorKpi ( self, request, context):
-        #KpiDevice returns (google.protobuf.Empty) {}
-        logger.info("IncludeKpi")
-        return
+        # receives monitoring.KpiDevice returns context.Empty
+        LOGGER.info('IncludeKpi')
+        return context_pb2.Empty()
 
     def GetStream_kpi ( self, request, context):
-        #KpiId ) returns (stream Kpi) {}
-        logger.info("IncludeKpi")
+        # receives monitoring.KpiId returns stream monitoring.Kpi
+        LOGGER.info('IncludeKpi')
         return
 
     @MONITORING_GETINSTANTKPI_REQUEST_TIME.time()
     def GetInstantKpi ( self, request, context):
-        #KpiId ) returns ( Kpi) {}
-        logger.info("IncludeKpi")
-        return
-
-
-if __name__ == "__main__":
-    logger.info("initializing monitoringService")
-
-    port = os.environ.get('PORT', "7070")
+        # receives monitoring.KpiId returns monitoring.Kpi
+        LOGGER.info('IncludeKpi')
+        return monitoring_pb2.Kpi()
 
+def start_server(address='[::]', port=PORT, max_workers=10):
     # create gRPC server
-    serverGRPC = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) # ,interceptors=(tracer_interceptor,))
+    serverGRPC = grpc.server(futures.ThreadPoolExecutor(max_workers=max_workers)) # ,interceptors=(tracer_interceptor,))
 
-    # add class to gRPC server
-    service = monitoringService()
-    monitoring_pb2_grpc.add_MonitoringServiceServicer_to_server(service, serverGRPC)
+    # add monitoring servicer class to gRPC server
+    monitoring_servicer = MonitoringServiceServicerImpl()
+    monitoring_pb2_grpc.add_MonitoringServiceServicer_to_server(monitoring_servicer, serverGRPC)
 
-    health_servicer = health.HealthServicer(experimental_non_blocking=True,experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1))
+    # add gRPC health checker servicer class to gRPC server
+    health_servicer = health.HealthServicer(
+        experimental_non_blocking=True, experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1))
     health_pb2_grpc.add_HealthServicer_to_server(health_servicer, serverGRPC)
 
     # start server
-    logger.info("listening on port: " + port)
-    serverGRPC.add_insecure_port('[::]:'+port)
+    endpoint = '{}:{}'.format(address, port)
+    LOGGER.info('Listening on {}'.format(endpoint))
+    serverGRPC.add_insecure_port(endpoint)
     serverGRPC.start()
-    health_servicer.set("", health_pb2.HealthCheckResponse.SERVING)
+    health_servicer.set('', health_pb2.HealthCheckResponse.SERVING) # pylint: disable=maybe-no-member
+    return(serverGRPC)
+
+def stop_server(serverGRPC, grace_period=0):
+    serverGRPC.stop(grace_period)
+
+if __name__ == '__main__':
+    LOGGER.info('initializing monitoringService')
+    port = os.environ.get('PORT', str(PORT))
+    serverGRPC = start_server(port=port)
 
     # keep alive
     try:
-         while True:
-            time.sleep(0.1)
+        while True: time.sleep(0.1)
     except KeyboardInterrupt:
-            serverGRPC.stop(0)
-
+        stop_server(serverGRPC)
diff --git a/src/monitoring/requirements.in b/src/monitoring/requirements.in
index b7eda3d6bcc625e18887caec6dc18a4f17b0c31c..bc7cb531e1c2b02215444d77a07565b8e393c0c7 100644
--- a/src/monitoring/requirements.in
+++ b/src/monitoring/requirements.in
@@ -7,4 +7,5 @@ python-json-logger
 google-cloud-profiler
 numpy
 prometheus-client
-
+pytest
+pytest-benchmark
diff --git a/src/monitoring/requirements.txt b/src/monitoring/requirements.txt
index 7b000b30e0b048875b2bcf56b4d9c1999c9f5e16..b8ecdfb63b74289c39cd6263b671ee7d9d22ef69 100644
--- a/src/monitoring/requirements.txt
+++ b/src/monitoring/requirements.txt
@@ -1,9 +1,11 @@
 #
-# This file is autogenerated by pip-compile
+# This file is autogenerated by pip-compile with python 3.9
 # To update, run:
 #
 #    pip-compile --output-file=requirements.txt requirements.in
 #
+attrs==21.2.0
+    # via pytest
 cachetools==4.2.2
     # via google-auth
 certifi==2021.5.30
@@ -20,16 +22,16 @@ google-api-python-client==2.8.0
     # via
     #   google-cloud-profiler
     #   google-python-cloud-debugger
-google-auth-httplib2==0.1.0
+google-auth==1.31.0
     # via
+    #   google-api-core
     #   google-api-python-client
+    #   google-auth-httplib2
     #   google-cloud-profiler
     #   google-python-cloud-debugger
-google-auth==1.31.0
+google-auth-httplib2==0.1.0
     # via
-    #   google-api-core
     #   google-api-python-client
-    #   google-auth-httplib2
     #   google-cloud-profiler
     #   google-python-cloud-debugger
 google-cloud-profiler==3.0.4
@@ -38,42 +40,60 @@ google-python-cloud-debugger==2.17
     # via -r requirements.in
 googleapis-common-protos==1.53.0
     # via google-api-core
-grpcio-health-checking==1.38.0
-    # via -r requirements.in
 grpcio==1.38.0
     # via
     #   -r requirements.in
     #   grpcio-health-checking
+grpcio-health-checking==1.38.0
+    # via -r requirements.in
 httplib2==0.19.1
     # via
     #   google-api-python-client
     #   google-auth-httplib2
 idna==2.10
     # via requests
+iniconfig==1.1.1
+    # via pytest
 numpy==1.20.3
     # via -r requirements.in
-opencensus-context==0.1.2
-    # via opencensus
 opencensus[stackdriver]==0.7.13
     # via -r requirements.in
+opencensus-context==0.1.2
+    # via opencensus
 packaging==20.9
-    # via google-api-core
+    # via
+    #   google-api-core
+    #   pytest
+pluggy==0.13.1
+    # via pytest
+prometheus-client==0.11.0
+    # via -r requirements.in
 protobuf==3.17.3
     # via
     #   google-api-core
     #   google-cloud-profiler
     #   googleapis-common-protos
     #   grpcio-health-checking
-pyasn1-modules==0.2.8
-    # via google-auth
+py==1.10.0
+    # via pytest
+py-cpuinfo==8.0.0
+    # via pytest-benchmark
 pyasn1==0.4.8
     # via
     #   pyasn1-modules
     #   rsa
+pyasn1-modules==0.2.8
+    # via google-auth
 pyparsing==2.4.7
     # via
     #   httplib2
     #   packaging
+pytest==6.2.4
+    # via
+    #   -r requirements.in
+    #   pytest-benchmark
+pytest-benchmark==3.4.1
+    # via -r requirements.in
 python-json-logger==2.0.1
     # via -r requirements.in
 pytz==2021.1
@@ -95,6 +115,8 @@ six==1.16.0
     #   google-python-cloud-debugger
     #   grpcio
     #   protobuf
+toml==0.10.2
+    # via pytest
 uritemplate==3.0.1
     # via google-api-python-client
 urllib3==1.26.5
diff --git a/src/monitoring/test_monitoring.py b/src/monitoring/test_monitoring.py
new file mode 100644
index 0000000000000000000000000000000000000000..905b0de677dcf0cb07a5c2232fd9cf10560c30c2
--- /dev/null
+++ b/src/monitoring/test_monitoring.py
@@ -0,0 +1,53 @@
+import logging, pytest, time
+from . import context_pb2
+from . import monitoring_pb2
+from .monitoring_server import start_server, stop_server
+from .monitoring_client import MonitoringClient
+
+LOGGER = logging.getLogger(__name__)
+LOGGER.setLevel(logging.DEBUG)
+
+SERVER_ADDRESS = '127.0.0.1'
+LISTEN_ADDRESS = '[::]'
+PORT = 7070
+
+# This fixture will be requested by test cases and last during testing session
+@pytest.fixture(scope='session')
+def monitoring_service():
+    LOGGER.warning('monitoring_service begin')
+
+    LOGGER.info('Initializing MonitoringService...')
+    server = start_server(address=LISTEN_ADDRESS, port=PORT)
+
+    # yield the server, when test finishes, execution will resume to stop it
+    LOGGER.warning('monitoring_service yielding')
+    yield server
+
+    LOGGER.info('Terminating MonitoringService...')
+    stop_server(server)
+
+# This fixture will be requested by test cases and last during testing session.
+# The client requires the server, so client fixture has the server as dependency.
+@pytest.fixture(scope='session')
+def monitoring_client(monitoring_service):
+    LOGGER.warning('monitoring_client begin')
+    client = MonitoringClient(server=SERVER_ADDRESS, port=PORT)    # instantiate the client
+    LOGGER.warning('monitoring_client returning')
+    return client
+
+# Test case that makes use of client fixture to test server's IncludeKpi method
+def test_include_kpi(monitoring_client):
+    LOGGER.warning('test_include_kpi begin')
+    # form request
+    kpi = monitoring_pb2.Kpi()
+    kpi.kpi_id.kpi_id.uuid = 'KPIID0000'    # pylint: disable=maybe-no-member
+    kpi.kpiDescription = 'KPI Desc'
+
+    # make call to server
+    LOGGER.warning('test_include_kpi requesting')
+    response = monitoring_client.IncludeKpi(kpi)
+    LOGGER.debug(str(response))
+    assert isinstance(response, context_pb2.Empty)
+
+# You can add as many tests as you want. Just copy the "def test_include_kpi(monitoring_client):" and implement
+# appropriate tests. monitoring_client and monitoring_service fixtures and their connection are reused along tests.