diff --git a/src/kpi_management/kpi_manager/database/service/KpiModel.py b/src/kpi_management/kpi_manager/database/service/KpiModel.py
index 846f738f94cad77d0449c3abc0dc4554902b3aca..78276f59e41c9b6b26de8a960bc10526197fd182 100644
--- a/src/kpi_management/kpi_manager/database/service/KpiModel.py
+++ b/src/kpi_management/kpi_manager/database/service/KpiModel.py
@@ -18,7 +18,7 @@ from sqlalchemy import Column, Integer, String, Float, Text, ForeignKey
 # from sqlalchemy.ext.declarative import declarative_base
 from sqlalchemy.orm import registry
 from sqlalchemy.orm import sessionmaker, relationship
-
+from common.proto.kpi_management_pb2 import KpiDescriptor
 
 logging.basicConfig(level=logging.INFO)
 LOGGER = logging.getLogger(__name__)
@@ -31,14 +31,14 @@ class Kpi(Base):
     __tablename__ = 'kpi'
 
     kpi_id          = Column(UUID(as_uuid=False), primary_key=True)
-    kpi_description = Column(Text,    nullable=False)
-    kpi_sample_type = Column(Integer, nullable=False)
-    device_id       = Column(String,  nullable=False)
-    endpoint_id     = Column(String,  nullable=False)
-    service_id      = Column(String,  nullable=False)
-    slice_id        = Column(String,  nullable=False)
-    connection_id   = Column(String,  nullable=False)
-    link_id         = Column(String,  nullable=False)
+    kpi_description = Column(Text               , nullable=False)
+    kpi_sample_type = Column(Integer            , nullable=False)
+    device_id       = Column(String             , nullable=False)
+    endpoint_id     = Column(String             , nullable=False)
+    service_id      = Column(String             , nullable=False)
+    slice_id        = Column(String             , nullable=False)
+    connection_id   = Column(String             , nullable=False)
+    link_id         = Column(String             , nullable=False)
 
     # helps in logging the information
     def __repr__(self):
@@ -49,20 +49,39 @@ class Kpi(Base):
                 f"link_id='{self.link_id}')>")
 
     @classmethod
-    def create_row_from_kpiDescriptor(cls, request):
+    def convert_KpiDescriptor_to_row(cls, request):
         """
         Create an instance of Kpi from a request object.
-        Args: request: The request object containing the data.
+        Args:    request: The request object containing the data.
         Returns: An instance of Kpi initialized with data from the request.
         """
         return cls(
-            kpi_id=request.kpi_id.kpi_id.uuid,
-            kpi_description=request.kpi_description,
-            kpi_sample_type=request.kpi_sample_type,
-            device_id=request.device_id.device_uuid.uuid,
-            endpoint_id=request.endpoint_id.endpoint_uuid.uuid,
-            service_id=request.service_id.service_uuid.uuid,
-            slice_id=request.slice_id.slice_uuid.uuid,
-            connection_id=request.connection_id.connection_uuid.uuid,
-            link_id=request.link_id.link_uuid.uuid
-        )
\ No newline at end of file
+            kpi_id          = request.kpi_id.kpi_id.uuid,
+            kpi_description = request.kpi_description,
+            kpi_sample_type = request.kpi_sample_type,
+            device_id       = request.device_id.device_uuid.uuid,
+            endpoint_id     = request.endpoint_id.endpoint_uuid.uuid,
+            service_id      = request.service_id.service_uuid.uuid,
+            slice_id        = request.slice_id.slice_uuid.uuid,
+            connection_id   = request.connection_id.connection_uuid.uuid,
+            link_id         = request.link_id.link_uuid.uuid
+        )
+    
+    @classmethod
+    def convert_row_to_KpiDescriptor(cls, row):
+        """
+        Create and return a dictionary representation of a Kpi instance.       
+        Args:   row: The Kpi instance (row) containing the data.
+        Returns: KpiDescriptor object
+        """
+        response = KpiDescriptor()
+        response.kpi_id.kpi_id.uuid                 = row.kpi_id
+        response.kpi_description                    = row.kpi_description
+        response.kpi_sample_type                    = row.kpi_sample_type
+        response.service_id.service_uuid.uuid       = row.service_id
+        response.device_id.device_uuid.uuid         = row.device_id
+        response.slice_id.slice_uuid.uuid           = row.slice_id
+        response.endpoint_id.endpoint_uuid.uuid     = row.endpoint_id
+        response.connection_id.connection_uuid.uuid = row.connection_id
+        response.link_id.link_uuid.uuid             = row.link_id
+        return response
\ No newline at end of file
diff --git a/src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py b/src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py
index 3d96c98dde9599d93db113a7543896e70e2fcb8f..3a3052182d7c8cf724f5c1abbaeda4d3c07c5223 100644
--- a/src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py
+++ b/src/kpi_management/kpi_manager/service/KpiManagerServiceServicerImpl.py
@@ -37,24 +37,13 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
         LOGGER.info('Init KpiManagerService')
         self.Kpi_DBobj = Kpi_DB()
     
