diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py
index 0f271d713a450989f00a6178a543eed765fcaa68..5d476109adc4430f5e90dd13f4bb7c4eb458826d 100644
--- a/inventory_provider/routes/classifier.py
+++ b/inventory_provider/routes/classifier.py
@@ -132,8 +132,8 @@ def related_interfaces(hostname, interface):
 
 def get_related_services(source_equipment: str, interface: str, r) -> dict:
     """
-    Finds the top-level-services for the given interface
-    and also gets the top-level-services for the related interfaces
+    Finds the related-services for the given interface
+    and also gets the related-services for the related interfaces
     e.g. ae20 will also find services on all logical units of ae20 (ae20.1 ...)
     :param source_equipment: equipment name
     :param interface: interface name
@@ -146,14 +146,14 @@ def get_related_services(source_equipment: str, interface: str, r) -> dict:
                         f'{ims_interface}')
     if if_services:
         for s in json.loads(if_services.decode('utf-8')):
-            yield from s['top-level-services']
+            yield from s['related-services']
     for related in related_interfaces(source_equipment, interface):
         ims_interface = get_ims_interface(related)
         rif_services = r.get(
             f'ims:interface_services:{ims_source_equipment}:{ims_interface}')
         if rif_services:
             for s in json.loads(rif_services.decode('utf-8')):
-                yield from s['top-level-services']
+                yield from s['related-services']
 
 
 def get_interface_services_and_loc(ims_source_equipment, ims_interface, redis):
@@ -746,7 +746,7 @@ def get_fiberlink_trap_metadata(ne_name_str: str, object_name_str: str) \
                 for fr in c['fibre-routes']:
                     fr_a_ids.add(fr['id'])
                     all_frs[fr['id']] = fr
-                for fr in c['top-level-services']:
+                for fr in c['related-services']:
                     tls_a_ids.add(fr['id'])
                     all_tls[fr['id']] = fr
         if circuits_b:
@@ -756,7 +756,7 @@ def get_fiberlink_trap_metadata(ne_name_str: str, object_name_str: str) \
                 for fr in c['fibre-routes']:
                     fr_b_ids.add(fr['id'])
                     all_frs[fr['id']] = fr
-                for fr in c['top-level-services']:
+                for fr in c['related-services']:
                     tls_b_ids.add(fr['id'])
                     all_tls[fr['id']] = fr
 
diff --git a/inventory_provider/routes/poller.py b/inventory_provider/routes/poller.py
index 0c35263fbec2af831a8b04b0cc3750dccdd7235f..73681162903e04ee84751946535c6a05e1c1526d 100644
--- a/inventory_provider/routes/poller.py
+++ b/inventory_provider/routes/poller.py
@@ -166,8 +166,8 @@ def _load_interface_bundles(hostname=None):
 
 
 def _load_services(hostname=None):
-    if hostname:
-        hostname = get_ims_equipment_name(hostname)
+    # if hostname:
+    #     hostname = get_ims_equipment_name(hostname)
 
     result = dict()
     key_pattern = f'ims:interface_services:{hostname}:*' \
@@ -272,6 +272,9 @@ def _add_circuits(interfaces, hostname=None):
     :param hostname: hostname or None for all
     :return: generator with 'circuits' populated in each element, if present
     """
+
+    if hostname:
+        hostname = get_ims_equipment_name(hostname)
     services = _load_services(hostname)
     for ifc in interfaces:
         router_services = services.get(
diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py
index b694cb23e1d19ba7029b71aae4e7c60084314a0d..9ecc442f2ab461417c178145f7ba7fd317b16808 100644
--- a/inventory_provider/tasks/worker.py
+++ b/inventory_provider/tasks/worker.py
@@ -532,6 +532,30 @@ def internal_refresh_phase_2(self):
         raise
 
 
+def populate_poller_cache(interface_services, r):
+    host_services = defaultdict(dict)
+    for v in interface_services.values():
+        # logger.debug(v)
+        if v:
+            h = v[0]['equipment']
+            i = v[0]['port']
+            host_services[h][i] = [{
+                'id': s['id'],
+                'name': s['name'],
+                'type': s['service_type'],
+                'status': s['status']
+            } for s in v]
+    # todo - delete from redis
+    rp = r.pipeline()
+    for k in r.scan_iter('poller_cache:*', count=1000):
+        rp.delete(k)
+    rp.execute()
+    rp = r.pipeline()
+    for host, interface_services in host_services.items():
+        rp.set(f'poller_cache:{host}', json.dumps(interface_services))
+    rp.execute()
+
+
 @app.task(
     base=InventoryTask,
     bind=True,
@@ -639,12 +663,12 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False):
     # are the BGP services on top of it
     tls_names.remove('IP PEERING - NON R&E (PUBLIC)')
 
-    def get_top_level_services(circuit_id: str) -> List[dict]:
-        tls = {}
+    def _get_related_services(circuit_id: str) -> List[dict]:
+        rs = {}
         c = hierarchy.get(circuit_id, None)
         if c:
 
-            def _is_tls(candidate):
+            def _is_rs(candidate):
                 if candidate['id'] in circuit_ids_not_to_monitor:
                     return False
                 if candidate['product'] in tls_names:
@@ -653,8 +677,8 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False):
                     return True
                 return False
 
-            if _is_tls(c):
-                tls[c['id']] = {
+            if _is_rs(c):
+                rs[c['id']] = {
                     'id': c['id'],
                     'name': c['name'],
                     'status': c['status'],
@@ -662,12 +686,12 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False):
                     'project': c['project'],
                     'contacts': sorted(list(c['contacts']))
                 }
-            elif c['sub-circuits']:
+            if c['sub-circuits']:
                 for sub in c['sub-circuits']:
                     temp_parents = \
-                        get_top_level_services(sub)
-                    tls.update({t['id']: t for t in temp_parents})
-        return list(tls.values())
+                        _get_related_services(sub)
+                    rs.update({t['id']: t for t in temp_parents})
+        return list(rs.values())
 
     def _format_service(s):
         if s['id'] in circuit_ids_not_to_monitor:
@@ -740,10 +764,10 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False):
                         c['monitored'] = True
                     circ['fibre-routes'].append(c)
 
-                circ['top-level-services'] = \
-                    get_top_level_services(circ['id'])
+                circ['related-services'] = \
+                    _get_related_services(circ['id'])
 
-                for tlc in circ['top-level-services']:
+                for tlc in circ['related-services']:
                     contacts.update(tlc.pop('contacts'))
                 circ['contacts'] = sorted(list(contacts))
 
@@ -783,6 +807,8 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False):
     rp.execute()
     rp = r.pipeline()
 
+    populate_poller_cache(interface_services, r)
+
     for v in access_services.values():
         rp.set(
             f'ims:access_services:{v["name"]}',
diff --git a/test/data/router-info.json b/test/data/router-info.json
index 4f5cd377c493f890fc8ebb7f202ec8badae2049a..87d749d32930dd71e60cc2075f06f02ad72cd1eb 100644
Binary files a/test/data/router-info.json and b/test/data/router-info.json differ