diff --git a/Phys/DaVinci/python/DaVinci/algorithms.py b/Phys/DaVinci/python/DaVinci/algorithms.py
index f0fad0585d9f7e39f2be2faf7a60a366104bfb5e..aad3d60c2c2bb41e86a21860846a235e13648529 100644
--- a/Phys/DaVinci/python/DaVinci/algorithms.py
+++ b/Phys/DaVinci/python/DaVinci/algorithms.py
@@ -8,7 +8,9 @@
 # granted to it by virtue of its status as an Intergovernmental Organization  #
 # or submit itself to any jurisdiction.                                       #
 ###############################################################################
-import re, click, json
+import re
+import logging
+import click
 
 from PyConf.Algorithms import (
     FilterDecays,
@@ -22,51 +24,9 @@ from PyConf.application import (
 from Hlt2Conf.algorithms import make_dvalgorithm
 from PyConf.components import force_location
 from Gaudi.Configuration import WARNING
-from .utils import load_file
-
-# needed for backwards compatibility with old style .tck.json files
-__lookup = {
-    1006:
-    "LHCb::RecSummary",
-    1541:
-    "KeyedContainer<LHCb::CaloCluster,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1542:
-    "KeyedContainer<LHCb::CaloDigit,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1543:
-    "KeyedContainer<LHCb::CaloAdc,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1550:
-    "KeyedContainer<LHCb::Event::v1::Track,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1551:
-    "KeyedContainer<LHCb::CaloHypo,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1552:
-    "KeyedContainer<LHCb::ProtoParticle,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1553:
-    "KeyedContainer<LHCb::RecVertex,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1554:
-    "KeyedContainer<LHCb::TwoProngVertex,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1555:
-    "KeyedContainer<LHCb::WeightsVector,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1560:
-    "LHCb::Relation1D<LHCb::Particle,LHCb::VertexBase>",
-    1561:
-    "KeyedContainer<LHCb::RichPID,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1562:
-    "LHCb::RelationWeighted1D<LHCb::ProtoParticle,LHCb::MCParticle,double>",
-    1571:
-    "KeyedContainer<LHCb::MuonPID,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1581:
-    "KeyedContainer<LHCb::Particle,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1582:
-    "KeyedContainer<LHCb::Vertex,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1583:
-    "KeyedContainer<LHCb::FlavourTag,Containers::KeyedObjectManager<Containers::hashmap> >",
-    1584:
-    "LHCb::Relation1D<LHCb::Particle,LHCb::RelatedInfoMap>",
-    1591:
-    "LHCb::Relation1D<LHCb::Particle,int>",
-    1660:
-    "LHCb::Relation1D<LHCb::Particle,LHCb::MCParticle>",
-}
+from GaudiConf import reading
+
+log = logging.getLogger(__name__)
 
 
 def set_filter(name, code, dec_reports):
@@ -197,6 +157,48 @@ def define_fsr_writer(options):
     return algs
 
 
+def __configure_unpacking(manifest, process, stream, simulation):
+    unpack_raw_event = reading.unpack_rawevent(
+        bank_types=['ODIN', 'DstData', 'HltDecReports'],
+        process=process,
+        stream=stream,
+        output_level=5,
+        configurables=False)
+
+    if process == "Spruce":
+        TES_ROOT = '/Event/Spruce'
+    else:
+        TES_ROOT = '/Event/HLT2'
+
+    reading_algs = []
+
+    locations = reading.make_locations(manifest, TES_ROOT)
+    reading_algs += [unpack_raw_event]
+
+    packed_decoder = reading.decoder(
+        process=process, stream=stream, output_level=5, configurables=False)
+    reading_algs += [packed_decoder]
+
+    mc_unpackers = []
+    if simulation:
+        mc_unpackers = reading.mc_unpackers(
+            process=process, configurables=False)
+
+    reading_algs += mc_unpackers
+
+    reading_algs += reading.unpackers(
+        locations,
+        manifest,
+        packed_decoder.OutputBuffers,
+        mc=mc_unpackers,
+        process=process,
+        output_level=5,
+        configurables=False)
+
+    # TODO: return a dictionary of handles to the data instead!!!
+    return reading_algs
+
+
 def unpack_locations(options, unpack_only_mc):
     """
     Configures algorithms for reading HLT2/Spruce output. Location are found using stream as prefix.
@@ -215,69 +217,29 @@ def unpack_locations(options, unpack_only_mc):
     stream = options.stream
     reading_algs = []
 
-    if process == "Spruce":
-        TES_ROOT = '/Event/Spruce'
-    else:
-        TES_ROOT = '/Event/HLT2'
-
     if unpack_only_mc:
         if options.simulation:
             reading_algs += reading.mc_unpackers(
                 process=process, filtered_mc=False, configurables=False)
         else:
-            message = "Requested unpacking MC but simulation is set False. Check your DV options."
+            message = 'Requested unpacking MC but simulation is set False. Check your DV options.'
             click.echo(
                 f"{click.style('WARNING', bold=True, fg='yellow')} {click.style(message, fg='white')}"
             )
     elif options.annsvc_config:
         # NOTE: this has _nothing_ to do with the ANNSvc
-        d = json.loads(load_file(options.annsvc_config))
-        ann = d.get("HltANNSvc/HltANNSvc", None)
-        if ann is not None:
-            # this is an old style .tck.json file -- adapt it on the fly
-            fix_prefix = lambda x, prefix: prefix + x.removeprefix(prefix + 'p') if x.startswith(prefix + 'p') else x
-            manifest = {
-                'PackedLocations':
-                [(fix_prefix(
-                    fix_prefix(loc, '/Event/Spruce/'), '/Event/HLT2/'),
-                  __lookup[t % 10000])
-                 for loc, t in ann['PackedObjectTypes'].items()]
-            }
-        else:
-            manifest = d
-
-        unpack_raw_event = reading.unpack_rawevent(
-            bank_types=['ODIN', 'DstData', 'HltDecReports'],
-            process=process,
-            stream=stream,
-            output_level=5,
-            configurables=False)
-
-        locations = reading.make_locations(manifest, TES_ROOT)
-        reading_algs += [unpack_raw_event]
-
-        packed_decoder = reading.decoder(
-            process=process,
-            stream=stream,
-            output_level=5,
-            configurables=False)
-        reading_algs += [packed_decoder]
-
-        mc_unpackers = []
-        if options.simulation:
-            mc_unpackers = reading.mc_unpackers(
-                process=process, configurables=False)
-
-        reading_algs += mc_unpackers
-
-        reading_algs += reading.unpackers(
-            locations,
-            manifest,
-            packed_decoder.OutputBuffers,
-            mc=mc_unpackers,
-            process=process,
-            output_level=5,
-            configurables=False)
+        #  but unfortunately that's what the option is currently called...
+        assert not options.input_manifest_file, "annsvc_config and input_manifest_file are mutually exclusive"
+        log.warning(
+            'deprecated option: \'annsvc_config\'. Please use \'input_manifest_file\' instead'
+        )
+        reading_algs += __configure_unpacking(
+            reading.load_manifest(options.annsvc_config), process, stream,
+            options.simulation)
+    elif options.input_manifest_file:
+        reading_algs += __configure_unpacking(
+            reading.load_manifest(options.input_manifest_file), process,
+            stream, options.simulation)
 
     return reading_algs