diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000000000000000000000000000000000000..99a3531c48cdaaf7512ffab7b543a15ecad8181f
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,60 @@
+
+
+dist: bionic
+
+services:
+  - docker
+
+language: cpp
+
+env:
+  matrix:
+    - COMPILER=gcc;   LCG_RELEASE=LCG_96c_LS; STANDARD=17; COMPILER_VERSION=gcc8;
+
+before_install:
+  - wget --no-check-certificate https://ecsft.cern.ch/dist/cvmfs/cvmfs-release/cvmfs-release-latest_all.deb
+  - sudo dpkg -i cvmfs-release-latest_all.deb
+  - sudo apt-get update
+  - sudo apt-get install cvmfs cvmfs-config-default
+  - rm -f cvmfs-release-latest_all.deb
+  - sudo mkdir -p /etc/cvmfs
+  - echo "CVMFS_QUOTA_LIMIT='32140'"                                | sudo tee     /etc/cvmfs/default.local > /dev/null
+  - echo "CVMFS_HTTP_PROXY=DIRECT"                                  | sudo tee -a  /etc/cvmfs/default.local > /dev/null
+  - echo "CVMFS_CACHE_BASE='/var/lib/cvmfs'"                        | sudo tee -a  /etc/cvmfs/default.local > /dev/null
+  - echo "CVMFS_FORCE_SIGNING='yes'"                                | sudo tee -a  /etc/cvmfs/default.local > /dev/null
+  - echo "CVMFS_REPOSITORIES='sft.cern.ch,sw-nightlies.hsf.org'"    | sudo tee -a  /etc/cvmfs/default.local > /dev/null
+  - echo "CVMFS_SEND_INFO_HEADER=no"                                | sudo tee -a  /etc/cvmfs/default.local > /dev/null
+  - cat /etc/cvmfs/default.local
+  - # change wrt dd4hep setup: don't manually mount cvmfs folders
+  - #sudo /etc/init.d/autofs stop
+  - sudo cvmfs_config setup
+  - sudo cvmfs_config probe
+  - sudo mkdir -p /cvmfs/sft.cern.ch
+  - sudo mkdir -p /cvmfs/sft-nightlies.cern.ch
+  - sudo mkdir -p /cvmfs/geant4.cern.ch
+  - sudo mkdir -p /cvmfs/sw-nightlies.hsf.org
+  - ls /cvmfs/sft.cern.ch
+  - ls /cvmfs/geant4.cern.ch
+  - ls /cvmfs/sw-nightlies.hsf.org
+  - export CVMFS_REPOS="-v /cvmfs/sft.cern.ch:/cvmfs/sft.cern.ch"
+  - export CVMFS_REPOS="${CVMFS_REPOS} -v /cvmfs/sw-nightlies.hsf.org:/cvmfs/sw-nightlies.hsf.org"
+  - export CVMFS_REPOS="${CVMFS_REPOS} -v /cvmfs/geant4.cern.ch:/cvmfs/geant4.cern.ch"
+
+
+# command to install dependencies
+install:
+  - shopt -s extglob dotglob
+  - mkdir package
+  - mv !(package) package
+  - shopt -u dotglob
+  - export PKGDIR=${PWD}/package
+
+# command to run tests
+script:
+  - docker run -ti --name CI_CONTAINER -v $PKGDIR:/workspace -e COMPILER_TYPE=$COMPILER -e LCG_RELEASE=${LCG_RELEASE} -e STANDARD=${STANDARD} -e COMPILER_VERSION=${COMPILER_VERSION} ${CVMFS_REPOS} -d clicdp/cc7-lcg bash 
+  - docker exec -ti CI_CONTAINER  /bin/bash -c "cd /workspace; ln -s /usr/lib64/liblzma.so.5.2.2 /usr/lib64/liblzma.so; echo 'hello world'"
+
+
+# Don't send e-mail notifications
+notifications:
+  email: false
diff --git a/Detector/DetInterface/DetInterface/IGeoSvc.h b/Detector/DetInterface/DetInterface/IGeoSvc.h
index 58df046d4aed0d5e22674f84db704c2d06bf749b..2925d7a2dec6ce96ffbe3f26779fadd1fa742c57 100644
--- a/Detector/DetInterface/DetInterface/IGeoSvc.h
+++ b/Detector/DetInterface/DetInterface/IGeoSvc.h
@@ -13,14 +13,18 @@
 #include "GaudiKernel/IService.h"
 
 namespace dd4hep {
-class Detector;
-class DetElement;
+    class Detector;
+    class DetElement;
+    namespace DDSegmentation {
+        class BitFieldCoder;
+    }
 }
 
 // class G4VUserDetectorConstruction;
 
 class GAUDI_API IGeoSvc : virtual public IService {
-
+public:
+  typedef dd4hep::DDSegmentation::BitFieldCoder Decoder;
 public:
   /// InterfaceID
   DeclareInterfaceID(IGeoSvc, 1, 0);
@@ -30,6 +34,9 @@ public:
   // receive Geant4 Geometry
   // virtual G4VUserDetectorConstruction* getGeant4Geo() = 0;
 
+  // short cut to retrieve the Decoder according to the Readout name
+  virtual Decoder* getDecoder(const std::string& readout_name) = 0;
+
   virtual ~IGeoSvc() {}
 };
 
