diff --git a/include/core/trajectory/trajectory_base.h b/include/core/trajectory/trajectory_base.h
index ffdcfe3231e0636c7a1d2af4949ee54383a83c8e..2b6c9cc6c645205f16e63db4d92bc146daacdc34 100644
--- a/include/core/trajectory/trajectory_base.h
+++ b/include/core/trajectory/trajectory_base.h
@@ -59,6 +59,10 @@ class TrajectoryBase : public NodeBase, public std::enable_shared_from_this<Traj
         FrameBasePtr getLastFrame();
         FrameBaseConstPtr getFirstFrame() const;
         FrameBasePtr getFirstFrame();
+        FrameBaseConstPtr getNextFrame(FrameBaseConstPtr) const;
+        FrameBasePtr getNextFrame(FrameBasePtr);
+        FrameBaseConstPtr getPreviousFrame(FrameBaseConstPtr) const;
+        FrameBasePtr getPreviousFrame(FrameBasePtr);
         TimeStamp closestTimeStampToTimeStamp(const TimeStamp& _ts) const;
         FrameBaseConstPtr closestFrameToTimeStamp(const TimeStamp& _ts) const;
         FrameBasePtr closestFrameToTimeStamp(const TimeStamp& _ts);
diff --git a/src/frame/frame_base.cpp b/src/frame/frame_base.cpp
index 07e728fd6f138717b8f205af92744630d8dbcd03..9467e1bc735328aa16217e7e47f12eb9204f68df 100644
--- a/src/frame/frame_base.cpp
+++ b/src/frame/frame_base.cpp
@@ -160,56 +160,28 @@ FrameBaseConstPtr FrameBase::getPreviousFrame() const
 {
     assert(getTrajectory() != nullptr && "This Frame is not linked to any trajectory");
 
-    auto current_frame_it = getTrajectory()->getFrameMap().find(time_stamp_);
-
-    assert(current_frame_it != getTrajectory()->getFrameMap().end() && "Frame not found in the frame map!");
-
-    if (current_frame_it == getTrajectory()->getFrameMap().begin())
-        return nullptr;
-
-    return std::prev(current_frame_it)->second;
+    return getTrajectory()->getPreviousFrame(shared_from_this());
 }
 
 FrameBasePtr FrameBase::getPreviousFrame()
 {
     assert(getTrajectory() != nullptr && "This Frame is not linked to any trajectory");
 
-    auto current_frame_it = getTrajectory()->getFrameMap().find(time_stamp_);
-
-    assert(current_frame_it != getTrajectory()->getFrameMap().end() && "Frame not found in the frame map!");
-
-    if (current_frame_it == getTrajectory()->getFrameMap().begin())
-        return nullptr;
-
-    return std::prev(current_frame_it)->second;
+    return getTrajectory()->getPreviousFrame(shared_from_this());
 }
 
 FrameBaseConstPtr FrameBase::getNextFrame() const
 {
     assert(getTrajectory() != nullptr && "This Frame is not linked to any trajectory");
 
-    auto current_frame_it = getTrajectory()->getFrameMap().find(time_stamp_);
-
-    assert(current_frame_it != getTrajectory()->getFrameMap().end() && "Frame not found in the frame map!");
-
-    if (std::next(current_frame_it) == getTrajectory()->getFrameMap().end())
-        return nullptr;
-
-    return std::next(current_frame_it)->second;
+    return getTrajectory()->getNextFrame(shared_from_this());
 }
 
 FrameBasePtr FrameBase::getNextFrame()
 {
     assert(getTrajectory() != nullptr && "This Frame is not linked to any trajectory");
 
-    auto current_frame_it = getTrajectory()->getFrameMap().find(time_stamp_);
-
-    assert(current_frame_it != getTrajectory()->getFrameMap().end() && "Frame not found in the frame map!");
-
-    if (std::next(current_frame_it) == getTrajectory()->getFrameMap().end())
-        return nullptr;
-
-    return std::next(current_frame_it)->second;
+    return getTrajectory()->getNextFrame(shared_from_this());
 }
 
 CaptureBasePtr FrameBase::addCapture(CaptureBasePtr _capt_ptr)