-
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def SetKpiDescriptor(self, request: KpiDescriptor, grpc_context: grpc.ServicerContext # type: ignore
                         ) -> KpiId: # type: ignore
         response = KpiId()
         LOGGER.info("Received gRPC message object: {:}".format(request))
         try:
-            # kpi_to_insert                 = KpiModel()
-            # kpi_to_insert.kpi_id          = request.kpi_id.kpi_id.uuid
-            # kpi_to_insert.kpi_description = request.kpi_description
-            # kpi_to_insert.kpi_sample_type = request.kpi_sample_type
-            # kpi_to_insert.device_id       = request.device_id.device_uuid.uuid
-            # kpi_to_insert.endpoint_id     = request.endpoint_id.endpoint_uuid.uuid 
-            # kpi_to_insert.service_id      = request.service_id.service_uuid.uuid 
-            # kpi_to_insert.slice_id        = request.slice_id.slice_uuid.uuid 
-            # kpi_to_insert.connection_id   = request.connection_id.connection_uuid.uuid
-            # kpi_to_insert.link_id         = request.link_id.link_uuid.uuid
-            kpi_to_insert = KpiModel.create_row_from_kpiDescriptor(request)
+            kpi_to_insert = KpiModel.convert_KpiDescriptor_to_row(request)
             if(self.Kpi_DBobj.add_row_to_db(kpi_to_insert)):
                 response.kpi_id.uuid = request.kpi_id.kpi_id.uuid
                 # LOGGER.info("Added Row: {:}".format(response))
@@ -71,15 +60,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
             kpi_id_to_search = request.kpi_id.uuid
             row = self.Kpi_DBobj.search_db_row_by_id(KpiModel, 'kpi_id', kpi_id_to_search)
             if row is not None:
-                response.kpi_id.kpi_id.uuid                 = row.kpi_id
-                response.kpi_description                    = row.kpi_description
-                response.kpi_sample_type                    = row.kpi_sample_type
-                response.service_id.service_uuid.uuid       = row.service_id
-                response.device_id.device_uuid.uuid         = row.device_id
-                response.slice_id.slice_uuid.uuid           = row.slice_id
-                response.endpoint_id.endpoint_uuid.uuid     = row.endpoint_id
-                response.connection_id.connection_uuid.uuid = row.connection_id
-                response.link_id.link_uuid.uuid             = row.link_id
+                response = KpiModel.convert_row_to_KpiDescriptor(row)
             return response
         except Exception as e:
             LOGGER.info('Unable to search kpi id. {:}'.format(e))
@@ -118,15 +99,7 @@ class KpiManagerServiceServicerImpl(KpiManagerServiceServicer):
         try:
             if len(rows) != 0:
                 for row in rows:
