diff --git a/demos/demo_analytic_autodiff_factor.cpp b/demos/demo_analytic_autodiff_factor.cpp
index 0625a61b5fce5bd66d240e3ac1da89e5d584e455..29a27f5d9c1662a6e6ab7bd4c9d7c02515476c4e 100644
--- a/demos/demo_analytic_autodiff_factor.cpp
+++ b/demos/demo_analytic_autodiff_factor.cpp
@@ -295,8 +295,8 @@ int main(int argc, char** argv)
         printf("\nError opening file\n");
 
     // PRIOR
-    FrameBasePtr first_frame_autodiff = wolf_problem_autodiff->getTrajectory()->getFrameMap().front();
-    FrameBasePtr first_frame_analytic = wolf_problem_analytic->getTrajectory()->getFrameMap().front();
+    FrameBasePtr first_frame_autodiff = wolf_problem_autodiff->getTrajectory()->getFirstFrame();
+    FrameBasePtr first_frame_analytic = wolf_problem_analytic->getTrajectory()->getFirstFrame();
     CaptureFix* initial_covariance_autodiff = new CaptureFix(TimeStamp(0), new SensorBase("ABSOLUTE POSE", nullptr, nullptr, nullptr, 0), first_frame_autodiff->getState(), Eigen::Matrix3d::Identity() * 0.01);
     CaptureFix* initial_covariance_analytic = new CaptureFix(TimeStamp(0), new SensorBase("ABSOLUTE POSE", nullptr, nullptr, nullptr, 0), first_frame_analytic->getState(), Eigen::Matrix3d::Identity() * 0.01);
     first_frame_autodiff->addCapture(initial_covariance_autodiff);
diff --git a/demos/demo_wolf_imported_graph.cpp b/demos/demo_wolf_imported_graph.cpp
index 037ff094a158592c24adee70c28ddfb8cddb1d35..bc8982ca2ce696719aab35105f059639d6c72f23 100644
--- a/demos/demo_wolf_imported_graph.cpp
+++ b/demos/demo_wolf_imported_graph.cpp
@@ -322,8 +322,8 @@ int main(int argc, char** argv)
         printf("\nError opening file\n");
 
     // PRIOR
-    FrameBasePtr first_frame_full = wolf_problem_full->getTrajectory()->getFrameMap().front();
-    FrameBasePtr first_frame_prun = wolf_problem_prun->getTrajectory()->getFrameMap().front();
+    FrameBasePtr first_frame_full = wolf_problem_full->getTrajectory()->getFirstFrame();
+    FrameBasePtr first_frame_prun = wolf_problem_prun->getTrajectory()->getFirstFrame();
     CaptureFix* initial_covariance_full = new CaptureFix(TimeStamp(0), new SensorBase("ABSLOUTE POSE", nullptr, nullptr, nullptr, 0), first_frame_full->getState(), Eigen::Matrix3d::Identity() * 0.01);
     CaptureFix* initial_covariance_prun = new CaptureFix(TimeStamp(0), new SensorBase("ABSLOUTE POSE", nullptr, nullptr, nullptr, 0), first_frame_prun->getState(), Eigen::Matrix3d::Identity() * 0.01);
     first_frame_full->addCapture(initial_covariance_full);
diff --git a/demos/solver/test_iQR_wolf2.cpp b/demos/solver/test_iQR_wolf2.cpp
index 821ffefeb052acb75f81ec5d3327ebdaf04c4cd7..2e8ee85c22155f08307637e0f6f41101a9d4e8b9 100644
--- a/demos/solver/test_iQR_wolf2.cpp
+++ b/demos/solver/test_iQR_wolf2.cpp
@@ -384,13 +384,13 @@ int main(int argc, char *argv[])
     // Vehicle poses
     std::cout << "Vehicle poses..." << std::endl;
     int i = 0;
-    Eigen::VectorXd state_poses(wolf_manager_QR->getProblem()->getTrajectory()->getFrameMap().size() * 3);
-    for (auto frame_it = wolf_manager_QR->getProblem()->getTrajectory()->getFrameMap().begin(); frame_it != wolf_manager_QR->getProblem()->getTrajectory()->getFrameMap().end(); frame_it++)
+    Eigen::VectorXd state_poses(wolf_manager_QR->getProblem()->getTrajectory()->size() * 3);
+    for (auto frame : wolf_manager_QR->getProblem()->getTrajectory()->getFrameMap())
     {
         if (complex_angle)
-            state_poses.segment(i, 3) << *(*frame_it)->getP()->get(), *((*frame_it)->getP()->get() + 1), atan2(*(*frame_it)->getO()->get(), *((*frame_it)->getO()->get() + 1));
+            state_poses.segment(i, 3) << *frame->getP()->get(), *(frame->getP()->get() + 1), atan2(*frame->getO()->get(), *(frame->getO()->get() + 1));
         else
-            state_poses.segment(i, 3) << *(*frame_it)->getP()->get(), *((*frame_it)->getP()->get() + 1), *(*frame_it)->getO()->get();
+            state_poses.segment(i, 3) << *frame->getP()->get(), *(frame->getP()->get() + 1), *frame->getO()->get();
         i += 3;
     }
 
