diff --git a/inventory_provider/tasks/ims_worker.py b/inventory_provider/tasks/ims_worker.py
index 87ee77be00dd9ebf6f6deb610da89c3968113296..1da774f6c1b48bc4c9d4f1ef430a9d7cea78721c 100644
--- a/inventory_provider/tasks/ims_worker.py
+++ b/inventory_provider/tasks/ims_worker.py
@@ -3,6 +3,7 @@ import json
 import logging
 import subprocess
 import tempfile
+from collections import defaultdict
 from datetime import datetime
 from enum import IntFlag
 from pathlib import Path
@@ -21,6 +22,41 @@ environment.setup_logging()
 logger = logging.getLogger(__name__)
 
 
+@app.task(
+    base=InventoryTask, bind=True, name='update_interfaces_to_services_ims')
+@log_task_entry_and_exit
+def update_interfaces_to_services_ims(self, use_current=False):
+    interface_services = defaultdict(list)
+
+    c = InventoryTask.config["ims"]
+    ds = IMS(c['api'], c['username'], c['password'])
+
+    for service in ims_data.get_interface_services(ds):
+        equipment_interface = '%s:%s' % (
+            service['equipment'], service['interface_name'])
+        interface_services[equipment_interface].append(service)
+
+
+    if use_current:
+        r = get_current_redis(InventoryTask.config)
+        # scan with bigger batches, to mitigate network latency effects
+    else:
+        r = get_next_redis(InventoryTask.config)
+
+    rp = r.pipeline()
+    # scan with bigger batches, to mitigate network latency effects
+    for key in r.scan_iter('ims:interface_services:*', count=1000):
+        rp.delete(key)
+    rp.execute()
+
+    rp = r.pipeline()
+    for equipment_interface, services in interface_services.items():
+        rp.set(
+            f'ims:interface_services:{equipment_interface}',
+            json.dumps(services))
+    rp.execute()
+
+
 @app.task(base=InventoryTask, bind=True, name='update_circuit_hierarchy_ims')
 @log_task_entry_and_exit
 def update_circuit_hierarchy_ims(self, use_current=False):