diff --git a/demos/hello_wolf/processor_range_bearing.cpp b/demos/hello_wolf/processor_range_bearing.cpp
index 8b64ac0d1ce0020633aa208b82f3f0288c0dd0ce..01b3cbceb074632927a6b3f1ec4b5798ffd4d83e 100644
--- a/demos/hello_wolf/processor_range_bearing.cpp
+++ b/demos/hello_wolf/processor_range_bearing.cpp
@@ -51,15 +51,15 @@ void ProcessorRangeBearing::processCapture(CaptureBasePtr _capture)
 
     // 1. get KF
     FrameBasePtr kf(nullptr);
-    if ( !buffer_pack_kf_.empty() )
+    if ( !buffer_frame_.empty() )
     {
         // KeyFrame Callback received
-        PackKeyFramePtr pack = buffer_pack_kf_.selectPack( _capture->getTimeStamp(), params_->time_tolerance );
+        FrameBasePtr keyframe = buffer_frame_.select( _capture->getTimeStamp(), params_->time_tolerance );
 
-        if (pack!=nullptr)
-            kf = pack->key_frame;
+        if (keyframe!=nullptr)
+            kf = keyframe;
 
-        buffer_pack_kf_.removeUpTo( _capture->getTimeStamp() );
+        buffer_frame_.removeUpTo( _capture->getTimeStamp() );
 
         assert( kf && "Callback KF is not close enough to _capture!");
     }
diff --git a/include/core/frame/frame_base.h b/include/core/frame/frame_base.h
index 6a9488e681e46ec5e775e43f2e7e3d5d236726dc..328df7c2dc2cfeebd30cf14f54d3c155a15d4214 100644
--- a/include/core/frame/frame_base.h
+++ b/include/core/frame/frame_base.h
@@ -58,6 +58,7 @@ class FrameBase : public NodeBase, public HasStateBlocks, public std::enable_sha
     protected:
         unsigned int frame_id_;
         TimeStamp time_stamp_;     ///< frame time stamp
+        double time_tolerance_;
         
     public:
         /** \brief Constructor with type, time stamp and state pointer
@@ -101,6 +102,8 @@ class FrameBase : public NodeBase, public HasStateBlocks, public std::enable_sha
         void        setTimeStamp(const TimeStamp& _ts);
         TimeStamp   getTimeStamp() const;
         void        getTimeStamp(TimeStamp& _ts) const;
+        double      getTimeTolerance() const {return time_tolerance_;}
+        void        setTimeTolerance(double _time_tolerance) {time_tolerance_ = _time_tolerance;}
 
         // State blocks ----------------------------------------------------
     public:
diff --git a/include/core/processor/processor_base.h b/include/core/processor/processor_base.h
index 84996921ca13b9813e23724e709da3ed30afe28e..bc4d523748b04747bb19617eb2498b2cced8d650 100644
--- a/include/core/processor/processor_base.h
+++ b/include/core/processor/processor_base.h
@@ -80,22 +80,6 @@ static ProcessorBasePtr create(const std::string& _unique_name, const ParamsProc
 
 
 
-/** \brief Key frame class pack
- *
- * To store a key_frame with an associated time tolerance.
- *
- * Used in keyframe callbacks as the minimal pack of information needed by the processor receiving the callback.
- */
-class PackKeyFrame
-{
-    public:
-        PackKeyFrame(const FrameBasePtr _key_frame, const double _time_tolerance) : key_frame(_key_frame), time_tolerance(_time_tolerance) {};
-        ~PackKeyFrame(){};
-        FrameBasePtr key_frame;
-        double time_tolerance;
-};
-
-WOLF_PTR_TYPEDEFS(PackKeyFrame);
 
 
 /** \brief Buffer for arbitrary type objects
@@ -112,16 +96,16 @@ public:
     Buffer(){};
     ~Buffer(void){};
 
-    /**\brief Select a Pack from the buffer
+    /**\brief Select an element from the buffer
     *
-    *  Select from the buffer the closest pack (w.r.t. time stamp),
+    *  Select from the buffer the closest element (w.r.t. time stamp),
     * respecting a defined time tolerances
     */
     T select(const TimeStamp& _time_stamp, const double& _time_tolerance);
     
-    /**\brief Select a Pack iterator from the buffer
+    /**\brief Select an element iterator from the buffer
     *
-    *  Select from the buffer the iterator pointing to the closest pack (w.r.t. time stamp),
+    *  Select from the buffer the iterator pointing to the closest element (w.r.t. time stamp),
     * respecting a defined time tolerances
     */
     Iterator selectIterator(const TimeStamp& _time_stamp, const double& _time_tolerance);
@@ -139,7 +123,7 @@ public:
     */
     SizeStd size(void);
 
-    /**\brief Add a pack to the buffer
+    /**\brief Add a element to the buffer
     *
     */
     void add(const TimeStamp& _time_stamp, const T& _element); //const double& _time_tolerance);
@@ -150,12 +134,12 @@ public:
     */
     std::map<TimeStamp,T>& getContainer();
 
-    /**\brief Remove all packs in the buffer with a time stamp older than the specified
+    /**\brief Remove all elements in the buffer with a time stamp older than the specified
     *
     */
     void removeUpTo(const TimeStamp& _time_stamp);
 
-    /**\brief Remove all packs in the buffer with a time stamp older than the specified
+    /**\brief Remove all elements in the buffer with a time stamp older than the specified
     *
     */
     void removeUpToLower(const TimeStamp& _time_stamp);
@@ -190,47 +174,16 @@ protected:
 };
 
 
-/** \brief Buffer of Key frame class objects
+/** \brief Buffer of Frames
  *
- * Object and functions to manage a buffer of KFPack objects.
+ * Object and functions to manage a buffer of FrameBasePtr objects.
  */
-class BufferPackKeyFrame : public Buffer<PackKeyFramePtr>
-{
-    public:
-
-        /**\brief Select a Pack from the buffer
-         *
-         *  Select from the buffer the closest pack (w.r.t. time stamp),
-         * respecting a defined time tolerances
-         */
-        PackKeyFramePtr selectPack(const TimeStamp& _time_stamp, const double& _time_tolerance);
-        PackKeyFramePtr selectPack(const CaptureBasePtr _capture, const double& _time_tolerance);
-
-        PackKeyFramePtr selectFirstPackBefore(const TimeStamp& _time_stamp, const double& _time_tolerance);
-        PackKeyFramePtr selectFirstPackBefore(const CaptureBasePtr _capture, const double& _time_tolerance);
-
-        /**\brief Add a pack to the buffer
-         *
-         */
-        void add(const FrameBasePtr& _key_frame, const double& _time_tolerance);
-
-        /**\brief Print buffer information
-         *
-         */
-        void print() const;
-
-        /**\brief Alias funct
-        *
-        */
-        static bool checkTimeTolerance(const TimeStamp& _time_stamp1, const double& _time_tolerance1, const TimeStamp& _time_stamp2, const double& _time_tolerance2)
-        { return doubleCheckTimeTolerance(_time_stamp1, _time_tolerance1, _time_stamp2, _time_tolerance2); };
-
-};
+class BufferFrame : public Buffer<FrameBasePtr> { };
 
 
-/** \brief Buffer of Capture class objects
+/** \brief Buffer of Captures
  *
- * Object and functions to manage a buffer of Capture objects.
+ * Object and functions to manage a buffer of CaptureBasePtr objects.
  */
 class BufferCapture : public Buffer<CaptureBasePtr> {};
 