-                    kpiDescriptor_obj = KpiDescriptor()
-                    kpiDescriptor_obj.kpi_id.kpi_id.uuid                 = row.kpi_id
-                    kpiDescriptor_obj.kpi_description                    = row.kpi_description
-                    kpiDescriptor_obj.kpi_sample_type                    = row.kpi_sample_type
-                    kpiDescriptor_obj.service_id.service_uuid.uuid       = row.service_id
-                    kpiDescriptor_obj.device_id.device_uuid.uuid         = row.device_id
-                    kpiDescriptor_obj.slice_id.slice_uuid.uuid           = row.slice_id
-                    kpiDescriptor_obj.endpoint_id.endpoint_uuid.uuid     = row.endpoint_id
-                    kpiDescriptor_obj.connection_id.connection_uuid.uuid = row.connection_id
+                    kpiDescriptor_obj = KpiModel.convert_row_to_KpiDescriptor(row)
                     response.kpi_descriptor_list.append(kpiDescriptor_obj)
             return response
         except Exception as e:
diff --git a/src/kpi_management/kpi_manager/tests/test_kpi_manager.py b/src/kpi_management/kpi_manager/tests/test_kpi_manager.py
index ca5f6af6f7a8d85679a0e6912590b3caa0774be5..531efc20ceaee4244331ad8cecef584e2f9b7e1e 100755
--- a/src/kpi_management/kpi_manager/tests/test_kpi_manager.py
+++ b/src/kpi_management/kpi_manager/tests/test_kpi_manager.py
@@ -43,7 +43,7 @@ from device.service.driver_api.DriverInstanceCache import DriverInstanceCache
 from device.service.DeviceService import DeviceService
 from device.client.DeviceClient import DeviceClient
 
-from kpi_management.kpi_manager.tests.test_messages import create_kpi_descriptor_request
+from kpi_management.kpi_manager.tests.test_messages import create_kpi_descriptor_request, create_kpi_filter_request
 # from monitoring.service.MonitoringService import MonitoringService
 from kpi_management.kpi_manager.service.KpiManagerService import KpiManagerService
 # from monitoring.client.MonitoringClient import MonitoringClient
@@ -219,14 +219,32 @@ def test_SetKpiDescriptor(kpi_manager_client):
 def test_DeleteKpiDescriptor(kpi_manager_client):
     LOGGER.info(" >>> test_DeleteKpiDescriptor: START <<< ")
     # adding KPI
-    response = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request())
+    response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request())
     # deleting KPI
-    del_response = kpi_manager_client.DeleteKpiDescriptor(response)
-    # verifing KPI
-    kpi_manager_client.GetKpiDescriptor(response)
+    del_response = kpi_manager_client.DeleteKpiDescriptor(response_id)
+    # select KPI
+    kpi_manager_client.GetKpiDescriptor(response_id)
     LOGGER.info("Response of delete method gRPC message object: {:}".format(del_response))
     assert isinstance(del_response, Empty)
 
+def test_GetKpiDescriptor(kpi_manager_client):
+    LOGGER.info(" >>> test_GetKpiDescriptor: START <<< ")
+    # adding KPI
+    response_id = kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request())
+    # get KPI
+    response = kpi_manager_client.GetKpiDescriptor(response_id)
+    LOGGER.info("Response gRPC message object: {:}".format(response))
+    assert isinstance(response, KpiDescriptor)
+
+def test_SelectKpiDescriptor(kpi_manager_client):
+    LOGGER.info(" >>> test_SelectKpiDescriptor: START <<< ")
+    # adding KPI
+    kpi_manager_client.SetKpiDescriptor(create_kpi_descriptor_request())
+    # select KPI(s)    
+    response = kpi_manager_client.SelectKpiDescriptor(create_kpi_filter_request())
+    LOGGER.info("Response gRPC message object: {:}".format(response))
+    assert isinstance(response, KpiDescriptorList)
+
 
 # ---------- 2nd Iteration Tests -----------------
 # def test_SetKpiDescriptor(kpi_manager_client):
