diff --git a/proto/context.proto b/proto/context.proto
index 2dfbb7805eb444ee94e27bb00ca05d9a1c83b8ec..3b25e6361766ee4c2b52e15aab215409f40cbb56 100644
--- a/proto/context.proto
+++ b/proto/context.proto
@@ -40,7 +40,7 @@ service ContextService {
   rpc SetDevice          (Device        ) returns (       DeviceId        ) {}
   rpc RemoveDevice       (DeviceId      ) returns (       Empty           ) {}
   rpc GetDeviceEvents    (Empty         ) returns (stream DeviceEvent     ) {}
-
+  rpc SelectDevice       (DeviceFilter  ) returns (       DeviceList      ) {}
   rpc ListEndPointNames  (EndPointIdList) returns (       EndPointNameList) {}
 
   rpc ListLinkIds        (Empty         ) returns (       LinkIdList      ) {}
@@ -57,6 +57,7 @@ service ContextService {
   rpc UnsetService       (Service       ) returns (       ServiceId       ) {}
   rpc RemoveService      (ServiceId     ) returns (       Empty           ) {}
   rpc GetServiceEvents   (Empty         ) returns (stream ServiceEvent    ) {}
+  rpc SelectService      (ServiceFilter ) returns (       ServiceList     ) {}
 
   rpc ListSliceIds       (ContextId     ) returns (       SliceIdList     ) {}
   rpc ListSlices         (ContextId     ) returns (       SliceList       ) {}
@@ -65,6 +66,7 @@ service ContextService {
   rpc UnsetSlice         (Slice         ) returns (       SliceId         ) {}
   rpc RemoveSlice        (SliceId       ) returns (       Empty           ) {}
   rpc GetSliceEvents     (Empty         ) returns (stream SliceEvent      ) {}
+  rpc SelectSlice        (SliceFilter   ) returns (       SliceList       ) {}
 
   rpc ListConnectionIds  (ServiceId     ) returns (       ConnectionIdList) {}
   rpc ListConnections    (ServiceId     ) returns (       ConnectionList  ) {}
@@ -208,6 +210,13 @@ message DeviceList {
   repeated Device devices = 1;
 }
 
+message DeviceFilter {
+  DeviceIdList device_ids = 1;
+  bool include_endpoints = 2;
+  bool include_config_rules = 3;
+  bool include_components = 4;
+}
+
 message DeviceEvent {
   Event event = 1;
   DeviceId device_id = 2;
@@ -288,6 +297,13 @@ message ServiceList {
   repeated Service services = 1;
 }
 
+message ServiceFilter {
+  ServiceIdList service_ids = 1;
+  bool include_endpoint_ids = 2;
+  bool include_constraints = 3;
+  bool include_config_rules = 4;
+}
+
 message ServiceEvent {
   Event event = 1;
   ServiceId service_id = 2;
@@ -342,6 +358,15 @@ message SliceList {
   repeated Slice slices = 1;
 }
 
+message SliceFilter {
+  SliceIdList slice_ids = 1;
+  bool include_endpoint_ids = 2;
+  bool include_constraints = 3;
+  bool include_service_ids = 4;
+  bool include_subslice_ids = 5;
+  bool include_config_rules = 6;
+}
+
 message SliceEvent {
   Event event = 1;
   SliceId slice_id = 2;
diff --git a/src/context/client/ContextClient.py b/src/context/client/ContextClient.py
index 7c3832d6b3ea7de0a495faee143b73179e8da5b9..13d9dc0035b45845bf11367e02c8830b5151c1d6 100644
--- a/src/context/client/ContextClient.py
+++ b/src/context/client/ContextClient.py
@@ -21,11 +21,11 @@ from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.proto.context_pb2 import (
     Connection, ConnectionEvent, ConnectionId, ConnectionIdList, ConnectionList,
     Context, ContextEvent, ContextId, ContextIdList, ContextList,
-    Device, DeviceEvent, DeviceId, DeviceIdList, DeviceList,
+    Device, DeviceEvent, DeviceFilter, DeviceId, DeviceIdList, DeviceList,
     Empty, EndPointIdList, EndPointNameList,
     Link, LinkEvent, LinkId, LinkIdList, LinkList,
-    Service, ServiceEvent, ServiceId, ServiceIdList, ServiceList,
-    Slice, SliceEvent, SliceId, SliceIdList, SliceList,
+    Service, ServiceEvent, ServiceFilter, ServiceId, ServiceIdList, ServiceList,
+    Slice, SliceEvent, SliceFilter, SliceId, SliceIdList, SliceList,
     Topology, TopologyDetails, TopologyEvent, TopologyId, TopologyIdList, TopologyList)
 from common.proto.context_pb2_grpc import ContextServiceStub
 from common.proto.context_policy_pb2_grpc import ContextPolicyServiceStub
@@ -185,6 +185,13 @@ class ContextClient:
         LOGGER.debug('RemoveDevice result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
+    @RETRY_DECORATOR
+    def SelectDevice(self, request: DeviceFilter) -> DeviceList:
+        LOGGER.debug('SelectDevice request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.SelectDevice(request)
+        LOGGER.debug('SelectDevice result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
     @RETRY_DECORATOR
     def GetDeviceEvents(self, request: Empty) -> Iterator[DeviceEvent]:
         LOGGER.debug('GetDeviceEvents request: {:s}'.format(grpc_message_to_json_string(request)))
@@ -283,6 +290,13 @@ class ContextClient:
         LOGGER.debug('RemoveService result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
+    @RETRY_DECORATOR
+    def SelectService(self, request: ServiceFilter) -> ServiceList:
+        LOGGER.debug('SelectService request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.SelectService(request)
+        LOGGER.debug('SelectService result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
     @RETRY_DECORATOR
     def GetServiceEvents(self, request: Empty) -> Iterator[ServiceEvent]:
         LOGGER.debug('GetServiceEvents request: {:s}'.format(grpc_message_to_json_string(request)))
@@ -332,6 +346,13 @@ class ContextClient:
         LOGGER.debug('RemoveSlice result: {:s}'.format(grpc_message_to_json_string(response)))
         return response
 
+    @RETRY_DECORATOR
+    def SelectSlice(self, request: SliceFilter) -> SliceList:
+        LOGGER.debug('SelectSlice request: {:s}'.format(grpc_message_to_json_string(request)))
+        response = self.stub.SelectSlice(request)
+        LOGGER.debug('SelectSlice result: {:s}'.format(grpc_message_to_json_string(response)))
+        return response
+
     @RETRY_DECORATOR
     def GetSliceEvents(self, request: Empty) -> Iterator[SliceEvent]:
         LOGGER.debug('GetSliceEvents request: {:s}'.format(grpc_message_to_json_string(request)))
diff --git a/src/context/service/ContextServiceServicerImpl.py b/src/context/service/ContextServiceServicerImpl.py
index 6fe00f917cf8b338f0934e2a268fa757d2055865..789ee7a78c6bcff3e62a6dd373bd58dbb2e7a960 100644
--- a/src/context/service/ContextServiceServicerImpl.py
+++ b/src/context/service/ContextServiceServicerImpl.py
@@ -18,11 +18,11 @@ from common.message_broker.MessageBroker import MessageBroker
 from common.proto.context_pb2 import (
     Connection, ConnectionEvent, ConnectionId, ConnectionIdList, ConnectionList,
     Context, ContextEvent, ContextId, ContextIdList, ContextList,
-    Device, DeviceEvent, DeviceId, DeviceIdList, DeviceList,
+    Device, DeviceEvent, DeviceFilter, DeviceId, DeviceIdList, DeviceList,
     Empty, EndPointIdList, EndPointNameList, EventTypeEnum,
     Link, LinkEvent, LinkId, LinkIdList, LinkList,
-    Service, ServiceEvent, ServiceId, ServiceIdList, ServiceList,
-    Slice, SliceEvent, SliceId, SliceIdList, SliceList,
+    Service, ServiceEvent, ServiceFilter, ServiceId, ServiceIdList, ServiceList,
+    Slice, SliceEvent, SliceFilter, SliceId, SliceIdList, SliceList,
     Topology, TopologyDetails, TopologyEvent, TopologyId, TopologyIdList, TopologyList)
 from common.proto.policy_pb2 import PolicyRuleIdList, PolicyRuleId, PolicyRuleList, PolicyRule
 from common.proto.context_pb2_grpc import ContextServiceServicer
@@ -31,13 +31,13 @@ from common.method_wrappers.Decorator import MetricsPool, safe_and_metered_rpc_m
 from .database.Connection import (
     connection_delete, connection_get, connection_list_ids, connection_list_objs, connection_set)
 from .database.Context import context_delete, context_get, context_list_ids, context_list_objs, context_set
-from .database.Device import device_delete, device_get, device_list_ids, device_list_objs, device_set
+from .database.Device import device_delete, device_get, device_list_ids, device_list_objs, device_select, device_set
 from .database.EndPoint import endpoint_list_names
 from .database.Link import link_delete, link_get, link_list_ids, link_list_objs, link_set
 from .database.PolicyRule import (
     policyrule_delete, policyrule_get, policyrule_list_ids, policyrule_list_objs, policyrule_set)
-from .database.Service import service_delete, service_get, service_list_ids, service_list_objs, service_set
-from .database.Slice import slice_delete, slice_get, slice_list_ids, slice_list_objs, slice_set, slice_unset
+from .database.Service import service_delete, service_get, service_list_ids, service_list_objs, service_select, service_set
+from .database.Slice import slice_delete, slice_get, slice_list_ids, slice_list_objs, slice_select, slice_set, slice_unset
 from .database.Topology import (
     topology_delete, topology_get, topology_get_details, topology_list_ids, topology_list_objs, topology_set)
 from .Events import (
@@ -161,6 +161,10 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer
             notify_event(self.messagebroker, TOPIC_DEVICE, event_type, {'device_id': device_id})
         return Empty()
 
+    @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
+    def SelectDevices(self, request : DeviceFilter, context : grpc.ServicerContext) -> DeviceList:
+        return DeviceList(devices=device_select(self.db_engine, request))
+
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetDeviceEvents(self, request : Empty, context : grpc.ServicerContext) -> Iterator[DeviceEvent]:
         for message in self.messagebroker.consume({TOPIC_DEVICE}, consume_timeout=CONSUME_TIMEOUT):
@@ -235,6 +239,10 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer
             notify_event(self.messagebroker, TOPIC_SERVICE, event_type, {'service_id': service_id})
         return Empty()
 
+    @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
+    def SelectService(self, request : ServiceFilter, context : grpc.ServicerContext) -> ServiceList:
+        return ServiceList(services=service_select(self.db_engine, request))
+
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetServiceEvents(self, request : Empty, context : grpc.ServicerContext) -> Iterator[ServiceEvent]:
         for message in self.messagebroker.consume({TOPIC_SERVICE}, consume_timeout=CONSUME_TIMEOUT):
@@ -278,6 +286,10 @@ class ContextServiceServicerImpl(ContextServiceServicer, ContextPolicyServiceSer
             notify_event(self.messagebroker, TOPIC_SLICE, event_type, {'slice_id': slice_id})
         return Empty()
 
+    @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
+    def SelectSlice(self, request : SliceFilter, context : grpc.ServicerContext) -> SliceList:
+        return SliceList(slices=slice_select(self.db_engine, request))
+
     @safe_and_metered_rpc_method(METRICS_POOL, LOGGER)
     def GetSliceEvents(self, request : Empty, context : grpc.ServicerContext) -> Iterator[SliceEvent]:
         for message in self.messagebroker.consume({TOPIC_SLICE}, consume_timeout=CONSUME_TIMEOUT):
diff --git a/src/context/service/database/Connection.py b/src/context/service/database/Connection.py
index a3edb8ea2838d9203a810677da495893a2cd6973..80d3b3a6d437986741ee5308205d8a902e897c40 100644
--- a/src/context/service/database/Connection.py
+++ b/src/context/service/database/Connection.py
@@ -16,7 +16,7 @@ import datetime, logging, re
 from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
 from sqlalchemy.exc import IntegrityError
-from sqlalchemy.orm import Session, sessionmaker
+from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Tuple
 from common.proto.context_pb2 import Connection, ConnectionId, ServiceId
@@ -40,7 +40,11 @@ def connection_list_ids(db_engine : Engine, request : ServiceId) -> List[Dict]:
 def connection_list_objs(db_engine : Engine, request : ServiceId) -> List[Dict]:
     _,service_uuid = service_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
-        obj_list : List[ConnectionModel] = session.query(ConnectionModel).filter_by(service_uuid=service_uuid).all()
+        obj_list : List[ConnectionModel] = session.query(ConnectionModel)\
+            .options(selectinload(ConnectionModel.connection_service))\
+            .options(selectinload(ConnectionModel.connection_endpoints))\
+            .options(selectinload(ConnectionModel.connection_subservices))\
+            .filter_by(service_uuid=service_uuid).all()
         return [obj.dump() for obj in obj_list]
     return run_transaction(sessionmaker(bind=db_engine), callback)
 
@@ -48,6 +52,9 @@ def connection_get(db_engine : Engine, request : ConnectionId) -> Dict:
     connection_uuid = connection_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[ConnectionModel] = session.query(ConnectionModel)\
+            .options(selectinload(ConnectionModel.connection_service))\
+            .options(selectinload(ConnectionModel.connection_endpoints))\
+            .options(selectinload(ConnectionModel.connection_subservices))\
             .filter_by(connection_uuid=connection_uuid).one_or_none()
         return None if obj is None else obj.dump()
     obj = run_transaction(sessionmaker(bind=db_engine), callback)
diff --git a/src/context/service/database/Context.py b/src/context/service/database/Context.py
index 9e05e54b38d3772ece2d87de0d98fb5a216088de..4654095034749e1de985705b242ba9fa05a82f6a 100644
--- a/src/context/service/database/Context.py
+++ b/src/context/service/database/Context.py
@@ -15,7 +15,7 @@
 import datetime, logging
 from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
-from sqlalchemy.orm import Session, sessionmaker
+from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Tuple
 from common.proto.context_pb2 import Context, ContextId
@@ -34,14 +34,22 @@ def context_list_ids(db_engine : Engine) -> List[Dict]:
 
 def context_list_objs(db_engine : Engine) -> List[Dict]:
     def callback(session : Session) -> List[Dict]:
-        obj_list : List[ContextModel] = session.query(ContextModel).all()
+        obj_list : List[ContextModel] = session.query(ContextModel)\
+            .options(selectinload(ContextModel.topologies))\
+            .options(selectinload(ContextModel.services))\
+            .options(selectinload(ContextModel.slices))\
+            .all()
         return [obj.dump() for obj in obj_list]
     return run_transaction(sessionmaker(bind=db_engine), callback)
 
 def context_get(db_engine : Engine, request : ContextId) -> Dict:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
-        obj : Optional[ContextModel] = session.query(ContextModel).filter_by(context_uuid=context_uuid).one_or_none()
+        obj : Optional[ContextModel] = session.query(ContextModel)\
+            .options(selectinload(ContextModel.topologies))\
+            .options(selectinload(ContextModel.services))\
+            .options(selectinload(ContextModel.slices))\
+            .filter_by(context_uuid=context_uuid).one_or_none()
         return None if obj is None else obj.dump()
     obj = run_transaction(sessionmaker(bind=db_engine), callback)
     if obj is None:
diff --git a/src/context/service/database/Device.py b/src/context/service/database/Device.py
index c5a19c9c4b0bca4f85ffe1211dbefc6b218d518e..c51a88368d27a02d73fa85fa3ee0689108056f4c 100644
--- a/src/context/service/database/Device.py
+++ b/src/context/service/database/Device.py
@@ -15,12 +15,12 @@
 import datetime, logging
 from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
-from sqlalchemy.orm import Session, sessionmaker
+from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Set, Tuple
 from common.method_wrappers.ServiceExceptions import InvalidArgumentException, NotFoundException
-from common.proto.context_pb2 import Device, DeviceId, TopologyId
-from common.tools.grpc.Tools import grpc_message_to_json_string
+from common.proto.context_pb2 import Device, DeviceFilter, DeviceId, TopologyId
+#from common.tools.grpc.Tools import grpc_message_to_json_string
 from common.tools.object_factory.Device import json_device_id
 from context.service.database.uuids.Topology import topology_get_uuid
 from .models.DeviceModel import DeviceModel
@@ -43,14 +43,22 @@ def device_list_ids(db_engine : Engine) -> List[Dict]:
 
 def device_list_objs(db_engine : Engine) -> List[Dict]:
     def callback(session : Session) -> List[Dict]:
-        obj_list : List[DeviceModel] = session.query(DeviceModel).all()
+        obj_list : List[DeviceModel] = session.query(DeviceModel)\
+            .options(selectinload(DeviceModel.endpoints))\
+            .options(selectinload(DeviceModel.config_rules))\
+            .all()
+            #.options(selectinload(DeviceModel.components))\
         return [obj.dump() for obj in obj_list]
     return run_transaction(sessionmaker(bind=db_engine), callback)
 
 def device_get(db_engine : Engine, request : DeviceId) -> Dict:
     device_uuid = device_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
-        obj : Optional[DeviceModel] = session.query(DeviceModel).filter_by(device_uuid=device_uuid).one_or_none()
+        obj : Optional[DeviceModel] = session.query(DeviceModel)\
+            .options(selectinload(DeviceModel.endpoints))\
+            .options(selectinload(DeviceModel.config_rules))\
+            .filter_by(device_uuid=device_uuid).one_or_none()
+            #.options(selectinload(DeviceModel.components))\
         return None if obj is None else obj.dump()
     obj = run_transaction(sessionmaker(bind=db_engine), callback)
     if obj is None:
@@ -182,3 +190,22 @@ def device_delete(db_engine : Engine, request : DeviceId) -> Tuple[Dict, bool]:
         return num_deleted > 0
     deleted = run_transaction(sessionmaker(bind=db_engine), callback)
     return json_device_id(device_uuid),deleted
+
+def device_select(db_engine : Engine, request : DeviceFilter) -> List[Dict]:
+    device_uuids = [
+        device_get_uuid(device_id, allow_random=False)
+        for device_id in request.device_ids.device_ids
+    ]
+    dump_params = dict(
+        include_endpoints   =request.include_endpoints,
+        include_config_rules=request.include_config_rules,
+        include_components  =request.include_components,
+    )
+    def callback(session : Session) -> List[Dict]:
+        query = session.query(DeviceModel)
+        if request.include_endpoints   : query = query.options(selectinload(DeviceModel.endpoints))
+        if request.include_config_rules: query = query.options(selectinload(DeviceModel.config_rules))
+        #if request.include_components  : query = query.options(selectinload(DeviceModel.components))
+        obj_list : List[DeviceModel] = query.filter(DeviceModel.device_uuid.in_(device_uuids)).all()
+        return [obj.dump(**dump_params) for obj in obj_list]
+    return run_transaction(sessionmaker(bind=db_engine), callback)
diff --git a/src/context/service/database/EndPoint.py b/src/context/service/database/EndPoint.py
index e2f86893abdf62c9675a83b2a80ceed1227b85d4..b0df3bb8101a7b64a148e916178b1c9a77d511af 100644
--- a/src/context/service/database/EndPoint.py
+++ b/src/context/service/database/EndPoint.py
@@ -14,7 +14,7 @@
 
 import logging
 from sqlalchemy.engine import Engine
-from sqlalchemy.orm import Session, sessionmaker
+from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List
 from common.proto.context_pb2 import EndPointIdList
@@ -29,7 +29,8 @@ def endpoint_list_names(db_engine : Engine, request : EndPointIdList) -> List[Di
         for endpoint_id in request.endpoint_ids
     }
     def callback(session : Session) -> List[Dict]:
-        obj_list : List[EndPointModel] = \
-            session.query(EndPointModel).filter(EndPointModel.endpoint_uuid.in_(endpoint_uuids)).all()
+        obj_list : List[EndPointModel] = session.query(EndPointModel)\
+            .options(selectinload(EndPointModel.device))\
+            .filter(EndPointModel.endpoint_uuid.in_(endpoint_uuids)).all()
         return [obj.dump_name() for obj in obj_list]
     return run_transaction(sessionmaker(bind=db_engine), callback)
diff --git a/src/context/service/database/Link.py b/src/context/service/database/Link.py
index 299827dbdde6f9961d55be5f69f4e359f4e876a7..f5bfc9dea5fb81fa8becfedc8ce1e4e0f59e7292 100644
--- a/src/context/service/database/Link.py
+++ b/src/context/service/database/Link.py
@@ -15,7 +15,7 @@
 import datetime, logging
 from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
-from sqlalchemy.orm import Session, sessionmaker
+from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Set, Tuple
 from common.proto.context_pb2 import Link, LinkId
@@ -36,14 +36,18 @@ def link_list_ids(db_engine : Engine) -> List[Dict]:
 
 def link_list_objs(db_engine : Engine) -> List[Dict]:
     def callback(session : Session) -> List[Dict]:
-        obj_list : List[LinkModel] = session.query(LinkModel).all()
+        obj_list : List[LinkModel] = session.query(LinkModel)\
+            .options(selectinload(LinkModel.link_endpoints))\
+            .all()
         return [obj.dump() for obj in obj_list]
     return run_transaction(sessionmaker(bind=db_engine), callback)
 
 def link_get(db_engine : Engine, request : LinkId) -> Dict:
     link_uuid = link_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
-        obj : Optional[LinkModel] = session.query(LinkModel).filter_by(link_uuid=link_uuid).one_or_none()
+        obj : Optional[LinkModel] = session.query(LinkModel)\
+            .options(selectinload(LinkModel.link_endpoints))\
+            .filter_by(link_uuid=link_uuid).one_or_none()
         return None if obj is None else obj.dump()
     obj = run_transaction(sessionmaker(bind=db_engine), callback)
     if obj is None:
diff --git a/src/context/service/database/PolicyRule.py b/src/context/service/database/PolicyRule.py
index e95cec4ae533795b23b8fd4e2f26ac9000c1bcce..13f0a2698c17874e1e15f4d6a1d527d366141f56 100644
--- a/src/context/service/database/PolicyRule.py
+++ b/src/context/service/database/PolicyRule.py
@@ -15,7 +15,7 @@
 import datetime, json
 from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
-from sqlalchemy.orm import Session, sessionmaker
+from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Set, Tuple
 from common.proto.policy_pb2 import PolicyRule, PolicyRuleId, PolicyRuleIdList, PolicyRuleList
@@ -31,14 +31,15 @@ from .uuids.Service import service_get_uuid
 def policyrule_list_ids(db_engine : Engine) -> List[Dict]:
     def callback(session : Session) -> List[Dict]:
         obj_list : List[PolicyRuleModel] = session.query(PolicyRuleModel).all()
-        #.options(selectinload(PolicyRuleModel.topology)).filter_by(context_uuid=context_uuid).one_or_none()
         return [obj.dump_id() for obj in obj_list]
     return run_transaction(sessionmaker(bind=db_engine), callback)
 
 def policyrule_list_objs(db_engine : Engine) -> List[Dict]:
     def callback(session : Session) -> List[Dict]:
-        obj_list : List[PolicyRuleModel] = session.query(PolicyRuleModel).all()
-        #.options(selectinload(PolicyRuleModel.topology)).filter_by(context_uuid=context_uuid).one_or_none()
+        obj_list : List[PolicyRuleModel] = session.query(PolicyRuleModel)\
+            .options(selectinload(PolicyRuleModel.policyrule_service))\
+            .options(selectinload(PolicyRuleModel.policyrule_devices))\
+            .all()
         return [obj.dump() for obj in obj_list]
     return run_transaction(sessionmaker(bind=db_engine), callback)
 
@@ -46,6 +47,8 @@ def policyrule_get(db_engine : Engine, request : PolicyRuleId) -> PolicyRule:
     policyrule_uuid = policyrule_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[PolicyRuleModel] = session.query(PolicyRuleModel)\
+            .options(selectinload(PolicyRuleModel.policyrule_service))\
+            .options(selectinload(PolicyRuleModel.policyrule_devices))\
             .filter_by(policyrule_uuid=policyrule_uuid).one_or_none()
         return None if obj is None else obj.dump()
     obj = run_transaction(sessionmaker(bind=db_engine), callback)
diff --git a/src/context/service/database/Service.py b/src/context/service/database/Service.py
index fe12eaf8a011e2ae4861c64cdfac8c4b9c388731..32484a3095c3d937392f580597339fe047d36e3f 100644
--- a/src/context/service/database/Service.py
+++ b/src/context/service/database/Service.py
@@ -15,10 +15,10 @@
 import datetime, logging
 from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
-from sqlalchemy.orm import Session, sessionmaker
+from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Tuple
-from common.proto.context_pb2 import ContextId, Service, ServiceId
+from common.proto.context_pb2 import ContextId, Service, ServiceFilter, ServiceId
 from common.method_wrappers.ServiceExceptions import InvalidArgumentException, NotFoundException
 from common.tools.object_factory.Context import json_context_id
 from common.tools.object_factory.Service import json_service_id
@@ -43,14 +43,22 @@ def service_list_ids(db_engine : Engine, request : ContextId) -> List[Dict]:
 def service_list_objs(db_engine : Engine, request : ContextId) -> List[Dict]:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
-        obj_list : List[ServiceModel] = session.query(ServiceModel).filter_by(context_uuid=context_uuid).all()
+        obj_list : List[ServiceModel] = session.query(ServiceModel)\
+            .options(selectinload(ServiceModel.service_endpoints))\
+            .options(selectinload(ServiceModel.constraints))\
+            .options(selectinload(ServiceModel.config_rules))\
+            .filter_by(context_uuid=context_uuid).all()
         return [obj.dump() for obj in obj_list]
     return run_transaction(sessionmaker(bind=db_engine), callback)
 
 def service_get(db_engine : Engine, request : ServiceId) -> Dict:
     _,service_uuid = service_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
-        obj : Optional[ServiceModel] = session.query(ServiceModel).filter_by(service_uuid=service_uuid).one_or_none()
+        obj : Optional[ServiceModel] = session.query(ServiceModel)\
+            .options(selectinload(ServiceModel.service_endpoints))\
+            .options(selectinload(ServiceModel.constraints))\
+            .options(selectinload(ServiceModel.config_rules))\
+            .filter_by(service_uuid=service_uuid).one_or_none()
         return None if obj is None else obj.dump()
     obj = run_transaction(sessionmaker(bind=db_engine), callback)
     if obj is None:
@@ -145,3 +153,22 @@ def service_delete(db_engine : Engine, request : ServiceId) -> Tuple[Dict, bool]
         return num_deleted > 0
     deleted = run_transaction(sessionmaker(bind=db_engine), callback)
     return json_service_id(service_uuid, json_context_id(context_uuid)),deleted
+
+def service_select(db_engine : Engine, request : ServiceFilter) -> List[Dict]:
+    service_uuids = [
+        service_get_uuid(service_id, allow_random=False)[1]
+        for service_id in request.service_ids.service_ids
+    ]
+    dump_params = dict(
+        include_endpoint_ids=request.include_endpoint_ids,
+        include_constraints =request.include_constraints,
+        include_config_rules=request.include_config_rules,
+    )
+    def callback(session : Session) -> List[Dict]:
+        query = session.query(ServiceModel)
+        if request.include_endpoint_ids: query = query.options(selectinload(ServiceModel.service_endpoints))
+        if request.include_constraints : query = query.options(selectinload(ServiceModel.constraints))
+        if request.include_config_rules: query = query.options(selectinload(ServiceModel.config_rules))
+        obj_list : List[ServiceModel] = query.filter(ServiceModel.service_uuid.in_(service_uuids)).all()
+        return [obj.dump(**dump_params) for obj in obj_list]
+    return run_transaction(sessionmaker(bind=db_engine), callback)
diff --git a/src/context/service/database/Slice.py b/src/context/service/database/Slice.py
index 724046bfae16ea8e75ba84b83ff52c1050242003..abd140024f2a13289c7af6a3bafe363a8247e053 100644
--- a/src/context/service/database/Slice.py
+++ b/src/context/service/database/Slice.py
@@ -16,10 +16,10 @@ import datetime, logging
 from sqlalchemy import and_
 from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
-from sqlalchemy.orm import Session, sessionmaker
+from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Set, Tuple
-from common.proto.context_pb2 import ContextId, Slice, SliceId
+from common.proto.context_pb2 import ContextId, Slice, SliceFilter, SliceId
 from common.method_wrappers.ServiceExceptions import InvalidArgumentException, NotFoundException
 from common.tools.object_factory.Context import json_context_id
 from common.tools.object_factory.Slice import json_slice_id
@@ -44,14 +44,26 @@ def slice_list_ids(db_engine : Engine, request : ContextId) -> List[Dict]:
 def slice_list_objs(db_engine : Engine, request : ContextId) -> List[Dict]:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
-        obj_list : List[SliceModel] = session.query(SliceModel).filter_by(context_uuid=context_uuid).all()
+        obj_list : List[SliceModel] = session.query(SliceModel)\
+            .options(selectinload(SliceModel.slice_endpoints))\
+            .options(selectinload(SliceModel.slice_services))\
+            .options(selectinload(SliceModel.slice_subslices))\
+            .options(selectinload(SliceModel.constraints))\
+            .options(selectinload(SliceModel.config_rules))\
+            .filter_by(context_uuid=context_uuid).all()
         return [obj.dump() for obj in obj_list]
     return run_transaction(sessionmaker(bind=db_engine), callback)
 
 def slice_get(db_engine : Engine, request : SliceId) -> Dict:
     _,slice_uuid = slice_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
-        obj : Optional[SliceModel] = session.query(SliceModel).filter_by(slice_uuid=slice_uuid).one_or_none()
+        obj : Optional[SliceModel] = session.query(SliceModel)\
+            .options(selectinload(SliceModel.slice_endpoints))\
+            .options(selectinload(SliceModel.slice_services))\
+            .options(selectinload(SliceModel.slice_subslices))\
+            .options(selectinload(SliceModel.constraints))\
+            .options(selectinload(SliceModel.config_rules))\
+            .filter_by(slice_uuid=slice_uuid).one_or_none()
         return None if obj is None else obj.dump()
     obj = run_transaction(sessionmaker(bind=db_engine), callback)
     if obj is None:
@@ -240,3 +252,26 @@ def slice_delete(db_engine : Engine, request : SliceId) -> Tuple[Dict, bool]:
         return num_deleted > 0
     deleted = run_transaction(sessionmaker(bind=db_engine), callback)
     return json_slice_id(slice_uuid, json_context_id(context_uuid)),deleted
+
+def slice_select(db_engine : Engine, request : SliceFilter) -> List[Dict]:
+    slice_uuids = [
+        slice_get_uuid(slice_id, allow_random=False)[1]
+        for slice_id in request.slice_ids.slice_ids
+    ]
+    dump_params = dict(
+        include_endpoint_ids=request.include_endpoint_ids,
+        include_constraints =request.include_constraints,
+        include_service_ids =request.include_service_ids,
+        include_subslice_ids=request.include_subslice_ids,
+        include_config_rules=request.include_config_rules,
+    )
+    def callback(session : Session) -> List[Dict]:
+        query = session.query(SliceModel)
+        if request.include_endpoint_ids: query = query.options(selectinload(SliceModel.slice_endpoints))
+        if request.include_service_ids : query = query.options(selectinload(SliceModel.slice_services))
+        if request.include_subslice_ids: query = query.options(selectinload(SliceModel.slice_subslices))
+        if request.include_constraints : query = query.options(selectinload(SliceModel.constraints))
+        if request.include_config_rules: query = query.options(selectinload(SliceModel.config_rules))
+        obj_list : List[SliceModel] = query.filter(SliceModel.slice_uuid.in_(slice_uuids)).all()
+        return [obj.dump(**dump_params) for obj in obj_list]
+    return run_transaction(sessionmaker(bind=db_engine), callback)
diff --git a/src/context/service/database/Topology.py b/src/context/service/database/Topology.py
index e2c6e2e996ac9321d0d8b9ae2ecea018b650632f..210f497d1765a6088f555c8914c8f600a258040c 100644
--- a/src/context/service/database/Topology.py
+++ b/src/context/service/database/Topology.py
@@ -15,7 +15,7 @@
 import datetime, logging
 from sqlalchemy.dialects.postgresql import insert
 from sqlalchemy.engine import Engine
-from sqlalchemy.orm import Session, sessionmaker
+from sqlalchemy.orm import Session, selectinload, sessionmaker
 from sqlalchemy_cockroachdb import run_transaction
 from typing import Dict, List, Optional, Tuple
 from common.proto.context_pb2 import ContextId, Topology, TopologyId
@@ -38,7 +38,10 @@ def topology_list_ids(db_engine : Engine, request : ContextId) -> List[Dict]:
 def topology_list_objs(db_engine : Engine, request : ContextId) -> List[Dict]:
     context_uuid = context_get_uuid(request, allow_random=False)
     def callback(session : Session) -> List[Dict]:
-        obj_list : List[TopologyModel] = session.query(TopologyModel).filter_by(context_uuid=context_uuid).all()
+        obj_list : List[TopologyModel] = session.query(TopologyModel)\
+            .options(selectinload(TopologyModel.topology_devices))\
+            .options(selectinload(TopologyModel.topology_links))\
+            .filter_by(context_uuid=context_uuid).all()
         return [obj.dump() for obj in obj_list]
     return run_transaction(sessionmaker(bind=db_engine), callback)
 
@@ -46,6 +49,8 @@ def topology_get(db_engine : Engine, request : TopologyId) -> Dict:
     _,topology_uuid = topology_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[TopologyModel] = session.query(TopologyModel)\
+            .options(selectinload(TopologyModel.topology_devices))\
+            .options(selectinload(TopologyModel.topology_links))\
             .filter_by(topology_uuid=topology_uuid).one_or_none()
         return None if obj is None else obj.dump()
     obj = run_transaction(sessionmaker(bind=db_engine), callback)
@@ -62,6 +67,8 @@ def topology_get_details(db_engine : Engine, request : TopologyId) -> Dict:
     _,topology_uuid = topology_get_uuid(request, allow_random=False)
     def callback(session : Session) -> Optional[Dict]:
         obj : Optional[TopologyModel] = session.query(TopologyModel)\
+            .options(selectinload(TopologyModel.topology_devices))\
+            .options(selectinload(TopologyModel.topology_links))\
             .filter_by(topology_uuid=topology_uuid).one_or_none()
         return None if obj is None else obj.dump_details()
     obj = run_transaction(sessionmaker(bind=db_engine), callback)
diff --git a/src/context/service/database/models/ConnectionModel.py b/src/context/service/database/models/ConnectionModel.py
index 156e33c6bb32e237af241035f1d9672b0b419222..f71d4177893d146af2f413781b51930c9909d827 100644
--- a/src/context/service/database/models/ConnectionModel.py
+++ b/src/context/service/database/models/ConnectionModel.py
@@ -59,8 +59,8 @@ class ConnectionEndPointModel(_Base):
     endpoint_uuid   = Column(ForeignKey('endpoint.endpoint_uuid', ondelete='RESTRICT'), primary_key=True, index=True)
     position        = Column(Integer, nullable=False)
 
-    connection = relationship('ConnectionModel', back_populates='connection_endpoints', lazy='joined')
-    endpoint   = relationship('EndPointModel',   lazy='joined') # back_populates='connection_endpoints'
+    connection = relationship('ConnectionModel', back_populates='connection_endpoints') #, lazy='joined'
+    endpoint   = relationship('EndPointModel',   lazy='selectin') # back_populates='connection_endpoints'
 
     __table_args__ = (
         CheckConstraint(position >= 0, name='check_position_value'),
@@ -72,5 +72,5 @@ class ConnectionSubServiceModel(_Base):
     connection_uuid = Column(ForeignKey('connection.connection_uuid', ondelete='CASCADE' ), primary_key=True)
     subservice_uuid = Column(ForeignKey('service.service_uuid', ondelete='RESTRICT'), primary_key=True, index=True)
 
-    connection = relationship('ConnectionModel', back_populates='connection_subservices', lazy='joined')
-    subservice = relationship('ServiceModel',    lazy='joined') # back_populates='connection_subservices'
+    connection = relationship('ConnectionModel', back_populates='connection_subservices') #, lazy='joined'
+    subservice = relationship('ServiceModel',    lazy='selectin') # back_populates='connection_subservices'
diff --git a/src/context/service/database/models/DeviceModel.py b/src/context/service/database/models/DeviceModel.py
index 2124386d16e2e33aec58f5b39bf0f89e3c6589f1..24130841d2bafde3608f2fa1cbdd476d28acba46 100644
--- a/src/context/service/database/models/DeviceModel.py
+++ b/src/context/service/database/models/DeviceModel.py
@@ -16,7 +16,7 @@ import operator
 from sqlalchemy import Column, DateTime, Enum, String
 from sqlalchemy.dialects.postgresql import ARRAY, UUID
 from sqlalchemy.orm import relationship
-from typing import Dict
+from typing import Dict, List
 from .enums.DeviceDriver import ORM_DeviceDriverEnum
 from .enums.DeviceOperationalStatus import ORM_DeviceOperationalStatusEnum
 from ._Base import _Base
@@ -39,19 +39,29 @@ class DeviceModel(_Base):
     def dump_id(self) -> Dict:
         return {'device_uuid': {'uuid': self.device_uuid}}
 
-    def dump(self) -> Dict:
-        return {
+    def dump_endpoints(self) -> List[Dict]:
+        return [endpoint.dump() for endpoint in self.endpoints]
+
+    def dump_config_rules(self) -> Dict:
+        return {'config_rules': [
+            config_rule.dump()
+            for config_rule in sorted(self.config_rules, key=operator.attrgetter('position'))
+        ]}
+
+    #def dump_components(self) -> List[Dict]:
+    #    return []
+
+    def dump(self,
+        include_endpoints : bool = True, include_config_rules : bool = True, include_components : bool = True,
+    ) -> Dict:
+        result = {
             'device_id'                : self.dump_id(),
             'name'                     : self.device_name,
             'device_type'              : self.device_type,
             'device_operational_status': self.device_operational_status.value,
             'device_drivers'           : [driver.value for driver in self.device_drivers],
-            'device_config'            : {'config_rules': [
-                config_rule.dump()
-                for config_rule in sorted(self.config_rules, key=operator.attrgetter('position'))
-            ]},
-            'device_endpoints'         : [
-                endpoint.dump()
-                for endpoint in self.endpoints
-            ],
         }
+        if include_endpoints: result['device_endpoints'] = self.dump_endpoints()
+        if include_config_rules: result['device_config'] = self.dump_config_rules()
+        #if include_components: result['components'] = self.dump_components()
+        return result
diff --git a/src/context/service/database/models/EndPointModel.py b/src/context/service/database/models/EndPointModel.py
index 12ba7e10e7c3d5789f9bf16ad7b4f50c35a36bf5..a079f9900e39fdf3a4329e604f4e596e7f5d1f89 100644
--- a/src/context/service/database/models/EndPointModel.py
+++ b/src/context/service/database/models/EndPointModel.py
@@ -31,8 +31,8 @@ class EndPointModel(_Base):
     created_at       = Column(DateTime, nullable=False)
     updated_at       = Column(DateTime, nullable=False)
 
-    device            = relationship('DeviceModel',          back_populates='endpoints')
-    topology          = relationship('TopologyModel')
+    device            = relationship('DeviceModel',          back_populates='endpoints') # lazy='selectin'
+    topology          = relationship('TopologyModel', lazy='selectin')
     #link_endpoints    = relationship('LinkEndPointModel',    back_populates='endpoint' )
     #service_endpoints = relationship('ServiceEndPointModel', back_populates='endpoint' )
 
diff --git a/src/context/service/database/models/PolicyRuleModel.py b/src/context/service/database/models/PolicyRuleModel.py
index 663a9a39a30903b3dd41ccfee56da19528325af0..32364e289cf68fe760c60eb27cde933f7cf448a4 100644
--- a/src/context/service/database/models/PolicyRuleModel.py
+++ b/src/context/service/database/models/PolicyRuleModel.py
@@ -74,4 +74,4 @@ class PolicyRuleDeviceModel(_Base):
     device_uuid     = Column(ForeignKey('device.device_uuid', ondelete='RESTRICT'), primary_key=True, index=True)
 
     #policyrule = relationship('PolicyRuleModel', lazy='joined') # back_populates='policyrule_devices'
-    device     = relationship('DeviceModel',     lazy='joined') # back_populates='policyrule_devices'
+    device     = relationship('DeviceModel',     lazy='selectin') # back_populates='policyrule_devices'
diff --git a/src/context/service/database/models/ServiceModel.py b/src/context/service/database/models/ServiceModel.py
index f1781c4f86fa25e8d9f3e42da46451e112ef779e..ef6e1b06aaaa616ede6f9633e4e0d7fc0aabf336 100644
--- a/src/context/service/database/models/ServiceModel.py
+++ b/src/context/service/database/models/ServiceModel.py
@@ -16,7 +16,7 @@ import operator
 from sqlalchemy import CheckConstraint, Column, DateTime, Enum, ForeignKey, Integer, String
 from sqlalchemy.dialects.postgresql import UUID
 from sqlalchemy.orm import relationship
-from typing import Dict
+from typing import Dict, List
 from .enums.ServiceStatus import ORM_ServiceStatusEnum
 from .enums.ServiceType import ORM_ServiceTypeEnum
 from ._Base import _Base
@@ -32,10 +32,10 @@ class ServiceModel(_Base):
     created_at     = Column(DateTime, nullable=False)
     updated_at     = Column(DateTime, nullable=False)
 
-    context           = relationship('ContextModel', back_populates='services')
-    service_endpoints = relationship('ServiceEndPointModel') # lazy='joined', back_populates='service'
-    constraints       = relationship('ConstraintModel', passive_deletes=True) # lazy='joined', back_populates='service'
-    config_rules      = relationship('ConfigRuleModel', passive_deletes=True) # lazy='joined', back_populates='service'
+    context           = relationship('ContextModel', back_populates='services', lazy='selectin')
+    service_endpoints = relationship('ServiceEndPointModel') # lazy='selectin', back_populates='service'
+    constraints       = relationship('ConstraintModel', passive_deletes=True) # lazy='selectin', back_populates='service'
+    config_rules      = relationship('ConfigRuleModel', passive_deletes=True) # lazy='selectin', back_populates='service'
 
     def dump_id(self) -> Dict:
         return {
@@ -43,25 +43,37 @@ class ServiceModel(_Base):
             'service_uuid': {'uuid': self.service_uuid},
         }
 
-    def dump(self) -> Dict:
-        return {
-            'service_id'          : self.dump_id(),
-            'name'                : self.service_name,
-            'service_type'        : self.service_type.value,
-            'service_status'      : {'service_status': self.service_status.value},
-            'service_endpoint_ids': [
-                service_endpoint.endpoint.dump_id()
-                for service_endpoint in sorted(self.service_endpoints, key=operator.attrgetter('position'))
-            ],
-            'service_constraints' : [
-                constraint.dump()
-                for constraint in sorted(self.constraints, key=operator.attrgetter('position'))
-            ],
-            'service_config'      : {'config_rules': [
-                config_rule.dump()
-                for config_rule in sorted(self.config_rules, key=operator.attrgetter('position'))
-            ]},
+    def dump_endpoint_ids(self) -> List[Dict]:
+        return [
+            service_endpoint.endpoint.dump_id()
+            for service_endpoint in sorted(self.service_endpoints, key=operator.attrgetter('position'))
+        ]
+
+    def dump_constraints(self) -> List[Dict]:
+        return [
+            constraint.dump()
+            for constraint in sorted(self.constraints, key=operator.attrgetter('position'))
+        ]
+
+    def dump_config_rules(self) -> Dict:
+        return {'config_rules': [
+            config_rule.dump()
+            for config_rule in sorted(self.config_rules, key=operator.attrgetter('position'))
+        ]}
+
+    def dump(
+        self, include_endpoint_ids : bool = True, include_constraints : bool = True, include_config_rules : bool = True
+    ) -> Dict:
+        result = {
+            'service_id'    : self.dump_id(),
+            'name'          : self.service_name,
+            'service_type'  : self.service_type.value,
+            'service_status': {'service_status': self.service_status.value},
         }
+        if include_endpoint_ids: result['service_endpoint_ids'] = self.dump_endpoint_ids()
+        if include_constraints: result['service_constraints'] = self.dump_constraints()
+        if include_config_rules: result['service_config'] = self.dump_config_rules()
+        return result
 
 class ServiceEndPointModel(_Base):
     __tablename__ = 'service_endpoint'
@@ -70,8 +82,8 @@ class ServiceEndPointModel(_Base):
     endpoint_uuid = Column(ForeignKey('endpoint.endpoint_uuid', ondelete='RESTRICT'), primary_key=True, index=True)
     position      = Column(Integer, nullable=False)
 
-    service  = relationship('ServiceModel',  back_populates='service_endpoints', lazy='joined')
-    endpoint = relationship('EndPointModel', lazy='joined') # back_populates='service_endpoints'
+    service  = relationship('ServiceModel',  back_populates='service_endpoints') # lazy='selectin'
+    endpoint = relationship('EndPointModel', lazy='selectin') # back_populates='service_endpoints'
 
     __table_args__ = (
         CheckConstraint(position >= 0, name='check_position_value'),
diff --git a/src/context/service/database/models/SliceModel.py b/src/context/service/database/models/SliceModel.py
index 7f1550eb2ebb80962bac94374112d43785184374..423af244e186301cf3132eea3fc7cbea16bf9fe9 100644
--- a/src/context/service/database/models/SliceModel.py
+++ b/src/context/service/database/models/SliceModel.py
@@ -16,7 +16,7 @@ import operator
 from sqlalchemy import CheckConstraint, Column, DateTime, Enum, ForeignKey, Integer, String
 from sqlalchemy.dialects.postgresql import UUID
 from sqlalchemy.orm import relationship
-from typing import Dict
+from typing import Dict, List
 from .enums.SliceStatus import ORM_SliceStatusEnum
 from ._Base import _Base
 
@@ -32,13 +32,13 @@ class SliceModel(_Base):
     created_at         = Column(DateTime, nullable=False)
     updated_at         = Column(DateTime, nullable=False)
 
-    context         = relationship('ContextModel', back_populates='slices')
-    slice_endpoints = relationship('SliceEndPointModel') # lazy='joined', back_populates='slice'
-    slice_services  = relationship('SliceServiceModel') # lazy='joined', back_populates='slice'
+    context         = relationship('ContextModel', back_populates='slices', lazy='selectin')
+    slice_endpoints = relationship('SliceEndPointModel') # lazy='selectin', back_populates='slice'
+    slice_services  = relationship('SliceServiceModel') # lazy='selectin', back_populates='slice'
     slice_subslices = relationship(
         'SliceSubSliceModel', primaryjoin='slice.c.slice_uuid == slice_subslice.c.slice_uuid')
-    constraints     = relationship('ConstraintModel', passive_deletes=True) # lazy='joined', back_populates='slice'
-    config_rules    = relationship('ConfigRuleModel', passive_deletes=True) # lazy='joined', back_populates='slice'
+    constraints     = relationship('ConstraintModel', passive_deletes=True) # lazy='selectin', back_populates='slice'
+    config_rules    = relationship('ConfigRuleModel', passive_deletes=True) # lazy='selectin', back_populates='slice'
 
     def dump_id(self) -> Dict:
         return {
@@ -46,36 +46,59 @@ class SliceModel(_Base):
             'slice_uuid': {'uuid': self.slice_uuid},
         }
 
-    def dump(self) -> Dict:
+
+    def dump_endpoint_ids(self) -> List[Dict]:
+        return [
+            slice_endpoint.endpoint.dump_id()
+            for slice_endpoint in sorted(self.slice_endpoints, key=operator.attrgetter('position'))
+        ]
+
+    def dump_constraints(self) -> List[Dict]:
+        return [
+            constraint.dump()
+            for constraint in sorted(self.constraints, key=operator.attrgetter('position'))
+        ]
+
+    def dump_config_rules(self) -> Dict:
+        return {'config_rules': [
+            config_rule.dump()
+            for config_rule in sorted(self.config_rules, key=operator.attrgetter('position'))
+        ]}
+
+    def dump_service_ids(self) -> List[Dict]:
+        return [
+            slice_service.service.dump_id()
+            for slice_service in self.slice_services
+        ]
+
+    def dump_subslice_ids(self) -> List[Dict]:
+        return [
+            slice_subslice.subslice.dump_id()
+            for slice_subslice in self.slice_subslices
+        ]
+
+    def dump_owner_id(self) -> Dict:
         return {
-            'slice_id'          : self.dump_id(),
-            'name'              : self.slice_name,
-            'slice_status'      : {'slice_status': self.slice_status.value},
-            'slice_endpoint_ids': [
-                slice_endpoint.endpoint.dump_id()
-                for slice_endpoint in sorted(self.slice_endpoints, key=operator.attrgetter('position'))
-            ],
-            'slice_constraints' : [
-                constraint.dump()
-                for constraint in sorted(self.constraints, key=operator.attrgetter('position'))
-            ],
-            'slice_config'      : {'config_rules': [
-                config_rule.dump()
-                for config_rule in sorted(self.config_rules, key=operator.attrgetter('position'))
-            ]},
-            'slice_service_ids': [
-                slice_service.service.dump_id()
-                for slice_service in self.slice_services
-            ],
-            'slice_subslice_ids': [
-                slice_subslice.subslice.dump_id()
-                for slice_subslice in self.slice_subslices
-            ],
-            'slice_owner': {
-                'owner_uuid': {'uuid': self.slice_owner_uuid},
-                'owner_string': self.slice_owner_string
-            }
+            'owner_uuid': {'uuid': self.slice_owner_uuid},
+            'owner_string': self.slice_owner_string
+        }
+
+    def dump(
+        self, include_endpoint_ids : bool = True, include_constraints : bool = True, include_service_ids : bool = True,
+        include_subslice_ids : bool = True, include_config_rules : bool = True
+    ) -> Dict:
+        result = {
+            'slice_id'    : self.dump_id(),
+            'name'        : self.slice_name,
+            'slice_status': {'slice_status': self.slice_status.value},
+            'slice_owner' : self.dump_owner_id()
         }
+        if include_endpoint_ids: result['slice_endpoint_ids'] = self.dump_endpoint_ids()
+        if include_constraints : result['slice_constraints' ] = self.dump_constraints()
+        if include_service_ids : result['slice_service_ids' ] = self.dump_service_ids()
+        if include_subslice_ids: result['slice_subslice_ids'] = self.dump_subslice_ids()
+        if include_config_rules: result['slice_config'      ] = self.dump_config_rules()
+        return result
 
 class SliceEndPointModel(_Base):
     __tablename__ = 'slice_endpoint'
@@ -84,8 +107,8 @@ class SliceEndPointModel(_Base):
     endpoint_uuid = Column(ForeignKey('endpoint.endpoint_uuid', ondelete='RESTRICT'), primary_key=True, index=True)
     position      = Column(Integer, nullable=False)
 
-    slice    = relationship('SliceModel', back_populates='slice_endpoints', lazy='joined')
-    endpoint = relationship('EndPointModel', lazy='joined') # back_populates='slice_endpoints'
+    slice    = relationship('SliceModel', back_populates='slice_endpoints') #, lazy='selectin'
+    endpoint = relationship('EndPointModel', lazy='selectin') # back_populates='slice_endpoints'
 
     __table_args__ = (
         CheckConstraint(position >= 0, name='check_position_value'),
@@ -97,8 +120,8 @@ class SliceServiceModel(_Base):
     slice_uuid   = Column(ForeignKey('slice.slice_uuid',     ondelete='CASCADE' ), primary_key=True)
     service_uuid = Column(ForeignKey('service.service_uuid', ondelete='RESTRICT'), primary_key=True, index=True)
 
-    slice   = relationship('SliceModel', back_populates='slice_services', lazy='joined')
-    service = relationship('ServiceModel', lazy='joined') # back_populates='slice_services'
+    slice   = relationship('SliceModel', back_populates='slice_services') # , lazy='selectin'
+    service = relationship('ServiceModel', lazy='selectin') # back_populates='slice_services'
 
 class SliceSubSliceModel(_Base):
     __tablename__ = 'slice_subslice'
@@ -107,5 +130,5 @@ class SliceSubSliceModel(_Base):
     subslice_uuid = Column(ForeignKey('slice.slice_uuid', ondelete='CASCADE'), primary_key=True, index=True)
 
     slice    = relationship(
-        'SliceModel', foreign_keys='SliceSubSliceModel.slice_uuid', back_populates='slice_subslices', lazy='joined')
-    subslice = relationship('SliceModel', foreign_keys='SliceSubSliceModel.subslice_uuid', lazy='joined')
+        'SliceModel', foreign_keys='SliceSubSliceModel.slice_uuid', back_populates='slice_subslices') #, lazy='selectin'
+    subslice = relationship('SliceModel', foreign_keys='SliceSubSliceModel.subslice_uuid', lazy='selectin')
diff --git a/src/context/service/database/models/TopologyModel.py b/src/context/service/database/models/TopologyModel.py
index 7dc2333f0a9b979f251c173d850a235dcb822d91..ebeddcb76c6631b3415a9bcea0f13167d5ab36bd 100644
--- a/src/context/service/database/models/TopologyModel.py
+++ b/src/context/service/database/models/TopologyModel.py
@@ -27,7 +27,7 @@ class TopologyModel(_Base):
     created_at    = Column(DateTime, nullable=False)
     updated_at    = Column(DateTime, nullable=False)
 
-    context          = relationship('ContextModel', back_populates='topologies')
+    context          = relationship('ContextModel', back_populates='topologies', lazy='selectin')
     topology_devices = relationship('TopologyDeviceModel') # back_populates='topology'
     topology_links   = relationship('TopologyLinkModel'  ) # back_populates='topology'
 
@@ -59,8 +59,8 @@ class TopologyDeviceModel(_Base):
     topology_uuid = Column(ForeignKey('topology.topology_uuid', ondelete='RESTRICT'), primary_key=True, index=True)
     device_uuid   = Column(ForeignKey('device.device_uuid',     ondelete='CASCADE' ), primary_key=True, index=True)
 
-    #topology = relationship('TopologyModel', lazy='joined') # back_populates='topology_devices'
-    device   = relationship('DeviceModel',   lazy='joined') # back_populates='topology_devices'
+    #topology = relationship('TopologyModel', lazy='selectin') # back_populates='topology_devices'
+    device   = relationship('DeviceModel',   lazy='selectin') # back_populates='topology_devices'
 
 class TopologyLinkModel(_Base):
     __tablename__ = 'topology_link'
@@ -68,5 +68,5 @@ class TopologyLinkModel(_Base):
     topology_uuid = Column(ForeignKey('topology.topology_uuid', ondelete='RESTRICT'), primary_key=True, index=True)
     link_uuid     = Column(ForeignKey('link.link_uuid',         ondelete='CASCADE' ), primary_key=True, index=True)
 
-    #topology = relationship('TopologyModel', lazy='joined') # back_populates='topology_links'
-    link     = relationship('LinkModel',     lazy='joined') # back_populates='topology_links'
+    #topology = relationship('TopologyModel', lazy='selectin') # back_populates='topology_links'
+    link     = relationship('LinkModel',     lazy='selectin') # back_populates='topology_links'