@@ -276,7 +229,7 @@ class ProcessorBase : public NodeBase, public std::enable_shared_from_this<Proce
     protected:
         unsigned int processor_id_;
         ParamsProcessorBasePtr params_;
-        BufferPackKeyFrame buffer_pack_kf_;
+        BufferFrame buffer_frame_;
         BufferCapture buffer_capture_;
         int dim_;
 
@@ -362,7 +315,7 @@ class ProcessorBase : public NodeBase, public std::enable_shared_from_this<Proce
     public:
         /**\brief notify a new keyframe made by another processor
          *
-         * It stores the new KF in buffer_pack_kf_ and calls triggerInKF()
+         * It stores the new KF in buffer_frame_ and calls triggerInKF()
          *
          */
         void keyFrameCallback(FrameBasePtr _keyframe_ptr, const double& _time_tol_other);
@@ -548,16 +501,16 @@ T Buffer<T>::selectFirstBefore(const TimeStamp& _time_stamp, const double& _time
     if (container_.empty())
          return nullptr;
 
-    // Checking on begin() since packs are ordered in time
-    // Return first pack if is older than time stamp
+    // Checking on begin() since elements are ordered in time
+    // Return first element if is older than time stamp
     if (container_.begin()->first < _time_stamp)
          return container_.begin()->second;
 
-    // Return first pack if despite being newer, it is within the time tolerance
+    // Return first element if despite being newer, it is within the time tolerance
     if (simpleCheckTimeTolerance(container_.begin()->first, _time_stamp, _time_tolerance))
         return container_.begin()->second;
 
-    // otherwise return nullptr (no pack before the provided ts or within the tolerance was found)
+    // otherwise return nullptr (no element before the provided ts or within the tolerance was found)
     return nullptr;
 }
 
@@ -569,16 +522,16 @@ T Buffer<T>::selectLastAfter(const TimeStamp& _time_stamp, const double& _time_t
     if (container_.empty())
          return nullptr;
 
-    // Checking on rbegin() since packs are ordered in time
-    // Return last pack if is newer than time stamp
+    // Checking on rbegin() since elements are ordered in time
+    // Return last element if is newer than time stamp
     if (container_.rbegin()->first > _time_stamp)
          return container_.rbegin()->second;
 
-    // Return last pack if despite being older, it is within the time tolerance
+    // Return last element if despite being older, it is within the time tolerance
     if (simpleCheckTimeTolerance(container_.rbegin()->first, _time_stamp, _time_tolerance))
         return container_.rbegin()->second;
 
-    // otherwise return nullptr (no pack after the provided ts or within the tolerance was found)
+    // otherwise return nullptr (no element after the provided ts or within the tolerance was found)
     return nullptr;
 }
 
diff --git a/include/core/processor/processor_motion.h b/include/core/processor/processor_motion.h
index 7a657aaae5cb74890c2ab95cf647e689478fe0b3..c24c9d727af9e03801d27f56a52d914cd12b5180 100644
--- a/include/core/processor/processor_motion.h
+++ b/include/core/processor/processor_motion.h
@@ -301,7 +301,7 @@ class ProcessorMotion : public ProcessorBase, public MotionProvider
          */
         virtual void postProcess(){ };
 
-        PackKeyFramePtr computeProcessingStep();
+        FrameBasePtr computeProcessingStep();
 
         // These are the pure virtual functions doing the mathematics
     public:
