diff --git a/src/monitoring/README.md b/src/monitoring/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..8a79168d9f579f0faa614a09fe36a1f0d02bc40c
--- /dev/null
+++ b/src/monitoring/README.md
@@ -0,0 +1,68 @@
+# How to run locally the monitoring service (tested in Ubuntu 20.04)
+
+
+## Download the grpc health probe
+
+`
+GRPC_HEALTH_PROBE_VERSION=v0.2.0 
+`
+
+`
+wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64
+`
+
+`
+chmod +x /bin/grpc_health_probe
+`
+
+## Get packages
+
+`
+python3 -m pip install pip-tools
+`
+
+`
+python3 -m pip install -r requirements.txt
+`
+
+## Install prometheus client
+
+`
+pip3 install prometheus_client
+`
+
+## Execute server
+`
+cd monitoring
+`
+
+`
+python3 monitoring/monitoring_server.py
+`
+
+## Execute client
+`
+python3 monitoring_client.py
+`
+
+# How to create and execute the monitoring server in a docker container
+
+## Install docker
+`
+curl -fsSL https://get.docker.com -o get-docker.sh
+`
+sudo sh get-docker.sh
+`
+## Build service
+`
+cd src
+`
+
+`
+./build.sh
+`
+
+## Run service
+`
+./start.sh
+`
diff --git a/src/monitoring/build.sh b/src/monitoring/build.sh
new file mode 100755
index 0000000000000000000000000000000000000000..41bf3f32c9e4328ba57e5c4a2fc537a9c9f54319
--- /dev/null
+++ b/src/monitoring/build.sh
@@ -0,0 +1,7 @@
+#!/usr/bin/env bash
+
+echo "BUILD monitoring server"
+docker build -t "monitoring:dockerfile" -f Dockerfile .
+
+echo "BUILD monitoring client"
+docker build -t "monitoring_client:dockerfile" -f tests/Dockerfile .
diff --git a/src/monitoring/clean.sh b/src/monitoring/clean.sh
new file mode 100755
index 0000000000000000000000000000000000000000..58667a9e6c127181e243c7b29e9c7bf0891cebff
--- /dev/null
+++ b/src/monitoring/clean.sh
@@ -0,0 +1,6 @@
+#!/usr/bin/env bash
+
+docker rm --force monitoring
+docker rm --force monitoring_client
+docker network remove teraflowbridge
+
diff --git a/src/monitoring/context_pb2.py b/src/monitoring/context_pb2.py
index 5930d483e211a51816f87595ed4bb12848ee9a44..cb90ca043992be439f4ff4635401424bd10294a8 100644
--- a/src/monitoring/context_pb2.py
+++ b/src/monitoring/context_pb2.py
@@ -20,7 +20,7 @@ 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')
+  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(
@@ -40,8 +40,8 @@ _DEVICEOPERATIONALSTATUS = _descriptor.EnumDescriptor(
   ],
   containing_type=None,
   serialized_options=None,
-  serialized_start=939,
-  serialized_end=991,
+  serialized_start=1195,
+  serialized_end=1247,
 )
 _sym_db.RegisterEnumDescriptor(_DEVICEOPERATIONALSTATUS)
 
@@ -83,19 +83,26 @@ _CONTEXT = _descriptor.Descriptor(
   containing_type=None,
   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),
     _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),
+    _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),
   ],
   extensions=[
   ],
@@ -109,7 +116,38 @@ _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,
+  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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=160,
+  serialized_end=207,
 )
 
 
@@ -121,15 +159,22 @@ _TOPOLOGY = _descriptor.Descriptor(
   containing_type=None,
   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),
+    _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),
     _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,
@@ -146,8 +191,8 @@ _TOPOLOGY = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=121,
-  serialized_end=193,
+  serialized_start=209,
+  serialized_end=318,
 )
 
 
@@ -177,8 +222,46 @@ _LINK = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=195,
-  serialized_end=244,
+  serialized_start=320,
+  serialized_end=369,
+)
+
+
+_TOPOLOGYID = _descriptor.Descriptor(
+  name='TopologyId',
+  full_name='context.TopologyId',
+  filename=None,
+  file=DESCRIPTOR,
+  containing_type=None,
+  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),
+    _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),
+  ],
+  extensions=[
+  ],
+  nested_types=[],
+  enum_types=[
+  ],
+  serialized_options=None,
+  is_extendable=False,
+  syntax='proto3',
+  extension_ranges=[],
+  oneofs=[
+  ],
+  serialized_start=371,
+  serialized_end=453,
 )
 
 
@@ -215,8 +298,8 @@ _CONSTRAINT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=246,
-  serialized_end=309,
+  serialized_start=455,
+  serialized_end=518,
 )
 
 
@@ -274,8 +357,8 @@ _DEVICE = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=312,
-  serialized_end=530,
+  serialized_start=521,
+  serialized_end=739,
 )
 
 
@@ -305,8 +388,8 @@ _DEVICECONFIG = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=532,
-  serialized_end=569,
+  serialized_start=741,
+  serialized_end=778,
 )
 
 
@@ -343,8 +426,8 @@ _ENDPOINT = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=571,
-  serialized_end=638,
+  serialized_start=780,
+  serialized_end=847,
 )
 
 
@@ -356,7 +439,7 @@ _ENDPOINTID = _descriptor.Descriptor(
   containing_type=None,
   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,
@@ -369,6 +452,13 @@ _ENDPOINTID = _descriptor.Descriptor(
       message_type=None, enum_type=None, containing_type=None,
       is_extension=False, extension_scope=None,
       serialized_options=None, file=DESCRIPTOR),
+    _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),
   ],
   extensions=[
   ],
@@ -381,8 +471,8 @@ _ENDPOINTID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=640,
-  serialized_end=719,
+  serialized_start=849,
+  serialized_end=965,
 )
 
 
@@ -412,8 +502,8 @@ _DEVICEID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=721,
-  serialized_end=765,
+  serialized_start=967,
+  serialized_end=1011,
 )
 
 
@@ -443,8 +533,8 @@ _UUID = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=767,
-  serialized_end=787,
+  serialized_start=1013,
+  serialized_end=1033,
 )
 
 
@@ -481,8 +571,8 @@ _TERAFLOWCONTROLLER = _descriptor.Descriptor(
   extension_ranges=[],
   oneofs=[
   ],
-  serialized_start=789,
-  serialized_end=859,
+  serialized_start=1035,
+  serialized_end=1110,
 )
 
 
@@ -519,29 +609,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
@@ -568,6 +666,13 @@ Context = _reflection.GeneratedProtocolMessageType('Context', (_message.Message,
   ))
 _sym_db.RegisterMessage(Context)
 
+ContextId = _reflection.GeneratedProtocolMessageType('ContextId', (_message.Message,), dict(
+  DESCRIPTOR = _CONTEXTID,
+  __module__ = 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.ContextId)
+  ))
+_sym_db.RegisterMessage(ContextId)
+
 Topology = _reflection.GeneratedProtocolMessageType('Topology', (_message.Message,), dict(
   DESCRIPTOR = _TOPOLOGY,
   __module__ = 'context_pb2'
@@ -582,6 +687,13 @@ Link = _reflection.GeneratedProtocolMessageType('Link', (_message.Message,), dic
   ))
 _sym_db.RegisterMessage(Link)
 
+TopologyId = _reflection.GeneratedProtocolMessageType('TopologyId', (_message.Message,), dict(
+  DESCRIPTOR = _TOPOLOGYID,
+  __module__ = 'context_pb2'
+  # @@protoc_insertion_point(class_scope:context.TopologyId)
+  ))
+_sym_db.RegisterMessage(TopologyId)
+
 Constraint = _reflection.GeneratedProtocolMessageType('Constraint', (_message.Message,), dict(
   DESCRIPTOR = _CONSTRAINT,
   __module__ = 'context_pb2'
@@ -653,8 +765,8 @@ _CONTEXTSERVICE = _descriptor.ServiceDescriptor(
   file=DESCRIPTOR,
   index=0,
   serialized_options=None,
-  serialized_start=993,
-  serialized_end=1061,
+  serialized_start=1249,
+  serialized_end=1317,
   methods=[
   _descriptor.MethodDescriptor(
     name='GetTopology',
diff --git a/src/monitoring/monitoring_client.py b/src/monitoring/monitoring_client.py
index 955b512f137a61b8a4e2df93afaeeee5f8bb05cc..db70e6e2a5923fc14cba5de234e9e5b3a3cbff5b 100644
--- a/src/monitoring/monitoring_client.py
+++ b/src/monitoring/monitoring_client.py
@@ -1,9 +1,9 @@
 import sys
 import grpc
 
-import monitoring
+import monitoring_pb2 as monitoring
 import monitoring_pb2_grpc
-import context
+import context_pb2
 
 import json
 
@@ -16,7 +16,7 @@ class MonitoringClient:
     def __init__(self, server="monitoring", port="7070"):
         logger.info("init monitoringClient port " + port)
         self.channel=grpc.insecure_channel(server+':'+port)
-        self.server=usc_pb2_grpc.MonitoringServiceStub(self.channel)
+        self.server=monitoring_pb2_grpc.MonitoringServiceStub(self.channel)
 
     def IncludeKpi(self, request):
         logger.info("IncludeKpi: {}".format(request))
@@ -50,12 +50,12 @@ if __name__ == "__main__":
     else:
         port = "7070"
 
-
     # form request
     kpi = monitoring.Kpi()
-    kpi.kpi_id.kpi_id = "KPIID0000"
-    kpi.kpiDescription "KPI Desc"
-    
+    monitoring.KpiId.kpi_id = "KPIID0000"
+    kpi.kpiDescription = "KPI Desc"
+
+
     # make call to server
     client = MonitoringClient(port)
     response=client.IncludeKpi(kpi)
diff --git a/src/monitoring/monitoring_server.py b/src/monitoring/monitoring_server.py
index e7713e44d3d59db572f2c13676a289883d20f7bb..66c85e2e613324cbd40c64135bf275c62e13b736 100644
--- a/src/monitoring/monitoring_server.py
+++ b/src/monitoring/monitoring_server.py
@@ -19,8 +19,6 @@ from logger import getJSONLogger
 logger = getJSONLogger('monitoringservice-server')
 logger.setLevel('DEBUG')
 
-from prometheus_client import start_http_server, Summary
-
 import threading
 
 from prometheus_client import start_http_server, Summary
@@ -39,24 +37,24 @@ class monitoringService(monitoring_pb2_grpc.MonitoringServiceServicer):
         #KPI, returns empty
         logger.info("IncludeKpi")
         MONITORING_INCLUDEKPI_COUNTER.inc()
-        return 
+        return
 
 
     def MonitorKpi ( self, request, context):
         #KpiDevice returns (google.protobuf.Empty) {}
         logger.info("IncludeKpi")
-        return 
+        return
 
     def GetStream_kpi ( self, request, context):
         #KpiId ) returns (stream Kpi) {}
         logger.info("IncludeKpi")
-        return 
+        return
 
     @MONITORING_GETINSTANTKPI_REQUEST_TIME.time()
     def GetInstantKpi ( self, request, context):
         #KpiId ) returns ( Kpi) {}
         logger.info("IncludeKpi")
-        return   
+        return
 
 
 if __name__ == "__main__":
@@ -68,7 +66,7 @@ if __name__ == "__main__":
     serverGRPC = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) # ,interceptors=(tracer_interceptor,))
 
     # add class to gRPC server
-    service = monitoring_pb2_grpc.MonitoringService()
+    service = monitoring_pb2_grpc.MonitoringServiceServicer()
     monitoring_pb2_grpc.add_MonitoringServiceServicer_to_server(service, serverGRPC)
 
     health_servicer = health.HealthServicer(experimental_non_blocking=True,experimental_thread_pool=futures.ThreadPoolExecutor(max_workers=1))
diff --git a/src/monitoring/requirements.txt b/src/monitoring/requirements.txt
index 7b000b30e0b048875b2bcf56b4d9c1999c9f5e16..66f5f281c342c6c62864c83f721b91497f529be9 100644
--- a/src/monitoring/requirements.txt
+++ b/src/monitoring/requirements.txt
@@ -1,4 +1,7 @@
-#
+#raise _InactiveRpcError(state)
+grpc._channel._InactiveRpcError: <_InactiveRpcError of RPC that terminated with:
+	status = StatusCode.UNAVAILABLE
+	details = "DNS resolution failed for service: 7070:7070"
 # This file is autogenerated by pip-compile
 # To update, run:
 #
diff --git a/src/monitoring/start.sh b/src/monitoring/start.sh
new file mode 100755
index 0000000000000000000000000000000000000000..dd12fc87cc7b75ebf61e59e3a00fe269fc3af60b
--- /dev/null
+++ b/src/monitoring/start.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+docker network create -d bridge teraflowbridge
+
+docker run -d -p 7070:7070 --name monitoring --network=teraflowbridge monitoring:dockerfile
+docker run -d -p --name monitoring_client --network=teraflowbridge monitoring_client:dockerfile
diff --git a/src/monitoring/tests/Dockerfile b/src/monitoring/tests/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..32a8af2f744c7ac787d2b46d5c3fb5a638d97f5a
--- /dev/null
+++ b/src/monitoring/tests/Dockerfile
@@ -0,0 +1,28 @@
+FROM python:3-slim
+RUN apt-get update -qqy && \
+	apt-get -qqy install wget g++ && \
+	rm -rf /var/lib/apt/lists/*
+# show python logs as they occur
+ENV PYTHONUNBUFFERED=0
+
+# download the grpc health probe
+RUN GRPC_HEALTH_PROBE_VERSION=v0.2.0 && \
+    wget -qO/bin/grpc_health_probe https://github.com/grpc-ecosystem/grpc-health-probe/releases/download/${GRPC_HEALTH_PROBE_VERSION}/grpc_health_probe-linux-amd64 && \
+    chmod +x /bin/grpc_health_probe
+
+# get packages
+WORKDIR /monitoring
+COPY monitoring/requirements.in requirements.in
+RUN python3 -m pip install pip-tools
+RUN pip-compile --output-file=requirements.txt requirements.in
+RUN python3 -m pip install -r requirements.txt
+
+# add files into working directory
+COPY /monitoring/. .
+COPY /common/logger.py .
+
+# set listen port
+
+ENTRYPOINT ["python", "/monitoring/monitoring_client.py"]
+
+