diff --git a/src/processor_base.cpp b/src/processor_base.cpp
index 28a6f3dde73ebba6bba0e9c632660d9d13180803..ea4bdc4e82e1edbcb83c9500656f0b0d05de6ab8 100644
--- a/src/processor_base.cpp
+++ b/src/processor_base.cpp
@@ -11,8 +11,7 @@ ProcessorBase::ProcessorBase(const std::string& _type, ProcessorParamsBasePtr _p
         NodeBase("PROCESSOR", _type, _params->name),
         processor_id_(++processor_id_count_),
         params_(_params),
-        sensor_ptr_(),
-        is_removing_(false)
+        sensor_ptr_()
 {
 //    WOLF_DEBUG("constructed    +p" , id());
 }
@@ -98,6 +97,12 @@ PackKeyFramePtr PackKeyFrameBuffer::selectPack(const TimeStamp& _time_stamp, con
 
     PackKeyFrameBuffer::Iterator post = container_.upper_bound(_time_stamp);
 
+    // remove packs corresponding to removed KFs (keeping the next iterator in post)
+    while (post != container_.end() && post->second->key_frame->isRemoving())
+        post = container_.erase(post);
+    while (post != container_.begin() && std::prev(post)->second->key_frame->isRemoving())
+        container_.erase(std::prev(post));
+
     bool prev_exists = (post != container_.begin());
     bool post_exists = (post != container_.end());
 
@@ -133,33 +138,33 @@ PackKeyFramePtr PackKeyFrameBuffer::selectPack(const CaptureBasePtr _capture, co
     return selectPack(_capture->getTimeStamp(), _time_tolerance);
 }
 
-PackKeyFramePtr PackKeyFrameBuffer::selectPackBefore(const TimeStamp& _time_stamp, const Scalar& _time_tolerance)
+PackKeyFramePtr PackKeyFrameBuffer::selectFirstPackBefore(const TimeStamp& _time_stamp, const Scalar& _time_tolerance)
 {
-    if (container_.empty())
-        return nullptr;
+    // remove packs corresponding to removed KFs
+    while (!container_.empty() && container_.begin()->second->key_frame->isRemoving())
+        container_.erase(container_.begin());
 
-    PackKeyFrameBuffer::Iterator post = container_.upper_bound(_time_stamp);
+    // There is no pack
+    if (container_.empty())
+         return nullptr;
 
-    bool prev_exists = (post != container_.begin());
+    // Checking on begin() since packs are ordered in time
+    // Return first pack if is older than time stamp
+    if (container_.begin()->first < _time_stamp)
+         return container_.begin()->second;
 
-    if (prev_exists)
+    // Return first pack if despite being newer, it is within the time tolerance
+    if (checkTimeTolerance(container_.begin()->first, container_.begin()->second->time_tolerance, _time_stamp, _time_tolerance))
         return container_.begin()->second;
 
-    else
-    {
-        bool post_exists = (post != container_.end());
-        bool post_ok     = post_exists && checkTimeTolerance(post->first, post->second->time_tolerance, _time_stamp, _time_tolerance);
-
-        if (post_ok)
-            return post->second;
-    }
-
+    // otherwise return nullptr (no pack before the provided ts or within the tolerance was found)
     return nullptr;
+
 }
 
-PackKeyFramePtr PackKeyFrameBuffer::selectPackBefore(const CaptureBasePtr _capture, const Scalar& _time_tolerance)
+PackKeyFramePtr PackKeyFrameBuffer::selectFirstPackBefore(const CaptureBasePtr _capture, const Scalar& _time_tolerance)
 {
-    return selectPackBefore(_capture->getTimeStamp(), _time_tolerance);
+    return selectFirstPackBefore(_capture->getTimeStamp(), _time_tolerance);
 }
 
 void PackKeyFrameBuffer::print(void)
diff --git a/src/processor_base.h b/src/processor_base.h
index b9dc4b8d6464062e21a91e8d4133462731ac1be6..bcf5c46b62730d593165f99fdb8d021296964812 100644
--- a/src/processor_base.h
+++ b/src/processor_base.h
@@ -58,8 +58,8 @@ class PackKeyFrameBuffer
         PackKeyFramePtr selectPack(const TimeStamp& _time_stamp, const Scalar& _time_tolerance);
         PackKeyFramePtr selectPack(const CaptureBasePtr _capture, const Scalar& _time_tolerance);
 
-        PackKeyFramePtr selectPackBefore(const TimeStamp& _time_stamp, const Scalar& _time_tolerance);
-        PackKeyFramePtr selectPackBefore(const CaptureBasePtr _capture, const Scalar& _time_tolerance);
+        PackKeyFramePtr selectFirstPackBefore(const TimeStamp& _time_stamp, const Scalar& _time_tolerance);
+        PackKeyFramePtr selectFirstPackBefore(const CaptureBasePtr _capture, const Scalar& _time_tolerance);
 
         /**\brief Buffer size
          *
@@ -147,15 +147,13 @@ class ProcessorBase : public NodeBase, public std::enable_shared_from_this<Proce
     private:
         SensorBaseWPtr sensor_ptr_;
 
-        bool is_removing_; ///< A flag for safely removing nodes from the Wolf tree. See remove().
-
         static unsigned int processor_id_count_;
 
     public:
         ProcessorBase(const std::string& _type, ProcessorParamsBasePtr _params);
         virtual ~ProcessorBase();
         virtual void configure(SensorBasePtr _sensor) = 0;
-        void remove();
+        virtual void remove();
 
         unsigned int id();
 
diff --git a/src/processor_motion.cpp b/src/processor_motion.cpp
index 450cd9d8c2333e06ef76a269939430fe42a18705..c72c02973a4c57abea464811a32f59f707271c7a 100644
--- a/src/processor_motion.cpp
+++ b/src/processor_motion.cpp
@@ -584,7 +584,7 @@ PackKeyFramePtr ProcessorMotion::computeProcessingStep()
         throw std::runtime_error("ProcessorMotion received data before being initialized.");
     }
 
-    PackKeyFramePtr pack = kf_pack_buffer_.selectPackBefore(last_ptr_, params_motion_->time_tolerance);
+    PackKeyFramePtr pack = kf_pack_buffer_.selectFirstPackBefore(last_ptr_, params_motion_->time_tolerance);
 
     if (pack)
     {
diff --git a/src/test/gtest_pack_KF_buffer.cpp b/src/test/gtest_pack_KF_buffer.cpp
index dab222c29248b5be35c61d9de10ffb041647217f..1204254c1024266c98cfe2c8e3764f76453fe2ee 100644
--- a/src/test/gtest_pack_KF_buffer.cpp
+++ b/src/test/gtest_pack_KF_buffer.cpp
@@ -144,7 +144,7 @@ TEST_F(BufferPackKeyFrameTest, selectPack)
     }
 }
 
-TEST_F(BufferPackKeyFrameTest, selectPackBefore)
+TEST_F(BufferPackKeyFrameTest, selectFirstPackBefore)
 {
     pack_kf_buffer.clear();
 
@@ -194,7 +194,7 @@ TEST_F(BufferPackKeyFrameTest, selectPackBefore)
         int j = 0;
         for (auto ts : q_ts)
         {
-            packQ = pack_kf_buffer.selectPackBefore(ts, tt);
+            packQ = pack_kf_buffer.selectFirstPackBefore(ts, tt);
             if (packQ)
                 res(i,j) = packQ->key_frame->getTimeStamp().get();