diff --git a/Detector/GeoSvc/src/GeoSvc.cpp b/Detector/GeoSvc/src/GeoSvc.cpp
index 305896c44546a12d3e34e3630f2632fe23a0806c..1739aa8a68e3996ea56d37849ffefa8dcd0b2f71 100644
--- a/Detector/GeoSvc/src/GeoSvc.cpp
+++ b/Detector/GeoSvc/src/GeoSvc.cpp
@@ -46,3 +46,34 @@ dd4hep::Detector*
 GeoSvc::lcdd() {
     return m_dd4hep_geo;
 }
+
+IGeoSvc::Decoder*
+GeoSvc::getDecoder(const std::string& readout_name) {
+
+    IGeoSvc::Decoder* decoder = nullptr;
+
+    if (!lcdd()) {
+        error() << "Failed to get lcdd()" << endmsg;
+        return decoder;
+    }
+
+    auto readouts = m_dd4hep_geo->readouts();
+    if (readouts.find(readout_name) == readouts.end()) {
+        error() << "Failed to find readout name '" << readout_name << "'"
+                << " in DD4hep::readouts. "
+                << endmsg;
+        return decoder;
+    }
+    
+    dd4hep::Readout readout = lcdd()->readout(readout_name);
+    auto m_idspec = readout.idSpec(); 
+
+    decoder = m_idspec.decoder();
+
+    if (!decoder) {
+        error() << "Failed to get the decoder with readout '"
+                << readout_name << "'" << endmsg;
+    }
+
+    return decoder;
+}
diff --git a/Detector/GeoSvc/src/GeoSvc.h b/Detector/GeoSvc/src/GeoSvc.h
index 9c98daa9d58bb5f4786aa2881eb639716fc7d5ff..1be2b4ff4e0d4a504e216cc9b9a302dec001f5f6 100644
--- a/Detector/GeoSvc/src/GeoSvc.h
+++ b/Detector/GeoSvc/src/GeoSvc.h
@@ -28,6 +28,8 @@ public:
     dd4hep::DetElement getDD4HepGeo() override;
     dd4hep::Detector* lcdd() override;
 
+    Decoder* getDecoder(const std::string& readout_name) override;
+
 private:
 
     // DD4hep XML compact file path
@@ -38,4 +40,4 @@ private:
 };
 
 
-#endif GeoSvc_h
+#endif // GeoSvc_h
diff --git a/Examples/CMakeLists.txt b/Examples/CMakeLists.txt
index a53bc0fa1c8f8b543f93397650fdc4e829977268..8a0ba74979b16bc41d1e26dee535ac00fd12f51f 100644
--- a/Examples/CMakeLists.txt
+++ b/Examples/CMakeLists.txt
@@ -6,6 +6,11 @@ find_package(podio REQUIRED)
 find_package(LCIO REQUIRED)
 find_package(EDM4HEP REQUIRED)
 find_package(K4FWCore REQUIRED)
