diff --git a/DDCond/include/DDCond/ConditionsIOVPool.h b/DDCond/include/DDCond/ConditionsIOVPool.h
index 4c0d49158ee722c6d59133d1b5ff3218916da317..e25ac64ffcfe4ddfa6ca5278947a15ce85a72faf 100644
--- a/DDCond/include/DDCond/ConditionsIOVPool.h
+++ b/DDCond/include/DDCond/ConditionsIOVPool.h
@@ -59,9 +59,17 @@ namespace dd4hep {
       /// Select all ACTIVE conditions, which do match the IOV requirement
       size_t select(const IOV& req_validity, RangeConditions& valid, IOV& cond_validity);
       /// Select all ACTIVE conditions, which do match the IOV requirement
-      size_t select(const IOV& req_validity, const ConditionsSelect& valid, IOV& cond_validity);
+      size_t select(const IOV&              req_validity,
+                    const ConditionsSelect& valid,
+                    IOV&                    cond_validity);
       /// Select all ACTIVE conditions pools, which do match the IOV requirement
       size_t select(const IOV& req_validity, Elements& valid, IOV& cond_validity);
+      /// Select all ACTIVE conditions pools, which do match the IOV requirement (faster)
+      size_t select(const IOV& req_validity, Elements& valid);
+      /// Select all ACTIVE conditions pools, which do match the IOV requirement
+      size_t select(const IOV& req_validity, std::vector<Element>& valid, IOV& cond_validity);
+      /// Select all ACTIVE conditions pools, which do match the IOV requirement (faster)
+      size_t select(const IOV& req_validity, std::vector<Element>& valid);
 
       /// Remove all key based pools with an age beyon the minimum age. 
       /** @return Number of conditions cleaned up and removed.                       */
diff --git a/DDCond/include/DDCond/ConditionsSlice.h b/DDCond/include/DDCond/ConditionsSlice.h
index 6e795b47ecb58fc9e078b25a961379e757df3a1d..07eff440d217a5d380765eae7eac868575531f88 100644
--- a/DDCond/include/DDCond/ConditionsSlice.h
+++ b/DDCond/include/DDCond/ConditionsSlice.h
@@ -52,13 +52,17 @@ namespace dd4hep {
      */
     class ConditionsSlice : public ConditionsMap  {
     public:
-      typedef Condition::key_type                key_type;
+      typedef Condition::key_type                           key_type;
+      typedef std::vector<std::shared_ptr<ConditionsPool> > ContainedPools;
 
       enum ManageFlag {
         REGISTER_MANAGER= 1<<0,
         REGISTER_POOL   = 1<<1,
         REGISTER_FULL   = REGISTER_MANAGER|REGISTER_POOL
       };
+      enum LoadFlags  {
+        REF_POOLS       = 1<<1
+      };
       
       /// Helper to simplify the registration of new condtitions from arbitrary containers.
       /**
@@ -104,6 +108,13 @@ namespace dd4hep {
       /// Container of conditions required by this slice
       std::shared_ptr<ConditionsContent> content;
 
+      /// Store the result of the prepare step
+      ConditionsManager::Result status;
+      /// If requested refence the used pools with a shared pointer to inhibit cleanup
+      ContainedPools            used_pools;
+      /// Flag to steer conditions management
+      unsigned long             flags = 0;
+      
     protected:
       /// If flag conditonsManager["OutputUnloadedConditions"]=true: will contain conditions not loaded
       ConditionsContent::Conditions   m_missingConditions;
@@ -133,7 +144,11 @@ namespace dd4hep {
       virtual ~ConditionsSlice();
 
       /// Total size of all conditions contained in the slice
-      size_t size() const  {  return content->conditions().size()+content->derived().size(); }
+      size_t size() const   { return content->conditions().size()+content->derived().size(); }
+      /// Set flag to reference the used pools during prepare
+      void refPools()       { this->flags |= REF_POOLS;                                      }
+      /// Set flag to not reference the used pools during prepare (and drop possibly pending)
+      void derefPools();
       /// Access the map of conditions from the desired content
       const ConditionsContent::Conditions& conditions() const { return content->conditions();}
       /// Access the map of computational conditions from the desired content
@@ -146,6 +161,7 @@ namespace dd4hep {
       const IOV& iov()  const;
       /// Clear the conditions content and the user pool.
       void reset();
+
       /// Insert a set of conditions to the slice AND register them to the conditions manager.
       /** Note: The conditions already require a valid hash key                           */
       template <typename T> void manage(const T& conds, ManageFlag flg)  {
diff --git a/DDCond/src/ConditionsIOVPool.cpp b/DDCond/src/ConditionsIOVPool.cpp
index 09f36f1963a71772a9ff7fc6dc58a64469ba656c..3385dec36dd10ed67ed274ae8f80aa902588e297 100644
--- a/DDCond/src/ConditionsIOVPool.cpp
+++ b/DDCond/src/ConditionsIOVPool.cpp
@@ -128,7 +128,7 @@ size_t ConditionsIOVPool::select(const IOV&              req_validity,
                                  const ConditionsSelect& predicate_processor,
                                  IOV&                    cond_validity)
 {
-  size_t num_selected = 0;
+  size_t num_selected = 0, pool_selected = 0;
   if ( !elements.empty() )  {
     const IOV::Key req_key = req_validity.key(); // 16 bytes => better copy!
     for( const auto& i : elements )  {
@@ -137,7 +137,8 @@ size_t ConditionsIOVPool::select(const IOV&              req_validity,
         continue;
       }
       cond_validity.iov_intersection(i.first);
-      num_selected += i.second->select_all(predicate_processor);
+      pool_selected = i.second->select_all(predicate_processor);
+      num_selected += pool_selected;
       i.second->age_value = 0;
     }
   }
@@ -148,18 +149,54 @@ size_t ConditionsIOVPool::select(const IOV&              req_validity,
 size_t ConditionsIOVPool::select(const IOV& req_validity, 
                                  Elements&  valid,
                                  IOV&       cond_validity)
+{
+  size_t num_selected = select(req_validity, valid);
+  cond_validity.invert().reset();
+  for( const auto& i : valid )
+    cond_validity.iov_intersection(*(i.second->iov));
+  return num_selected;
+}
+
+/// Select all ACTIVE conditions, which do match the IOV requirement
+size_t ConditionsIOVPool::select(const IOV& req_validity, Elements&  valid)
 {
   size_t num_selected = 0;
   if ( !elements.empty() )   {
     const IOV::Key req_key = req_validity.key(); // 16 bytes => better copy!
     for( const auto& i : elements )  {
       if ( !IOV::key_contains_range(i.first, req_key) )  {
-        ++i.second->age_value;
         continue;
       }
-      cond_validity.iov_intersection(i.first);
       valid[i.first] = i.second;
-      i.second->age_value = 0;
+      ++num_selected;
+    }
+  }
+  return num_selected;
+}
+
+/// Select all ACTIVE conditions, which do match the IOV requirement
+size_t ConditionsIOVPool::select(const IOV&        req_validity, 
+                                 std::vector<Element>&  valid,
+                                 IOV&              cond_validity)
+{
+  size_t num_selected = select(req_validity, valid);
+  cond_validity.invert().reset();
+  for( const auto& i : valid )
+    cond_validity.iov_intersection(*(i->iov));
+  return num_selected;
+}
+
+/// Select all ACTIVE conditions, which do match the IOV requirement
+size_t ConditionsIOVPool::select(const IOV& req_validity, std::vector<Element>& valid)
+{
+  size_t num_selected = 0;
+  if ( !elements.empty() )   {
+    const IOV::Key req_key = req_validity.key(); // 16 bytes => better copy!
+    for( const auto& i : elements )  {
+      if ( !IOV::key_contains_range(i.first, req_key) )  {
+        continue;
+      }
+      valid.push_back(i.second);
       ++num_selected;
     }
   }
diff --git a/DDCond/src/ConditionsSlice.cpp b/DDCond/src/ConditionsSlice.cpp
index c65ef2062d7ca1528f3c324a215b359b81d1f157..8f0aa1175800d2e6e8eeff807cc6e8a5f196d246 100644
--- a/DDCond/src/ConditionsSlice.cpp
+++ b/DDCond/src/ConditionsSlice.cpp
@@ -43,9 +43,16 @@ ConditionsSlice::ConditionsSlice(const ConditionsSlice& copy)
 
 /// Default destructor. 
 ConditionsSlice::~ConditionsSlice()   {
+  reset();
   InstanceCount::decrement(this);  
 }
 
+/// Set flag to not reference the used pools during prepare (and drop possibly pending)
+void ConditionsSlice::derefPools()     {
+  used_pools.clear(); // Drop all refs possibly pending
+  this->flags &= ~REF_POOLS;
+}
+
 /// Access the combined IOV of the slice from the pool
 const IOV& ConditionsSlice::iov()  const    {
   if ( pool.get() ) return pool->validity();
@@ -56,6 +63,7 @@ const IOV& ConditionsSlice::iov()  const    {
 
 /// Clear the conditions access and the user pool.
 void ConditionsSlice::reset()   {
+  derefPools();
   if ( pool.get() ) pool->clear();
 }
 
diff --git a/DDCond/src/plugins/ConditionsUserPool.cpp b/DDCond/src/plugins/ConditionsUserPool.cpp
index 4cf7325463a6f6c8fd396f13fd8d3bf124756256..06d07017d8c19bd8aefa858a8f0a64d3f626565a 100644
--- a/DDCond/src/plugins/ConditionsUserPool.cpp
+++ b/DDCond/src/plugins/ConditionsUserPool.cpp
@@ -572,6 +572,11 @@ ConditionsMappedUserPool<MAPPING>::prepare(const IOV&                  required,
       copy(begin(calc_missing), last_calc, inserter(slice_miss_calc, slice_miss_calc.begin()));
     }
   }
+  slice.status = result;
+  slice.used_pools.clear();
+  if ( slice.flags&ConditionsSlice::REF_POOLS )   {
+    m_iovPool->select(required, slice.used_pools);
+  }
   return result;
 }
 
@@ -643,6 +648,7 @@ ConditionsMappedUserPool<MAPPING>::load(const IOV&              required,
       copy(begin(cond_missing), last_cond, inserter(slice_miss_cond, slice_miss_cond.begin()));
     }
   }
+  slice.status = result;
   return result;
 }
 
@@ -706,6 +712,11 @@ ConditionsMappedUserPool<MAPPING>::compute(const IOV&                  required,
       copy(begin(calc_missing), last_calc, inserter(slice_miss_calc, slice_miss_calc.begin()));
     }
   }
+  slice.status += result;
+  slice.used_pools.clear();
+  if ( slice.flags&ConditionsSlice::REF_POOLS )   {
+    m_iovPool->select(required, slice.used_pools);
+  }
   return result;
 }