diff --git a/include/core/processor/processor_tracker.h b/include/core/processor/processor_tracker.h
index 932b6d0ea55ff5b9a0f4df8b7457be90c8de62cc..bd2889842739917b5dd210a9a5ab71cdd50a8b5c 100644
--- a/include/core/processor/processor_tracker.h
+++ b/include/core/processor/processor_tracker.h
@@ -108,12 +108,12 @@ class ProcessorTracker : public ProcessorBase
 {
     public:
         typedef enum {
-            FIRST_TIME_WITH_PACK,
-            FIRST_TIME_WITHOUT_PACK,
-            SECOND_TIME_WITH_PACK,
-            SECOND_TIME_WITHOUT_PACK,
-            RUNNING_WITH_PACK,
-            RUNNING_WITHOUT_PACK
+            FIRST_TIME_WITH_KEYFRAME,
+            FIRST_TIME_WITHOUT_KEYFRAME,
+            SECOND_TIME_WITH_KEYFRAME,
+            SECOND_TIME_WITHOUT_KEYFRAME,
+            RUNNING_WITH_KEYFRAME,
+            RUNNING_WITHOUT_KEYFRAME
         } ProcessingStep ;
 
     protected:
diff --git a/src/processor/processor_base.cpp b/src/processor/processor_base.cpp
index 0e88a448e98041ce034390d8bfd324f41528b1d6..634a6e0b91cedb0740a3ed1038180fba3039b559 100644
--- a/src/processor/processor_base.cpp
+++ b/src/processor/processor_base.cpp
@@ -63,9 +63,11 @@ void ProcessorBase::keyFrameCallback(FrameBasePtr _keyframe_ptr, const double& _
     n_kf_callback_++;
     startKFProfiling();
 
+    _keyframe_ptr->setTimeTolerance(_time_tol_other);
+
     // asking if frame should be stored
     if (storeKeyFrame(_keyframe_ptr))
-        buffer_pack_kf_.add(_keyframe_ptr, _time_tol_other);
+        buffer_frame_.add(_keyframe_ptr->getTimeStamp(), _keyframe_ptr);
 
     // asking if frame should be processed
     if (triggerInKeyFrame(_keyframe_ptr, _time_tol_other))
@@ -155,101 +157,6 @@ void ProcessorBase::setProblem(ProblemPtr _problem)
         motion_provider_ptr->addToProblem(_problem, motion_provider_ptr);
 }
 
-/////////////////////////////////////////////////////////////////////////////////////////
-
-void BufferPackKeyFrame::add(const FrameBasePtr& _key_frame, const double& _time_tolerance)
-{
-    TimeStamp time_stamp = _key_frame->getTimeStamp();
-    PackKeyFramePtr kfpack = std::make_shared<PackKeyFrame>(_key_frame, _time_tolerance);
-    Buffer::add(time_stamp, kfpack);
-}
-
-PackKeyFramePtr BufferPackKeyFrame::selectPack(const TimeStamp& _time_stamp, const double& _time_tolerance)
-{
-    if (container_.empty())
-        return nullptr;
-
-    BufferPackKeyFrame::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());
-
-    bool post_ok = post_exists && doubleCheckTimeTolerance(post->first, post->second->time_tolerance, _time_stamp, _time_tolerance);
-
-    if (prev_exists)
-    {
-        BufferPackKeyFrame::Iterator prev = std::prev(post);
-
-        bool prev_ok = doubleCheckTimeTolerance(prev->first, prev->second->time_tolerance, _time_stamp, _time_tolerance);
-
-        if (prev_ok && !post_ok)
-            return prev->second;
-
-        else if (!prev_ok && post_ok)
-            return post->second;
-
-        else if (prev_ok && post_ok)
-        {
-            if (std::fabs(post->first - _time_stamp) < std::fabs(prev->first - _time_stamp))
-                return post->second;
-            else
-                return prev->second;
-        }
-    }
-    else if (post_ok)
-        return post->second;
-
-    return nullptr;
-}
-PackKeyFramePtr BufferPackKeyFrame::selectPack(const CaptureBasePtr _capture, const double& _time_tolerance)
-{
-    return selectPack(_capture->getTimeStamp(), _time_tolerance);
-}
-
-PackKeyFramePtr BufferPackKeyFrame::selectFirstPackBefore(const TimeStamp& _time_stamp, const double& _time_tolerance)
-{
-    // remove packs corresponding to removed KFs
-    while (!container_.empty() && container_.begin()->second->key_frame->isRemoving())
-        container_.erase(container_.begin());
-
-    // There is no pack
-    if (container_.empty())
-         return nullptr;
-
-    // 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;
-
-    // Return first pack if despite being newer, it is within the time tolerance
-    if (doubleCheckTimeTolerance(container_.begin()->first, container_.begin()->second->time_tolerance, _time_stamp, _time_tolerance))
-        return container_.begin()->second;
-
-    // otherwise return nullptr (no pack before the provided ts or within the tolerance was found)
-    return nullptr;
-
-}
-
-PackKeyFramePtr BufferPackKeyFrame::selectFirstPackBefore(const CaptureBasePtr _capture, const double& _time_tolerance)
-{
-    return selectFirstPackBefore(_capture->getTimeStamp(), _time_tolerance);
-}
-
-void BufferPackKeyFrame::print(void) const
-{
-    std::cout << "[ ";
-    for (auto iter : container_)
-    {
-        std::cout << "( tstamp: " << iter.first << ", id: " << iter.second->key_frame->id() << ") ";
-    }
-    std::cout << "]" << std::endl;
-}
 
 void ProcessorBase::printHeader(int _depth, bool _constr_by, bool _metric, bool _state_blocks, std::ostream& _stream, std::string _tabs) const
 {
diff --git a/src/processor/processor_loop_closure.cpp b/src/processor/processor_loop_closure.cpp
index 927d873f48fe70ffaef085a0d28a9fdf84bbf03f..d1d64a811f08e0608bbc1b50f1710ffa7c332d67 100644
--- a/src/processor/processor_loop_closure.cpp
+++ b/src/processor/processor_loop_closure.cpp
@@ -51,25 +51,25 @@ void ProcessorLoopClosure::processCapture(CaptureBasePtr _capture)
         process(_capture);
 
         // remove the frame and older frames
-        buffer_pack_kf_.removeUpTo(_capture->getFrame()->getTimeStamp());
+        buffer_frame_.removeUpTo(_capture->getFrame()->getTimeStamp());
 
         return;
     }
 
     // Search for any stored frame within time tolerance of capture
-    auto frame_pack = buffer_pack_kf_.select(_capture->getTimeStamp(), params_->time_tolerance);
+    auto keyframe_from_callback = buffer_frame_.select(_capture->getTimeStamp(), params_->time_tolerance);
 
     // CASE 2:
-    if (_capture->getFrame() == nullptr and frame_pack)
+    if (_capture->getFrame() == nullptr and keyframe_from_callback)
     {
         WOLF_DEBUG("CASE 2");
 
-        _capture->link(frame_pack->key_frame);
+        _capture->link(keyframe_from_callback);
 
         process(_capture);
 
         // remove the frame and older frames
-        buffer_pack_kf_.removeUpTo(frame_pack->key_frame->getTimeStamp());
+        buffer_frame_.removeUpTo(keyframe_from_callback->getTimeStamp());
 
         return;
     }
@@ -129,7 +129,7 @@ void ProcessorLoopClosure::processKeyFrame(FrameBasePtr _frame, const double& _t
         WOLF_DEBUG("CASE 3");
 
         // store frame
-        buffer_pack_kf_.add(_frame, _time_tolerance);
+        buffer_frame_.add(_frame->getTimeStamp(), _frame);
 
         return;
     }
diff --git a/src/processor/processor_motion.cpp b/src/processor/processor_motion.cpp
index 6b9b4b031b1091ca2e832f3f76336fd7cffc943c..6f4339a922f169e0a7630e46c1d9022391ebdf16 100644
--- a/src/processor/processor_motion.cpp
+++ b/src/processor/processor_motion.cpp
@@ -183,9 +183,9 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
 
     preProcess(); // Derived class operations
 