diff --git a/src/processor/processor_motion.cpp b/src/processor/processor_motion.cpp
index 78b61297e5c746b3ab8ac543b460c2f52904323d..ef4b1ea19c681434f3b5ce9bc1c01a9a43df8ede 100644
--- a/src/processor/processor_motion.cpp
+++ b/src/processor/processor_motion.cpp
@@ -901,8 +901,9 @@ CaptureMotionConstPtr ProcessorMotion::findCaptureContainingTimeStamp(const Time
     FrameBaseConstPtr       frame          = nullptr;
     CaptureBaseConstPtr     capture        = nullptr;
     CaptureMotionConstPtr   capture_motion = nullptr;
-    for (auto frame_rev_iter = getProblem()->getTrajectory()->getFrameMap().rbegin();
-         frame_rev_iter != getProblem()->getTrajectory()->getFrameMap().rend();
+    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    for (auto frame_rev_iter = frame_map.rbegin();
+         frame_rev_iter != frame_map.rend();
          ++frame_rev_iter)
     {
         frame   = frame_rev_iter->second;
@@ -951,8 +952,9 @@ CaptureMotionPtr ProcessorMotion::findCaptureContainingTimeStamp(const TimeStamp
     FrameBasePtr       frame          = nullptr;
     CaptureBasePtr     capture        = nullptr;
     CaptureMotionPtr   capture_motion = nullptr;
-    for (auto frame_rev_iter = getProblem()->getTrajectory()->getFrameMap().rbegin();
-         frame_rev_iter != getProblem()->getTrajectory()->getFrameMap().rend();
+    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    for (auto frame_rev_iter = frame_map.rbegin();
+         frame_rev_iter != frame_map.rend();
          ++frame_rev_iter)
     {
         frame   = frame_rev_iter->second;
diff --git a/src/trajectory/trajectory_base.cpp b/src/trajectory/trajectory_base.cpp
index c081dc0103bd0f1eb5dd25f5fe54bfa9febcb3b0..2e6748bcf9a77cf123cf2f35aff88223848eb993 100644
--- a/src/trajectory/trajectory_base.cpp
+++ b/src/trajectory/trajectory_base.cpp
@@ -49,8 +49,6 @@ FrameBasePtr TrajectoryBase::addFrame(FrameBasePtr _frame_ptr)
 
 void TrajectoryBase::removeFrame(FrameBasePtr _frame_ptr)
 {
-    // add to list
-    // frame_map_.erase(_frame_ptr);
     frame_map_.erase(_frame_ptr->getTimeStamp());
     frame_const_map_.erase(_frame_ptr->getTimeStamp());
 }
@@ -96,7 +94,7 @@ TimeStamp TrajectoryBase::closestTimeStampToTimeStamp(const TimeStamp& _ts) cons
         return upper_bound->first;
 
     // unreachable
-    return TimeStamp();
+    return TimeStamp::Invalid();
 }
 
 FrameBaseConstPtr TrajectoryBase::closestFrameToTimeStamp(const TimeStamp& _ts) const
@@ -123,10 +121,56 @@ FrameBasePtr TrajectoryBase::closestFrameToTimeStamp(const TimeStamp& _ts)
     return nullptr;
 }
 
+FrameBaseConstPtr TrajectoryBase::getNextFrame(FrameBaseConstPtr _frame) const
+{
+    auto frame_it = frame_const_map_.find(_frame->getTimeStamp());
+    WOLF_WARN_COND(frame_it == frame_const_map_.end(), "Frame not found in the frame map!");
+    
+    if (frame_it == frame_const_map_.end() or std::next(frame_it) == frame_const_map_.end())
+        return nullptr;
+
+    return std::next(frame_it)->second;
+}
+
+FrameBasePtr TrajectoryBase::getNextFrame(FrameBasePtr _frame)
+{
+    auto frame_it = frame_map_.find(_frame->getTimeStamp());
+    WOLF_WARN_COND(frame_it == frame_map_.end(), "Frame not found in the frame map!");
+    
+    if (frame_it == frame_map_.end() or std::next(frame_it) == frame_map_.end())
+        return nullptr;
+
+    return std::next(frame_it)->second;
+}
+
+FrameBaseConstPtr TrajectoryBase::getPreviousFrame(FrameBaseConstPtr _frame) const
+{
+    auto frame_it = frame_const_map_.find(_frame->getTimeStamp());
+    WOLF_WARN_COND(frame_it == frame_const_map_.end(), "Frame not found in the frame map!");
+    
+    if (frame_it == frame_const_map_.end() or frame_it == frame_const_map_.begin())
+        return nullptr;
+
+    return std::prev(frame_it)->second;
+}
+
+FrameBasePtr TrajectoryBase::getPreviousFrame(FrameBasePtr _frame)
+{
+    auto frame_it = frame_map_.find(_frame->getTimeStamp());
+    WOLF_WARN_COND(frame_it == frame_map_.end(), "Frame not found in the frame map!");
+    
+    if (frame_it == frame_map_.end() or frame_it == frame_map_.begin())
+        return nullptr;
+
+    return std::prev(frame_it)->second;
+}
+
+
 void TrajectoryBase::printHeader(int _depth, bool _metric, bool _state_blocks, bool _constr_by, std::ostream& _stream, std::string _tabs) const
 {
     _stream << _tabs << "Trajectory" << ((_depth < 1) ? (" -- " + std::to_string(getFrameMap().size()) + "F") : "")  << std::endl;
 }
+
 void TrajectoryBase::print(int _depth, bool _constr_by, bool _metric, bool _state_blocks, std::ostream& _stream, std::string _tabs) const
 {
     printHeader(_depth, _constr_by, _metric, _state_blocks, _stream, _tabs);
@@ -152,6 +196,7 @@ CheckLog TrajectoryBase::localCheck(bool _verbose, TrajectoryBaseConstPtr _trj_p
     log.assertTrue((_trj_ptr->getProblem()->getTrajectory().get() == _trj_ptr.get()), inconsistency_explanation);
     return log;
 }
+
 bool TrajectoryBase::check(CheckLog& _log, NodeBaseConstPtr _node_ptr, bool _verbose, std::ostream& _stream, std::string _tabs) const
 {
     auto trj_ptr = std::static_pointer_cast<const TrajectoryBase>(_node_ptr);
diff --git a/test/gtest_frame_base.cpp b/test/gtest_frame_base.cpp
index 26c9b3cc0fe7f5aff4eb533c93826c84cb9d0d55..de1fc08ce7f926a380aeb04d21b33ec4dddde7b7 100644
--- a/test/gtest_frame_base.cpp
+++ b/test/gtest_frame_base.cpp
@@ -140,15 +140,25 @@ TEST(FrameBase, Frames)
     intrinsics_odo.k_rot_to_rot = 1;
     auto S = SensorBase::emplace<SensorOdom2d>(P->getHardware(), Vector3d::Zero(), intrinsics_odo);
     auto F0 = FrameBase::emplace<FrameBase>(T, 0, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    P->print(2,0,0,0);
     auto F1 = FrameBase::emplace<FrameBase>(T, 1, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    P->print(2,0,0,0);
     auto F2 = FrameBase::emplace<FrameBase>(T, 2, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    P->print(2,0,0,0);
     auto F3 = FrameBase::emplace<FrameBase>(T, 3, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    P->print(2,0,0,0);
     auto F4 = FrameBase::emplace<FrameBase>(T, 4, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    P->print(2,0,0,0);
     auto F5 = FrameBase::emplace<FrameBase>(T, 5, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    P->print(2,0,0,0);
     auto F6 = FrameBase::emplace<FrameBase>(T, 6, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    P->print(2,0,0,0);
     auto F7 = FrameBase::emplace<FrameBase>(T, 7, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    P->print(2,0,0,0);
     auto F8 = FrameBase::emplace<FrameBase>(T, 8, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    P->print(2,0,0,0);
     auto F9 = FrameBase::emplace<FrameBase>(T, 9, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    P->print(2,0,0,0);
 
     // tree is now consistent
     ASSERT_TRUE(P->check(0));
@@ -170,28 +180,28 @@ TEST(FrameBase, Frames)
     ASSERT_EQ(F9, T->closestFrameToTimeStamp(9));
 
     // Next frame
-    ASSERT_EQ(F1, F0->getNextFrame());
-    ASSERT_EQ(F2, F1->getNextFrame());
-    ASSERT_EQ(F3, F2->getNextFrame());
-    ASSERT_EQ(F4, F3->getNextFrame());
-    ASSERT_EQ(F5, F4->getNextFrame());
-    ASSERT_EQ(F6, F5->getNextFrame());
-    ASSERT_EQ(F7, F6->getNextFrame());
-    ASSERT_EQ(F8, F7->getNextFrame());
-    ASSERT_EQ(F9, F8->getNextFrame());
-    ASSERT_EQ(nullptr, F9->getNextFrame());
+    EXPECT_EQ(F1->id(), F0->getNextFrame()->id());
+    EXPECT_EQ(F2->id(), F1->getNextFrame()->id());
+    EXPECT_EQ(F3->id(), F2->getNextFrame()->id());
+    EXPECT_EQ(F4->id(), F3->getNextFrame()->id());
+    EXPECT_EQ(F5->id(), F4->getNextFrame()->id());
+    EXPECT_EQ(F6->id(), F5->getNextFrame()->id());
+    EXPECT_EQ(F7->id(), F6->getNextFrame()->id());
+    EXPECT_EQ(F8->id(), F7->getNextFrame()->id());
+    EXPECT_EQ(F9->id(), F8->getNextFrame()->id());
+    EXPECT_EQ(nullptr, F9->getNextFrame());
 
     // Prev frame
-    ASSERT_EQ(nullptr, F0->getPreviousFrame());
-    ASSERT_EQ(F0, F1->getPreviousFrame());
-    ASSERT_EQ(F1, F2->getPreviousFrame());
-    ASSERT_EQ(F2, F3->getPreviousFrame());
-    ASSERT_EQ(F3, F4->getPreviousFrame());
-    ASSERT_EQ(F4, F5->getPreviousFrame());
-    ASSERT_EQ(F5, F6->getPreviousFrame());
-    ASSERT_EQ(F6, F7->getPreviousFrame());
-    ASSERT_EQ(F7, F8->getPreviousFrame());
-    ASSERT_EQ(F8, F9->getPreviousFrame());
+    EXPECT_EQ(nullptr, F0->getPreviousFrame());
+    EXPECT_EQ(F0, F1->getPreviousFrame());
+    EXPECT_EQ(F1, F2->getPreviousFrame());
+    EXPECT_EQ(F2, F3->getPreviousFrame());
+    EXPECT_EQ(F3, F4->getPreviousFrame());
+    EXPECT_EQ(F4, F5->getPreviousFrame());
+    EXPECT_EQ(F5, F6->getPreviousFrame());
+    EXPECT_EQ(F6, F7->getPreviousFrame());
+    EXPECT_EQ(F7, F8->getPreviousFrame());
+    EXPECT_EQ(F8, F9->getPreviousFrame());
 }
 
 #include "core/state_block/state_quaternion.h"
diff --git a/test/gtest_odom_2d.cpp b/test/gtest_odom_2d.cpp
index 1192372ff97072462258a560a7b64bdfc0776b14..7391619e1b59f1e3258a740ef034936e1a757d2d 100644
--- a/test/gtest_odom_2d.cpp
+++ b/test/gtest_odom_2d.cpp
@@ -399,7 +399,6 @@ TEST(Odom2d, KF_callback)
 //    std::cout << "\nIntegrating data..." << std::endl;
 
     // Capture to use as container for all incoming data
-    auto capture = std::make_shared<CaptureOdom2d>(t, sensor_odom2d, data, data_cov, nullptr);
 
     std::cout << "t: " << t << std::endl;
     for (int n=1; n<=N; n++)
@@ -407,7 +406,8 @@ TEST(Odom2d, KF_callback)
         t += dt;
 
         // re-use capture with updated timestamp
-        capture->setTimeStamp(t);
+        auto capture = std::make_shared<CaptureOdom2d>(t, sensor_odom2d, data, data_cov, nullptr);
+        //capture->setTimeStamp(t);
 
         // Processor
         capture->process();
@@ -452,7 +452,7 @@ TEST(Odom2d, KF_callback)
     processor_odom2d->keyFrameCallback(keyframe_2);
     ASSERT_TRUE(problem->check(0));
     t += dt;
-    capture = std::make_shared<CaptureOdom2d>(t, sensor_odom2d, data, data_cov, nullptr);
+    auto capture = std::make_shared<CaptureOdom2d>(t, sensor_odom2d, data, data_cov, nullptr);
     capture->process();
     ASSERT_TRUE(problem->check(0));