diff --git a/src/frame/frame_base.cpp b/src/frame/frame_base.cpp
index cbf11f07e9d8e6173ed3812c1152834fb275cf75..549b1435222c8cda2c0615a54632d6c8c5b63840 100644
--- a/src/frame/frame_base.cpp
+++ b/src/frame/frame_base.cpp
@@ -141,43 +141,28 @@ FrameBasePtr FrameBase::getPreviousFrame() const
 {
     assert(getTrajectory() != nullptr && "This Frame is not linked to any trajectory");
 
-    //look for the position of this node in the upper list (frame list of trajectory)
-    for (auto f_it = getTrajectory()->rbegin(); f_it != getTrajectory()->rend(); f_it++ )
-    {
-        if ( this->frame_id_ == (*f_it)->id() )
-        {
-        	f_it++;
-        	if (f_it != getTrajectory()->rend())
-            {
-                return *f_it;
-            }
-        	else
-        	{
-        	    return nullptr;
-        	}
-        }
-    }
-    return nullptr;
+    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;
 }
 
 FrameBasePtr FrameBase::getNextFrame() const
 {
-    //std::cout << "finding next frame of " << this->frame_id_ << std::endl;
-	auto f_it = getTrajectory()->rbegin();
-	f_it++; //starting from second last frame
+    assert(getTrajectory() != nullptr && "This Frame is not linked to any trajectory");
 
-    //look for the position of this node in the frame list of trajectory
-    while (f_it != getTrajectory()->rend())
-    {
-        if ( this->frame_id_ == (*f_it)->id())
-        {
-        	f_it--;
-			return *f_it;
-        }
-    	f_it++;
-    }
-    std::cout << "next frame not found!" << std::endl;
-    return nullptr;
+    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;
 }
 
 CaptureBasePtr FrameBase::addCapture(CaptureBasePtr _capt_ptr)
diff --git a/test/gtest_frame_base.cpp b/test/gtest_frame_base.cpp
index fc170fe3589bc43c5816b04af4419dcab510c671..790ac4b32b1802dc2ae68d2b8d59eb79db971aee 100644
--- a/test/gtest_frame_base.cpp
+++ b/test/gtest_frame_base.cpp
@@ -80,9 +80,6 @@ TEST(FrameBase, LinksToTree)
     //TODO: WARNING! I dropped this comprovations since the emplacing operation is now atomic.
     ASSERT_FALSE(F2->getConstrainedByList().empty());
 
-    // tree is inconsistent since we are missing the constrained_by link
-    // ASSERT_FALSE(P->check(0));
-
     // tree is now consistent
     ASSERT_TRUE(P->check(0));
 
@@ -113,6 +110,70 @@ TEST(FrameBase, LinksToTree)
     ASSERT_TRUE(F1->isFixed());
 }
 
+TEST(FrameBase, Frames)
+{
+    // Problem with 10 frames
+    ProblemPtr P = Problem::create("PO", 2);
+    TrajectoryBasePtr T = P->getTrajectory();
+    ParamsSensorOdom2d intrinsics_odo;
+    intrinsics_odo.k_disp_to_disp = 1;
+    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));
+    auto F1 = FrameBase::emplace<FrameBase>(T, 1, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    auto F2 = FrameBase::emplace<FrameBase>(T, 2, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    auto F3 = FrameBase::emplace<FrameBase>(T, 3, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    auto F4 = FrameBase::emplace<FrameBase>(T, 4, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    auto F5 = FrameBase::emplace<FrameBase>(T, 5, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    auto F6 = FrameBase::emplace<FrameBase>(T, 6, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    auto F7 = FrameBase::emplace<FrameBase>(T, 7, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    auto F8 = FrameBase::emplace<FrameBase>(T, 8, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+    auto F9 = FrameBase::emplace<FrameBase>(T, 9, make_shared<StateBlock>(2), make_shared<StateBlock>(1));
+
+    // tree is now consistent
+    ASSERT_TRUE(P->check(0));
+
+    // First and last
+    ASSERT_EQ(F0, T->getFirstFrame());
+    ASSERT_EQ(F9, T->getLastFrame());
+
+    // Find by timestamp
+    ASSERT_EQ(F0, T->closestFrameToTimeStamp(0));
+    ASSERT_EQ(F1, T->closestFrameToTimeStamp(1));
+    ASSERT_EQ(F2, T->closestFrameToTimeStamp(2));
+    ASSERT_EQ(F3, T->closestFrameToTimeStamp(3));
+    ASSERT_EQ(F4, T->closestFrameToTimeStamp(4));
+    ASSERT_EQ(F5, T->closestFrameToTimeStamp(5));
+    ASSERT_EQ(F6, T->closestFrameToTimeStamp(6));
+    ASSERT_EQ(F7, T->closestFrameToTimeStamp(7));
+    ASSERT_EQ(F8, T->closestFrameToTimeStamp(8));
+    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());
+
+    // 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());
+}
+
 #include "core/state_block/state_quaternion.h"
 TEST(FrameBase, GetSetState)
 {