+find_package(DD4hep COMPONENTS DDRec DDParsers REQUIRED)
+
+gaudi_depends_on_subdirs(
+    Detector/DetInterface
+)
 
 set(Examples_srcs
     src/HelloWorld/*.cpp
@@ -13,6 +18,7 @@ set(Examples_srcs
     src/SecondAlg/*.cpp
  #   src/PlcioTest/*.cpp
     src/Edm4hepTest/*.cpp
+    src/DumpIDAlg/*.cpp
 )
 
 # Headers and Libraries
@@ -23,6 +29,7 @@ gaudi_install_headers(Examples)
 gaudi_add_module(Examples ${Examples_srcs}
     INCLUDE_DIRS K4FWCore GaudiAlgLib GaudiKernel ${podio_INCLUDE_DIRS} ${LCIO_INCLUDE_DIRS}
     LINK_LIBRARIES K4FWCore GaudiAlgLib GaudiKernel ${LCIO_LIBRARIES} 
+      DD4hep ${DD4hep_COMPONENT_LIBRARIES}
       # Force loading the libraries.
       -Wl,--no-as-needed EDM4HEP::edm4hep EDM4HEP::edm4hepDict ${podio_LIBRARIES} podio::podioRootIO -Wl,--as-needed
 )
diff --git a/Examples/src/DumpIDAlg/DumpIDAlg.cpp b/Examples/src/DumpIDAlg/DumpIDAlg.cpp
new file mode 100644
index 0000000000000000000000000000000000000000..1ae59e335bb44fcb32a428a5fb03f77c37df9f29
--- /dev/null
+++ b/Examples/src/DumpIDAlg/DumpIDAlg.cpp
@@ -0,0 +1,110 @@
+#include "DumpIDAlg.h"
+#include "edm4hep/EventHeaderCollection.h"
+#include "edm4hep/MCParticleCollection.h"
+#include "edm4hep/SimCalorimeterHitCollection.h"
+#include "edm4hep/CaloHitContributionCollection.h"
+
+#include "DD4hep/Detector.h"
+#include "DD4hep/IDDescriptor.h"
+#include "DD4hep/Plugins.h"
+
+DECLARE_COMPONENT(DumpIDAlg)
+
+DumpIDAlg::DumpIDAlg(const std::string& name, ISvcLocator* svcLoc)
+: GaudiAlgorithm(name, svcLoc), m_dd4hep_geo(nullptr), m_decoder(nullptr)
+{
+
+}
+
+StatusCode DumpIDAlg::initialize()
+{
+    m_geosvc = service<IGeoSvc>("GeoSvc");
+    if (!m_geosvc) {
+        error() << "Failed to find GeoSvc." << endmsg;
+        return StatusCode::FAILURE;
+    }
+    m_dd4hep_geo = m_geosvc->lcdd();
+    if (!m_dd4hep_geo) {
+        error() << "failed to retrieve dd4hep_geo: " << m_dd4hep_geo << endmsg;
+        return StatusCode::FAILURE;
+    }
+
+    // get the DD4hep readout
+    const std::string name_readout = "EcalBarrelCollection";
+    m_decoder = m_geosvc->getDecoder(name_readout);
+    if (!m_decoder) {
+        error() << "Failed to get the decoder. " << endmsg;
+        return StatusCode::FAILURE;
+    }
+
+    //  Book N-tuple 1
+    NTuplePtr nt1( ntupleSvc(), "MyTuples/1" );
+    if ( nt1 ) {
+        m_tuple_id = nt1;
+    } else {
+        m_tuple_id = ntupleSvc()->book( "MyTuples/1", CLID_RowWiseTuple, "Row-wise N-Tuple example" );
+        if ( m_tuple_id ) {
+            m_tuple_id->addItem( "system", m_id_system ).ignore();
+            m_tuple_id->addItem( "module", m_id_module ).ignore();
+            m_tuple_id->addItem( "stave", m_id_stave ).ignore();
+            m_tuple_id->addItem( "tower", m_id_tower ).ignore();
+            m_tuple_id->addItem( "layer", m_id_layer ).ignore();
+            m_tuple_id->addItem( "wafer", m_id_wafer ).ignore();
+            m_tuple_id->addItem( "cellX", m_id_cellX ).ignore();
+            m_tuple_id->addItem( "cellY", m_id_cellY ).ignore();
+
+        } else { // did not manage to book the N tuple....
+            error() << "    Cannot book N-tuple:" << long( m_tuple_id ) << endmsg;
+            return StatusCode::FAILURE;
+        }
+    }
+
+
+    return GaudiAlgorithm::initialize();
+}
+
+StatusCode DumpIDAlg::execute()
+{
+
+
+    auto ecalBarrelCol = m_EcalBarrelCol.get();
+    for (auto calohit: *ecalBarrelCol) {
+        auto cellid = calohit.getCellID();
+
+        m_id_system = m_decoder->get(cellid, "system");
+        m_id_module = m_decoder->get(cellid, "module");
+        m_id_stave = m_decoder->get(cellid, "stave");
+        m_id_tower = m_decoder->get(cellid, "tower");
+        m_id_layer = m_decoder->get(cellid, "layer");
+        m_id_wafer = m_decoder->get(cellid, "wafer");
+        m_id_cellX = m_decoder->get(cellid, "cellX");
+        m_id_cellY = m_decoder->get(cellid, "cellY");
+
+        info() << "Calo hit cellid: " << cellid
+               << " system: " << m_id_system
+               << " module: " << m_id_module
+               << " stave: " << m_id_stave
+               << " tower: " << m_id_tower
+               << " layer: " << m_id_layer
+               << " wafer: " << m_id_wafer
+               << " cellX: " << m_id_cellX
+               << " cellY: " << m_id_cellY
+               << endmsg;
+
+        // calculate I/J/K 
+
+        m_tuple_id->write();
+
+    }
+    return StatusCode::SUCCESS;
+}
+
+StatusCode DumpIDAlg::finalize()
+{
+
+    return GaudiAlgorithm::finalize();
+}
+
+
+
+
diff --git a/Examples/src/DumpIDAlg/DumpIDAlg.h b/Examples/src/DumpIDAlg/DumpIDAlg.h
new file mode 100644
index 0000000000000000000000000000000000000000..20bb9469ffaebe9f46fb50bf0a919cbf66218bb0
--- /dev/null
+++ b/Examples/src/DumpIDAlg/DumpIDAlg.h
@@ -0,0 +1,53 @@
+#ifndef DumpIDAlg_h
+#define DumpIDAlg_h
+
+#include "FWCore/DataHandle.h"
+#include "GaudiAlg/GaudiAlgorithm.h"
+#include "GaudiKernel/NTuple.h"
+
+#include "DetInterface/IGeoSvc.h"
+
+#include "DD4hep/Detector.h"
+
+namespace edm4hep {
+    class EventHeaderCollection;
+    class MCParticleCollection;
+    class SimCalorimeterHitCollection;
+    class CaloHitContributionCollection;
+}
+
+class DumpIDAlg: public GaudiAlgorithm
+{
+public:
+
+    DumpIDAlg(const std::string& name, ISvcLocator* svcLoc);
+
+    virtual StatusCode initialize();
+    virtual StatusCode execute();
+    virtual StatusCode finalize();
+
+private:
+    SmartIF<IGeoSvc> m_geosvc;
+    dd4hep::Detector* m_dd4hep_geo;
+    dd4hep::DDSegmentation::BitFieldCoder* m_decoder;
+
+    DataHandle<edm4hep::SimCalorimeterHitCollection> m_EcalBarrelCol{"EcalBarrelCollection", 
+            Gaudi::DataHandle::Reader, this};
+
+private:
+    // strore all the id for later analysis
+    NTuple::Tuple* m_tuple_id = nullptr;
+
+    NTuple::Item<int> m_id_system;
+    NTuple::Item<int> m_id_module;
+    NTuple::Item<int> m_id_stave;
+    NTuple::Item<int> m_id_tower;
+    NTuple::Item<int> m_id_layer;
+    NTuple::Item<int> m_id_wafer;
+    NTuple::Item<int> m_id_cellX;
+    NTuple::Item<int> m_id_cellY;
+    
+};
+
+
+#endif