diff --git a/src/kpi_management/kpi_manager/tests/test_messages.py b/src/kpi_management/kpi_manager/tests/test_messages.py
index 7c2933b7a874e5c501358ed8808ed9da95f41dcb..e1cb4ddf60412cbb19d2bf355d99cf9063105751 100644
--- a/src/kpi_management/kpi_manager/tests/test_messages.py
+++ b/src/kpi_management/kpi_manager/tests/test_messages.py
@@ -15,16 +15,45 @@
 import uuid
 from common.proto import kpi_management_pb2
 from common.proto.kpi_sample_types_pb2 import KpiSampleType
+from common.proto.context_pb2 import DeviceId, LinkId, ServiceId, SliceId,\
+                             ConnectionId, EndPointId
 
 def create_kpi_descriptor_request(descriptor_name: str = "Test_name"):
     _create_kpi_request                                    = kpi_management_pb2.KpiDescriptor()
     _create_kpi_request.kpi_id.kpi_id.uuid                 = str(uuid.uuid4())
     _create_kpi_request.kpi_description                    = descriptor_name
     _create_kpi_request.kpi_sample_type                    = KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED
-    _create_kpi_request.device_id.device_uuid.uuid         = 'DEV1'     # pylint: disable=maybe-no-member
-    _create_kpi_request.service_id.service_uuid.uuid       = 'SERV1'    # pylint: disable=maybe-no-member
+    _create_kpi_request.device_id.device_uuid.uuid         = 'DEV2'     # pylint: disable=maybe-no-member
+    _create_kpi_request.service_id.service_uuid.uuid       = 'SERV2'    # pylint: disable=maybe-no-member
     _create_kpi_request.slice_id.slice_uuid.uuid           = 'SLC1'     # pylint: disable=maybe-no-member
     _create_kpi_request.endpoint_id.endpoint_uuid.uuid     = 'END1'     # pylint: disable=maybe-no-member
     _create_kpi_request.connection_id.connection_uuid.uuid = 'CON1'     # pylint: disable=maybe-no-member
     _create_kpi_request.link_id.link_uuid.uuid             = 'LNK1'     # pylint: disable=maybe-no-member
-    return _create_kpi_request
\ No newline at end of file
+    return _create_kpi_request
+
+def create_kpi_filter_request():
+    _create_kpi_filter_request = kpi_management_pb2.KpiDescriptorFilter()
+    _create_kpi_filter_request.kpi_sample_type.append(KpiSampleType.KPISAMPLETYPE_PACKETS_RECEIVED)
+
+    device_id_obj     = DeviceId()
+    service_id_obj    = ServiceId()
+    slice_id_obj      = SliceId()
+    endpoint_id_obj   = EndPointId()
+    connection_id_obj = ConnectionId()
+    link_id_obj       = LinkId()
+
+    device_id_obj.device_uuid.uuid         = "DEV2"
+    service_id_obj.service_uuid.uuid       = "SERV2"
+    slice_id_obj.slice_uuid.uuid           = "SLC1"
+    endpoint_id_obj.endpoint_uuid.uuid     = "END1"
+    connection_id_obj.connection_uuid.uuid = "CON1"
+    link_id_obj.link_uuid.uuid             = "LNK1"
+
+    _create_kpi_filter_request.device_id.append(device_id_obj)
+    _create_kpi_filter_request.service_id.append(service_id_obj)
+    _create_kpi_filter_request.slice_id.append(slice_id_obj)
+    _create_kpi_filter_request.endpoint_id.append(endpoint_id_obj)
+    _create_kpi_filter_request.connection_id.append(connection_id_obj)
+    _create_kpi_filter_request.link_id.append(link_id_obj)
+
+    return _create_kpi_filter_request
\ No newline at end of file