diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 3224176e1c3e62ddbf01fc12805e22d1dfb0e36e..dbcc78e12dc8e19fc02e6baf1fa6e8176701eac9 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -65,7 +65,7 @@ include:
 
 final_report:
   stage: finish
-  #needs: ["ecal_1_emcal_crystal_electrons", "tracking_central_electrons","clustering:results"]
+  needs: ["ecal_collect", "tracking_central_electrons","clustering:results"]
   script:
     # disabled while we address ACTS issues
     #- mkdir -p results/views && cd results/views && bash ../../bin/download_views
diff --git a/benchmarks/clustering/barrel_clusters.sh b/benchmarks/clustering/barrel_clusters.sh
index 6e701cc3dbed451451d256e215d0d55a19f530ee..4d671c8b225104603b6d88cd00040940571d5f58 100644
--- a/benchmarks/clustering/barrel_clusters.sh
+++ b/benchmarks/clustering/barrel_clusters.sh
@@ -1,6 +1,6 @@
 #!/bin/bash
 
-./util/print_env.sh
+print_env.sh
 
 ## To run the reconstruction, we need the following global variables:
 ## - JUGGLER_INSTALL_PREFIX:   Install prefix for Juggler (simu/recon)
@@ -10,7 +10,8 @@
 ##
 ## You can ready options/env.sh for more in-depth explanations of the variables
 ## and how they can be controlled.
-source options/env.sh
+
+# deprecated
 export JUGGLER_DETECTOR_PATH=${DETECTOR_PATH}
 
 if [[ ! -n  "${JUGGLER_N_EVENTS}" ]] ; then 
@@ -30,21 +31,8 @@ export JUGGLER_REC_FILE="rec_${JUGGLER_FILE_NAME_TAG}.root"
 echo "JUGGLER_N_EVENTS = ${JUGGLER_N_EVENTS}"
 echo "JUGGLER_DETECTOR = ${JUGGLER_DETECTOR}"
 
-### Build the detector constructors.
-#git clone https://eicweb.phy.anl.gov/EIC/detectors/${JUGGLER_DETECTOR}.git
-#git clone https://eicweb.phy.anl.gov/EIC/detectors/accelerator.git
-#pushd ${JUGGLER_DETECTOR}
-#ln -s ../accelerator/eic
-#popd
-#mkdir ${JUGGLER_DETECTOR}/build
-#pushd ${JUGGLER_DETECTOR}/build
-#cmake ../. -DCMAKE_INSTALL_PREFIX=/usr/local && make -j30 install
-#popd
-
 root -b -q "benchmarks/clustering/scripts/gen_central_electrons.cxx(${JUGGLER_N_EVENTS}, \"${JUGGLER_FILE_NAME_TAG}.hepmc\")"
 
-#pushd ${JUGGLER_DETECTOR}
-#ls -l
 ### run geant4 simulations
 npsim --runType batch \
       --part.minimalKineticEnergy 1000*GeV  \
@@ -59,14 +47,13 @@ if [[ "$?" -ne "0" ]] ; then
 fi
 
 # Need to figure out how to pass file name to juggler from the commandline
-xenv -x ${JUGGLER_INSTALL_PREFIX}/Juggler.xenv gaudirun.py benchmarks/clustering/options/fullcaloclustering.py
+gaudirun.py benchmarks/clustering/options/fullcalo_clustering.py
 if [[ "$?" -ne "0" ]] ; then
   echo "ERROR running juggler"
   exit 1
 fi
 
-#pwd
-#mkdir -p results/clustering
+mkdir -p results/clustering
 
 #root -b -q "benchmarks/clustering/scripts/barrel_clusters.cxx(\"${JUGGLER_REC_FILE}\")"
 
diff --git a/benchmarks/clustering/config.yml b/benchmarks/clustering/config.yml
index 2cc7fc281f626e5ae22d4c03240a1d12d16ab4cd..76aab71dd4441954b566c91de26fbc1ab3dfbdec 100644
--- a/benchmarks/clustering/config.yml
+++ b/benchmarks/clustering/config.yml
@@ -1,13 +1,12 @@
 clustering:process :
-  allow_failure: true
+  extends: .rec_benchmark
   stage: process
   timeout: 8 hour
-  needs: ["common:detector"]
   script:
     - bash benchmarks/clustering/barrel_clusters.sh
 
 clustering:results:
-  allow_failure: true
+  extends: .rec_benchmark
   stage: collect
   needs: ["clustering:process"]
   script:
