diff --git a/inventory_provider/db/ims_data.py b/inventory_provider/db/ims_data.py
index f6d856c845b328aa7a0cf65a7afa7af10adad29d..0283754bf0f3367fdb6a1bf9911dcf3ecb88970d 100644
--- a/inventory_provider/db/ims_data.py
+++ b/inventory_provider/db/ims_data.py
@@ -2,7 +2,8 @@ import logging
 import re
 from collections import OrderedDict, defaultdict
 from copy import copy
-from itertools import chain
+from itertools import chain, groupby
+from operator import itemgetter
 
 from inventory_provider import environment
 from inventory_provider.db import ims
@@ -75,6 +76,18 @@ def get_customer_service_emails(ds: IMS):
         yield k, sorted(list(v))
 
 
+def get_circuit_related_customer_ids(ds: IMS):
+    relations = sorted(
+        list(
+            ds.get_filtered_entities(
+                'CircuitCustomerRelation',
+                'circuit.inventoryStatusId== 3')
+        ), key=itemgetter('circuitid'))
+
+    return {k: [c['customerid'] for c in v] for k, v in
+            groupby(relations, key=itemgetter('circuitid'))}
+
+
 def get_port_id_services(ds: IMS):
     circuit_nav_props = [
         ims.CIRCUIT_PROPERTIES['Ports'],
diff --git a/inventory_provider/routes/classifier.py b/inventory_provider/routes/classifier.py
index 6d27c8a081c398aec98ade4aac42647ef0dd00fe..d2b46d342a1793562e52aa5cd04ca265c88a480c 100644
--- a/inventory_provider/routes/classifier.py
+++ b/inventory_provider/routes/classifier.py
@@ -185,12 +185,12 @@ def get_interface_services_and_loc(ims_source_equipment, ims_interface, redis):
         for s in json.loads(raw_services.decode('utf-8')):
             related_services.update(
                 {r['id']: r for r in s['related-services']})
+            contacts.update(set(s.pop('contacts', set())))
             if s['circuit_type'] == 'service':
-                contacts.update(set(s.pop('contacts', set())))
                 _format_service(s)
                 result['services'].append(s)
-        result['related-services'] = list(related_services.values())
         result['contacts'] = sorted(list(contacts))
+        result['related-services'] = list(related_services.values())
 
         if not result['services']:
             result.pop('services', None)
diff --git a/inventory_provider/tasks/worker.py b/inventory_provider/tasks/worker.py
index 4d7e33c506390db0a5b76b129dabe06d02156ffd..544e10c098db1343ae249718c6011d50102b629b 100644
--- a/inventory_provider/tasks/worker.py
+++ b/inventory_provider/tasks/worker.py
@@ -574,6 +574,8 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False):
         {k: v for k, v in ims_data.get_customer_service_emails(ds1)}
     circuit_ids_to_monitor = \
         list(ims_data.get_monitored_circuit_ids(ds1))
+    additional_circuit_customer_ids = \
+        ims_data.get_circuit_related_customer_ids(ds1)
 
     hierarchy = None
     port_id_details = defaultdict(list)
@@ -613,12 +615,18 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False):
             else:
                 return 0
 
+    def _get_circuit_contacts(c):
+        customer_ids = {c['customerid']}
+        customer_ids.update(additional_circuit_customer_ids.get(c['id'], []))
+        return set().union(
+            *[customer_contacts.get(cid, []) for cid in customer_ids])
+
     def _populate_hierarchy():
         nonlocal hierarchy
         hierarchy = {}
         for d in ims_data.get_circuit_hierarchy(ds1):
-            d['contacts'] = customer_contacts.get(d['customerid'], [])
             hierarchy[d['id']] = d
+            d['contacts'] = sorted(list(_get_circuit_contacts(d)))
         logger.debug("hierarchy complete")
 
     def _populate_port_id_details():
@@ -672,7 +680,7 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False):
                     'circuit_type': c['circuit-type'],
                     'service_type': c['product'],
                     'project': c['project'],
-                    'contacts': sorted(list(c['contacts']))
+                    'contacts': c['contacts']
                 }
                 if c['id'] in circuit_ids_to_monitor:
                     rs[c['id']]['status'] = c['status']
@@ -737,13 +745,7 @@ def update_circuit_hierarchy_and_port_id_services(self, use_current=False):
             circuits = port_id_services.get(details['port_id'], [])
 
             for circ in circuits:
-                contacts = set()
-                contacts.update(
-                    customer_contacts.get(
-                        circ['customerid'],
-                        []
-                    )
-                )
+                contacts = _get_circuit_contacts(circ)
                 circ['fibre-routes'] = []
                 for x in set(_get_fibre_routes(circ['id'])):
                     c = {