diff --git a/DDCore/include/DD4hep/Callback.h b/DDCore/include/DD4hep/Callback.h
index 3c48d9391dc586eff3025483d45cf799a7563784..d48026be7c2013a229774efa0e808b5e8811fd28 100644
--- a/DDCore/include/DD4hep/Callback.h
+++ b/DDCore/include/DD4hep/Callback.h
@@ -58,6 +58,11 @@ namespace dd4hep {
       : par(p), call(0) {
       func.first = func.second = 0;
     }
+    /// Constructor with object initialization
+    Callback(const void* p)
+      : par((void*)p), call(0) {
+      func.first = func.second = 0;
+    }
     /// Initializing constructor
     Callback(void* p, void* mf, func_t c)
       : par(p), call(c) {
diff --git a/DDDigi/include/DDDigi/DigiAction.h b/DDDigi/include/DDDigi/DigiAction.h
index 9db7b5e6b5a9f018af97b4e5209c129f0db13537..d6c8ec41d0016269dd32b174ceeb9fdc1283f073 100644
--- a/DDDigi/include/DDDigi/DigiAction.h
+++ b/DDDigi/include/DDDigi/DigiAction.h
@@ -83,19 +83,26 @@ namespace dd4hep {
      *  \ingroup DD4HEP_DIGITIZATION
      */
     class DigiAction {
+
       friend class DigiKernel;
 
+    public:
+      using context_t = DigiContext;
+      using kernel_t  = DigiKernel;
+
     protected:
       /// Reference to the Digi context
 #if defined(G__ROOT) || defined(__CLING__) || defined(__ROOTCLING__)
-      const DigiKernel*  m_kernel;
+      const kernel_t*  m_kernel;
+
     public:
-      const DigiKernel*  kernel()  const   {
+      const kernel_t*  kernel()  const   {
 	return m_kernel;
       }
+
     protected:
 #else
-      const DigiKernel&  m_kernel;
+      const kernel_t&  m_kernel;
 #endif
       /// Action name
       std::string        m_name;
@@ -117,7 +124,7 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiAction(const DigiKernel& kernel, const std::string& nam);
+      DigiAction(const kernel_t& kernel, const std::string& nam);
       /// Increase reference count
       long addRef();
       /// Decrease reference count. Implicit destruction
diff --git a/DDDigi/include/DDDigi/DigiActionSequence.h b/DDDigi/include/DDDigi/DigiActionSequence.h
index 548294422c86619d02fa64bffd26df94f8d0fcd5..2ec360f3ed5606f36c24d5008221a54963fba445 100644
--- a/DDDigi/include/DDDigi/DigiActionSequence.h
+++ b/DDDigi/include/DDDigi/DigiActionSequence.h
@@ -54,23 +54,23 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiActionSequence(const DigiKernel& kernel, const std::string& nam);
+      DigiActionSequence(const kernel_t& kernel, const std::string& nam);
       /// Default destructor
       virtual ~DigiActionSequence();
       /// Adopt a new action as part of the sequence. Sequence takes ownership.
       virtual void adopt(DigiEventAction* action)  override;
       /// Register external listener callbacks before starting the sequence
       template <typename Q, typename T>
-      void begin(Q* p, void (T::*f)(DigiContext* context)) {
+      void begin(Q* p, void (T::*f)(context_t* context)) {
         m_begin.add(p, f);
       }
       /// Register external listener callbacks after finishing the sequence
       template <typename Q, typename T>
-      void end(Q* p, void (T::*f)(DigiContext* context))  {
+      void end(Q* p, void (T::*f)(context_t* context))  {
         m_end.add(p, f);
       }
       /// Begin-of-event callback
-      virtual void execute(DigiContext& context)  const override;
+      virtual void execute(context_t& context)  const override;
     };
 
     /// Definitiaon of the sequential action sequence
@@ -83,7 +83,7 @@ namespace dd4hep {
     class DigiSequentialActionSequence : public DigiActionSequence {
     public:
       /// Standard constructor
-      DigiSequentialActionSequence(const DigiKernel& kernel, const std::string& nam);
+      DigiSequentialActionSequence(const kernel_t& kernel, const std::string& nam);
       /// Default destructor
       virtual ~DigiSequentialActionSequence();
     };
@@ -98,7 +98,7 @@ namespace dd4hep {
     class DigiParallelActionSequence : public DigiActionSequence {
     public:
       /// Standard constructor
-      DigiParallelActionSequence(const DigiKernel& kernel, const std::string& nam);
+      DigiParallelActionSequence(const kernel_t& kernel, const std::string& nam);
       /// Default destructor
       virtual ~DigiParallelActionSequence();
     };
diff --git a/DDDigi/include/DDDigi/DigiAttenuator.h b/DDDigi/include/DDDigi/DigiAttenuator.h
index b5ed824d6efd0a63b71896814cacbd68fcb8405e..a5d85b88689e16b1ef083d3201581d008a43abc4 100644
--- a/DDDigi/include/DDDigi/DigiAttenuator.h
+++ b/DDDigi/include/DDDigi/DigiAttenuator.h
@@ -63,9 +63,9 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiAttenuator(const DigiKernel& kernel, const std::string& nam);
+      DigiAttenuator(const kernel_t& kernel, const std::string& nam);
       /// Main functional callback adapter
-      virtual void execute(DigiContext& context, work_t& work, const predicate_t& predicate)  const override;
+      virtual void execute(context_t& context, work_t& work, const predicate_t& predicate)  const override;
     };
 
     /// Default base class for all Digitizer actions and derivates thereof.
@@ -96,11 +96,11 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiAttenuatorSequence(const DigiKernel& kernel, const std::string& nam);
+      DigiAttenuatorSequence(const kernel_t& kernel, const std::string& nam);
       /// Initialization callback
       virtual void initialize();
       /// Main functional callback
-      virtual void execute(DigiContext& context)  const;
+      virtual void execute(context_t& context)  const;
     };
   }    // End namespace digi
 }      // End namespace dd4hep
diff --git a/DDDigi/include/DDDigi/DigiContainerCombine.h b/DDDigi/include/DDDigi/DigiContainerCombine.h
index 043fbea97b49c73735f20cc16a74686068e75dd3..6343c0ff40bcda0cb700dbb107bd01e0c147fc8f 100644
--- a/DDDigi/include/DDDigi/DigiContainerCombine.h
+++ b/DDDigi/include/DDDigi/DigiContainerCombine.h
@@ -83,7 +83,7 @@ namespace dd4hep {
       void have_workers(size_t len)  const;
 
       /// Combine selected containers to one single deposit container
-      std::size_t combine_containers(DigiContext& context,
+      std::size_t combine_containers(context_t& context,
 				     DigiEvent& event,
 				     DataSegment& inputs,
 				     DataSegment& outputs)  const;
@@ -93,10 +93,10 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiContainerCombine(const DigiKernel& kernel, const std::string& name);
+      DigiContainerCombine(const kernel_t& kernel, const std::string& name);
 
       /// Main functional callback
-      virtual void execute(DigiContext& context)  const;
+      virtual void execute(context_t& context)  const;
     };
   }    // End namespace digi
 }      // End namespace dd4hep
diff --git a/DDDigi/include/DDDigi/DigiContainerDrop.h b/DDDigi/include/DDDigi/DigiContainerDrop.h
index 38e978ae8a8c6ca96ab431605a6931d8ab8e82a3..6083701174a12d89f95d1f4b1111cc684b53806a 100644
--- a/DDDigi/include/DDDigi/DigiContainerDrop.h
+++ b/DDDigi/include/DDDigi/DigiContainerDrop.h
@@ -41,15 +41,15 @@ namespace dd4hep {
 
     protected:
       /// Property: Container names to be loaded
-      std::vector<std::string>       m_containers   { };
+      std::vector<std::string>    m_containers   { };
       /// Property: Input data segment name
-      std::string                    m_input_segment;
+      std::string                 m_input_segment;
       /// Property: event masks to be handled
-      std::vector<int>               m_input_masks  { };
+      std::vector<int>            m_input_masks  { };
       /// Fully qualified keys of all containers to be manipulated
-      std::set<Key::key_type>        m_keys  { };
+      std::set<Key::key_type>     m_keys  { };
       /// Container keys of all containers to be manipulated
-      std::set<Key::itemkey_type>    m_cont_keys  { };
+      std::set<Key::itemkey_type> m_cont_keys  { };
 
       /// Worker objects to be submitted to TBB each performing part of the job
       Workers m_workers;
@@ -69,10 +69,10 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiContainerDrop(const DigiKernel& kernel, const std::string& name);
+      DigiContainerDrop(const kernel_t& kernel, const std::string& name);
 
       /// Main functional callback
-      virtual void execute(DigiContext& context)  const;
+      virtual void execute(context_t& context)  const;
     };
   }    // End namespace digi
 }      // End namespace dd4hep
diff --git a/DDDigi/include/DDDigi/DigiContainerProcessor.h b/DDDigi/include/DDDigi/DigiContainerProcessor.h
index 621370e94b3a6c96d0569010a499a01e9743b419..0dcfee5e137bc89b421df12f094b02bb3ef15bfe 100644
--- a/DDDigi/include/DDDigi/DigiContainerProcessor.h
+++ b/DDDigi/include/DDDigi/DigiContainerProcessor.h
@@ -29,9 +29,9 @@ namespace dd4hep {
   namespace digi {
 
     /// Forward declarations
+    class DigiSegmentContext;
     class DigiContainerSequence;
     class DigiContainerProcessor;
-    class DigiSegmentProcessContext;
     class DigiContainerSequenceAction;
     class DigiMultiContainerProcessor;
     
@@ -44,11 +44,11 @@ namespace dd4hep {
      */
     class DigiContainerProcessor : public DigiAction   {
     public:
-      using segment_t      = DataSegment;
-      using context_t      = DigiContext;
+      /// Structure imports
       using action_t       = DigiAction;
+      using segment_t      = DataSegment;
       using property_t     = PropertyManager;
-      using segmentation_t = DigiSegmentProcessContext;
+      using segmentation_t = DigiSegmentContext;
 
       /// Input definition
       struct input_t  {
@@ -66,23 +66,30 @@ namespace dd4hep {
 
       /// Hit processing predicate
       struct predicate_t  {
-	Callback              callback;
-	const segmentation_t& segmentation;
-	predicate_t(const segmentation_t& s) : segmentation(s) {}
-	predicate_t(const Callback& cb, const segmentation_t& s) : callback(cb), segmentation(s) {}
+	Callback callback                   { };
+	uint32_t id                         { 0 };
+	const segmentation_t* segmentation  { nullptr };
+	predicate_t() = default;
+	predicate_t(predicate_t&& copy) = default;
+	predicate_t(const predicate_t& copy) = default;
+	predicate_t(const Callback& c, uint32_t i, const segmentation_t* s)
+	  : callback(c), id(i), segmentation(s) {}
+	predicate_t& operator = (predicate_t&& copy) = default;
+	predicate_t& operator = (const predicate_t& copy) = default;
 	/// Check if a deposit should be processed
 	bool operator()(const std::pair<const CellID, EnergyDeposit>& deposit)   const;
       };
 
+      /// Work definition
       struct work_t  {
 	/// Event processing context
-	context_t&      context;
+	context_t&        context;
 	/// Input data
-	input_t         input;
+	input_t           input;
 	/// Output data
-	output_t&       output;
+	output_t&         output;
 	/// Optional properties
-	const property_t&  properties;
+	const property_t& properties;
 
 	/// Basic check if input data are present
 	bool has_input()  const    {  return this->input.data.has_value();  }
@@ -107,13 +114,19 @@ namespace dd4hep {
       static const predicate_t& accept_all();
 
       /// Standard constructor
-      DigiContainerProcessor(const DigiKernel& kernel, const std::string& name);
+      DigiContainerProcessor(const kernel_t& kernel, const std::string& name);
       /// Default destructor
       virtual ~DigiContainerProcessor();
       /// Main functional callback adapter
-      virtual void execute(DigiContext& context, work_t& work, const predicate_t& predicate)  const;
+      virtual void execute(context_t& context, work_t& work, const predicate_t& predicate)  const;
     };
 
+    /// Check if a deposit should be processed
+    inline bool DigiContainerProcessor::predicate_t::operator()(const std::pair<const CellID, EnergyDeposit>& deposit)   const   {
+      const void* args[] = { &deposit };
+      return this->callback.execute(args);
+    }
+
     /// Worker class act on containers in an event identified by input masks and container name
     /**
      *  The sequencer calls all registered processors for the contaiers registered.
@@ -124,6 +137,7 @@ namespace dd4hep {
      */
     class DigiContainerSequence : public DigiContainerProcessor  {
     protected:
+      /// Structure imports
       using self_t      = DigiContainerSequence;
       using processor_t = DigiContainerProcessor;
       using worker_t    = DigiParallelWorker<processor_t,work_t>;
@@ -150,11 +164,11 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiContainerSequence(const DigiKernel& kernel, const std::string& name);
+      DigiContainerSequence(const kernel_t& kernel, const std::string& name);
       /// Adopt new parallel worker
       virtual void adopt_processor(DigiContainerProcessor* action);
       /// Main functional callback adapter
-      virtual void execute(DigiContext& context, work_t& work, const predicate_t& predicate)  const;
+      virtual void execute(context_t& context, work_t& work, const predicate_t& predicate)  const;
     };
 
     /// Worker base class to analyse containers from the input segment in parallel
@@ -169,23 +183,28 @@ namespace dd4hep {
     class DigiContainerSequenceAction : public DigiEventAction  {
 
     protected:
-      /// Argument structure for client calls
+      /// Structure imports
       using action_t    = DigiAction;
       using self_t      = DigiContainerSequenceAction;
       using processor_t = DigiContainerProcessor;
       using output_t    = processor_t::output_t;
       using property_t  = processor_t::property_t;
+
+      /// Single worker work item definition
       struct work_item_t  {
 	Key key;
 	std::any* data;
       };
+      /// Work definition structure
+      /// Argument structure for client calls
       struct work_t  {
-	DigiContext&             context;
+	context_t&             context;
 	std::vector<work_item_t> input_items;
 	output_t&                output;
 	const property_t&        properties;
 	const self_t&            parent;
       };
+
       using worker_t         = DigiParallelWorker<processor_t, work_t>;
       using workers_t        = DigiParallelWorkers<worker_t>;
       using reg_workers_t    = std::map<Key, worker_t*>;
@@ -225,13 +244,13 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiContainerSequenceAction(const DigiKernel& kernel, const std::string& name);
+      DigiContainerSequenceAction(const kernel_t& kernel, const std::string& name);
       /// Adopt new parallel worker acting on one single container
       void adopt_processor(DigiContainerProcessor* action, const std::string& container);
       /// Adopt new parallel worker acting on multiple containers
       void adopt_processor(DigiContainerProcessor* action, const std::vector<std::string>& containers);
       /// Main functional callback if specific work is known
-      virtual void execute(DigiContext& context)  const override;
+      virtual void execute(context_t& context)  const override;
     };
 
     /// Sequencer class to analyse containers from the input segment in parallel
@@ -252,7 +271,7 @@ namespace dd4hep {
 
       /// Argument structure required to support multiple client calls
       struct work_t  {
-	DigiContext&      context;
+	context_t&        context;
 	work_items_t&     items;
 	output_t&         output;
 	const property_t& properties;
@@ -298,7 +317,7 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiMultiContainerProcessor(const DigiKernel& kernel, const std::string& name);
+      DigiMultiContainerProcessor(const kernel_t& kernel, const std::string& name);
       const std::vector<Key>& worker_keys(size_t worker_id)  const  {
 	return this->m_worker_keys.at(worker_id);
       }
@@ -308,7 +327,7 @@ namespace dd4hep {
       /// Adopt new parallel worker
       void adopt_processor(DigiContainerProcessor* action, const std::vector<std::string>& containers);
       /// Main functional callback
-      virtual void execute(DigiContext& context)  const;
+      virtual void execute(context_t& context)  const;
     };
   }    // End namespace digi
 }      // End namespace dd4hep
diff --git a/DDDigi/include/DDDigi/DigiInputAction.h b/DDDigi/include/DDDigi/DigiInputAction.h
index 584775b0768599a7be62ea29cf0b7c7c57bbc6a3..bb605b417e17246ce707e322ef0df8ac0627615d 100644
--- a/DDDigi/include/DDDigi/DigiInputAction.h
+++ b/DDDigi/include/DDDigi/DigiInputAction.h
@@ -53,7 +53,7 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiInputAction(const DigiKernel& kernel, const std::string& nam);
+      DigiInputAction(const kernel_t& kernel, const std::string& nam);
       /// Default destructor
       virtual ~DigiInputAction();
 
@@ -70,7 +70,7 @@ namespace dd4hep {
 	return m_input_mask;
       }
       /// Callback to read event input
-      virtual void execute(DigiContext& context)  const override;
+      virtual void execute(context_t& context)  const override;
     };
   }    // End namespace digi
 }      // End namespace dd4hep
diff --git a/DDDigi/include/DDDigi/DigiLockedAction.h b/DDDigi/include/DDDigi/DigiLockedAction.h
index 034575359199eec7a8a274329acba6ec71580252..992e70d4315de8885d24d2cff5a90d22e52deade 100644
--- a/DDDigi/include/DDDigi/DigiLockedAction.h
+++ b/DDDigi/include/DDDigi/DigiLockedAction.h
@@ -49,13 +49,13 @@ namespace dd4hep {
       
     public:
       /// Standard constructor
-      DigiLockedAction(const DigiKernel& kernel, const std::string& nam);
+      DigiLockedAction(const kernel_t& kernel, const std::string& nam);
       /// Default destructor
       virtual ~DigiLockedAction();
       /// Underlying object to be used during the locked execution
       void use(DigiEventAction* action);
       /// Callback to read event locked
-      virtual void execute(DigiContext& context)  const override;
+      virtual void execute(context_t& context)  const override;
     };
 
   }    // End namespace digi
diff --git a/DDDigi/include/DDDigi/DigiOutputAction.h b/DDDigi/include/DDDigi/DigiOutputAction.h
index 17314301fb723d082170999315fdfa5e5d058474..ae67ca80b934d5cb334bfe952710eba8c5c6ff1a 100644
--- a/DDDigi/include/DDDigi/DigiOutputAction.h
+++ b/DDDigi/include/DDDigi/DigiOutputAction.h
@@ -51,12 +51,12 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiOutputAction(const DigiKernel& kernel, const std::string& nam);
+      DigiOutputAction(const kernel_t& kernel, const std::string& nam);
       /// Default destructor
       virtual ~DigiOutputAction();
 
       /// Callback to read event output
-      virtual void execute(DigiContext& context)  const override;
+      virtual void execute(context_t& context)  const override;
     };
 
   }    // End namespace digi
diff --git a/DDDigi/include/DDDigi/DigiSegmentSplitter.h b/DDDigi/include/DDDigi/DigiSegmentSplitter.h
index 901854cc3dc54d50504b7b7c4c4495b6682dd183..85a046b55b99a79d8956ac044e95d05a4e238ab7 100644
--- a/DDDigi/include/DDDigi/DigiSegmentSplitter.h
+++ b/DDDigi/include/DDDigi/DigiSegmentSplitter.h
@@ -15,9 +15,9 @@
 
 // Framework include files
 #include <DDDigi/DigiEventAction.h>
-#include <DDDigi/DigiContainerProcessor.h>
-#include <DDDigi/DigiSegmentationTool.h>
 #include <DDDigi/DigiParallelWorker.h>
+#include <DDDigi/DigiSegmentationTool.h>
+#include <DDDigi/DigiContainerProcessor.h>
 
 /// Namespace for the AIDA detector description toolkit
 namespace dd4hep {
@@ -37,16 +37,15 @@ namespace dd4hep {
     class DigiSegmentProcessContext : public DigiSegmentContext  {
     public:
       using predicate_t = DigiContainerProcessor::predicate_t;
-      predicate_t predicate  { {}, *this };
-      uint32_t    id         { 0 };
+      predicate_t predicate;
 
     public:
       /// Default constructor
       DigiSegmentProcessContext() = default;
-      /// Default move constructor
-      DigiSegmentProcessContext(DigiSegmentProcessContext&& copy) = default;
       /// Default copy constructor
       DigiSegmentProcessContext(const DigiSegmentContext& copy);
+      /// Default move constructor
+      DigiSegmentProcessContext(DigiSegmentProcessContext&& copy) = default;
       /// Default copy constructor
       DigiSegmentProcessContext(const DigiSegmentProcessContext& copy) = default;
       /// Default destructor
@@ -62,18 +61,35 @@ namespace dd4hep {
       std::string identifier()  const;
       /// Check a given cell id if it matches this selection
       bool matches(uint64_t cell)  const  {
-	return this->split_id(cell) == this->id;
+	return this->split_id(cell) == this->predicate.id;
+      }
+      /// Check a given cell id if it matches this selection
+      bool matches(CellID cell)  const  {
+	return this->split_id(cell) == this->predicate.id;
       }
+
+      /// Check if a deposit should be processed
+      bool use_depo(const std::pair<const CellID, EnergyDeposit>* deposit)   const   {
+	return this->matches(deposit->first);
+      }
+      void enable(uint32_t split_id);
     };
 
+    /// Predicate function to accept a subset of segment entries
+    /**
+     *
+     *  \author  M.Frank
+     *  \version 1.0
+     *  \ingroup DD4HEP_DIGITIZATION
+     */
     struct accept_segment_t : public DigiContainerProcessor::predicate_t  {
-      using segmentation_t = DigiSegmentProcessContext;
-      accept_segment_t(const segmentation_t& s) : predicate_t( { this }, s) {
-	auto fptr = &accept_segment_t::operator();
-	callback.make(fptr);
+      accept_segment_t(const DigiSegmentContext* s, uint32_t i)
+	: predicate_t( {}, i, s)      {
+	callback = Callback(this).make(&accept_segment_t::use_depo);
       }
-      inline bool operator()(const std::pair<const CellID, EnergyDeposit>& depo) const  {
-	return this->segmentation.matches(depo.first);
+      /// Check if a deposit should be processed
+      bool use_depo(const std::pair<const CellID, EnergyDeposit>* deposit)   const   {
+	return this->segmentation->split_id(deposit->first) == this->id;
       }
     };
 
@@ -88,41 +104,46 @@ namespace dd4hep {
      */
     class DigiSegmentSplitter : public DigiContainerProcessor   {
     protected:
+
+      /**  Local use definitions                      */
       using self_t      = DigiSegmentSplitter;
+      using tool_t      = DigiSegmentationTool;
       using split_t     = std::pair<DetElement, VolumeID>;
       using splits_t    = std::map<VolumeID, split_t>;
       using segment_t   = DigiSegmentProcessContext;
       using processor_t = DigiContainerProcessor;
+
       using worker_t    = DigiParallelWorker<processor_t,work_t, segment_t>;
       using workers_t   = DigiParallelWorkers<worker_t>;
       friend class DigiParallelWorker<processor_t, work_t, segment_t>;
 
     protected:
+
       /**  Object properties                          */
       /// Property: Split element of the ID descriptor
       std::string          m_processor_type;
-      /// Name of the subdetector to be handed
+      /// Property: Name of the subdetector to be handed
       std::string          m_detector_name;
-      /// Splitter field in the segmentation description
+      /// Property: Splitter field in the segmentation description
       std::string          m_split_by;
+      /// Property to steer parallel processing
+      bool                 m_parallel          { false };
       /// Property: Flag if processors should be shared
       bool                 m_share_processor   { true };
 
       /**  Member variables                           */
-      /// Segmentation too instance
-      mutable DigiSegmentationTool m_split_tool;
-      /// Segmentation split context
-      DigiSegmentContext   m_split_context;
       /// Data keys from the readout collection names
-      std::vector<Key>     m_keys;
+      std::vector<Key>   m_keys;
+      /// Segmentation split context
+      segment_t          m_split_context;
       /// Split elements used to parallelize the processing
-      splits_t             m_splits;
-      /// Property to steer parallel processing
-      bool                 m_parallel { false };
+      splits_t           m_splits;
       /// Array of sub-workers
-      workers_t            m_workers;
+      workers_t          m_workers;
       /// Lock for output merging
-      mutable std::mutex   m_output_lock;
+      mutable std::mutex m_output_lock;
+      /// Segmentation too instance
+      mutable tool_t     m_split_tool;
 
     protected:
       /// Default destructor
@@ -139,11 +160,11 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiSegmentSplitter(const DigiKernel& kernel, const std::string& name);
+      DigiSegmentSplitter(const kernel_t& kernel, const std::string& name);
       /// Access the readout collection keys
       std::vector<std::string> collection_names()   const;
       /// Main functional callback
-      virtual void execute(DigiContext& context, work_t& work, const predicate_t& predicate)  const  override;
+      virtual void execute(context_t& context, work_t& work, const predicate_t& predicate)  const  override;
     };
   }    // End namespace digi
 }      // End namespace dd4hep
diff --git a/DDDigi/include/DDDigi/DigiSegmentationTool.h b/DDDigi/include/DDDigi/DigiSegmentationTool.h
index 6ef34f1449240cac3b69052824598bb62bd0afde..713a4afa9568ccdbb6ecaa04d7fd4ff576105e03 100644
--- a/DDDigi/include/DDDigi/DigiSegmentationTool.h
+++ b/DDDigi/include/DDDigi/DigiSegmentationTool.h
@@ -30,8 +30,6 @@ namespace dd4hep {
 
     /// Segmentation split context
     /**
-     *  
-     *  
      *
      *  \author  M.Frank
      *  \version 1.0
@@ -39,15 +37,16 @@ namespace dd4hep {
      */
     class DigiSegmentContext  {
     public:
-      DetElement             detector   { };
-      IDDescriptor           idspec     { };
-      const BitFieldElement* field      { nullptr };
-      uint64_t               cell_mask  { ~0x0UL };
-      uint64_t               det_mask   { 0UL };
-      uint64_t               split_mask { 0UL };
-      int32_t                offset     { 0 };
-      int32_t                width      { 0 };
-      int32_t                max_split  { 0 };
+      using field_t = const BitFieldElement;
+      DetElement   detector   { };
+      IDDescriptor idspec     { };
+      field_t*     field      { nullptr };
+      uint64_t     cell_mask  { ~0x0UL };
+      uint64_t     det_mask   { 0UL };
+      uint64_t     split_mask { 0UL };
+      int32_t      offset     { 0 };
+      int32_t      width      { 0 };
+      int32_t      max_split  { 0 };
 
     public:
       /// Default constructor
@@ -67,18 +66,20 @@ namespace dd4hep {
       const std::string& name()  const;
       /// Split field name
       const char* cname()  const;
+      /// Full identifier (field + id)
+      std::string identifier(uint32_t id)  const;
       
       /// Get the identifier of the cell to be split
       uint32_t split_id(uint64_t cell)  const  {
-	return int( (cell & this->split_mask) >> this->offset );
+	return uint32_t( (cell & this->split_mask) >> this->offset );
       }
       /// The CELL ID part of the identifier
       uint64_t cell_id(uint64_t cell)  const  {
-	return ( (cell & this->cell_mask) >> (this->offset + width) );
+	return uint64_t( uint64_t(cell & this->cell_mask) >> (this->offset + width) );
       }
       /// The identifier of the parent detector
       uint64_t detector_id(uint64_t cell)  const  {
-	return (cell & this->det_mask);
+	return uint64_t(cell & this->det_mask);
       }
     };
 
diff --git a/DDDigi/include/DDDigi/DigiStoreDump.h b/DDDigi/include/DDDigi/DigiStoreDump.h
index 6f9a6cc5f894b8ff9cb92b2e86927f6e613485fc..be581e83791f943047dd8b07b7cc30f133e809d9 100644
--- a/DDDigi/include/DDDigi/DigiStoreDump.h
+++ b/DDDigi/include/DDDigi/DigiStoreDump.h
@@ -48,6 +48,8 @@ namespace dd4hep {
       std::vector<int>                m_masks      { };
       std::vector<Key::itemkey_type>  m_container_items { };
 
+      using records_t = std::vector<std::string>;
+
     protected:
       /// Define standard assignments and constructors
       DDDIGI_DEFINE_ACTION_CONSTRUCTORS(DigiStoreDump);
@@ -56,23 +58,23 @@ namespace dd4hep {
       virtual ~DigiStoreDump();
 
       template <typename T> std::string data_header(Key key, const std::string& tag, const T& data)  const;
-      template <typename T> std::vector<std::string> dump_history(DigiContext& context, Key key, const T& container)  const;
-      template <typename T> std::vector<std::string> dump_history(DigiContext& context, Key key, const T& item, std::size_t seq_no)  const;
+      template <typename T> records_t dump_history(context_t& context, Key key, const T& container)  const;
+      template <typename T> records_t dump_history(context_t& context, Key key, const T& item, std::size_t seq_no)  const;
 
-      std::vector<std::string>
-	dump_deposit_history(DigiContext& context, Key container_key, const DepositMapping& container)  const;
+      records_t
+	dump_deposit_history(context_t& context, Key container_key, const DepositMapping& container)  const;
 
-      std::vector<std::string>
-	dump_deposit_history(DigiContext& context, Key container_key, const DepositVector& container)  const;
+      records_t
+	dump_deposit_history(context_t& context, Key container_key, const DepositVector& container)  const;
 
-      std::vector<std::string>
-	dump_particle_history(DigiContext& context, Key container_key, const ParticleMapping& container)  const;
+      records_t
+	dump_particle_history(context_t& context, Key container_key, const ParticleMapping& container)  const;
 
       /// Dump hit container
       void dump_headers(const std::string& tag, const DigiEvent& event, const DataSegment& segment)  const;
 
       /// Dump hit container
-      void dump_history(DigiContext& context, const std::string& tag, const DigiEvent& event, const DataSegment& cont)  const;
+      void dump_history(context_t& context, const std::string& tag, const DigiEvent& event, const DataSegment& cont)  const;
 
       /// Initialize the action
       virtual void initialize();
@@ -81,7 +83,7 @@ namespace dd4hep {
       /// Standard constructor
       DigiStoreDump(const DigiKernel& kernel, const std::string& nam);
       /// Main functional callback
-      virtual void execute(DigiContext& context)  const;
+      virtual void execute(context_t& context)  const;
     };
   }    // End namespace digi
 }      // End namespace dd4hep
diff --git a/DDDigi/include/DDDigi/DigiSynchronize.h b/DDDigi/include/DDDigi/DigiSynchronize.h
index 3c4c565b8b3176a1f5f95dceb72322df464ccc5d..6a16e2b4547c748ba1c557705790bfd78c64cae2 100644
--- a/DDDigi/include/DDDigi/DigiSynchronize.h
+++ b/DDDigi/include/DDDigi/DigiSynchronize.h
@@ -34,8 +34,8 @@ namespace dd4hep {
      */
     class DigiSynchronize : public DigiEventAction {
     protected:
-      using Worker    = DigiParallelWorker<DigiEventAction,DigiContext,int>;
-      using Workers   = DigiParallelWorkers<Worker>;
+      using Worker  = DigiParallelWorker<DigiEventAction,context_t,int>;
+      using Workers = DigiParallelWorkers<Worker>;
       /// The list of action objects to be called
       Workers m_actors;
 
@@ -45,13 +45,13 @@ namespace dd4hep {
 
     public:
       /// Standard constructor
-      DigiSynchronize(const DigiKernel& kernel, const std::string& nam);
+      DigiSynchronize(const kernel_t& kernel, const std::string& nam);
       /// Default destructor
       virtual ~DigiSynchronize();
       /// Adopt a new action as part of the sequence. Sequence takes ownership.
       virtual void adopt(DigiEventAction* action);
       /// Begin-of-event callback
-      virtual void execute(DigiContext& context)  const override;
+      virtual void execute(context_t& context)  const override;
     };
   }    // End namespace digi
 }      // End namespace dd4hep
diff --git a/DDDigi/plugins/DigiSegmentDepositExtractor.cpp b/DDDigi/plugins/DigiSegmentDepositExtractor.cpp
index 48c81e463c7899cf84b0664e3211c493cb81f138..5039e39eb3a4e0137b3c9ed61bf68d7a99742685 100644
--- a/DDDigi/plugins/DigiSegmentDepositExtractor.cpp
+++ b/DDDigi/plugins/DigiSegmentDepositExtractor.cpp
@@ -17,6 +17,7 @@
 
 /// Namespace for the AIDA detector description toolkit
 namespace dd4hep {
+
   /// Namespace for the Digitization part of the AIDA detector description toolkit
   namespace digi {
 
@@ -59,6 +60,6 @@ namespace dd4hep {
     };
   }    // End namespace digi
 }      // End namespace dd4hep
-
+//        Factory definitiony
 #include <DDDigi/DigiFactories.h>
 DECLARE_DIGIACTION_NS(dd4hep::digi,DigiSegmentDepositExtractor)
diff --git a/DDDigi/plugins/DigiSegmentDepositPrint.cpp b/DDDigi/plugins/DigiSegmentDepositPrint.cpp
index db28f56d0dcc3bdccc8eccfa4f8d7d18820a68e1..5a17bf7da66f0fd98f4aa4b48835e07d10327ba1 100644
--- a/DDDigi/plugins/DigiSegmentDepositPrint.cpp
+++ b/DDDigi/plugins/DigiSegmentDepositPrint.cpp
@@ -40,7 +40,7 @@ namespace dd4hep {
       print(const char* fmt, const T& cont, const predicate_t& predicate)  const   {
 	for( const auto& dep : cont )   {
 	  if( predicate(dep) )   {
-	    info(fmt, predicate.segmentation.split_id(dep.first), dep.first,
+	    info(fmt, predicate.segmentation->split_id(dep.first), dep.first,
 		 dep.second.history.hits.size(), 
 		 dep.second.history.particles.size(),
 		 dep.second.deposit);
@@ -55,8 +55,8 @@ namespace dd4hep {
 		   "%s[%s] %s-id: %%d [processor:%d] Cell: %%016lX mask: %016lX  "
 		   "hist:%%4ld hits %%4ld parts. entries deposit: %%f", 
 		   context.event->id(),
-		   predicate.segmentation.idspec.name(), predicate.segmentation.cname(),
-		   predicate.segmentation.id, predicate.segmentation.split_mask);
+		   predicate.segmentation->idspec.name(), predicate.segmentation->cname(),
+		   predicate.id, predicate.segmentation->split_mask);
 	if ( const auto* m = work.get_input<DepositMapping>() )
 	  print(format, *m, predicate);
 	else if ( const auto* v = work.get_input<DepositVector>() )
@@ -67,6 +67,6 @@ namespace dd4hep {
     };
   }    // End namespace digi
 }      // End namespace dd4hep
-
+//        Factory definition
 #include <DDDigi/DigiFactories.h>
 DECLARE_DIGIACTION_NS(dd4hep::digi,DigiSegmentDepositPrint)
diff --git a/DDDigi/plugins/DigiSimpleADCResponse.cpp b/DDDigi/plugins/DigiSimpleADCResponse.cpp
index 5f5c52cec1106a36a4864f752cb658c51f227794..564756338dcc91ca2cc6b7814893f658513e48d1 100644
--- a/DDDigi/plugins/DigiSimpleADCResponse.cpp
+++ b/DDDigi/plugins/DigiSimpleADCResponse.cpp
@@ -21,6 +21,7 @@
 
 /// Namespace for the AIDA detector description toolkit
 namespace dd4hep {
+
   /// Namespace for the Digitization part of the AIDA detector description toolkit
   namespace digi {
 
@@ -28,7 +29,6 @@ namespace dd4hep {
       using segmentation_t = DigiSegmentProcessContext;
       std::string    m_response_postfix   { ".adc" };
       std::string    m_history_postfix    { ".hist" };
-      double         m_use_segmentation   { false  };
       double         m_signal_cutoff      { std::numeric_limits<double>::epsilon() };
       double         m_signal_saturation  { std::numeric_limits<double>::max() };
       double         m_adc_offset         { 0e0  };
@@ -49,7 +49,7 @@ namespace dd4hep {
       /// Create container with ADC counts and register it to the output segment
       template <typename T, typename P>
       void emulate_adc(const char* tag, const T& input, work_t& work, const P& predicate)  const  {
-	std::string postfix = m_use_segmentation ? "."+predicate.segmentation.identifier() : std::string();
+	std::string postfix = predicate.segmentation ? "."+predicate.segmentation->identifier(predicate.id) : std::string();
 	std::string history_name  = input.name + postfix + m_history_postfix;
 	std::string response_name = input.name + postfix + m_response_postfix;
 	DetectorHistory  history (history_name, work.output.mask);
@@ -86,14 +86,12 @@ namespace dd4hep {
 
       /// Main functional callback
       virtual void execute(DigiContext& context, work_t& work, const predicate_t& predicate)  const final  {
-	if ( !m_use_segmentation )
-	  emulate_adc(context, work, accept_all());
-	else if ( predicate.segmentation.matches(work.input.key.value()) )
-	  emulate_adc(context, work, accept_segment_t(predicate.segmentation));
+	emulate_adc(context, work, predicate);
       }
     };
   }    // End namespace digi
 }      // End namespace dd4hep
-
+//        Factory definition
 #include <DDDigi/DigiFactories.h>
 DECLARE_DIGIACTION_NS(dd4hep::digi,DigiSimpleADCResponse)
+
diff --git a/DDDigi/python/dddigi.py b/DDDigi/python/dddigi.py
index 8f7b02ebaac642bb212184b996463f7dcc2bde64..eb9028727dbd1731f14f3614a833effd9b8e428c 100644
--- a/DDDigi/python/dddigi.py
+++ b/DDDigi/python/dddigi.py
@@ -309,12 +309,12 @@ def _props(obj, **extensions):
   cls = getattr(current, obj)
   for extension in extensions.items():
     call = extension[0]
-    # print('TRY: Overloading: '+str(cls)+' '+call+' to __'+call+' '+str(hasattr(cls, call)))
+    # print('TRY: Overloading: ' + str(cls) + ' ' + call + ' to __' + call + ' ' + str(hasattr(cls, call)))
     if hasattr(cls, call):
-      # print('Overloading: '+str(cls)+' '+call+' to __'+call)
+      # print('Overloading: ' + str(cls) + ' ' + call + ' to __' + call)
       setattr(cls, '__' + call, getattr(cls, call))
     else:
-      print('FAILED: Overloading: '+str(cls)+' '+call+' to __'+call+' '+str(hasattr(cls, call)))
+      print('FAILED: Overloading: ' + str(cls) + ' '+call + ' to __' + call + ' ' + str(hasattr(cls, call)))
     setattr(cls, call, extension[1])
   cls.__getattr__ = _get
   cls.__setattr__ = _set
diff --git a/DDDigi/src/DigiContainerProcessor.cpp b/DDDigi/src/DigiContainerProcessor.cpp
index 040a7731b44e47a5d0a69706027ab8636bcd52d9..c93dba1926c6c88eb0b683bddc08ba73f4842fff 100644
--- a/DDDigi/src/DigiContainerProcessor.cpp
+++ b/DDDigi/src/DigiContainerProcessor.cpp
@@ -85,21 +85,13 @@ const DigiContainerProcessor::predicate_t& DigiContainerProcessor::accept_all()
     bool use(const std::pair<const CellID, EnergyDeposit>&)  const {
       return true;
     }
-  };
-  static true_t s_y { };
-  static segmentation_t s_seg {};
-  static predicate_t   s_true { Callback(&s_y).make(&true_t::use), s_seg };
-  return s_true;
-}
-
-/// Check if a deposit should be processed
-bool DigiContainerProcessor::predicate_t::operator()(const std::pair<const CellID, EnergyDeposit>& deposit)   const   {
-  const void* args[] = { &deposit };
-  return this->callback.execute(args);
+  } s_true;
+  static predicate_t s_pred { Callback(&s_true).make(&true_t::use), 0, nullptr };
+  return s_pred;
 }
 
 /// Standard constructor
-DigiContainerProcessor::DigiContainerProcessor(const DigiKernel& kernel, const std::string& name)   
+DigiContainerProcessor::DigiContainerProcessor(const kernel_t& kernel, const std::string& name)   
   : DigiAction(kernel, name)
 {
   InstanceCount::increment(this);
@@ -111,13 +103,13 @@ DigiContainerProcessor::~DigiContainerProcessor() {
 }
 
 /// Main functional callback if specific work is known
-void DigiContainerProcessor::execute(DigiContext&       /* context   */,
+void DigiContainerProcessor::execute(context_t&       /* context   */,
 				     work_t&            /* work      */,
 				     const predicate_t& /* predicate */)  const   {
 }
 
 /// Standard constructor
-DigiContainerSequence::DigiContainerSequence(const DigiKernel& krnl, const std::string& nam)
+DigiContainerSequence::DigiContainerSequence(const kernel_t& krnl, const std::string& nam)
   : DigiContainerProcessor(krnl, nam)
 {
   declareProperty("parallel", m_parallel = false);
@@ -139,7 +131,7 @@ void DigiContainerSequence::adopt_processor(DigiContainerProcessor* action)   {
 }
 
 /// Main functional callback if specific work is known
-void DigiContainerSequence::execute(DigiContext& context, work_t& work, const predicate_t& /* predicate */)  const   {
+void DigiContainerSequence::execute(context_t& context, work_t& work, const predicate_t& /* predicate */)  const   {
   auto group = m_workers.get_group();
   m_kernel.submit(context, group, m_workers.size(), &work, m_parallel);
 }
@@ -148,12 +140,12 @@ void DigiContainerSequence::execute(DigiContext& context, work_t& work, const pr
 template <> void DigiParallelWorker<DigiContainerProcessor,
 				    DigiContainerSequence::work_t,
 				    std::size_t>::execute(void* data) const  {
-  calldata_t* args  = reinterpret_cast<calldata_t*>(data);
-  action->execute(args->context, *args, action->accept_all());
+  calldata_t* arg  = reinterpret_cast<calldata_t*>(data);
+  action->execute(arg->context, *arg, action->accept_all());
 }
 
 /// Standard constructor
-DigiContainerSequenceAction::DigiContainerSequenceAction(const DigiKernel& krnl, const std::string& nam)
+DigiContainerSequenceAction::DigiContainerSequenceAction(const kernel_t& krnl, const std::string& nam)
   : DigiEventAction(krnl, nam)
 {
   declareProperty("input_mask",     m_input_mask);
@@ -227,27 +219,27 @@ DigiContainerSequenceAction::need_registered_worker(Key item_key, bool exc)   co
 }
 
 /// Main functional callback if specific work is known
-void DigiContainerSequenceAction::execute(DigiContext& context)  const   {
-  auto& event   = *context.event;
-  auto& inputs  = event.get_segment(m_input_segment);
-  auto& outputs = event.get_segment(m_output_segment);
+void DigiContainerSequenceAction::execute(context_t& context)  const   {
   std::vector<ParallelWorker*> event_workers;
-  output_t output { m_output_mask, outputs };
-  work_t   args   { context, { }, output, m_properties, *this };
-
-  args.input_items.resize(m_workers.size(), { { }, nullptr });
-  event_workers.reserve(inputs.size());
-  for( auto& i : inputs )   {
+  auto& event  = *context.event;
+  auto& input  = event.get_segment(m_input_segment);
+  auto& output = event.get_segment(m_output_segment);
+  output_t out { m_output_mask, output };
+  work_t   arg { context, { }, out, m_properties, *this };
+
+  arg.input_items.resize(m_workers.size(), { { }, nullptr });
+  event_workers.reserve(input.size());
+  for( auto& i : input )   {
     Key key(i.first);
     if ( key.mask() == m_input_mask )   {
       if ( worker_t* w = need_registered_worker(key, false) )  {
 	event_workers.emplace_back(w);
-	args.input_items[w->options] = { key, &i.second };
+	arg.input_items[w->options] = { key, &i.second };
       }
     }
   }
   if ( !event_workers.empty() )   {
-    m_kernel.submit(context, &event_workers.at(0), event_workers.size(), &args, m_parallel);
+    m_kernel.submit(context, &event_workers.at(0), event_workers.size(), &arg, m_parallel);
   }
 }
 
@@ -255,20 +247,20 @@ void DigiContainerSequenceAction::execute(DigiContext& context)  const   {
 template <> void DigiParallelWorker<DigiContainerProcessor,
 				    DigiContainerSequenceAction::work_t,
 				    std::size_t>::execute(void* data) const  {
-  calldata_t* args  = reinterpret_cast<calldata_t*>(data);
-  auto& item = args->input_items[this->options];
-  DigiContainerProcessor::work_t work {args->context, {item.key, *item.data}, args->output, args->properties};
+  calldata_t* args = reinterpret_cast<calldata_t*>(data);
+  auto&       item = args->input_items[this->options];
+  DigiContainerProcessor::work_t work { args->context, { item.key, *item.data }, args->output, args->properties };
   action->execute(args->context, work, action->accept_all());
 }
 
 /// Standard constructor
-DigiMultiContainerProcessor::DigiMultiContainerProcessor(const DigiKernel& krnl, const std::string& nam)
+DigiMultiContainerProcessor::DigiMultiContainerProcessor(const kernel_t& krnl, const std::string& nam)
   : DigiEventAction(krnl, nam)
 {
-  this->declareProperty("input_masks",      m_input_masks);
-  this->declareProperty("input_segment",    m_input_segment);
-  this->declareProperty("output_mask",      m_output_mask);
-  this->declareProperty("output_segment",   m_output_segment);
+  declareProperty("input_masks",    m_input_masks);
+  declareProperty("input_segment",  m_input_segment);
+  declareProperty("output_mask",    m_output_mask);
+  declareProperty("output_segment", m_output_segment);
   m_kernel.register_initialize(Callback(this).make(&DigiMultiContainerProcessor::initialize));
   InstanceCount::increment(this);
 }
@@ -347,17 +339,17 @@ void DigiMultiContainerProcessor::adopt_processor(DigiContainerProcessor* action
 }
 
 /// Main functional callback
-void DigiMultiContainerProcessor::execute(DigiContext& context)  const  {
+void DigiMultiContainerProcessor::execute(context_t& context)  const  {
   work_items_t work_items;
-  auto& msk    = m_input_masks;
-  auto& event  = *context.event;
-  auto& inputs = event.get_segment(m_input_segment);
+  auto& mask  = m_input_masks;
+  auto& event = *context.event;
+  auto& input = event.get_segment(m_input_segment);
 
-  work_items.reserve(inputs.size());
-  for( auto& i : inputs )   {
-    Key  key(i.first);
+  work_items.reserve(input.size());
+  for( auto& i : input )   {
+    Key key(i.first);
     key.set_mask(0);
-    bool use = msk.empty() || std::find(msk.begin(), msk.end(), key.mask()) != msk.end();
+    bool use = mask.empty() || std::find(mask.begin(), mask.end(), key.mask()) != mask.end();
     if ( use )   {
       use = m_work_items.empty() || m_work_items.find(key) != m_work_items.end();
       if ( use )   {
@@ -366,10 +358,10 @@ void DigiMultiContainerProcessor::execute(DigiContext& context)  const  {
     }
   }
   if ( !work_items.empty() )   {
-    auto& outputs = event.get_segment(m_output_segment);
-    output_t   output { m_output_mask, outputs };
-    work_t     args   { context, work_items, output, properties(), *this };
-    m_kernel.submit(context, m_workers.get_group(), m_workers.size(), &args, m_parallel);
+    auto& output = event.get_segment(m_output_segment);
+    output_t out { m_output_mask, output };
+    work_t   arg { context, work_items, out, properties(), *this };
+    m_kernel.submit(context, m_workers.get_group(), m_workers.size(), &arg, m_parallel);
   }
 }
 
@@ -406,4 +398,3 @@ template <> void DigiParallelWorker<DigiContainerProcessor,
 #endif
   }
 }
-
diff --git a/DDDigi/src/DigiSegmentSplitter.cpp b/DDDigi/src/DigiSegmentSplitter.cpp
index 4944c8c63368b65e43b34790c77c1a9463d7e93b..1f016a5aae7b83289b39c0beec2f80094913b698 100644
--- a/DDDigi/src/DigiSegmentSplitter.cpp
+++ b/DDDigi/src/DigiSegmentSplitter.cpp
@@ -29,11 +29,7 @@ DigiSegmentProcessContext::DigiSegmentProcessContext(const DigiSegmentContext& c
 
 /// Full identifier (field + id)
 std::string DigiSegmentProcessContext::identifier()  const   {
-  std::stringstream str;
-  if ( this->field )   {
-    str << this->field->name() << "." << this->id;
-  }
-  return str.str();
+  return this->DigiSegmentContext::identifier(this->predicate.id);
 }
 
 /// Default move assignment
@@ -43,6 +39,12 @@ DigiSegmentProcessContext::operator=(const DigiSegmentContext& copy)   {
   return *this;
 }
 
+void DigiSegmentProcessContext::enable(uint32_t split_id)  {
+  this->predicate.id = split_id;
+  this->predicate.segmentation = this;
+  this->predicate.callback = Callback(this).make(&DigiSegmentProcessContext::use_depo);
+}
+
 /// Worker adaptor for caller DigiContainerSequence
 template <> void DigiParallelWorker<DigiContainerProcessor,
 				    DigiContainerProcessor::work_t,
@@ -52,10 +54,11 @@ template <> void DigiParallelWorker<DigiContainerProcessor,
 }
 
 /// Standard constructor
-DigiSegmentSplitter::DigiSegmentSplitter(const DigiKernel& kernel, const std::string& nam)
+DigiSegmentSplitter::DigiSegmentSplitter(const kernel_t& kernel, const std::string& nam)
   : DigiContainerProcessor(kernel, nam),
     m_split_tool(kernel.detectorDescription())
 {
+  declareProperty("parallel",        m_parallel = false);
   declareProperty("detector",        m_detector_name);
   declareProperty("split_by",        m_split_by);
   declareProperty("processor_type",  m_processor_type);
@@ -98,13 +101,12 @@ void DigiSegmentSplitter::initialize()   {
     const auto& workers = group.actors();
     /// Create the processors:
     for( auto& p : m_splits )   {
-      auto split_id = p.second.second;
       bool ok = false;
+      auto split_id = p.second.second;
       for( auto* w : workers )   {
-	if ( w->options.id == split_id )  {
-	  auto& segment    = w->options;
-          segment          = m_split_context;
-	  segment.id       = p.second.second;
+	if ( w->options.predicate.id == split_id )  {
+	  w->options = m_split_context;
+	  w->options.enable(split_id);
 	  ok = true;
 	  break;
 	}
@@ -114,7 +116,7 @@ void DigiSegmentSplitter::initialize()   {
 	bad = true;
       }
     }
-    if ( bad )    {
+    if ( bad )   {
       except("+++ If you add processors by hand, do it properly! "
 	     "Otherwise use the property 'processor_type'. "
 	     "This setup is invalid.");
@@ -124,18 +126,16 @@ void DigiSegmentSplitter::initialize()   {
   /// IF NOT:
   /// 2) Create the processors using the 'processor_type' option
   for( auto& p : m_splits )   {
-    ::snprintf(text, sizeof(text), "_%05X",
-	       m_split_context.split_id(p.first));
+    uint32_t id = m_split_context.split_id(p.first);
+    ::snprintf(text, sizeof(text), "_%05X", id);
     std::string nam = this->name() + text;
     auto* proc = createAction<DigiContainerProcessor>(m_processor_type, m_kernel, nam);
     if ( !proc )   {
-      except("+++ Failed to create split worker: %s/%s",
-	     m_processor_type.c_str(), nam.c_str());
+      except("+++ Failed to create split worker: %s/%s", m_processor_type.c_str(), nam.c_str());
     }
+    info("+++ Created worker: %s layer: %d %d", nam.c_str(), p.first, id);
     auto* w = new worker_t(proc, m_split_context);
-    auto& segment    = w->options;
-    segment.detector = p.second.first;
-    segment.id       = p.second.second;
+    w->options.enable(id);
     m_workers.insert(w);
     ++count;
   }
@@ -145,22 +145,21 @@ void DigiSegmentSplitter::initialize()   {
 /// Adopt new parallel worker handling a single split identifier
 void DigiSegmentSplitter::adopt_segment_processor(DigiContainerProcessor* action, int split_id)   {
   if ( !action )  {
-    except("+++ FAILED: attempt to add invalid processor!");
+    except("+++ adopt_segment_processor: FAILED attempt to add invalid processor!");
   }
   auto* w = new worker_t(action, m_split_context);
-  w->options.id = split_id;
+  w->options.enable(split_id);
   m_workers.insert(w);
 }
 
 /// Adopt new parallel worker handling multiple split-identifiers
 void DigiSegmentSplitter::adopt_segment_processor(DigiContainerProcessor* action, const std::vector<int>&  ids)   {
-  for( int split_id : ids )   {
+  for( int split_id : ids )
     adopt_segment_processor(action, split_id);
-  }
 }
 
 /// Main functional callback
-void DigiSegmentSplitter::execute(DigiContext& context, work_t& work, const predicate_t& /* predicate */)  const    {
+void DigiSegmentSplitter::execute(context_t& context, work_t& work, const predicate_t& /* predicate */)  const    {
   Key key = work.input_key();
   Key unmasked_key;
   unmasked_key.set_item(key.item());
diff --git a/DDDigi/src/DigiSegmentationTool.cpp b/DDDigi/src/DigiSegmentationTool.cpp
index 2355590da8bb96b229736febd1252159a609f06e..c8f94fde03f0f7b56ff69344f06bcc2ef3db574c 100644
--- a/DDDigi/src/DigiSegmentationTool.cpp
+++ b/DDDigi/src/DigiSegmentationTool.cpp
@@ -57,6 +57,15 @@ const char* DigiSegmentContext::cname()  const  {
   return this->field ? this->field->name().c_str() : "";
 }
 
+/// Full identifier (field + id)
+std::string DigiSegmentContext::identifier(uint32_t id)  const   {
+  std::stringstream str;
+  if ( this->field )   {
+    str << this->field->name() << "." << id;
+  }
+  return str.str();
+}
+
 /// Initializing constructor
 DigiSegmentationTool::DigiSegmentationTool(Detector& desc)
   : description(desc)
diff --git a/examples/DDDigi/scripts/DigiTest.py b/examples/DDDigi/scripts/DigiTest.py
index 798594a98e6e4094bbad3124be21af8a27bcfae5..9b0c5b298bb20ec70488375c434a204adb768244 100644
--- a/examples/DDDigi/scripts/DigiTest.py
+++ b/examples/DDDigi/scripts/DigiTest.py
@@ -10,7 +10,6 @@
 # ==========================================================================
 from __future__ import absolute_import
 import os
-import dd4hep
 import dddigi
 import logging
 from dd4hep import units
diff --git a/examples/DDDigi/scripts/TestSegmentationSplit.py b/examples/DDDigi/scripts/TestSegmentationSplit.py
index 6ff313bad24285e4c942e1a9699b7c806c48ef02..e64c83806f7d9fdcb838b76e4330bfb209e072c7 100644
--- a/examples/DDDigi/scripts/TestSegmentationSplit.py
+++ b/examples/DDDigi/scripts/TestSegmentationSplit.py
@@ -38,7 +38,7 @@ def run():
   event.adopt_action('DigiStoreDump/StoreDump')
   digi.info('Created event.dump')
   # ========================================================================
-  digi.run_checked(num_events=1, num_threads=10, parallel=3)
+  digi.run_checked(num_events=3, num_threads=10, parallel=3)
 
 
 if __name__ == '__main__':
diff --git a/examples/DDDigi/scripts/TestSegmentationSplit2.py b/examples/DDDigi/scripts/TestSegmentationSplit2.py
index 88d1dc237074f45aa40d5fee28edea2fb7a78c05..f0611c0dc648dfcf13c94f6e4127936260649a39 100644
--- a/examples/DDDigi/scripts/TestSegmentationSplit2.py
+++ b/examples/DDDigi/scripts/TestSegmentationSplit2.py
@@ -43,7 +43,7 @@ def run():
   event.adopt_action('DigiStoreDump/StoreDump')
   digi.info('Created event.dump')
   # ========================================================================
-  digi.run_checked(num_events=1, num_threads=10, parallel=3)
+  digi.run_checked(num_events=5, num_threads=10, parallel=3)
 
 
 if __name__ == '__main__':