diff --git a/benchmarks/ecal/config.yml b/benchmarks/ecal/config.yml
index 87060f135f0fb0754d453342fcfaa274af89fe9d..0632b5cba1e104dbf951f7b53b2e627aebdf4be2 100644
--- a/benchmarks/ecal/config.yml
+++ b/benchmarks/ecal/config.yml
@@ -1,65 +1,42 @@
-ecal_1_emcal_crystal_electrons:
-  image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
+emcal_crystal_electrons:
+  extends: .rec_benchmark
   stage: process
-  needs: ["common:detector"]
   timeout: 8 hours
-  artifacts:
-    expire_in: 20 weeks
-    paths:
-      - results/
-        #allow_failure: true
   script:
     - bash benchmarks/ecal/emcal_electrons.sh
 
-ecal_2_emcal_crystal_pi0s:
-  image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
-  needs: ["common:detector"]
-  timeout: 12 hours
-  artifacts:
-    expire_in: 20 weeks
-    paths:
-      - results/
+emcal_crystal_pi0s:
+  extends: .rec_benchmark
   stage: run
-  #allow_failure: true
+  timeout: 12 hours
   script:
     - bash benchmarks/ecal/emcal_pi0s.sh
 
-ecal_3_emcal_barrel_electrons:
-  image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
-  needs: ["common:detector"]
+emcal_barrel_electrons:
+  extends: .rec_benchmark
   timeout: 48 hours
-  artifacts:
-    expire_in: 20 weeks
-    paths:
-      - results/
   stage: run
-  #allow_failure: true
   script:
     - bash benchmarks/ecal/run_emcal_barrel_electrons.sh
 
-ecal_4_emcal_barrel_pions:
-  image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
-  needs: ["common:detector"]
+emcal_barrel_pions:
+  extends: .rec_benchmark
   timeout: 48 hours
-  artifacts:
-    expire_in: 20 weeks
-    paths:
-      - results/
   stage: run
-  #allow_failure: true
   script:
     - bash benchmarks/ecal/run_emcal_barrel_pions.sh
 
-## Not fully yet...
 full_emcal_barrel_electrons:
-  image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
-  needs: ["common:detector"]
+  extends: .rec_benchmark
   timeout: 48 hours
-  artifacts:
-    expire_in: 20 weeks
-    paths:
-      - results/
   stage: run
-  #allow_failure: true
   script:
     - bash benchmarks/ecal/full_emcal_electrons.sh
+
+ecal_collect:
+  stage: collect
+  needs:
+    - ["emcal_crystal_electrons", "emcal_crystal_pi0s", "emcal_barrel_electrons", "emcal_barrel_pions", "full_emcal_barrel_electrons"]
+  script:
+    - echo "Done collecting artifacts."
+
diff --git a/benchmarks/ecal/emcal_pi0s.sh b/benchmarks/ecal/emcal_pi0s.sh
index fd09b8d823df3f790e6cab6c3943565c23f2c7cd..bed60cd518b56e4e2c78410fbe6d9c717d2ee1cb 100644
--- a/benchmarks/ecal/emcal_pi0s.sh
+++ b/benchmarks/ecal/emcal_pi0s.sh
@@ -58,7 +58,7 @@ if [[ "$?" -ne "0" ]] ; then
 fi
 
 # Need to figure out how to pass file name to juggler from the commandline
-xenv -x ${JUGGLER_INSTALL_PREFIX}/Juggler.xenv gaudirun.py benchmarks/ecal/options/crystal_calorimeter_reco.py
+gaudirun.py benchmarks/ecal/options/crystal_calorimeter_reco.py
 if [[ "$?" -ne "0" ]] ; then
   echo "ERROR running juggler"
   exit 1
diff --git a/benchmarks/ecal/options/crystal_calorimeter_reco.py b/benchmarks/ecal/options/crystal_calorimeter_reco.py
index 7892b0fb5c30b8f3bb7ba6dbde026addab030af7..51b2cf17b076089bf8a210ab97378234197e3139 100644
--- a/benchmarks/ecal/options/crystal_calorimeter_reco.py
+++ b/benchmarks/ecal/options/crystal_calorimeter_reco.py
@@ -32,7 +32,7 @@ if "JUGGLER_N_EVENTS" in os.environ :
   n_events = str(os.environ["JUGGLER_N_EVENTS"])
 
 geo_service  = GeoSvc("GeoSvc", detectors=["{}/{}.xml".format(detector_path,detector_name)])
