diff --git a/options/tracker_reconstruction.py b/options/tracker_reconstruction.py
new file mode 100644
index 0000000000000000000000000000000000000000..75f104aee62a105069b4f2114548a48893761f6d
--- /dev/null
+++ b/options/tracker_reconstruction.py
@@ -0,0 +1,205 @@
+from Gaudi.Configuration import *
+
+from GaudiKernel.DataObjectHandleBase import DataObjectHandleBase
+from Configurables import ApplicationMgr, EICDataSvc, PodioOutput, GeoSvc
+from GaudiKernel import SystemOfUnits as units
+
+detector_name = "topside"
+if "JUGGLER_DETECTOR" in os.environ :
+  detector_name = str(os.environ["JUGGLER_DETECTOR"])
+
+# todo add checks
+input_sim_file  = str(os.environ["JUGGLER_SIM_FILE"])
+output_rec_file = str(os.environ["JUGGLER_REC_FILE"])
+n_events = str(os.environ["JUGGLER_N_EVENTS"])
+
+geo_service  = GeoSvc("GeoSvc", detectors=["{}.xml".format(detector_name)])
+podioevent   = EICDataSvc("EventDataSvc", inputs=[input_sim_file], OutputLevel=DEBUG)
+
+from Configurables import PodioInput
+from Configurables import Jug__Base__InputCopier_dd4pod__Geant4ParticleCollection_dd4pod__Geant4ParticleCollection_ as MCCopier
+from Configurables import Jug__Base__InputCopier_dd4pod__CalorimeterHitCollection_dd4pod__CalorimeterHitCollection_ as CalCopier
+from Configurables import Jug__Base__InputCopier_dd4pod__TrackerHitCollection_dd4pod__TrackerHitCollection_ as TrkCopier
+
+from Configurables import Jug__Digi__ExampleCaloDigi as ExampleCaloDigi
+from Configurables import Jug__Digi__UFSDTrackerDigi as UFSDTrackerDigi
+from Configurables import Jug__Digi__EMCalorimeterDigi as EMCalorimeterDigi
+
+from Configurables import Jug__Reco__TrackerHitReconstruction as TrackerHitReconstruction
+
+from Configurables import Jug__Reco__TrackerSourceLinker as TrackerSourceLinker
+from Configurables import Jug__Reco__TrackingHitsSourceLinker as TrackingHitsSourceLinker
+from Configurables import Jug__Reco__TrackParamTruthInit as TrackParamTruthInit
+from Configurables import Jug__Reco__TrackParamClusterInit as TrackParamClusterInit
+from Configurables import Jug__Reco__TrackParamVertexClusterInit as TrackParamVertexClusterInit
+
+from Configurables import Jug__Reco__TrackFindingAlgorithm as TrackFindingAlgorithm
+from Configurables import Jug__Reco__ParticlesFromTrackFit as ParticlesFromTrackFit
+from Configurables import Jug__Reco__EMCalReconstruction as EMCalReconstruction
+
+from Configurables import Jug__Reco__SimpleClustering as SimpleClustering
+
+
+
+podioinput = PodioInput("PodioReader", 
+                        collections=["mcparticles","SiTrackerBarrelHits","SiVertexBarrelHits","EcalBarrelHits"])#, OutputLevel=DEBUG)
+
+## copiers to get around input --> output copy bug. Note the "2" appended to the output collection.
+copier = MCCopier("MCCopier", 
+        inputCollection="mcparticles", 
+        outputCollection="mcparticles2") 
+trkcopier = TrkCopier("TrkCopier", 
+        inputCollection="SiTrackerBarrelHits", 
+        outputCollection="SiTrackerBarrelHits2") 
+
+ecal_digi = EMCalorimeterDigi("ecal_digi", 
+        inputHitCollection="EcalBarrelHits", 
+        outputHitCollection="RawEcalBarrelHits")
+
+ufsd_digi = UFSDTrackerDigi("ufsd_digi", 
+        inputHitCollection="SiTrackerBarrelHits",
+        outputHitCollection="SiTrackerBarrelRawHits",
+        timeResolution=8)
+
+vtx_digi = UFSDTrackerDigi("vtx_digi", 
+        inputHitCollection="SiVertexBarrelHits",
+        outputHitCollection="SiVertexBarrelRawHits",
+        timeResolution=8)
+
+
+ecal_reco = EMCalReconstruction("ecal_reco", 
+        inputHitCollection="RawEcalBarrelHits", 
+        outputHitCollection="RecEcalBarrelHits",
+        minModuleEdep=0.0*units.MeV,
+        OutputLevel=DEBUG)
+
+simple_cluster = SimpleClustering("simple_cluster", 
+        inputHitCollection="RecEcalBarrelHits", 
+        outputClusters="SimpleClusters",
+        minModuleEdep=1.0*units.MeV,
+        maxDistance=50.0*units.cm,
+        OutputLevel=DEBUG)
+
+trk_barrel_reco = TrackerHitReconstruction("trk_barrel_reco",
+        inputHitCollection="SiTrackerBarrelRawHits",
+        outputHitCollection="TrackerBarrelRecHits")
+
+vtx_barrel_reco = TrackerHitReconstruction("vtx_barrel_reco",
+        inputHitCollection = vtx_digi.outputHitCollection,
+        outputHitCollection="VertexBarrelRecHits")
+
+# Source linker 
+sourcelinker = TrackerSourceLinker("trk_srclinker",
+        inputHitCollection="TrackerBarrelRecHits",
+        outputSourceLinks="BarrelTrackSourceLinks",
+        OutputLevel=DEBUG)
+
+trk_hits_srclnkr = TrackingHitsSourceLinker("trk_hits_srclnkr",
+        inputTrackerCollections=["TrackerBarrelRecHits","VertexBarrelRecHits"],
+        outputSourceLinks="BarrelSourceLinks",
+        OutputLevel=DEBUG)
+
+## Track param init
+truth_trk_init = TrackParamTruthInit("truth_trk_init",
+        inputMCParticles="mcparticles",
+        outputInitialTrackParameters="InitTrackParams",
+        OutputLevel=DEBUG)
+
+clust_trk_init = TrackParamClusterInit("clust_trk_init",
+        inputClusters="SimpleClusters",
+        outputInitialTrackParameters="InitTrackParamsFromClusters",
+        OutputLevel=DEBUG)
+
+vtxcluster_trk_init = TrackParamVertexClusterInit("vtxcluster_trk_init",
+        inputVertexHits="VertexBarrelRecHits",
+        inputClusters="SimpleClusters",
+        outputInitialTrackParameters="InitTrackParamsFromVtxClusters",
+        maxHitRadius=40.0*units.mm,
+        OutputLevel=DEBUG)
+
+# Tracking algorithms
+trk_find_alg = TrackFindingAlgorithm("trk_find_alg",
+        inputSourceLinks="BarrelSourceLinks",
+        inputInitialTrackParameters= "InitTrackParams",#"InitTrackParamsFromClusters", 
+        outputTrajectories="trajectories",
+        OutputLevel=DEBUG)
+parts_from_fit = ParticlesFromTrackFit("parts_from_fit",
+        inputTrajectories="trajectories",
+        outputParticles="ReconstructedParticles",
+        outputTrackParameters="outputTrackParameters",
+        OutputLevel=DEBUG)
+
+trk_find_alg1 = TrackFindingAlgorithm("trk_find_alg1",
+        inputSourceLinks="BarrelSourceLinks",
+        inputInitialTrackParameters= "InitTrackParamsFromClusters", 
+        outputTrajectories="trajectories1",
+        OutputLevel=DEBUG)
+parts_from_fit1 = ParticlesFromTrackFit("parts_from_fit1",
+        inputTrajectories="trajectories1",
+        outputParticles="ReconstructedParticles1",
+        outputTrackParameters="outputTrackParameters1",
+        OutputLevel=DEBUG)
+
+trk_find_alg2 = TrackFindingAlgorithm("trk_find_alg2",
+        inputSourceLinks="BarrelSourceLinks",
+        inputInitialTrackParameters= "InitTrackParamsFromVtxClusters", 
+        outputTrajectories="trajectories2",
+        OutputLevel=DEBUG)
+parts_from_fit2 = ParticlesFromTrackFit("parts_from_fit2",
+        inputTrajectories="trajectories2",
+        outputParticles="ReconstructedParticles2",
+        outputTrackParameters="outputTrackParameters2",
+        OutputLevel=DEBUG)
+
+
+#types = []
+## this printout is useful to check that the type information is passed to python correctly
+#print("---------------------------------------\n")
+#print("---\n# List of input and output types by class")
+#for configurable in sorted([ PodioInput, EICDataSvc, PodioOutput,
+#                             TrackerHitReconstruction,ExampleCaloDigi, 
+#                             UFSDTrackerDigi, TrackerSourceLinker,
+#                             PodioOutput],
+#                           key=lambda c: c.getType()):
+#    print("\"{}\":".format(configurable.getType()))
+#    props = configurable.getDefaultProperties()
+#    for propname, prop in sorted(props.items()):
+#        print(" prop name: {}".format(propname))
+#        if isinstance(prop, DataObjectHandleBase):
+#            types.append(prop.type())
+#            print("  {}: \"{}\"".format(propname, prop.type()))
+#print("---")
+
+out = PodioOutput("out", filename=output_rec_file)
+out.outputCommands = ["keep *", 
+        "drop BarrelTrackSourceLinks", 
+        "drop InitTrackParams",
+        "drop trajectories",
+        "drop outputSourceLinks",
+        "drop outputInitialTrackParameters",
+        "drop mcparticles"
+        ]
+
+ApplicationMgr(
+    TopAlg = [podioinput, 
+              copier, trkcopier,
+              ecal_digi, ufsd_digi, vtx_digi, 
+              ecal_reco, 
+              simple_cluster,
+              trk_barrel_reco, 
+              vtx_barrel_reco, 
+              sourcelinker, trk_hits_srclnkr,
+              clust_trk_init, 
+              truth_trk_init, 
+              vtxcluster_trk_init, 
+              trk_find_alg, parts_from_fit,
+              trk_find_alg1, parts_from_fit1,
+              trk_find_alg2, parts_from_fit2,
+              out
+              ],
+    EvtSel = 'NONE',
+    EvtMax   = n_events,
+    ExtSvc = [podioevent,geo_service],
+    OutputLevel=DEBUG
+ )
+