diff --git a/demos/mcapi_pov_estimation.cpp b/demos/mcapi_pov_estimation.cpp
index 9fdc2feebbea2a407bd5268d0be86388804e5de3..b465845c1c6b6c75d596dff953f0fd287a975768 100644
--- a/demos/mcapi_pov_estimation.cpp
+++ b/demos/mcapi_pov_estimation.cpp
@@ -475,7 +475,7 @@ int main (int argc, char **argv) {
     std::vector<Vector3d> v_ob_fbk_v; 
     //////////////////////////////////////////
 
-    unsigned int nb_kf = problem->getTrajectory()->getFrameMap().size();
+    unsigned int nb_kf = problem->getTrajectory()->size();
     for (unsigned int i=0; i < t_arr.size(); i++){
         // TimeStamp ts(t_arr[i]+dt); // works best with tsid trajectories
         TimeStamp ts(t_arr[i]);  // works best with pyb trajectories
@@ -543,9 +543,9 @@ int main (int argc, char **argv) {
         }
 
         // if new KF add 
-        // unsigned int new_kf_nb = problem->getTrajectory()->getFrameMap().size();
+        // unsigned int new_kf_nb = problem->getTrajectory()->size();
         // if (new_kf_nb > nb_kf){
-        //     auto last_kf = problem->getTrajectory()->getFrameMap().rbegin()->second;
+        //     auto last_kf = problem->getTrajectory()->getLastFrame();
         //     nb_kf = new_kf_nb;
         //     // ADD ABSOLUTE FACTOR (GPS LIKE)
         // }
@@ -664,7 +664,8 @@ int main (int argc, char **argv) {
     VectorComposite kf_state;
     CaptureBasePtr cap_imu;
     VectorComposite bi_bias_est;
-    for (auto& elt: problem->getTrajectory()->getFrameMap()){
+    auto frame_map = problem->getTrajectory()->getFrameMap();
+    for (auto& elt : frame_map){
         auto kf = elt.second;
         kf_state = kf->getState();
         cap_imu = kf->getCaptureOf(sen_imu); 
diff --git a/demos/mcapi_povcdl_estimation.cpp b/demos/mcapi_povcdl_estimation.cpp
index 82bf7d64e2c9779a17a590fc7b9a6cf2b58cded1..83111ab6ae729acabed35baccfdf4d567cd4b798 100644
--- a/demos/mcapi_povcdl_estimation.cpp
+++ b/demos/mcapi_povcdl_estimation.cpp
@@ -862,7 +862,8 @@ int main (int argc, char **argv) {
     VectorComposite bp_bias_est;
     CaptureBasePtr cap_imu;
     VectorComposite bi_bias_est;
-    for (auto& elt: problem->getTrajectory()->getFrameMap()){
+    for (auto elt : problem->getTrajectory()->getFrameMap())
+    {
         auto kf = elt.second;
         kf_state = kf->getState();
         cap_ikin = kf->getCaptureOf(sen_ikin); 
diff --git a/demos/solo_mocap_imu.cpp b/demos/solo_mocap_imu.cpp
index 19f8dfaa700dbcb7876dfd2f3587bb996d68ab1b..c196dac545478f6e934205952abd231fa5f82fc8 100644
--- a/demos/solo_mocap_imu.cpp
+++ b/demos/solo_mocap_imu.cpp
@@ -308,13 +308,14 @@ int main (int argc, char **argv) {
         CP->process();
 
         // solve every new KF
-        if (problem->getTrajectory()->getFrameMap().size() > nb_kf ){
+        if (problem->getTrajectory()->size() > nb_kf )
+        {
             std::string report = solver->solve(SolverManager::ReportVerbosity::BRIEF);
             std::cout << ts << "  ";
             std::cout << report << std::endl;
 
             // recover covariances at this point
-            auto kf_last = problem->getTrajectory()->getFrameMap().rbegin()->second;
+            auto kf_last = problem->getTrajectory()->getLastFrame();
             
             CaptureBasePtr cap_imu = kf_last->getCaptureOf(sen_imu); 
 
@@ -408,7 +409,7 @@ int main (int argc, char **argv) {
 
 
     // Compute Covariances
-    unsigned int Nkf = problem->getTrajectory()->getFrameMap().size();
+    unsigned int Nkf = problem->getTrajectory()->size();
     double* tkf_carr  = new double[1*Nkf];
     double* Qp_carr  = new double[3*Nkf];
     double* Qo_carr  = new double[3*Nkf];
@@ -422,8 +423,9 @@ int main (int argc, char **argv) {
     double* fac_imu_err_carr = new double[9*Nkf];
     double* fac_pose_err_carr  = new double[6*Nkf];
     int i = 0;
-    for (auto& elt: problem->getTrajectory()->getFrameMap()){
-        std::cout << "Traj " << i << "/" << problem->getTrajectory()->getFrameMap().size() << std::endl;
+    for (auto elt: problem->getTrajectory()->getFrameMap())
+    {
+        std::cout << "Traj " << i << "/" << problem->getTrajectory()->size() << std::endl;
         tkf_carr[i] = elt.first.get();
         auto kf = elt.second;
         VectorComposite kf_state = kf->getState();
diff --git a/demos/solo_real_pov_estimation.cpp b/demos/solo_real_pov_estimation.cpp
index fbae4d51a0f97f30aa05c5329ca754986ce72cb2..411597d87ae0261197d424184737716cf9195500 100644
--- a/demos/solo_real_pov_estimation.cpp
+++ b/demos/solo_real_pov_estimation.cpp
@@ -495,11 +495,11 @@ int main (int argc, char **argv) {
         // }
 
         // solve every new KF
-        if (problem->getTrajectory()->getFrameMap().size() > nb_kf ){
+        if (problem->getTrajectory()->size() > nb_kf ){
             std::string report = solver->solve(SolverManager::ReportVerbosity::BRIEF);
             std::cout << ts << "  ";
             std::cout << report << std::endl;
-            nb_kf = problem->getTrajectory()->getFrameMap().size();
+            nb_kf = problem->getTrajectory()->size();
         }
 
         // Store current state estimation
@@ -575,7 +575,7 @@ int main (int argc, char **argv) {
 
 
     // Compute Covariances
-    unsigned int Nkf = problem->getTrajectory()->getFrameMap().size();
+    unsigned int Nkf = problem->getTrajectory()->size();
     double* tkf_carr  = new double[1*Nkf];
     double* Qp_carr  = new double[3*Nkf];
     double* Qo_carr  = new double[3*Nkf];
@@ -586,8 +586,9 @@ int main (int argc, char **argv) {
     double* fac_imu_err_carr = new double[9*Nkf];
     double* fac_pose_err_carr  = new double[6*Nkf];
     int i = 0;
-    for (auto& elt: problem->getTrajectory()->getFrameMap()){
-        std::cout << "Traj " << i << "/" << problem->getTrajectory()->getFrameMap().size() << std::endl;
+    for (auto elt: problem->getTrajectory()->getFrameMap())
+    {
+        std::cout << "Traj " << i << "/" << problem->getTrajectory()->size() << std::endl;
         tkf_carr[i] = elt.first.get();
         auto kf = elt.second;
         VectorComposite kf_state = kf->getState();
diff --git a/demos/solo_real_povcdl_estimation.cpp b/demos/solo_real_povcdl_estimation.cpp
index 0e4e6a4a6ce958563c3b4e84dfe3f31feb42f464..aee06204b9d7dc68151c79f7971f090003205c88 100644
--- a/demos/solo_real_povcdl_estimation.cpp
+++ b/demos/solo_real_povcdl_estimation.cpp
@@ -584,12 +584,12 @@ int main (int argc, char **argv) {
 
 
         // add zero vel artificial factor
-        if (problem->getTrajectory()->getFrameMap().size() > nb_kf){
-            auto kf_pair = problem->getTrajectory()->getFrameMap().rbegin();
-            std::cout << "New KF " << kf_pair->first << std::endl;
-            auto kf = kf_pair->second;
+        if (problem->getTrajectory()->size() > nb_kf)
+        {
+            auto kf = problem->getTrajectory()->getLastFrame();
+            std::cout << "New KF " << kf->getTimeStamp() << std::endl;
 
-            // CaptureBasePtr capV0 = CaptureBase::emplace<CaptureBase>(kf, "Vel0", kf_pair->first);
+            // CaptureBasePtr capV0 = CaptureBase::emplace<CaptureBase>(kf, "Vel0", kf->getTimeStamp());
             // FeatureBasePtr featV0 = FeatureBase::emplace<FeatureBase>(capV0, "Vel0", Vector3d::Zero(), 0.00001*Matrix3d::Ones());
             // FactorBasePtr facV0 = FactorBase::emplace<FactorBlockAbsolute>(featV0, featV0, kf->getV(), nullptr, false);
 
@@ -728,7 +728,8 @@ int main (int argc, char **argv) {
     VectorComposite bp_bias_est;
     CaptureBasePtr cap_imu;
     VectorComposite bi_bias_est;
-    for (auto& elt: problem->getTrajectory()->getFrameMap()){
+    for (auto elt: problem->getTrajectory()->getFrameMap())
+    {
         auto kf = elt.second;
         kf_state = kf->getState();
         cap_ikin = kf->getCaptureOf(sen_ikin); 
diff --git a/include/bodydynamics/capture/capture_force_torque_preint.h b/include/bodydynamics/capture/capture_force_torque_preint.h
index 12f4eb58c9e2a8b8d89e7923bea393e93bae48a5..81db7bf05f90fc9048a907253b477b73f8c748a5 100644
--- a/include/bodydynamics/capture/capture_force_torque_preint.h
+++ b/include/bodydynamics/capture/capture_force_torque_preint.h
@@ -62,7 +62,9 @@ class CaptureForceTorquePreint : public CaptureMotion
     
         ~CaptureForceTorquePreint() override;
 
-        CaptureBasePtr getIkinCaptureOther(){ return cap_ikin_other_; }
+        CaptureBaseConstPtr getIkinCaptureOther() const { return cap_ikin_other_;}
+        CaptureBasePtr getIkinCaptureOther(){ return cap_ikin_other_;}
+        CaptureBaseConstPtr getGyroCaptureOther() const { return cap_gyro_other_;}
         CaptureBasePtr getGyroCaptureOther(){ return cap_gyro_other_;}
 
     private:
diff --git a/include/bodydynamics/factor/factor_force_torque.h b/include/bodydynamics/factor/factor_force_torque.h
index 85d74de654cfd2976eae06ab640086fec74870aa..958398a325c0e6c77fd5b70a2cabb4497fec746b 100644
--- a/include/bodydynamics/factor/factor_force_torque.h
+++ b/include/bodydynamics/factor/factor_force_torque.h
@@ -79,7 +79,7 @@ class FactorForceTorque : public FactorAutodiff<FactorForceTorque, 9, 3,3,3, 3,3
             const T* const _qkm,
             T* _res) const;
 
-        void computeJac(const FeatureForceTorquePtr& _feat, 
+        void computeJac(const FeatureForceTorqueConstPtr& _feat, 
                         const double& _mass, 
                         const double& _dt, 
                         const Eigen::VectorXd& _bp, 
@@ -149,25 +149,24 @@ void FactorForceTorque::retrieveMeasurementCovariance(const FeatureForceTorquePt
 }
 
 
-void FactorForceTorque::computeJac(const FeatureForceTorquePtr& _feat, 
+void FactorForceTorque::computeJac(const FeatureForceTorqueConstPtr& _feat, 
                                    const double& _mass, 
                                    const double& _dt,  
                                    const Eigen::VectorXd& _bp, 
                                    Eigen::Matrix<double, 9, 15>& _J_ny_nz) const
 {
     _J_ny_nz.setZero();
-    FeatureForceTorquePtr feat = std::static_pointer_cast<FeatureForceTorque>(_feat);
 
     // Measurements retrieval
-    Eigen::Map<const Eigen::Vector3d>    f1  (feat->getForcesMeas().data());
-    Eigen::Map<const Eigen::Vector3d>    f2  (feat->getForcesMeas().data()    + 3  );
-    Eigen::Map<const Eigen::Vector3d>    tau1(feat->getTorquesMeas().data());
-    Eigen::Map<const Eigen::Vector3d>    tau2(feat->getTorquesMeas().data()   + 3 );
-    Eigen::Map<const Eigen::Vector3d>    pbl1(feat->getKinMeas().data());
-    Eigen::Map<const Eigen::Vector3d>    pbl2(feat->getKinMeas().data()       + 3 );
-    Eigen::Map<const Eigen::Quaterniond> bql1(feat->getKinMeas().data()       + 6);
-    Eigen::Map<const Eigen::Quaterniond> bql2(feat->getKinMeas().data()   + 10);
-    Eigen::Map<const Eigen::Vector3d>    pbc (feat->getPbcMeas().data());
+    Eigen::Map<const Eigen::Vector3d>    f1  (_feat->getForcesMeas().data());
+    Eigen::Map<const Eigen::Vector3d>    f2  (_feat->getForcesMeas().data()    + 3  );
+    Eigen::Map<const Eigen::Vector3d>    tau1(_feat->getTorquesMeas().data());
+    Eigen::Map<const Eigen::Vector3d>    tau2(_feat->getTorquesMeas().data()   + 3 );
+    Eigen::Map<const Eigen::Vector3d>    pbl1(_feat->getKinMeas().data());
+    Eigen::Map<const Eigen::Vector3d>    pbl2(_feat->getKinMeas().data()       + 3 );
+    Eigen::Map<const Eigen::Quaterniond> bql1(_feat->getKinMeas().data()       + 6);
+    Eigen::Map<const Eigen::Quaterniond> bql2(_feat->getKinMeas().data()   + 10);
+    Eigen::Map<const Eigen::Vector3d>    pbc (_feat->getPbcMeas().data());
 
     Eigen::Matrix3d bRl1 = q2R(bql1);
     Eigen::Matrix3d bRl2 = q2R(bql2);
@@ -226,7 +225,7 @@ bool FactorForceTorque::operator () (
             const T* const _qkm,
             T* _res) const   
 {
-    FeatureForceTorquePtr feat = std::static_pointer_cast<FeatureForceTorque>(getFeature());
+    auto feat = std::static_pointer_cast<const FeatureForceTorque>(getFeature());
 
     // State variables instanciation
     Eigen::Map<const Eigen::Matrix<T,3,1> > ck(_ck);
diff --git a/include/bodydynamics/factor/factor_inertial_kinematics.h b/include/bodydynamics/factor/factor_inertial_kinematics.h
index c0b36d22bdd65b63b575e6d80863ea2eea978405..ff824e20b8673da4d6de79afa06e80da6cd2607e 100644
--- a/include/bodydynamics/factor/factor_inertial_kinematics.h
+++ b/include/bodydynamics/factor/factor_inertial_kinematics.h
@@ -158,7 +158,7 @@ bool FactorInertialKinematics::operator () (
 
     Map<Matrix<T,9,1> > res(_res);
 
-    FeatureInertialKinematicsPtr feat = std::static_pointer_cast<FeatureInertialKinematics>(getFeature());
+    auto feat = std::static_pointer_cast<const FeatureInertialKinematics>(getFeature());
 
     // Measurements retrieval
     Map<const Vector3d> pBC_m(getMeasurement().data()    );      // B_p_BC
diff --git a/include/bodydynamics/feature/feature_force_torque.h b/include/bodydynamics/feature/feature_force_torque.h
index bbe2fda19d7fcdbde4e88aa564efc3547a6293ef..14594821f3171f7628199e4b3b5f76026f4f7f63 100644
--- a/include/bodydynamics/feature/feature_force_torque.h
+++ b/include/bodydynamics/feature/feature_force_torque.h
@@ -50,19 +50,19 @@ class FeatureForceTorque : public FeatureBase
 
         ~FeatureForceTorque() override;
 
-        const double & getDt(){return dt_;}
-        const double & getMass(){return mass_;}
+        const double & getDt() const {return dt_;}
+        const double & getMass() const {return mass_;}
         void setDt(const double & _dt){dt_ = _dt;}
         void setMass(const double & _mass){mass_ = _mass;}
 
-        const Eigen::Vector6d& getForcesMeas(){return forces_meas_;}
-        const Eigen::Vector6d& getTorquesMeas(){return torques_meas_;}
-        const Eigen::Vector3d& getPbcMeas(){return pbc_meas_;}
-        const Eigen::Matrix<double,14,1>& getKinMeas(){return kin_meas_;}
-        const Eigen::Matrix6d& getCovForcesMeas(){return cov_forces_meas_;}
-        const Eigen::Matrix6d& getCovTorquesMeas(){return cov_torques_meas_;}
-        const Eigen::Matrix3d& getCovPbcMeas(){return cov_pbc_meas_;}
-        const Eigen::Matrix<double,14,14>& getCovKinMeas(){return cov_kin_meas_;}
+        const Eigen::Vector6d& getForcesMeas() const {return forces_meas_;}
+        const Eigen::Vector6d& getTorquesMeas() const {return torques_meas_;}
+        const Eigen::Vector3d& getPbcMeas() const {return pbc_meas_;}
+        const Eigen::Matrix<double,14,1>& getKinMeas() const {return kin_meas_;}
+        const Eigen::Matrix6d& getCovForcesMeas() const {return cov_forces_meas_;}
+        const Eigen::Matrix6d& getCovTorquesMeas() const {return cov_torques_meas_;}
+        const Eigen::Matrix3d& getCovPbcMeas() const {return cov_pbc_meas_;}
+        const Eigen::Matrix<double,14,14>& getCovKinMeas() const {return cov_kin_meas_;}
 
         void setForcesMeas(const Eigen::Vector6d& _forces_meas){forces_meas_ = _forces_meas;}
         void setTorquesMeas(const Eigen::Vector6d& _torques_meas){torques_meas_ = _torques_meas;}
diff --git a/include/bodydynamics/feature/feature_inertial_kinematics.h b/include/bodydynamics/feature/feature_inertial_kinematics.h
index bb9588ffbc24e78162bedddc5df7a914f7d55c63..98f03fc3e948e1c5feeaf399e3bdf10297a2b1a6 100644
--- a/include/bodydynamics/feature/feature_inertial_kinematics.h
+++ b/include/bodydynamics/feature/feature_inertial_kinematics.h
@@ -43,8 +43,8 @@ class FeatureInertialKinematics : public FeatureBase
         ~FeatureInertialKinematics() override = default;
 
 
-        const Eigen::Matrix3d & getBIq(){return BIq_;}
-        const Eigen::Vector3d & getBLcm(){return BLcm_;}
+        const Eigen::Matrix3d & getBIq() const {return BIq_;}
+        const Eigen::Vector3d & getBLcm() const {return BLcm_;}
         void setBIq(const Eigen::Matrix3d & _BIq){BIq_ = _BIq;}
         void setBLcm(const Eigen::Vector3d & _BLcm){BLcm_ = _BLcm;}
 
diff --git a/include/bodydynamics/processor/processor_force_torque_preint.h b/include/bodydynamics/processor/processor_force_torque_preint.h
index c834f71b8e1fc42b2d9d8e7dfd1ee43157627d43..6cd089107cfebd55fad2a51ff1b6cf5eddb0b036 100644
--- a/include/bodydynamics/processor/processor_force_torque_preint.h
+++ b/include/bodydynamics/processor/processor_force_torque_preint.h
@@ -92,7 +92,7 @@ class ProcessorForceTorquePreint : public ProcessorMotion{
         Eigen::VectorXd deltaZero() const override;
         Eigen::VectorXd correctDelta(const Eigen::VectorXd& delta_preint,
                                              const Eigen::VectorXd& delta_step) const override;
-        VectorXd getCalibration (const CaptureBasePtr _capture = nullptr) const override;
+        VectorXd getCalibration (const CaptureBaseConstPtr _capture = nullptr) const override;
         void setCalibration(const CaptureBasePtr _capture, const VectorXd& _calibration) override;
 
         bool voteForKeyFrame() const override;
diff --git a/src/processor/processor_force_torque_preint.cpp b/src/processor/processor_force_torque_preint.cpp
index 994b91a49c911dc5835b1d642ead04d2f5ca0223..1b84f786077a0f65ee3cc944bf8ebe4f54511499 100644
--- a/src/processor/processor_force_torque_preint.cpp
+++ b/src/processor/processor_force_torque_preint.cpp
@@ -136,14 +136,14 @@ Eigen::VectorXd ProcessorForceTorquePreint::correctDelta (const Eigen::VectorXd&
     return bodydynamics::plus(delta_preint, delta_step);
 }
 
-VectorXd ProcessorForceTorquePreint::getCalibration (const CaptureBasePtr _capture) const
+VectorXd ProcessorForceTorquePreint::getCalibration (const CaptureBaseConstPtr _capture) const
 {
 
     VectorXd bias_vec(6);
 
     if (_capture) // access from capture is quicker
     {
-        CaptureForceTorquePreintPtr cap_ft(std::static_pointer_cast<CaptureForceTorquePreint>(_capture));
+        auto cap_ft(std::static_pointer_cast<const CaptureForceTorquePreint>(_capture));
 
         // get calib part from Ikin capture
         bias_vec.segment<3>(0) = cap_ft->getIkinCaptureOther()->getSensorIntrinsic()->getState();
@@ -211,7 +211,7 @@ void ProcessorForceTorquePreint::computeCurrentDelta(
     bodydynamics::debiasData(_data, _calib, nbc_, dimc_, body, jac_body_bias);
 
     MatrixXd jac_delta_body(12,data_size_-nbc_);
-    bodydynamics::body2delta(body, _dt, std::static_pointer_cast<SensorForceTorque>(getSensor())->getMass(), 
+    bodydynamics::body2delta(body, _dt, std::static_pointer_cast<const SensorForceTorque>(getSensor())->getMass(), 
                              nbc_, dimc_,
                              _delta, jac_delta_body); // Jacobians tested in bodydynamics_tools
 
diff --git a/src/processor/processor_inertial_kinematics.cpp b/src/processor/processor_inertial_kinematics.cpp
index 46eb8f944900d0eff9596ad239351d19ec74f1a3..360ef7d654952c17a18dce633f53f9177e79e61d 100644
--- a/src/processor/processor_inertial_kinematics.cpp
+++ b/src/processor/processor_inertial_kinematics.cpp
@@ -68,7 +68,6 @@ inline void ProcessorInertialKinematics::processCapture(CaptureBasePtr _capture)
     // done AFTER processCapture)
 
     // 1. get corresponding KF
-    FrameBasePtr kf;
     auto buffer_frame_it = buffer_frame_.getContainer().begin();
     auto buffer_capture_it = buffer_capture_.getContainer().begin();