diff --git a/include/core/trajectory/trajectory_base.h b/include/core/trajectory/trajectory_base.h
index cc6a8abafc9e65062fc2a83580977b9bb4193658..becf854fa604e4b496e51cc2fcede63c7274eacc 100644
--- a/include/core/trajectory/trajectory_base.h
+++ b/include/core/trajectory/trajectory_base.h
@@ -53,6 +53,7 @@ class TrajectoryBase : public NodeBase, public std::enable_shared_from_this<Traj
         ~TrajectoryBase() override;
         
         // Frames
+        SizeEigen size() const;
         FrameConstPtrMap getFrameMap() const;
         FramePtrMap getFrameMap();
         FrameBaseConstPtr getLastFrame() const;
@@ -130,6 +131,11 @@ inline FrameBasePtr TrajectoryBase::getLastFrame()
     return frame_map_.rbegin()->second;
 }
 
+inline SizeEigen TrajectoryBase::size() const
+{
+    return frame_const_map_.size();
+}
+
 } // namespace wolf
 
 #endif
diff --git a/src/sensor/sensor_base.cpp b/src/sensor/sensor_base.cpp
index f18d627aa37dec917ecbbf77c982294724a6b589..1958a86156c773665f3f157bbb8193cec840e731 100644
--- a/src/sensor/sensor_base.cpp
+++ b/src/sensor/sensor_base.cpp
@@ -228,21 +228,20 @@ void SensorBase::setLastCapture(CaptureBasePtr cap)
 void SensorBase::updateLastCapture()
 {
     // we search for the most recent Capture of this sensor which belongs to a KeyFrame
-    if (getProblem())
-    {
-        auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    if (not getProblem())
+        return;
 
-        auto frame_rev_it = frame_map.rbegin();
-        while (frame_rev_it != frame_map.rend())
+    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    for (auto frame_rev_iter = frame_map.rbegin();
+        frame_rev_iter != frame_map.rend();
+        ++frame_rev_iter)
+    {
+        auto capture = frame_rev_iter->second->getCaptureOf(shared_from_this());
+        if (capture and not capture->isRemoving())
         {
-            auto capture = frame_rev_it->second->getCaptureOf(shared_from_this());
-            if (capture and not capture->isRemoving())
-            {
-                // found the most recent Capture made by this sensor !
-                last_capture_ = capture;
-                return;
-            }
-            frame_rev_it++;
+            // found the most recent Capture made by this sensor !
+            last_capture_ = capture;
+            return;
         }
     }
 
@@ -256,20 +255,19 @@ CaptureBaseConstPtr SensorBase::findLastCaptureBefore(const TimeStamp& _ts) cons
     if (not getProblem())
         return nullptr;
 
-    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
-
     // We iterate in reverse since we're likely to find it close to the rbegin() place.
-    auto frame_rev_it = frame_map.rbegin();
-    while (frame_rev_it != frame_map.rend())
+    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    for (auto frame_rev_iter = frame_map.rbegin();
+        frame_rev_iter != frame_map.rend();
+        ++frame_rev_iter)
     {
-        if (frame_rev_it->second->getTimeStamp() <= _ts)
+        if (frame_rev_iter->second->getTimeStamp() <= _ts)
         {
-            auto capture = frame_rev_it->second->getCaptureOf(shared_from_this());
+            auto capture = frame_rev_iter->second->getCaptureOf(shared_from_this());
             if (capture)
                 // found the most recent Capture made by this sensor !
                 return capture;
         }
-        frame_rev_it++;
     }
 
     return nullptr;
@@ -281,20 +279,19 @@ CaptureBasePtr SensorBase::findLastCaptureBefore(const TimeStamp& _ts)
     if (not getProblem())
         return nullptr;
 
-    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
-
     // We iterate in reverse since we're likely to find it close to the rbegin() place.
-    auto frame_rev_it = frame_map.rbegin();
-    while (frame_rev_it != frame_map.rend())
+    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    for (auto frame_rev_iter = frame_map.rbegin();
+        frame_rev_iter != frame_map.rend();
+        ++frame_rev_iter)
     {
-        if (frame_rev_it->second->getTimeStamp() <= _ts)
+        if (frame_rev_iter->second->getTimeStamp() <= _ts)
         {
-            auto capture = frame_rev_it->second->getCaptureOf(shared_from_this());
+            auto capture = frame_rev_iter->second->getCaptureOf(shared_from_this());
             if (capture)
                 // found the most recent Capture made by this sensor !
                 return capture;
         }
-        frame_rev_it++;
     }
 
     return nullptr;
diff --git a/src/tree_manager/tree_manager_sliding_window.cpp b/src/tree_manager/tree_manager_sliding_window.cpp
index 5d6f1345ee09674750d129e64a89a87ca081902d..1a0f44507a010891a792ce2f01af16d2233ce6cb 100644
--- a/src/tree_manager/tree_manager_sliding_window.cpp
+++ b/src/tree_manager/tree_manager_sliding_window.cpp
@@ -26,7 +26,7 @@ namespace wolf
 
 void TreeManagerSlidingWindow::keyFrameCallback(FrameBasePtr _frame)
 {
-    int n_f = getProblem()->getTrajectory()->getFrameMap().size();
+    int n_f = getProblem()->getTrajectory()->size();
     bool remove_first = (n_f > params_sw_->n_frames);
     int n_fix = (n_f >= params_sw_->n_frames ?
                  params_sw_->n_fix_first_frames :
diff --git a/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp b/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp
index 3b8800bfc4cd1de2803a9ac29b7cabf9b7a088e7..85b9c4cf7f92164f93aa1c10a46c22fa53c07ef8 100644
--- a/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp
+++ b/src/tree_manager/tree_manager_sliding_window_dual_rate.cpp
@@ -36,7 +36,7 @@ TreeManagerSlidingWindowDualRate::TreeManagerSlidingWindowDualRate(ParamsTreeMan
 
 void TreeManagerSlidingWindowDualRate::keyFrameCallback(FrameBasePtr _frame)
 {
-    int n_f = getProblem()->getTrajectory()->getFrameMap().size(); // in trajectory there are only key frames
+    int n_f = getProblem()->getTrajectory()->size(); // in trajectory there are only key frames
 
     // recent segment not complete
     if (n_f <= params_swdr_->n_frames_recent)
diff --git a/test/gtest_odom_2d.cpp b/test/gtest_odom_2d.cpp
index 7391619e1b59f1e3258a740ef034936e1a757d2d..04d838944dd50139da61d890c0171e0b41a33cb0 100644
--- a/test/gtest_odom_2d.cpp
+++ b/test/gtest_odom_2d.cpp
@@ -444,7 +444,7 @@ TEST(Odom2d, KF_callback)
     FrameBasePtr keyframe_2 = problem->emplaceFrame(t_split, x_split);
 
     // there must be 2KF and one F
-    ASSERT_EQ(problem->getTrajectory()->getFrameMap().size(), 2);
+    ASSERT_EQ(problem->getTrajectory()->size(), 2);
     // The last KF must have TS = 0.08
     ASSERT_EQ(problem->getLastFrame()->getTimeStamp().getNanoSeconds(), 80000000);
 
diff --git a/test/gtest_problem.cpp b/test/gtest_problem.cpp
index d86942de20f525f0b0995e2a5b43e18750311697..ffecd322bc2a021abf7ae01850c3a6b38369208c 100644
--- a/test/gtest_problem.cpp
+++ b/test/gtest_problem.cpp
@@ -248,7 +248,7 @@ TEST(Problem, emplaceFrame_factory)
 
 
     // check that all frames are effectively in the trajectory
-    ASSERT_EQ(P->getTrajectory()->getFrameMap().size(), (SizeStd) 3);
+    ASSERT_EQ(P->getTrajectory()->size(), (SizeStd) 3);
 
     ASSERT_EQ(f0->getStateVector().size(), 3 );
     ASSERT_EQ(f1->getStateVector().size(), 7 );
diff --git a/test/gtest_solver_ceres_multithread.cpp b/test/gtest_solver_ceres_multithread.cpp
index e883a1597c26f8418c06348a4b5b3db50cad01f4..8c5a2685c5155a9c5a5efbe28fb2ea26a7c899a6 100644
--- a/test/gtest_solver_ceres_multithread.cpp
+++ b/test/gtest_solver_ceres_multithread.cpp
@@ -84,7 +84,7 @@ TEST(SolverCeresMultithread, MultiThreadingTruncatedNotifications)
 
         ts += 1.0;
 
-        if (P->getTrajectory()->getFrameMap().size() > 10)
+        if (P->getTrajectory()->size() > 10)
             P->getTrajectory()->getFirstFrame()->remove();
 
         if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt)
diff --git a/test/gtest_solver_manager_multithread.cpp b/test/gtest_solver_manager_multithread.cpp
index 267a202f370c59e92371136fb6c6cf587f9985f0..099297e77a3e3a4d9e2663b078b50919d1a52d24 100644
--- a/test/gtest_solver_manager_multithread.cpp
+++ b/test/gtest_solver_manager_multithread.cpp
@@ -79,7 +79,7 @@ TEST(SolverManagerMultithread, MultiThreadingTruncatedNotifications)
 
         ts += 1.0;
 
-        if (P->getTrajectory()->getFrameMap().size() > 10)
+        if (P->getTrajectory()->size() > 10)
             P->getTrajectory()->getFirstFrame()->remove();
 
         if (std::chrono::duration_cast<std::chrono::duration<double>>(std::chrono::high_resolution_clock::now() - start).count() > Dt)