diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 444fe93852e62e35724916b54687edb00ecc16fd..56422570f04ef7c20dab511f80fdf505cc32e838 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -12,18 +12,18 @@ stages:
 compile:
   stage: build
   tags:
-    - sodium
+    - silicon
   before_script:
     - pwd &&  ls -lrth
   script:
     - export homedir=$(pwd) &&  pwd && cd /tmp && git clone --depth=1 https://eicweb.phy.anl.gov/EIC/NPDet.git && mkdir build && cd build && cmake ../NPDet/. && make -j20 install
     - cd /tmp && git clone --depth=1 https://eicweb.phy.anl.gov/EIC/eicd.git && mkdir eicd_build && cd eicd_build && cmake ../eicd/. && make -j20 install
-    - cd $homedir && ls -lrth && mkdir build && cd build && cmake .. && make -j 20
+    - cd $homedir && ls -lrth && mkdir build && cd build && cmake .. && make -j10
 
 run_example:
   stage: run
   tags:
-    - sodium
+    - silicon
   script:
     - ./build/run gaudirun.py Examples/options/hello_world.py
 
@@ -31,6 +31,6 @@ run_example2:
   image: eicweb.phy.anl.gov:4567/eic/npdet/npdet:latest
   stage: run
   tags:
-    - sodium
+    - silicon
   script:
     - ./build/run gaudirun.py JugBase/tests/options/simple_reader.py
diff --git a/JugDigi/src/components/HadronicCalDigi.cpp b/JugDigi/src/components/HadronicCalDigi.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..9d08d5bb5e71e5e379e663be92a7c50f81aae9e7
--- /dev/null
+++ b/JugDigi/src/components/HadronicCalDigi.cpp
@@ -0,0 +1,88 @@
+#include <algorithm>
+
+#include "GaudiAlg/Transformer.h"
+#include "GaudiAlg/Producer.h"
+#include "GaudiAlg/GaudiTool.h"
+#include "GaudiKernel/RndmGenerators.h"
+#include "Gaudi/Property.h"
+
+// FCCSW
+#include "JugBase/DataHandle.h"
+
+// Event Model related classes
+#include "eicd/RawCalorimeterHitCollection.h"
+#include "eicd/RawCalorimeterHitData.h"
+#include "dd4pod/CalorimeterHitCollection.h"
+
+namespace Jug {
+  namespace Digi {
+
+    /** Hadronic Calorimeter Digitization.
+     *
+     * \f$ \sigma/E = a/\sqrt{E} \oplus b \f$
+     *
+     * \param a stochastic term (0.5 is 50%)
+     * \param b constant term (0.05 is 5%)
+     *
+     * Resolution terms are added in quadrature. 
+     * When digitizing they are assumed to be independent random variables and are sampled as such.
+     *
+     *
+     */
+    class HadronicCalDigi : public GaudiAlgorithm {
+    public:
+      Gaudi::Property<double>                      m_energyResolution_a{this, "energyResolution_a", 0.5 /*50 percent*/};
+      Gaudi::Property<double>                      m_energyResolution_b{this, "energyResolution_b", 0.05 /* 5 percent*/};
+      Rndm::Numbers                                m_gaussDist_a;
+      Rndm::Numbers                                m_gaussDist_b;
+      DataHandle<dd4pod::CalorimeterHitCollection> m_inputHitCollection{"inputHitCollection", Gaudi::DataHandle::Reader,
+                                                                        this};
+      DataHandle<eic::RawCalorimeterHitCollection> m_outputHitCollection{"outputHitCollection",
+                                                                         Gaudi::DataHandle::Writer, this};
+
+    public:
+      HadronicCalDigi(const std::string& name, ISvcLocator* svcLoc) : GaudiAlgorithm(name, svcLoc) {
+        declareProperty("inputHitCollection", m_inputHitCollection, "");
+        declareProperty("outputHitCollection", m_outputHitCollection, "");
+      }
+
+      StatusCode initialize() override {
+        IRndmGenSvc* randSvc = svc<IRndmGenSvc>("RndmGenSvc", true);
+        StatusCode   sc      = m_gaussDist_a.initialize(randSvc, Rndm::Gauss(0.0, m_energyResolution_a.value() ));
+        if (!sc.isSuccess()) {
+          return StatusCode::FAILURE;
+        }
+        sc      = m_gaussDist_b.initialize(randSvc, Rndm::Gauss(0.0, m_energyResolution_b.value()));
+        if (!sc.isSuccess()) {
+          return StatusCode::FAILURE;
+        }
+        if (GaudiAlgorithm::initialize().isFailure())
+          return StatusCode::FAILURE;
+        // f_counter = m_starting_value.value();
+        return StatusCode::SUCCESS;
+      }
+
+      StatusCode execute() override {
+        // input collection
+        const dd4pod::CalorimeterHitCollection* simhits = m_inputHitCollection.get();
+        // Create output collections
+        auto                              rawhits          = m_outputHitCollection.createAndPut();
+        eic::RawCalorimeterHitCollection* rawHitCollection = new eic::RawCalorimeterHitCollection();
+        for (const auto& ahit : *simhits) {
+          // std::cout << ahit << "\n";
+          double  sqrtE = std::sqrt(ahit.energyDeposit()) ;
+          double aterm = m_gaussDist_a()*sqrtE;
+          double bterm = ahit.energyDeposit()*m_gaussDist_b();
+          // here 1000 is arbitrary scale factor
+          eic::RawCalorimeterHit rawhit((long long)ahit.cellID(), (long long)ahit.cellID(),
+                                        (long long)(ahit.energyDeposit() +aterm + bterm) * 1000, 0);
+          rawhits->push_back(rawhit);
+        }
+        return StatusCode::SUCCESS;
+      }
+    };
+    DECLARE_COMPONENT(HadronicCalDigi)
+
+  } // namespace Digi
+} // namespace Jug
+