-podioevent   = EICDataSvc("EventDataSvc", inputs=[input_sim_file], OutputLevel=DEBUG)
+podioevent   = EICDataSvc("EventDataSvc", inputs=[input_sim_file], OutputLevel=INFO)
 
 from Configurables import PodioInput
 from Configurables import Jug__Base__InputCopier_dd4pod__Geant4ParticleCollection_dd4pod__Geant4ParticleCollection_ as MCCopier
@@ -48,8 +48,8 @@ from Configurables import Jug__Reco__ClusterRecoCoG as RecoCoG
 podioinput = PodioInput("PodioReader", collections=["mcparticles","CrystalEcalHits"], 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",OutputLevel=DEBUG) 
-calcopier = CalCopier("CalCopier", inputCollection="CrystalEcalHits", outputCollection="CrystalEcalHits2",OutputLevel=DEBUG) 
+copier    = MCCopier("MCCopier", inputCollection="mcparticles", outputCollection="mcparticles2",OutputLevel=INFO) 
+calcopier = CalCopier("CalCopier", inputCollection="CrystalEcalHits", outputCollection="CrystalEcalHits2",OutputLevel=INFO) 
 
 emcaldigi = CrystalEndcapsDigi("ecal_digi", 
         inputHitCollection="CrystalEcalHits", 
@@ -81,5 +81,5 @@ ApplicationMgr(
     EvtSel = 'NONE',
     EvtMax   = n_events,
     ExtSvc = [podioevent],
-    OutputLevel=DEBUG
+    OutputLevel=INFO
  )
diff --git a/benchmarks/imaging_ecal/config.yml b/benchmarks/imaging_ecal/config.yml
index 958d0d17a46cc5b0a948023bd262e33606cb5ac2..13b684f893fc7d39758046dc22aac2347dd180e9 100644
--- a/benchmarks/imaging_ecal/config.yml
+++ b/benchmarks/imaging_ecal/config.yml
@@ -1,39 +1,21 @@
 imaging_ecal_electrons:
-  image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
-  needs: ["common:detector"]
+  extends: .rec_benchmark
   timeout: 48 hours
-  artifacts:
-    expire_in: 20 weeks
-    paths:
-      - results/
   stage: run
   script:
-    - bash benchmarks/imaging_ecal/run_emcal_barrel.sh -t emcal_barrel_electrons -p "electron" -n 1000
-      #allow_failure: true
+    - bash benchmarks/imaging_ecal/run_emcal_barrel.sh -t emcal_barrel_electrons -p "electron" -n 100
 
 imaging_ecal_photons:
-  image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
-  needs: ["common:detector"]
+  extends: .rec_benchmark
   timeout: 48 hours
-  artifacts:
-    expire_in: 20 weeks
-    paths:
-      - results/
   stage: run
   script:
-    - bash benchmarks/imaging_ecal/run_emcal_barrel.sh -t emcal_barrel_photons -p "photon" -n 1000
-      #allow_failure: true
+    - bash benchmarks/imaging_ecal/run_emcal_barrel.sh -t emcal_barrel_photons -p "photon" -n 100
 
 imaging_ecal_pions:
-  image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
-  needs: ["common:detector"]
+  extends: .rec_benchmark
   timeout: 48 hours
-  artifacts:
-    expire_in: 20 weeks
-    paths:
-      - results/
   stage: run
   script:
-    - bash benchmarks/imaging_ecal/run_emcal_barrel.sh -t emcal_barrel_pions -p "pion-" -n 1000
-      #allow_failure: true
+    - bash benchmarks/imaging_ecal/run_emcal_barrel.sh -t emcal_barrel_pions -p "pion-" -n 100
 
diff --git a/benchmarks/imaging_ecal/options/imaging_topocluster.py b/benchmarks/imaging_ecal/options/imaging_topocluster.py
index dde4426aacd0b685ff9f8b74626dfbb0e8744e92..bdcda122e517fe40ba67afa59c598c8e76b4457a 100644
--- a/benchmarks/imaging_ecal/options/imaging_topocluster.py
+++ b/benchmarks/imaging_ecal/options/imaging_topocluster.py
@@ -21,7 +21,7 @@ kwargs['sf'] = float(os.environ.get('CB_EMCAL_SAMP_FRAC', '1.0'))
 kwargs['input'] = os.environ.get('CB_EMCAL_SIM_FILE', '../topside/barrel_pion0_5GeV.root')
 kwargs['output'] = os.environ.get('CB_EMCAL_REC_FILE', 'barrel_pion0_5GeV_cluster.root')
 kwargs['compact'] = os.environ.get('CB_EMCAL_COMPACT_PATH', '../topside/test.xml')
-kwargs['nev'] = int(os.environ.get('CB_EMCAL_NUMEV', 10000))
+kwargs['nev'] = int(os.environ.get('CB_EMCAL_NUMEV', 100))
 
 if kwargs['nev'] < 1:
     f = ROOT.TFile(kwargs['input'])
diff --git a/benchmarks/imaging_ecal/run_emcal_barrel.sh b/benchmarks/imaging_ecal/run_emcal_barrel.sh
index 4157142e2acb7d7b88dd5d6ea97082b3d5825c4b..ad7f7ed89fdea5a3ec743c878e51c4f54cc4ab6c 100644
--- a/benchmarks/imaging_ecal/run_emcal_barrel.sh
+++ b/benchmarks/imaging_ecal/run_emcal_barrel.sh
@@ -1,13 +1,51 @@
 #!/bin/bash
 
-while getopts t:p:n: flag
+print_env.sh
+
+function print_the_help {
+  echo "USAGE: ${0} -n <nevents> -t <nametag> -p <particle> "
+  echo "  OPTIONS: "
+  echo "    -n,--nevents     Number of eventsj"
+  echo "    -t,--nametag     name tag"
+  echo "    -p,--particle    particle type" 
+  echo "                     allowed types: pion0, pion+, pion-, kaon0, kaon+, kaon-, proton, neutron, electron, positron, photon"
+  exit 
+}
+
+POSITIONAL=()
+while [[ $# -gt 0 ]]
 do
-    case "${flag}" in
-        t) nametag=${OPTARG};;
-        p) particle=${OPTARG};;
-        n) export CB_EMCAL_NUMEV=${OPTARG};;
-    esac
+  key="$1"
+
+  case $key in
+    -h|--help)
+      shift # past argument
+      print_the_help
+      ;;
+    -t|--nametag)
+      nametag="$2"
+      shift # past argument
+      shift # past value
+      ;;
+    -p|--particle)
+      particle="$2"
+      shift # past argument
+      shift # past value
+      ;;
+    -n|--nevents)
+      export CB_EMCAL_NUMEV=${OPTARG}
+      shift # past argument
+      #shift # past value
+      ;;
+    *)    # unknown option
+      #POSITIONAL+=("$1") # save it in an array for later
+      echo "unknown option $1"
+      print_the_help
+      shift # past argument
+      ;;
+  esac
 done
