diff --git a/proto/l3_attackmitigator.proto b/proto/l3_attackmitigator.proto
index 39333718a5904d1617ba827d35149687ff903b65..532f2b6fdf3f555e06c6dd4bc995f60dc65bca07 100644
--- a/proto/l3_attackmitigator.proto
+++ b/proto/l3_attackmitigator.proto
@@ -27,13 +27,16 @@ service L3Attackmitigator{
 message L3AttackmitigatorOutput {
 	float confidence = 1;
 	string timestamp = 2;
-	string ip_o = 3;	
-	string tag_name = 4;
-	int32 tag = 5;
-	string flow_id = 6;
-	string protocol = 7;
-	string port_d = 8;
-	string ml_id = 9;
-	float time_start = 10;
-	float time_end = 11;
+	string ip_o = 3;
+	string ip_d = 4;	
+	string tag_name = 5;
+	int32 tag = 6;
+	string flow_id = 7;
+	string protocol = 8;
+	string port_o = 9;
+	string port_d = 10;
+	string ml_id = 11;
+	string service_id = 12; 
+	float time_start = 13;
+	float time_end = 14;
 }
diff --git a/proto/l3_centralizedattackdetector.proto b/proto/l3_centralizedattackdetector.proto
index 3cb1b0991b1dc4df2c268d511c0ebd6f9f9d80aa..e3358dcd705978f62e9ce500d3e0ddce7b7428f7 100644
--- a/proto/l3_centralizedattackdetector.proto
+++ b/proto/l3_centralizedattackdetector.proto
@@ -43,9 +43,10 @@ message L3CentralizedattackdetectorMetrics {
 	string ip_d = 11;
 	string port_d = 12;
 	string flow_id = 13;
-	string protocol = 14;
-	float time_start = 15;
-	float time_end = 16;
+	string service_id = 14;
+	string protocol = 15;
+	float time_start = 16;
+	float time_end = 17;
 }
 
 message Empty {
diff --git a/src/l3_attackmitigator/service/l3_attackmitigatorServiceServicerImpl.py b/src/l3_attackmitigator/service/l3_attackmitigatorServiceServicerImpl.py
index 8664704524ecef779235af3ca3dc765af7af4898..e53bcd214f57cb351cb2f3d24787898dce8bf155 100644
--- a/src/l3_attackmitigator/service/l3_attackmitigatorServiceServicerImpl.py
+++ b/src/l3_attackmitigator/service/l3_attackmitigatorServiceServicerImpl.py
@@ -14,41 +14,261 @@
 
 from __future__ import print_function
 import logging
-from common.proto.l3_attackmitigator_pb2 import (
-    EmptyMitigator
+from common.proto.l3_centralizedattackdetector_pb2 import (
+    Empty
 )
 from common.proto.l3_attackmitigator_pb2_grpc import (
     L3AttackmitigatorServicer,
 )
+from common.proto.context_pb2 import (
+    Service, ServiceId, ServiceConfig, ServiceTypeEnum, ServiceStatusEnum, ServiceStatus, Context, ContextId, Uuid, Timestamp, ConfigRule, ConfigRule_Custom, ConfigActionEnum, Device, DeviceId, DeviceConfig, DeviceOperationalStatusEnum, DeviceDriverEnum, EndPoint, Link, LinkId, EndPoint, EndPointId, Topology, TopologyId
+)
+from common.proto.context_pb2_grpc import (
+    ContextServiceStub
+)
+from common.proto.service_pb2_grpc import (
+    ServiceServiceStub
+)
+from datetime import datetime
+import grpc
 
 LOGGER = logging.getLogger(__name__)
+CONTEXT_CHANNEL = "192.168.165.78:1010"
+SERVICE_CHANNEL = "192.168.165.78:3030"
 
 class l3_attackmitigatorServiceServicerImpl(L3AttackmitigatorServicer):
 
+    def GetNewService(self, service_id):
+        service = Service()
+        service_id_obj = self.GenerateServiceId(service_id)
+        """
+        ServiceId()
+        context_id = ContextId()
+        uuid = Uuid()
+        uuid.uuid = service_id
+        context_id.context_uuid.CopyFrom(uuid)
+        service_id_obj.context_id.CopyFrom(context_id)
+        service_id_obj.service_uuid.CopyFrom(uuid)
+        """
+        service.service_id.CopyFrom(service_id_obj)
+        service.service_type = ServiceTypeEnum.SERVICETYPE_L3NM
+        service_status = ServiceStatus()
+        service_status.service_status = ServiceStatusEnum.SERVICESTATUS_ACTIVE
+        service.service_status.CopyFrom(service_status)
+        timestamp = Timestamp()
+        timestamp.timestamp = datetime.timestamp(datetime.now())
+        service.timestamp.CopyFrom(timestamp)
+        return service
+    
+    def GetNewContext(self, service_id):
+        context = Context()
+        context_id = ContextId()
+        uuid = Uuid()
+        uuid.uuid = service_id
+        context_id.context_uuid.CopyFrom(uuid)
+        context.context_id.CopyFrom(context_id)
+        return context
+
+    def GetNewDevice(self, service_id):
+        device = Device()
+        device_id = DeviceId()
+        uuid = Uuid()
+        uuid.uuid = service_id
+        device_id.device_uuid.CopyFrom(uuid)
+        device.device_type="test"
+        device.device_id.CopyFrom(device_id)
+        device.device_operational_status = DeviceOperationalStatusEnum.DEVICEOPERATIONALSTATUS_ENABLED
+        return device
+
+    def GetNewLink(self, service_id):
+        link = Link()
+        link_id = LinkId()
+        uuid = Uuid()
+        uuid.uuid = service_id
+        link_id.link_uuid.CopyFrom(uuid)
+        link.link_id.CopyFrom(link_id)
+        return link
+
+    def GetNewTopology(self,context_id, device_id, link_id):
+        topology = Topology()
+        topology_id = TopologyId()
+        topology_id.context_id.CopyFrom(context_id)
+        uuid = Uuid()
+        uuid.uuid = "test_crypto"
+        topology_id.topology_uuid.CopyFrom(uuid)
+        topology.topology_id.CopyFrom(topology_id)
+        topology.device_ids.extend([device_id])
+        topology.link_ids.extend([link_id])
+        return topology
+
+    def GetNewEndpoint(self, topology_id, device_id, uuid_name):
+        endpoint = EndPoint()
+        endpoint_id = EndPointId()
+        endpoint_id.topology_id.CopyFrom(topology_id)
+        endpoint_id.device_id.CopyFrom(device_id)
+        uuid = Uuid()
+        uuid.uuid = uuid_name
+        endpoint_id.endpoint_uuid.CopyFrom(uuid)
+        endpoint.endpoint_id.CopyFrom(endpoint_id)
+        endpoint.endpoint_type = "test"
+        return endpoint
+        
+
     def __init__(self):
         LOGGER.debug("Creating Servicer...")
         self.last_value = -1
         self.last_tag = 0
-    
+        
+        context = self.GetNewContext("test_crypto")
+        print(context, flush=True)
+        print(self.SetContext(context))
+
+        service = self.GetNewService("test_crypto")
+        print("This is the new service", self.CreateService(service), flush = True)
+
+        ip_o = "127.0.0.1"
+        ip_d = "127.0.0.2"
+        port_o = "123"
+        port_d = "124"
+
+        service_id = self.GenerateServiceId("test_crypto")
+
+        config_rule = self.GetConfigRule(ip_o, ip_d, port_o, port_d)
+
+        service = self.GetService(service_id)
+        print("Service obtained from id", service, flush=True)
+        
+        config_rule = self.GetConfigRule(ip_o, ip_d, port_o, port_d)
+
+        #service_config = service.service_config
+        #service_config.append(config_rule)
+        
+        service_config = ServiceConfig()
+        service_config.config_rules.extend([config_rule])
+        service.service_config.CopyFrom(service_config)
+        
+        device = self.GetNewDevice("test_crypto")
+        print("New device", device, flush=True)
+        device_id = self.SetDevice(device)
+
+        link = self.GetNewLink("test_crypto")
+        print("New link", link, flush=True)
+        link_id = self.SetLink(link)
+        
+        topology = self.GetNewTopology(context.context_id, device.device_id, link.link_id)
+        print("New topology", topology, flush=True)
+        topology_id = self.SetTopology(topology)
+
+        endpoint = self.GetNewEndpoint(topology.topology_id, device.device_id, "test_crypto")
+        print("New endpoint", endpoint, flush=True)
+        link.link_endpoint_ids.extend([endpoint.endpoint_id])
+
+        self.SetLink(link)
+
+        print("Service with new rule", service, flush=True)
+        self.UpdateService(service)
+
+        service2 = self.GetService(service_id)
+        print("Service obtained from id after updating", service2, flush=True)
+        
+
+    def GenerateRuleValue(self, ip_o, ip_d, port_o, port_d):
+        value = {
+            'ipv4:source-address': ip_o,
+            'ipv4:destination-address': ip_d,
+            'transport:source-port': port_o,
+            'transport:destination-port': port_d,
+            'forwarding-action': 'DROP',
+        }
+        return value
+
+    def GetConfigRule(self, ip_o, ip_d, port_o, port_d):
+        config_rule = ConfigRule()
+        config_rule_custom = ConfigRule_Custom()
+        config_rule.action = ConfigActionEnum.CONFIGACTION_SET
+        config_rule_custom.resource_key = 'test'
+        config_rule_custom.resource_value = str(self.GenerateRuleValue(ip_o, ip_d, port_o, port_d))
+        config_rule.custom.CopyFrom(config_rule_custom)
+        return config_rule
+
+    def GenerateServiceId(self, service_id):
+        service_id_obj = ServiceId()
+        context_id = ContextId()
+        uuid = Uuid()
+        uuid.uuid = service_id
+        context_id.context_uuid.CopyFrom(uuid)
+        service_id_obj.context_id.CopyFrom(context_id)
+        service_id_obj.service_uuid.CopyFrom(uuid)
+        return service_id_obj
+   
     def SendOutput(self, request, context):
         # SEND CONFIDENCE TO MITIGATION SERVER
-        logging.debug("")
-        print("Server received mitigation values...", request.confidence)
+        print("Server received mitigation values...", request.confidence, flush=True)
+        
         last_value = request.confidence
         last_tag = request.tag
+
+        ip_o = request.ip_o
+        ip_d = request.ip_d
+        port_o = request.port_o
+        port_d = request.port_d
+
+        service_id = self.GenerateServiceId(request.service_id)
+
+        config_rule = self.GetConfigRule(ip_o, ip_d, port_o, port_d)
+        
+        service = GetService(service_id)
+        print(service)
+        #service.config_rules.append(config_rule)
+        #UpdateService(service)
+
         # RETURN OK TO THE CALLER
-        return EmptyMitigator(
+        return Empty(
             message=f"OK, received values: {last_tag} with confidence {last_value}."
         )
+     
+    def SetDevice(self, device):
+        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
+            stub = ContextServiceStub(channel)
+            return stub.SetDevice(device)
+
+    def SetLink(self, link):
+        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
+            stub = ContextServiceStub(channel)
+            return stub.SetLink(link)
+
+    def SetTopology(self, link):
+        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
+            stub = ContextServiceStub(channel)
+            return stub.SetTopology(link)
+
+
+    def GetService(self, service_id):
+        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
+            stub = ContextServiceStub(channel)
+            return stub.GetService(service_id)
+
+    def SetContext(self, context):
+        with grpc.insecure_channel(CONTEXT_CHANNEL) as channel:
+            stub = ContextServiceStub(channel)
+            return stub.SetContext(context)
+
+    def UpdateService(self, service):
+        with grpc.insecure_channel(SERVICE_CHANNEL) as channel:
+            stub = ServiceServiceStub(channel)
+            stub.UpdateService(service)
+
+    def CreateService(self, service):
+        with grpc.insecure_channel(SERVICE_CHANNEL) as channel:
+            stub = ServiceServiceStub(channel)
+            stub.CreateService(service)
 
     def GetMitigation(self, request, context):
         # GET OR PERFORM MITIGATION STRATEGY
         logging.debug("")
         print("Returing mitigation strategy...")
         k = self.last_value * 2
-        return EmptyMitigator(
+        return Empty(
             message=f"Mitigation with double confidence = {k}"
         )
-
-
     
diff --git a/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl.py b/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl.py
index ad05b0ee62e87ce9028dc043b693c1b4cae008b3..a84ac181ee70c66908e5fbd1a1254eb56d9a3c9b 100644
--- a/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl.py
+++ b/src/l3_centralizedattackdetector/service/l3_centralizedattackdetectorServiceServicerImpl.py
@@ -70,12 +70,15 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
             "confidence": None,
             "timestamp": datetime.now().strftime("%d/%m/%Y %H:%M:%S"),
             "ip_o": request.ip_o,
+            "ip_d": request.ip_d,
             "tag_name": None,
             "tag": None,
             "flow_id": request.flow_id,
             "protocol": request.protocol,
+            "port_o": request.port_o,
             "port_d": request.port_d,
             "ml_id": "RandomForest",
+            "service_id": request.service_id,
             "time_start": request.time_start,
             "time_end": request.time_end,
         }
@@ -93,7 +96,7 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
     def SendInput(self, request, context):
         # PERFORM INFERENCE WITH SENT INPUTS
         logging.debug("")
-        print("Inferencing ...")
+        print("Inferencing ...", flush=True)
 
         # STORE VALUES
         self.inference_values.append(request)
@@ -102,22 +105,27 @@ class l3_centralizedattackdetectorServiceServicerImpl(L3Centralizedattackdetecto
         output = self.make_inference(request)
 
         # SEND INFO TO MITIGATION SERVER
+
+                
         try:
-                with grpc.insecure_channel("localhost:10002") as channel:
-                    stub = L3AttackmitigatorStub(channel)
-                    print("Sending to mitigator...")
-                    response = stub.SendOutput(output)
-                    print("Sent output to mitigator and received: ", response.message)
+            with grpc.insecure_channel("192.168.165.78:10002") as channel:
+                stub = L3AttackmitigatorStub(channel)
+                print("Sending to mitigator...")
+                response = stub.SendOutput(output)
+                #print("Response received", response, "Hola", flush=True)
+                #print("Sent output to mitigator and received: ", response.message) #FIX No message received
 
                 # RETURN "OK" TO THE CALLER
-                return Empty(
-                    message="OK, information received and mitigator notified"
-                )
-        except:
+            return Empty(
+                 message="OK, information received and mitigator notified"
+            )
+        except Exception as e:
+            print("This is an exception", repr(e), flush=True)
             print('Couldnt find l3_attackmitigator')
             return Empty(
                 message="Mitigator Not found"
             )
+        
 
     def GetOutput(self, request, context):
         logging.debug("")