-    PackKeyFramePtr pack = computeProcessingStep();
-    if (pack)
-        buffer_pack_kf_.removeUpTo( pack->key_frame->getTimeStamp() );
+    FrameBasePtr keyframe_from_callback = computeProcessingStep();
+    if (keyframe_from_callback)
+        buffer_frame_.removeUpTo( keyframe_from_callback->getTimeStamp() );
     
     switch(processing_step_)
     {
@@ -204,7 +204,7 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
         case FIRST_TIME_WITH_KF_ON_INCOMING :
         {
             // can joint to the KF
-            setOrigin(pack->key_frame);
+            setOrigin(keyframe_from_callback);
             break;
         }
         case FIRST_TIME_WITH_KF_AFTER_INCOMING :
@@ -259,9 +259,8 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
              *     \_f_/ \_f_/
              */
 
-            // extract pack elements
-            FrameBasePtr keyframe_from_callback = pack->key_frame;
-            TimeStamp ts_from_callback          = keyframe_from_callback->getTimeStamp();
+            // extract KF elements
+            TimeStamp ts_from_callback = keyframe_from_callback->getTimeStamp();
 
             // find the capture whose buffer is affected by the new keyframe
             auto capture_existing   = findCaptureContainingTimeStamp(ts_from_callback); // k
@@ -370,9 +369,8 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
              *     \____f____/ \_f_/
              */
 
-            // extract pack elements
-            FrameBasePtr keyframe_from_callback = pack->key_frame;
-            TimeStamp ts_from_callback          = keyframe_from_callback->getTimeStamp();
+            // extract KF elements
+            TimeStamp ts_from_callback = keyframe_from_callback->getTimeStamp();
 
             // update KF state (adding missing StateBlocks)
             auto proc_state = getState(ts_from_callback);
@@ -933,21 +931,21 @@ CaptureMotionPtr ProcessorMotion::findCaptureContainingTimeStamp(const TimeStamp
     return capture_motion;
 }
 
-PackKeyFramePtr ProcessorMotion::computeProcessingStep()
+FrameBasePtr ProcessorMotion::computeProcessingStep()
 {
     // Origin not set
     if (!origin_ptr_)
     {
-        PackKeyFramePtr pack = buffer_pack_kf_.selectFirstPackBefore(incoming_ptr_, params_motion_->time_tolerance);
+        FrameBasePtr keyframe_from_callback = buffer_frame_.selectFirstBefore(incoming_ptr_->getTimeStamp(), params_motion_->time_tolerance);
 
-        if (pack)
+        if (keyframe_from_callback)
         {
-            if (buffer_pack_kf_.checkTimeTolerance(pack->key_frame->getTimeStamp(), pack->time_tolerance, incoming_ptr_->getTimeStamp(), params_motion_->time_tolerance))
+            if (buffer_frame_.doubleCheckTimeTolerance(keyframe_from_callback->getTimeStamp(), keyframe_from_callback->getTimeTolerance(), incoming_ptr_->getTimeStamp(), params_motion_->time_tolerance))
             {
                 WOLF_DEBUG("First time with a KF compatible.")
                 processing_step_ = FIRST_TIME_WITH_KF_ON_INCOMING;
             }
-            else if (pack->key_frame->getTimeStamp() < incoming_ptr_->getTimeStamp())
+            else if (keyframe_from_callback->getTimeStamp() < incoming_ptr_->getTimeStamp())
             {
                 WOLF_DEBUG("First time with a KF too old. It seems the prior has been set before receiving the first capture of this processor.")
                 processing_step_ = FIRST_TIME_WITH_KF_BEFORE_INCOMING;
@@ -964,23 +962,23 @@ PackKeyFramePtr ProcessorMotion::computeProcessingStep()
             processing_step_ = FIRST_TIME_WITHOUT_KF;
         }
 
-        return pack;
+        return keyframe_from_callback;
     }
     else
     {
-        PackKeyFramePtr pack = buffer_pack_kf_.selectFirstPackBefore(last_ptr_, params_motion_->time_tolerance);
+        FrameBasePtr keyframe_from_callback = buffer_frame_.selectFirstBefore(last_ptr_->getTimeStamp(), params_motion_->time_tolerance);
 
         // ignore "future" KF to avoid MotionBuffer::split() error
-        if (pack && pack->key_frame->getTimeStamp() > last_ptr_->getBuffer().back().ts_)
-            pack = nullptr;
+        if (keyframe_from_callback && keyframe_from_callback->getTimeStamp() > last_ptr_->getBuffer().back().ts_)
+            keyframe_from_callback = nullptr;
 
-        if (pack)
+        if (keyframe_from_callback)
         {
-            if (buffer_pack_kf_.checkTimeTolerance(pack->key_frame->getTimeStamp(), pack->time_tolerance, origin_ptr_->getTimeStamp(), params_motion_->time_tolerance))
+            if (buffer_frame_.doubleCheckTimeTolerance(keyframe_from_callback->getTimeStamp(), keyframe_from_callback->getTimeTolerance(), origin_ptr_->getTimeStamp(), params_motion_->time_tolerance))
 
                 processing_step_ = RUNNING_WITH_KF_ON_ORIGIN;
 
-            else if (pack->key_frame->getTimeStamp() < origin_ptr_->getTimeStamp())
+            else if (keyframe_from_callback->getTimeStamp() < origin_ptr_->getTimeStamp())
 
                 processing_step_ = RUNNING_WITH_KF_BEFORE_ORIGIN;
 
@@ -992,7 +990,7 @@ PackKeyFramePtr ProcessorMotion::computeProcessingStep()
         else
             processing_step_ = RUNNING_WITHOUT_KF;
 
-        return pack;
+        return keyframe_from_callback;
     }
 
     // not reached
diff --git a/src/processor/processor_pose.cpp b/src/processor/processor_pose.cpp
index c8e9c5aa9351ae19b232f63f4205347586985122..e9458c8c6d6e16594a7ec96be7b9c0a073d44367 100644
--- a/src/processor/processor_pose.cpp
+++ b/src/processor/processor_pose.cpp
@@ -45,15 +45,15 @@ void ProcessorPose::configure(SensorBasePtr _sensor)
 
 void ProcessorPose::createFactorIfNecessary(){
     auto sensor_pose = std::static_pointer_cast<SensorPose>(getSensor());
-    auto kf_it_last = buffer_pack_kf_.getContainer().end();
-    auto kf_it = buffer_pack_kf_.getContainer().begin();
-    while (kf_it != buffer_pack_kf_.getContainer().end())
+    auto kf_it_last = buffer_frame_.getContainer().end();
+    auto kf_it = buffer_frame_.getContainer().begin();
+    while (kf_it != buffer_frame_.getContainer().end())
     {
         TimeStamp t = kf_it->first;
-        double time_tolerance = std::min(getTimeTolerance(), kf_it->second->time_tolerance);
+        double time_tolerance = std::min(getTimeTolerance(), kf_it->second->getTimeTolerance());
         if (getTimeTolerance() == 0.0){
             WOLF_WARN("Time tolerance set to zero -> value not used");
-            time_tolerance = kf_it->second->time_tolerance;
+            time_tolerance = kf_it->second->getTimeTolerance();
         }
         auto cap_it = buffer_capture_.selectIterator(t, time_tolerance);
 
@@ -62,7 +62,7 @@ void ProcessorPose::createFactorIfNecessary(){
         {
             // if a corresponding capture exists, link it to the KF and create a factor
             auto cap = std::static_pointer_cast<CapturePose>(cap_it->second);
-            cap->link(kf_it->second->key_frame);
+            cap->link(kf_it->second);
             FeatureBasePtr feat = FeatureBase::emplace<FeatureBase>(cap, "Pose", cap->getData(), cap->getDataCovariance());
             FactorPose3dWithExtrinsicsPtr fac = FactorBase::emplace<FactorPose3dWithExtrinsics>(feat, feat, shared_from_this(), false, TOP_MOTION);
 
@@ -78,11 +78,11 @@ void ProcessorPose::createFactorIfNecessary(){
     }
 
     // whatever happened, remove very old captures
-    buffer_capture_.removeUpTo(buffer_pack_kf_.getContainer().begin()->first - 5);
+    buffer_capture_.removeUpTo(buffer_frame_.getContainer().begin()->first - 5);
 
     // now we erase the kf buffer if there was a match
-    if (kf_it_last != buffer_pack_kf_.getContainer().end()){
-        buffer_pack_kf_.getContainer().erase(buffer_pack_kf_.getContainer().begin(), std::next(kf_it_last));
+    if (kf_it_last != buffer_frame_.getContainer().end()){
+        buffer_frame_.getContainer().erase(buffer_frame_.getContainer().begin(), std::next(kf_it_last));
     }
 
 }
@@ -96,11 +96,11 @@ inline void ProcessorPose::processCapture(CaptureBasePtr _capture)
         return;
     }
     // nothing to do if any of the two buffer is empty
-    if(buffer_pack_kf_.empty()){
-        WOLF_DEBUG("PInertialKinematic: KF pack buffer empty, time ",  _capture->getTimeStamp());
+    if(buffer_frame_.empty()){
+        WOLF_DEBUG("PInertialKinematic: Frame buffer empty, time ",  _capture->getTimeStamp());
         return;
     }
-    if(buffer_pack_kf_.empty()){
+    if(buffer_frame_.empty()){
         WOLF_DEBUG("PInertialKinematics: Capture buffer empty, time ",  _capture->getTimeStamp());
         return;
     }
@@ -117,11 +117,11 @@ inline void ProcessorPose::processKeyFrame(FrameBasePtr _keyframe_ptr, const dou
         return;
     }
     // nothing to do if any of the two buffer is empty
-    if(buffer_pack_kf_.empty()){
-        WOLF_DEBUG("ProcessorPose: KF pack buffer empty, time ",  _keyframe_ptr->getTimeStamp());
+    if(buffer_frame_.empty()){
+        WOLF_DEBUG("ProcessorPose: Frame buffer empty, time ",  _keyframe_ptr->getTimeStamp());
         return;
     }
-    if(buffer_pack_kf_.empty()){
+    if(buffer_frame_.empty()){
         WOLF_DEBUG("ProcessorPose: Capture buffer empty, time ",  _keyframe_ptr->getTimeStamp());
         return;
     }
diff --git a/src/processor/processor_tracker.cpp b/src/processor/processor_tracker.cpp
index 961937caf44a126aebcf91e5586e3f07c0e3e979..49b604fb260942de874e6f1eebe5fd8e11a4201f 100644
--- a/src/processor/processor_tracker.cpp
+++ b/src/processor/processor_tracker.cpp
@@ -41,7 +41,7 @@ ProcessorTracker::ProcessorTracker(const std::string& _type,
                                    ParamsProcessorTrackerPtr _params_tracker) :
         ProcessorBase(_type, _dim, _params_tracker),
         params_tracker_(_params_tracker),
-        processing_step_(FIRST_TIME_WITHOUT_PACK),
+        processing_step_(FIRST_TIME_WITHOUT_KEYFRAME),
         origin_ptr_(nullptr),
         last_ptr_(nullptr),
         incoming_ptr_(nullptr),
@@ -75,15 +75,15 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
 
     switch(processing_step_)
     {
-        case FIRST_TIME_WITH_PACK :
+        case FIRST_TIME_WITH_KEYFRAME :
         {
-            PackKeyFramePtr pack = buffer_pack_kf_.selectPack( incoming_ptr_, params_tracker_->time_tolerance);
-            buffer_pack_kf_.removeUpTo( pack->key_frame->getTimeStamp() );
+            FrameBasePtr keyframe = buffer_frame_.select( incoming_ptr_->getTimeStamp(), params_tracker_->time_tolerance);
+            buffer_frame_.removeUpTo( keyframe->getTimeStamp() );
 
-            WOLF_DEBUG( "PT ", getName(), " FIRST_TIME_WITH_PACK: KF" , pack->key_frame->id() , " callback unpacked with ts= " , pack->key_frame->getTimeStamp() );
+            WOLF_DEBUG( "PT ", getName(), " FIRST_TIME_WITH_KEYFRAME: KF" , keyframe->id() , " callback unpacked with ts= " , keyframe->getTimeStamp() );
 
             // Append incoming to KF
-            incoming_ptr_->link(pack->key_frame);
+            incoming_ptr_->link(keyframe);
 
             // Process info
             // TrackerFeature:  We only process new features in Last, here last = nullptr, so we do not have anything to do.
@@ -98,9 +98,9 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
 
             break;
         }
-        case FIRST_TIME_WITHOUT_PACK :
+        case FIRST_TIME_WITHOUT_KEYFRAME :
         {
-            WOLF_DEBUG( "PT ", getName(), " FIRST_TIME_WITHOUT_PACK" );
+            WOLF_DEBUG( "PT ", getName(), " FIRST_TIME_WITHOUT_KEYFRAME" );
 
             FrameBasePtr kfrm = FrameBase::emplace<FrameBase>(getProblem()->getTrajectory(),
                                                               incoming_ptr_->getTimeStamp(),
@@ -124,16 +124,16 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
 
             break;
         }
-        case SECOND_TIME_WITH_PACK :
+        case SECOND_TIME_WITH_KEYFRAME :
         {
         	// No-break case only for debug. Next case will be executed too.
-            PackKeyFramePtr pack = buffer_pack_kf_.selectPack( incoming_ptr_, params_tracker_->time_tolerance);
-            WOLF_DEBUG( "PT ", getName(), " SECOND_TIME_WITH_PACK: KF" , pack->key_frame->id() , " callback unpacked with ts= " , pack->key_frame->getTimeStamp() );
+            FrameBasePtr keyframe = buffer_frame_.select( incoming_ptr_->getTimeStamp(), params_tracker_->time_tolerance);
+            WOLF_DEBUG( "PT ", getName(), " SECOND_TIME_WITH_KEYFRAME: KF" , keyframe->id() , " callback unpacked with ts= " , keyframe->getTimeStamp() );
         }
         // Fall through
-        case SECOND_TIME_WITHOUT_PACK :
+        case SECOND_TIME_WITHOUT_KEYFRAME :
         {
-            WOLF_DEBUG( "PT ", getName(), " SECOND_TIME_WITHOUT_PACK" );
+            WOLF_DEBUG( "PT ", getName(), " SECOND_TIME_WITHOUT_KEYFRAME" );
 
             FrameBasePtr frm = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(),
                                                            getProblem()->getFrameStructure(),
@@ -157,18 +157,18 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
 
             break;
         }
-        case RUNNING_WITH_PACK :
+        case RUNNING_WITH_KEYFRAME :
         {
-            PackKeyFramePtr pack = buffer_pack_kf_.selectPack( last_ptr_ , params_tracker_->time_tolerance);
-            buffer_pack_kf_.removeUpTo( pack->key_frame->getTimeStamp() );
+            FrameBasePtr keyframe = buffer_frame_.select( last_ptr_->getTimeStamp() , params_tracker_->time_tolerance);
+            buffer_frame_.removeUpTo( keyframe->getTimeStamp() );
 
-            WOLF_DEBUG( "PT ", getName(), " RUNNING_WITH_PACK: KF" , pack->key_frame->id() , " callback unpacked with ts= " , pack->key_frame->getTimeStamp() );
+            WOLF_DEBUG( "PT ", getName(), " RUNNING_WITH_KEYFRAME: KF" , keyframe->id() , " callback unpacked with ts= " , keyframe->getTimeStamp() );
 
             processKnown();
 
             // Capture last_ is added to the new keyframe
             FrameBasePtr last_old_frame = last_ptr_->getFrame();
-            last_ptr_->move(pack->key_frame);
+            last_ptr_->move(keyframe);
             last_old_frame->remove();
 
             // Create new frame
@@ -192,9 +192,9 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
 
             break;
         }
-        case RUNNING_WITHOUT_PACK :
+        case RUNNING_WITHOUT_KEYFRAME :
         {
-            WOLF_DEBUG( "PT ", getName(), " RUNNING_WITHOUT_PACK");
+            WOLF_DEBUG( "PT ", getName(), " RUNNING_WITHOUT_KEYFRAME");
 
             processKnown();
 
@@ -278,39 +278,39 @@ void ProcessorTracker::computeProcessingStep()
     {
         case FIRST_TIME :
 
-            if (buffer_pack_kf_.selectPack(incoming_ptr_, params_tracker_->time_tolerance))
-                processing_step_ = FIRST_TIME_WITH_PACK;
+            if (buffer_frame_.select(incoming_ptr_->getTimeStamp(), params_tracker_->time_tolerance))
+                processing_step_ = FIRST_TIME_WITH_KEYFRAME;
             else // ! last && ! pack(incoming)
-                processing_step_ = FIRST_TIME_WITHOUT_PACK;
+                processing_step_ = FIRST_TIME_WITHOUT_KEYFRAME;
         break;
 
         case SECOND_TIME :
 
-            if (buffer_pack_kf_.selectPack(last_ptr_, params_tracker_->time_tolerance))
-                processing_step_ = SECOND_TIME_WITH_PACK;
+            if (buffer_frame_.select(last_ptr_->getTimeStamp(), params_tracker_->time_tolerance))
+                processing_step_ = SECOND_TIME_WITH_KEYFRAME;
             else
-                processing_step_ = SECOND_TIME_WITHOUT_PACK;
+                processing_step_ = SECOND_TIME_WITHOUT_KEYFRAME;
             break;
 
         case RUNNING :
         default :
 
-            if (buffer_pack_kf_.selectPack(last_ptr_, params_tracker_->time_tolerance))
+            if (buffer_frame_.select(last_ptr_->getTimeStamp(), params_tracker_->time_tolerance))
             {
                 if (last_ptr_->getFrame()->getProblem())
                 {
                     WOLF_WARN("||*||");
                     WOLF_INFO(" ... It seems you missed something!");
-                    WOLF_INFO("Pack's KF and last's Frame have matching time stamps (i.e. below time tolerances)");
+                    WOLF_INFO("Received KF and last's Frame have matching time stamps (i.e. below time tolerances)");
                     WOLF_INFO("Check the following for correctness:");
                     WOLF_INFO("  - You have all processors installed before starting receiving any data");
                     WOLF_INFO("  - You have configured all your processors with compatible time tolerances");
-                    WOLF_ERROR("Pack's KF and last's KF have matching time stamps (i.e. below time tolerances).");
+                    WOLF_ERROR("Received KF and last's KF have matching time stamps (i.e. below time tolerances).");
                 }
-                processing_step_ = RUNNING_WITH_PACK;
+                processing_step_ = RUNNING_WITH_KEYFRAME;
             }
             else
-                processing_step_ = RUNNING_WITHOUT_PACK;
+                processing_step_ = RUNNING_WITHOUT_KEYFRAME;
             break;
     }
 }
diff --git a/test/dummy/processor_loop_closure_dummy.h b/test/dummy/processor_loop_closure_dummy.h
index e363ee52b96babf92decde84032b765ebbe70001..79a598790dfc58dd9aee764bd0611507aca93479 100644
--- a/test/dummy/processor_loop_closure_dummy.h
+++ b/test/dummy/processor_loop_closure_dummy.h
@@ -101,7 +101,7 @@ class ProcessorLoopClosureDummy : public ProcessorLoopClosure
     public:
         unsigned int getNStoredFrames()
         {
-            return buffer_pack_kf_.getContainer().size();
+            return buffer_frame_.getContainer().size();
         }
 
         unsigned int getNStoredCaptures()
diff --git a/test/gtest_pack_KF_buffer.cpp b/test/gtest_pack_KF_buffer.cpp
index 5512a2040c000c2ff7d71462fd158510c3572001..d8c41241a477e05195d023b1de147e48682bd467 100644
--- a/test/gtest_pack_KF_buffer.cpp
+++ b/test/gtest_pack_KF_buffer.cpp
@@ -43,11 +43,11 @@
 using namespace wolf;
 using namespace Eigen;
 
-class BufferPackKeyFrameTest : public testing::Test
+class BufferFrameTest : public testing::Test
 {
     public:
 
-        BufferPackKeyFrame pack_kf_buffer;
+        BufferFrame buffer_kf;
         FrameBasePtr f10, f20, f21, f28;
         double tt10, tt20, tt21, tt28;
         TimeStamp timestamp;
@@ -64,29 +64,34 @@ class BufferPackKeyFrameTest : public testing::Test
             tt20 = 1.0;
             tt21 = 1.0;
             tt28 = 1.0;
+
+            f10->setTimeTolerance(tt10);
+            f20->setTimeTolerance(tt20);
+            f21->setTimeTolerance(tt21);
+            f28->setTimeTolerance(tt28);
         };
 };
 
-TEST_F(BufferPackKeyFrameTest, empty)
+TEST_F(BufferFrameTest, empty)
 {
-    ASSERT_TRUE(pack_kf_buffer.empty());
+    ASSERT_TRUE(buffer_kf.empty());
 }
 
-TEST_F(BufferPackKeyFrameTest, add)
+TEST_F(BufferFrameTest, add)
 {
-    pack_kf_buffer.add(f10, tt10);
-    ASSERT_EQ(pack_kf_buffer.size(), (unsigned int) 1);
-    pack_kf_buffer.add(f20, tt20);
-    ASSERT_EQ(pack_kf_buffer.size(), (unsigned int) 2);
+    buffer_kf.add(10, f10);
+    ASSERT_EQ(buffer_kf.size(), (unsigned int) 1);
+    buffer_kf.add(20, f20);
+    ASSERT_EQ(buffer_kf.size(), (unsigned int) 2);
 }
 
-TEST_F(BufferPackKeyFrameTest, clear)
+TEST_F(BufferFrameTest, clear)
 {
-    pack_kf_buffer.add(f10, tt10);
-    pack_kf_buffer.add(f20, tt20);
-    ASSERT_EQ(pack_kf_buffer.size(), (unsigned int) 2);
-    pack_kf_buffer.clear();
-    ASSERT_TRUE(pack_kf_buffer.empty());
+    buffer_kf.add(10, f10);
+    buffer_kf.add(20, f20);
+    ASSERT_EQ(buffer_kf.size(), (unsigned int) 2);
+    buffer_kf.clear();
+    ASSERT_TRUE(buffer_kf.empty());
 }
 
 //TEST_F(BufferPackKeyFrameTest, print)
@@ -97,166 +102,166 @@ TEST_F(BufferPackKeyFrameTest, clear)
 //    kfpackbuffer.print();
 //}
 
-TEST_F(BufferPackKeyFrameTest, checkTimeTolerance)
+TEST_F(BufferFrameTest, doubleCheckTimeTolerance)
 {
-    pack_kf_buffer.clear();
-    pack_kf_buffer.add(f10, tt10);
-    pack_kf_buffer.add(f20, tt20);
+    buffer_kf.clear();
+    buffer_kf.add(10, f10);
+    buffer_kf.add(20, f20);
     // min time tolerance  > diff between time stamps. It should return true
-    ASSERT_TRUE(pack_kf_buffer.checkTimeTolerance(10, 20, 20, 20));
+    ASSERT_TRUE(buffer_kf.doubleCheckTimeTolerance(10, 20, 20, 20));
     // min time tolerance  < diff between time stamps. It should return true
-    ASSERT_FALSE(pack_kf_buffer.checkTimeTolerance(10, 1, 20, 20));
-}
-
-TEST_F(BufferPackKeyFrameTest, selectPack)
-{
-    // Evaluation using two packs (p1,p2)
-    // with different time tolerances (tp1,tp2)
-    // using a query pack (q) with also different time tolerances
-    // depending on these tolerances we will get one (p1) or the other (p2)
-    // packages from the buffer (res).
-    // This can be summarized in the table hereafter:
-    //
-    //  p1 p2 q | resulting pack time stamp
-    // --------------------------------
-    //  2  2  2 | nullptr
-    //  2  2  5 | nullptr
-    //  2  2  7 | nullptr
-    //  2  7  2 | nullptr
-    //  2  7  5 | 20
-    //  2  7  7 | 20
-    //  7  2  2 | nullptr
-    //  7  2  5 | nullptr
-    //  7  2  7 | 10
-    //  7  7  2 | nullptr
-    //  7  7  5 | 20
-    //  7  7  7 | 20
-
-    pack_kf_buffer.clear();
-
-    // input packages
-    std::vector<int> p1 = {2, 7}; // Pack 1 time tolerances
-    std::vector<int> p2 = {2, 7}; // Pack 2 time tolerances
-    std::vector<int> q = {2, 5, 7}; // Query pack time tolerances
-
-    // Solution matrix
-    Eigen::VectorXi res = Eigen::VectorXi::Zero(12);
-    res(4) = 20;
-    res(5) = 20;
-    res(8) = 10;
-    res(10) = 20;
-    res(11) = 20;
-
-    // test
-    for (unsigned int ip1=0;ip1<p1.size();++ip1)
-    {
-        for (unsigned int ip2=0;ip2<p2.size();++ip2)
-        {
-            pack_kf_buffer.add(f10, p1[ip1]);
-            pack_kf_buffer.add(f20, p2[ip2]);
-            for (unsigned int iq=0;iq<q.size();++iq)
-            {
-                PackKeyFramePtr packQ = pack_kf_buffer.selectPack(16, q[iq]);
-                if (packQ!=nullptr)
-                {
-                    ASSERT_EQ(packQ->key_frame->getTimeStamp(),res(ip1*6+ip2*3+iq));
-                }
-            }
-            pack_kf_buffer.clear();
-        }
-    }
+    ASSERT_FALSE(buffer_kf.doubleCheckTimeTolerance(10, 1, 20, 20));
 }
 
-TEST_F(BufferPackKeyFrameTest, selectFirstPackBefore)
-{
-    pack_kf_buffer.clear();
-
-    pack_kf_buffer.add(f10, tt10);
-    pack_kf_buffer.add(f20, tt20);
-    pack_kf_buffer.add(f21, tt21);
-
-    // input time stamps
-    std::vector<TimeStamp> q_ts = {9.5, 9.995, 10.005, 19.5, 20.5, 21.5};
-    double tt = 0.01;
-
-    // Solution matrix
-    // q_ts  |  pack
-    //=================
-    // first time
-    //-----------------
-    // 9.5      nullptr
-    // 9.995    10
-    // 10,005   10
-    // 19.5     10
-    // 20.5     10
-    // 21.5     10
-    // second time
-    //-----------------
-    // 9.5      nullptr
-    // 9.995    null
-    // 10,005   null
-    // 19.5     null
-    // 20.5     20
-    // 21.5     20
-    // third time
-    //-----------------
-    // 9.5      nullptr
-    // 9.995    null
-    // 10,005   null
-    // 19.5     null
-    // 20.5     null
-    // 21.5     21
-
-    Eigen::MatrixXd truth(3,6), res(3,6);
-    truth << 0,10,10,10,10,10,  0,0,0,0,20,20,  0,0,0,0,0,21;
-    res.setZero();
-
-    for (int i=0; i<3; i++)
-    {
-        PackKeyFramePtr packQ;
-        int j = 0;
-        for (auto ts : q_ts)
-        {
-            packQ = pack_kf_buffer.selectFirstPackBefore(ts, tt);
-            if (packQ)
-                res(i,j) = packQ->key_frame->getTimeStamp().get();
-
-            j++;
-        }
-        pack_kf_buffer.removeUpTo(packQ->key_frame->getTimeStamp());
-    }
+//TEST_F(BufferFrameTest, select)
+//{
+//    // Evaluation using two packs (p1,p2)
+//    // with different time tolerances (tp1,tp2)
+//    // using a query pack (q) with also different time tolerances
+//    // depending on these tolerances we will get one (p1) or the other (p2)
+//    // packages from the buffer (res).
+//    // This can be summarized in the table hereafter:
+//    //
+//    //  p1 p2 q | resulting pack time stamp
+//    // --------------------------------
+//    //  2  2  2 | nullptr
+//    //  2  2  5 | nullptr
+//    //  2  2  7 | nullptr
+//    //  2  7  2 | nullptr
+//    //  2  7  5 | 20
+//    //  2  7  7 | 20
+//    //  7  2  2 | nullptr
+//    //  7  2  5 | nullptr
+//    //  7  2  7 | 10
+//    //  7  7  2 | nullptr
+//    //  7  7  5 | 20
+//    //  7  7  7 | 20
+//
+//    buffer_kf.clear();
+//
+//    // input packages
+//    std::vector<int> p1 = {2, 7}; // Pack 1 time tolerances
+//    std::vector<int> p2 = {2, 7}; // Pack 2 time tolerances
+//    std::vector<int> q = {2, 5, 7}; // Query pack time tolerances
+//
+//    // Solution matrix
+//    Eigen::VectorXi res = Eigen::VectorXi::Zero(12);
+//    res(4) = 20;
+//    res(5) = 20;
+//    res(8) = 10;
+//    res(10) = 20;
+//    res(11) = 20;
+//
+//    // test
+//    for (unsigned int ip1=0;ip1<p1.size();++ip1)
+//    {
+//        for (unsigned int ip2=0;ip2<p2.size();++ip2)
+//        {
+//            buffer_kf.add(f10, p1[ip1]);
+//            buffer_kf.add(f20, p2[ip2]);
+//            for (unsigned int iq=0;iq<q.size();++iq)
+//            {
+//                PackKeyFramePtr packQ = buffer_kf.selectPack(16, q[iq]);
+//                if (packQ!=nullptr)
+//                {
+//                    ASSERT_EQ(packQ->key_frame->getTimeStamp(),res(ip1*6+ip2*3+iq));
+//                }
+//            }
+//            buffer_kf.clear();
+//        }
+//    }
+//}
 
-    ASSERT_MATRIX_APPROX(res, truth, 1e-6);
-}
+//TEST_F(BufferFrameTest, selectFirstBefore)
+//{
+//    buffer_kf.clear();
+//
+//    buffer_kf.add(10, f10);
+//    buffer_kf.add(20, f20);
+//    buffer_kf.add(21, f21);
+//
+//    // input time stamps
+//    std::vector<TimeStamp> q_ts = {9.5, 9.995, 10.005, 19.5, 20.5, 21.5};
+//    double tt = 0.01;
+//
+//    // Solution matrix
+//    // q_ts  |  pack
+//    //=================
+//    // first time
+//    //-----------------
+//    // 9.5      nullptr
+//    // 9.995    10
+//    // 10,005   10
+//    // 19.5     10
+//    // 20.5     10
+//    // 21.5     10
+//    // second time
+//    //-----------------
+//    // 9.5      nullptr
+//    // 9.995    null
+//    // 10,005   null
+//    // 19.5     null
+//    // 20.5     20
+//    // 21.5     20
+//    // third time
+//    //-----------------
+//    // 9.5      nullptr
+//    // 9.995    null
+//    // 10,005   null
+//    // 19.5     null
+//    // 20.5     null
+//    // 21.5     21
+//
+//    Eigen::MatrixXd truth(3,6), res(3,6);
+//    truth << 0,10,10,10,10,10,  0,0,0,0,20,20,  0,0,0,0,0,21;
+//    res.setZero();
+//
+//    for (int i=0; i<3; i++)
+//    {
+//        PackKeyFramePtr packQ;
+//        int j = 0;
+//        for (auto ts : q_ts)
+//        {
+//            packQ = buffer_kf.selectFirstPackBefore(ts, tt);
+//            if (packQ)
+//                res(i,j) = packQ->key_frame->getTimeStamp().get();
+//
+//            j++;
+//        }
+//        buffer_kf.removeUpTo(packQ->key_frame->getTimeStamp());
+//    }
+//
+//    ASSERT_MATRIX_APPROX(res, truth, 1e-6);
+//}
 
-TEST_F(BufferPackKeyFrameTest, removeUpTo)
+TEST_F(BufferFrameTest, removeUpTo)
 {
     // Small time tolerance for all test asserts
     double tt = 0.1;
-    pack_kf_buffer.clear();
-    pack_kf_buffer.add(f10, tt10);
-    pack_kf_buffer.add(f20, tt20);
-    pack_kf_buffer.add(f21, tt21);
+    buffer_kf.clear();
+    buffer_kf.add(10, f10);
+    buffer_kf.add(20, f20);
+    buffer_kf.add(21, f21);
 
     // it should remove f20 and f10, thus size should be 1 after removal
     // Specifically, only f21 should remain
-    PackKeyFramePtr pack20 = std::make_shared<PackKeyFrame>(f20,tt20);
-    pack_kf_buffer.removeUpTo( pack20->key_frame->getTimeStamp() );
-    ASSERT_EQ(pack_kf_buffer.size(), (unsigned int) 1);
-    ASSERT_TRUE(pack_kf_buffer.selectPack(f10->getTimeStamp(),tt)==nullptr);
-    ASSERT_TRUE(pack_kf_buffer.selectPack(f20->getTimeStamp(),tt)==nullptr);
-    ASSERT_TRUE(pack_kf_buffer.selectPack(f21->getTimeStamp(),tt)!=nullptr);
+    buffer_kf.removeUpTo( f20->getTimeStamp() );
+    ASSERT_EQ(buffer_kf.size(), (unsigned int) 1);
+    ASSERT_TRUE(buffer_kf.select(f10->getTimeStamp(),tt)==nullptr);
+    ASSERT_TRUE(buffer_kf.select(f20->getTimeStamp(),tt)==nullptr);
+    ASSERT_TRUE(buffer_kf.select(f21->getTimeStamp(),tt)!=nullptr);
 
     // Chech removal of an imprecise time stamp
     // Specifically, only f28 should remain
-    pack_kf_buffer.add(f28, tt28);
-    ASSERT_EQ(pack_kf_buffer.size(), (unsigned int) 2);
+    buffer_kf.add(28, f28);
+    ASSERT_EQ(buffer_kf.size(), (unsigned int) 2);
     FrameBasePtr f22 = std::make_shared<FrameBase>(TimeStamp(22),nullptr,nullptr,nullptr);
-    PackKeyFramePtr pack22 = std::make_shared<PackKeyFrame>(f22,5);
-    pack_kf_buffer.removeUpTo( pack22->key_frame->getTimeStamp() );
-    ASSERT_EQ(pack_kf_buffer.size(), (unsigned int) 1);
-    ASSERT_TRUE(pack_kf_buffer.selectPack(f21->getTimeStamp(),tt)==nullptr);
-    ASSERT_TRUE(pack_kf_buffer.selectPack(f28->getTimeStamp(),tt)!=nullptr);
+    f22->setTimeTolerance(5.0);
+    //    PackKeyFramePtr pack22 = std::make_shared<PackKeyFrame>(f22,5);
+    buffer_kf.removeUpTo( f22->getTimeStamp() );
+    ASSERT_EQ(buffer_kf.size(), (unsigned int) 1);
+    ASSERT_TRUE(buffer_kf.select(f21->getTimeStamp(),tt)==nullptr);
+    ASSERT_TRUE(buffer_kf.select(f28->getTimeStamp(),tt)!=nullptr);
 }
 
 int main(int argc, char **argv)