+set -- "${POSITIONAL[@]}" # restore positional parameters
 
 export CB_EMCAL_COMPACT_PATH=${DETECTOR_PATH}/${JUGGLER_DETECTOR}.xml
 
@@ -70,7 +108,7 @@ CB_EMCAL_OPTION_DIR=benchmarks/imaging_ecal/options
 CB_EMCAL_SCRIPT_DIR=benchmarks/imaging_ecal/scripts
 
 # Run Juggler
-xenv -x ${JUGGLER_INSTALL_PREFIX}/Juggler.xenv gaudirun.py ${CB_EMCAL_OPTION_DIR}/imaging_topocluster.py
+gaudirun.py ${CB_EMCAL_OPTION_DIR}/imaging_topocluster.py
 # gaudirun.py ${CB_EMCAL_OPTION_DIR}/imaging_topocluster.py
 if [[ "$?" -ne "0" ]] ; then
   echo "ERROR running juggler"
diff --git a/benchmarks/rich/config.yml b/benchmarks/rich/config.yml
index dae1855d8d04b68a3f40530f8eee3519480ad4e5..3cc8b89f818a3dd9beec29cce8557d5a8aaa77b5 100644
--- a/benchmarks/rich/config.yml
+++ b/benchmarks/rich/config.yml
@@ -1,14 +1,8 @@
 rich_job_x:
-  image: eicweb.phy.anl.gov:4567/eic/juggler/juggler:$JUGGLER_TAG
-  needs: ["common:detector"]
+  extends: .rec_benchmark
   timeout: 24 hours
-  artifacts:
-    expire_in: 20 weeks
-    paths:
-      - results/
   stage: run
   script:
     - bash benchmarks/rich/forward_hadrons.sh
-      #allow_failure: true