diff --git a/CMakeLists.txt b/CMakeLists.txt
index 89e8ce8771d7987d3a40afbd1f7a78a6f8aecc7a..c31312a7033c003e32aa91b03f704f41c283441d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -118,7 +118,6 @@ SET(HDRS_FACTOR
   include/gnss/factor/factor_gnss_fix_2d.h
   include/gnss/factor/factor_gnss_fix_3d.h
   include/gnss/factor/factor_gnss_pseudo_range.h
-  include/gnss/factor/factor_gnss_single_diff_2d.h
   include/gnss/factor/factor_gnss_tdcp.h
   include/gnss/factor/factor_gnss_tdcp_2d.h
   include/gnss/factor/factor_gnss_tdcp_3d.h
diff --git a/include/gnss/capture/capture_gnss.h b/include/gnss/capture/capture_gnss.h
index 1a8980534f1e38c6aa0b6479369fbe4db77c078f..ea0d900399a23860bcb53e3615af830834008d77 100644
--- a/include/gnss/capture/capture_gnss.h
+++ b/include/gnss/capture/capture_gnss.h
@@ -43,25 +43,43 @@ class CaptureGnss : public CaptureBase
       CaptureGnss(const TimeStamp& _ts, SensorBasePtr _sensor_ptr, GnssUtils::SnapshotPtr _snapshot);
       ~CaptureGnss() override;
 
-      GnssUtils::SnapshotPtr getSnapshot() const;
-      GnssUtils::ObservationsPtr getObservations() const;
-      GnssUtils::NavigationPtr getNavigation() const;
-      GnssUtils::Satellites& getSatellites();
+      GnssUtils::SnapshotConstPtr getSnapshot() const;
+      GnssUtils::SnapshotPtr getSnapshot();
+      GnssUtils::ObservationsConstPtr getObservations() const;
+      GnssUtils::ObservationsPtr getObservations();
+      GnssUtils::NavigationConstPtr getNavigation() const;
+      GnssUtils::NavigationPtr getNavigation();
       const GnssUtils::Satellites& getSatellites() const;
+      GnssUtils::Satellites& getSatellites();
 
 };
 
-inline GnssUtils::SnapshotPtr CaptureGnss::getSnapshot() const
+inline GnssUtils::SnapshotConstPtr CaptureGnss::getSnapshot() const
 {
   return snapshot_;
 }
 
-inline GnssUtils::ObservationsPtr CaptureGnss::getObservations() const
+inline GnssUtils::SnapshotPtr CaptureGnss::getSnapshot()
+{
+  return snapshot_;
+}
+
+inline GnssUtils::ObservationsConstPtr CaptureGnss::getObservations() const
+{
+  return snapshot_->getObservations();
+}
+
+inline GnssUtils::ObservationsPtr CaptureGnss::getObservations()
 {
   return snapshot_->getObservations();
 }
 
-inline GnssUtils::NavigationPtr CaptureGnss::getNavigation() const
+inline GnssUtils::NavigationConstPtr CaptureGnss::getNavigation() const
+{
+  return snapshot_->getNavigation();
+}
+
+inline GnssUtils::NavigationPtr CaptureGnss::getNavigation()
 {
   return snapshot_->getNavigation();
 }
diff --git a/include/gnss/capture/capture_gnss_tdcp.h b/include/gnss/capture/capture_gnss_tdcp.h
index 73af63d7ccc75ce4ec45616638c60a54b43e722f..73dce5e723f89ecbf2ef88dc0fd13e7db692a944 100644
--- a/include/gnss/capture/capture_gnss_tdcp.h
+++ b/include/gnss/capture/capture_gnss_tdcp.h
@@ -56,7 +56,8 @@ class CaptureGnssTdcp : public CaptureBase
         const Eigen::Vector3d& getData() const;
         const Eigen::Matrix3d& getDataCovariance() const;
         void getDataAndCovariance(Eigen::Vector3d& data, Eigen::Matrix3d& data_cov) const;
-        FrameBasePtr getOriginFrame() const;
+        FrameBaseConstPtr getOriginFrame() const;
+        FrameBasePtr getOriginFrame();
         const TimeStamp& getGpsTimeStamp() const;
         void setGpsTimeStamp(const TimeStamp &_ts_GPST);
 };
@@ -77,12 +78,17 @@ inline void CaptureGnssTdcp::getDataAndCovariance(Eigen::Vector3d& data, Eigen::
     data_cov = data_covariance_;
 }
 
-inline FrameBasePtr CaptureGnssTdcp::getOriginFrame() const
+inline FrameBaseConstPtr CaptureGnssTdcp::getOriginFrame() const
 {
     return origin_frame_ptr_;
 }
 
-inline const wolf::TimeStamp& CaptureGnssTdcp::getGpsTimeStamp() const
+inline FrameBasePtr CaptureGnssTdcp::getOriginFrame()
+{
+    return origin_frame_ptr_;
+}
+
+inline const TimeStamp& CaptureGnssTdcp::getGpsTimeStamp() const
 {
     return ts_GPST_;
 }
diff --git a/include/gnss/factor/factor_gnss_single_diff_2d.h b/include/gnss/factor/factor_gnss_single_diff_2d.h
deleted file mode 100644
index f85495b058a4c7a33f8982f85f38d5b1e99c5b0b..0000000000000000000000000000000000000000
--- a/include/gnss/factor/factor_gnss_single_diff_2d.h
+++ /dev/null
@@ -1,126 +0,0 @@
-//--------LICENSE_START--------
-//
-// Copyright (C) 2020,2021,2022 Institut de Robòtica i Informàtica Industrial, CSIC-UPC.
-// Authors: Joan Solà Ortega (jsola@iri.upc.edu)
-// All rights reserved.
-//
-// This file is part of WOLF
-// WOLF is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with this program.  If not, see <http://www.gnu.org/licenses/>.
-//
-//--------LICENSE_END--------
-
-#ifndef FACTOR_GNSS_SINGLE_DIFF_2d_H_
-#define FACTOR_GNSS_SINGLE_DIFF_2d_H_
-
-//Wolf includes
-#include "core/common/wolf.h"
-#include "core/factor/factor_autodiff.h"
-#include "core/frame/frame_base.h"
-#include "gnss/sensor/sensor_gnss.h"
-
-namespace wolf {
-    
-WOLF_PTR_TYPEDEFS(FactorGnssSingleDiff2d);
-
-class FactorGnssSingleDiff2d : public FactorAutodiff<FactorGnssSingleDiff2d, 3, 2, 1, 2, 1, 3, 1, 1, 1>
-{
-    protected:
-        SensorGnssPtr sensor_gnss_ptr_;
-
-    public:
-
-        FactorGnssSingleDiff2d(FeatureBasePtr& _ftr_ptr, const FrameBasePtr& _frame_other_ptr, const SensorGnssPtr& _sensor_gnss_ptr, const ProcessorBasePtr& _processor_ptr, bool _apply_loss_function, FactorStatus _status = FAC_ACTIVE) :
-            FactorAutodiff<FactorGnssSingleDiff2d, 3, 2, 1, 2, 1, 3, 1, 1, 1>("GNSS SINGLE DIFFERENCES 2d",
-                                                                              TOP_GEOM,
-                                                                              _ftr_ptr,
-                                                                              _frame_other_ptr,
-                                                                              nullptr,
-                                                                              nullptr,
-                                                                              nullptr,
-                                                                              _processor_ptr,
-                                                                              _apply_loss_function,
-                                                                              _status,
-                                                                              _frame_other_ptr->getP(),
-                                                                              _frame_other_ptr->getO(),
-                                                                              _ftr_ptr->getFrame()->getP(),
-                                                                              _ftr_ptr->getFrame()->getO(),
-                                                                              _sensor_gnss_ptr->getP(),
-                                                                              _sensor_gnss_ptr->getEnuMapRoll(),
-                                                                              _sensor_gnss_ptr->getEnuMapPitch(),
-                                                                              _sensor_gnss_ptr->getEnuMapYaw()),
-            sensor_gnss_ptr_(_sensor_gnss_ptr)
-        {
-            WOLF_WARN_COND(!sensor_gnss_ptr_->isEnuDefined(), "Creating a GNSS SingleDiff 2d factor without initializing ENU");
-        }
-
-        virtual ~FactorGnssSingleDiff2d() = default;
-
-        template<typename T>
-        bool operator ()(const T* const _x1,
-                         const T* const _o1,
-                         const T* const _x2,
-                         const T* const _o2,
-                         const T* const _x_antena,
-                         const T* const _roll_ENU_MAP,
-                         const T* const _pitch_ENU_MAP,
-                         const T* const _yaw_ENU_MAP,
-                         T* _residuals) const;
-
-};
-
-template<typename T>
-inline bool FactorGnssSingleDiff2d::operator ()(const T* const _x1,
-                                                const T* const _o1,
-                                                const T* const _x2,
-                                                const T* const _o2,
-                                                const T* const _x_antena,
-                                                const T* const _roll_ENU_MAP,
-                                                const T* const _pitch_ENU_MAP,
-                                                const T* const _yaw_ENU_MAP,
-                                                T* _residuals) const
-{
-    Eigen::Map<const Eigen::Matrix<T,2,1> > t_MAP_BASE1(_x1);
-    Eigen::Matrix<T,2,2> R_MAP_BASE1 = Eigen::Rotation2D<T>(_o1[0]).matrix();
-    Eigen::Map<const Eigen::Matrix<T,2,1> > t_MAP_BASE2(_x2);
-    Eigen::Matrix<T,2,2> R_MAP_BASE2 = Eigen::Rotation2D<T>(_o2[0]).matrix();
-    Eigen::Map<const Eigen::Matrix<T,3,1> > t_BASE_ANTENA(_x_antena);
-    Eigen::Map<Eigen::Matrix<T,3,1> > residuals_ECEF(_residuals);
-
-    Eigen::Matrix<T,3,3> R_ENU_ECEF = sensor_gnss_ptr_->getREnuEcef().cast<T>();
-    Eigen::Matrix<T,2,3> R_MAP_ENU = sensor_gnss_ptr_->computeREnuMap(_roll_ENU_MAP[0], _pitch_ENU_MAP[0], _yaw_ENU_MAP[0]).transpose().topRows(2);
-
-    // Transform ECEF 3d SingleDiff Feature to 2d SingleDiff in Map coordinates (removing z)
-    Eigen::Matrix<T,2,1> measured_diff_2d_MAP = R_MAP_ENU * (R_ENU_ECEF * getMeasurement().cast<T>());
-
-    // Substraction of expected antena positions in Map coordinates
-    Eigen::Matrix<T,2,1> expected_diff_2d_MAP = (R_MAP_BASE2 * t_BASE_ANTENA.head(2) + t_MAP_BASE2) - (R_MAP_BASE1 * t_BASE_ANTENA.head(2) + t_MAP_BASE1);
-
-    // Compute residual rotating information matrix to 2d Map coordinates
-    // Covariance & information are rotated by R*S*R' so for the squred root upper (or right) R*L*U*R'->U*R'
-    // In this case R = R_2dMAP_ENU * R_ENU_ECEF, then R' = R_ENU_ECEF' * R_2dMAP_ENU'
-    residuals_ECEF = (getMeasurementSquareRootInformationUpper().cast<T>() * R_ENU_ECEF.transpose() * R_MAP_ENU.transpose()) * (expected_diff_2d_MAP - measured_diff_2d_MAP);
-
-    //std::cout << "frame1: " << _x1[0] << " " << _x1[1] << " " << _o1[0] << std::endl;
-    //std::cout << "frame2: " << _x2[0] << " " << _x2[1] << " " << _o2[0] << std::endl;
-    //std::cout << "antena: " << _x_antena[0] << " " << _x_antena[1] << " " << _x_antena[2] << std::endl;
-    //std::cout << "RPY: " << _roll[0] << " " << _pitch[1] << " " << _yaw[2] << std::endl;
-    //std::cout << "measured_diff_2d: " << measured_diff_2d[0] << " " << measured_diff_2d[1] << std::endl;
-    //std::cout << "expected_diff_2d: " << expected_diff_2d[0] << " " << expected_diff_2d[1] << std::endl;
-
-    return true;
-}
-
-} // namespace wolf
-
-#endif
diff --git a/include/gnss/processor/processor_gnss_tdcp.h b/include/gnss/processor/processor_gnss_tdcp.h
index 0f1bbf1d0aed54d393109a3d63f7769a3a3aea5d..caca1debbd9e2add16bf14dfd522e97ba96a2546 100644
--- a/include/gnss/processor/processor_gnss_tdcp.h
+++ b/include/gnss/processor/processor_gnss_tdcp.h
@@ -96,6 +96,7 @@ class ProcessorGnssTdcp : public ProcessorBase
 
         WOLF_PROCESSOR_CREATE(ProcessorGnssTdcp, ParamsProcessorGnssTdcp);
 
+        FrameBaseConstPtr getLastKF() const;
         FrameBasePtr getLastKF();
 
     protected:
@@ -144,7 +145,12 @@ class ProcessorGnssTdcp : public ProcessorBase
 
 };
 
-inline wolf::FrameBasePtr ProcessorGnssTdcp::getLastKF()
+inline FrameBaseConstPtr ProcessorGnssTdcp::getLastKF() const
+{
+    return last_KF_;
+}
+
+inline FrameBasePtr ProcessorGnssTdcp::getLastKF()
 {
     return last_KF_;
 }
diff --git a/include/gnss/sensor/sensor_gnss.h b/include/gnss/sensor/sensor_gnss.h
index 03fc7a2d446f4b568939e1686ccb021f234f1129..fece2683601328edd6d6f86b0efc5ba64ce36dc8 100644
--- a/include/gnss/sensor/sensor_gnss.h
+++ b/include/gnss/sensor/sensor_gnss.h
@@ -110,10 +110,14 @@ class SensorGnss : public SensorBase
         ~SensorGnss() override;
 
         // Gets
-        StateBlockPtr getEnuMapTranslation() const;
-        StateBlockPtr getEnuMapRoll() const;
-        StateBlockPtr getEnuMapPitch() const;
-        StateBlockPtr getEnuMapYaw() const;
+        StateBlockConstPtr getEnuMapTranslation() const;
+        StateBlockPtr getEnuMapTranslation();
+        StateBlockConstPtr getEnuMapRoll() const;
+        StateBlockPtr getEnuMapRoll();
+        StateBlockConstPtr getEnuMapPitch() const;
+        StateBlockPtr getEnuMapPitch();
+        StateBlockConstPtr getEnuMapYaw() const;
+        StateBlockPtr getEnuMapYaw();
         const Eigen::Matrix3d& getREnuEcef() const;
         const Eigen::Vector3d& gettEnuEcef() const;
         Eigen::Matrix3d getREnuMap() const;
@@ -178,22 +182,42 @@ inline bool SensorGnss::isEnuModeAuto() const
     return params_->ENU_mode == "auto";
 }
 
-inline StateBlockPtr SensorGnss::getEnuMapTranslation() const
+inline StateBlockConstPtr SensorGnss::getEnuMapTranslation() const
 {
     return getStateBlock('t');
 }
 
-inline StateBlockPtr SensorGnss::getEnuMapRoll() const
+inline StateBlockPtr SensorGnss::getEnuMapTranslation()
+{
+    return getStateBlock('t');
+}
+
+inline StateBlockConstPtr SensorGnss::getEnuMapRoll() const
+{
+    return getStateBlock('r');
+}
+
+inline StateBlockPtr SensorGnss::getEnuMapRoll()
 {
     return getStateBlock('r');
 }
 
-inline StateBlockPtr SensorGnss::getEnuMapPitch() const
+inline StateBlockConstPtr SensorGnss::getEnuMapPitch() const
 {
     return getStateBlock('p');
 }
 
-inline StateBlockPtr SensorGnss::getEnuMapYaw() const
+inline StateBlockPtr SensorGnss::getEnuMapPitch()
+{
+    return getStateBlock('p');
+}
+
+inline StateBlockConstPtr SensorGnss::getEnuMapYaw() const
+{
+    return getStateBlock('y');
+}
+
+inline StateBlockPtr SensorGnss::getEnuMapYaw()
 {
     return getStateBlock('y');
 }
diff --git a/src/processor/processor_gnss_single_diff.cpp b/src/processor/processor_gnss_single_diff.cpp
deleted file mode 100644
index 99c73f2fc8b8fb824739dde680a1264dbe8e842b..0000000000000000000000000000000000000000
--- a/src/processor/processor_gnss_single_diff.cpp
+++ /dev/null
@@ -1,179 +0,0 @@
-//--------LICENSE_START--------
-//
-// Copyright (C) 2020,2021,2022 Institut de Robòtica i Informàtica Industrial, CSIC-UPC.
-// Authors: Joan Solà Ortega (jsola@iri.upc.edu)
-// All rights reserved.
-//
-// This file is part of WOLF
-// WOLF is free software: you can redistribute it and/or modify
-// it under the terms of the GNU Lesser General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// at your option) any later version.
-//
-// This program is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-// GNU Lesser General Public License for more details.
-//
-// You should have received a copy of the GNU Lesser General Public License
-// along with this program.  If not, see <http://www.gnu.org/licenses/>.
-//
-//--------LICENSE_END--------
-#include "gnss/factor/factor_gnss_single_diff_2d.h"
-#include "gnss/feature/feature_gnss_single_diff.h"
-#include "gnss/processor/processor_gnss_single_diff.h"
-#include "gnss/capture/capture_gnss_single_diff.h"
-
-namespace wolf
-{
-
-ProcessorGnssSingleDiff::ProcessorGnssSingleDiff(ParamsProcessorGnssSingleDiffPtr _params_gnss) :
-        ProcessorBase("ProcessorGnssSingleDiff", 0, _params_gnss),
-        params_gnss_(_params_gnss)
-{
-    //
-}
-
-ProcessorGnssSingleDiff::~ProcessorGnssSingleDiff()
-{
-    //
-}
-
-void ProcessorGnssSingleDiff::processCapture(CaptureBasePtr _capture)
-{
-    // TODO: keep captures in a buffer and deal with KFpacks
-
-    //WOLF_DEBUG("ProcessorGnssSingleDiff::process()");
-    incoming_capture_ = std::static_pointer_cast<CaptureGnssSingleDiff>(_capture);
-
-    // discard capture with null or non-key origin frame
-    if (incoming_capture_->getOriginFrame() == nullptr || !incoming_capture_->getOriginFrame()->isKey())
-    {
-        WOLF_WARN("process single difference with null frame origin, skipping...");
-        return;
-    }
-
-    if (last_KF_ == nullptr)
-        last_KF_ = incoming_capture_->getOriginFrame();
-
-    // NEW KF? ------------------------------------------------
-    FrameBasePtr new_frame = nullptr;
-
-    // ALREADY CREATED KF
-    PackKeyFramePtr KF_pack = buffer_pack_kf_.selectPack( incoming_capture_, params_->time_tolerance);
-    if (KF_pack && KF_pack->key_frame != incoming_capture_->getOriginFrame())
-    {
-        new_frame = KF_pack->key_frame;
-        WOLF_DEBUG( "PR ",getName()," - capture ", incoming_capture_->id(), " appended to existing KF " , KF_pack->key_frame->id() , " TS: ", KF_pack->key_frame->getTimeStamp());
-    }
-    // MAKE KF
-    else if (voteForKeyFrame() && permittedKeyFrame())
-    {
-        new_frame = getProblem()->emplaceKeyFrame( incoming_capture_->getTimeStamp());
-        getProblem()->keyFrameCallback(new_frame, shared_from_this(), params_->time_tolerance);
-        WOLF_DEBUG( "PR ",getName()," - capture ", incoming_capture_->id(), " appended to new KF " , new_frame->id() , " TS: ", new_frame->getTimeStamp());
-    }
-
-    // ESTABLISH FACTOR ------------------------------------------------
-    if (new_frame)
-    {
-        // LINK CAPTURE
-        _capture->link(new_frame); // Add incoming Capture to the new Frame
-
-        // EMPLACE FEATURE
-        auto ftr = FeatureBase::emplace<FeatureGnssSingleDiff>(incoming_capture_, incoming_capture_->getData(),incoming_capture_->getDataCovariance());
-
-        // ADD FACTOR
-        emplaceFactor(ftr);
-
-        // store last KF
-        last_KF_ = new_frame;
-    }
-
-    // INITIALIZE ENU_MAP IF 4 NECESSARY CONDITIONS ------------------------------------------------
-    //      1 - ENU-ECEF defined
-    //      2 - not initialized
-    //      3 - current capture in key-frame with factor
-    //      4 - frames constained by the factor separated enough ( > enu_map_init_dist_min)
-    if ( sensor_gnss_->isEnuDefined() &&
-        !sensor_gnss_->isEnuMapInitialized() &&
-         new_frame != nullptr &&
-         incoming_capture_->getFrame() != nullptr && incoming_capture_->getFrame()->isKey() &&
-         incoming_capture_->getData().norm() > params_gnss_->enu_map_init_dist_min)
-    {
-        WOLF_DEBUG("initializing enu map");
-        sensor_gnss_->initializeEnuMapYaw(incoming_capture_->getOriginFrame()->getState(),
-                                          incoming_capture_->getFrame()->getState(),
-                                          incoming_capture_->getData());
-    }
-}
-
-FactorBasePtr ProcessorGnssSingleDiff::emplaceFactor(FeatureBasePtr _ftr)
-{
-    //WOLF_DEBUG("creating the factor...");
-    // 2d
-    if (getProblem()->getDim() == 2)
-        return FactorBase::emplace<FactorGnssSingleDiff2d>(_ftr, _ftr, incoming_capture_->getOriginFrame(), sensor_gnss_, shared_from_this(), params_->apply_loss_function);
-    // 3d TODO
-    else
-        std::runtime_error("Single Differences in 3d not implemented yet.");
-
-    return nullptr;
-}
-
-bool ProcessorGnssSingleDiff::voteForKeyFrame() const
-{
-    if (last_KF_==nullptr)
-        return true;
-
-    std::cout << "params_gnss_->time_th = " << params_gnss_->time_th << std::endl;
-    std::cout << "(last_KF_->getTimeStamp() - incoming_capture_->getTimeStamp()) = " << (last_KF_->getTimeStamp() - incoming_capture_->getTimeStamp()) << std::endl;
-
-    // Depending on time since the last KF with gnssfix capture
-    if ((incoming_capture_->getTimeStamp() - last_KF_->getTimeStamp()) > params_gnss_->time_th)
-        return true;
-
-    // Distance criterion
-    std::cout << "params_gnss_->dist_traveled = " << params_gnss_->dist_traveled << std::endl;
-    Eigen::Vector2d v_current_origin = (sensor_gnss_->getREnuMap().transpose() * sensor_gnss_->getREnuEcef() * incoming_capture_->getData()).head<2>();
-    std::cout << "v_current_origin: " << v_current_origin.transpose() << std::endl;
-    Eigen::Vector2d v_origin_last_KF = last_KF_->getP()->getState() - incoming_capture_->getOriginFrame()->getP()->getState();
-    std::cout << "v_origin_last_KF: " << v_origin_last_KF.transpose() << std::endl;
-    std::cout << "v_current_origin + v_origin_last_KF: " << (v_current_origin + v_origin_last_KF).transpose() << std::endl;
-    if ((v_current_origin + v_origin_last_KF).norm() > params_gnss_->dist_traveled)
-        return true;
-
-    // TODO: more alternatives?
-
-    // otherwise
-    return false;
-}
-
-bool ProcessorGnssSingleDiff::storeKeyFrame(FrameBasePtr _frame_ptr)
-{
-    return true;
-}
-bool ProcessorGnssSingleDiff::storeCapture(CaptureBasePtr _cap_ptr)
-{
-    return false;
-}
-void ProcessorGnssSingleDiff::configure(SensorBasePtr _sensor)
-{
-    sensor_gnss_ = std::static_pointer_cast<SensorGnss>(_sensor);
-};
-
-ProcessorBasePtr ProcessorGnssSingleDiff::create(const std::string& _unique_name, const ParamsProcessorBasePtr _params)
-{
-    ProcessorGnssSingleDiffPtr prc = std::make_shared<ProcessorGnssSingleDiff>(std::static_pointer_cast<ParamsProcessorGnssSingleDiff>(_params));
-    prc->setName(_unique_name);
-    return prc;
-}
-
-} // namespace wolf
-
-
-// Register in the FactorySensor
-#include "core/processor/factory_processor.h"
-namespace wolf {
-WOLF_REGISTER_PROCESSOR(ProcessorGnssSingleDiff)
-} // namespace wolf
diff --git a/src/processor/processor_gnss_tdcp.cpp b/src/processor/processor_gnss_tdcp.cpp
index c087f70747614b859de670898ce9cd9dd655ca6f..1ed2b6855410743a787dc6f6edadd9ae0b6ab6ab 100644
--- a/src/processor/processor_gnss_tdcp.cpp
+++ b/src/processor/processor_gnss_tdcp.cpp
@@ -144,11 +144,15 @@ void ProcessorGnssTdcp::processKeyFrame(FrameBasePtr _keyframe)
     }
 
     // Iterate over all KF of the trajectory with GNSS captures
-    for (auto KF_it = getProblem()->getTrajectory()->rbegin();
-         KF_it != getProblem()->getTrajectory()->rend();
-         KF_it++)
+    auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+    for (auto frame_rev_iter = frame_map.rbegin();
+        frame_rev_iter != frame_map.rend();
+        ++frame_rev_iter)
     {
-        auto KF_ref = *KF_it;
+        auto KF_ref = frame_rev_iter->second;
+        if (not KF_ref)
+            break;
+
         if (_keyframe->getTimeStamp() < KF_ref->getTimeStamp())
             continue;
 
diff --git a/src/processor/processor_tracker_gnss.cpp b/src/processor/processor_tracker_gnss.cpp
index ace52948ce6e00adc5961081c00ee02fe8760781..802a7ca5f1c385da8335b9512121a0ebce5f154b 100644
--- a/src/processor/processor_tracker_gnss.cpp
+++ b/src/processor/processor_tracker_gnss.cpp
@@ -410,21 +410,21 @@ void ProcessorTrackerGnss::establishFactors()
             WOLF_DEBUG("TDCP BATCH frame ", last_ptr_->getFrame()->id());
             FactorBasePtr last_fac_ptr = nullptr;
 
-            for (auto KF_rit = getProblem()->getTrajectory()->rbegin();
-                 KF_rit != getProblem()->getTrajectory()->rend();
-                 KF_rit++)
+            auto frame_map = getProblem()->getTrajectory()->getFrameMap();
+            for (auto frame_rev_iter = frame_map.rbegin();
+                frame_rev_iter != frame_map.rend();
+                ++frame_rev_iter)
             {
-                FrameBasePtr KF = (*KF_rit);
-
-                WOLF_DEBUG("TDCP BATCH ref frame ", KF->id());
+                auto ref_KF = frame_rev_iter->second;
+                WOLF_DEBUG("TDCP BATCH ref frame ", ref_KF->id());
 
                 // discard non-key frames, last-last pair and frames without CaptureGnss
-                if (KF == last_ptr_->getFrame() or
-                    KF->getCaptureOf(getSensor(),"CaptureGnss") == nullptr)
+                if (ref_KF == last_ptr_->getFrame() or
+                    ref_KF->getCaptureOf(getSensor(),"CaptureGnss") == nullptr)
                     continue;
 
                 // static cast
-                auto ref_cap_gnss = std::static_pointer_cast<CaptureGnss>((*KF_rit)->getCaptureOf(getSensor(),"CaptureGnss"));
+                auto ref_cap_gnss = std::static_pointer_cast<CaptureGnss>(ref_KF->getCaptureOf(getSensor(),"CaptureGnss"));
                 auto last_cap_gnss = std::static_pointer_cast<CaptureGnss>(last_ptr_);
 
                 // dt
@@ -469,7 +469,7 @@ void ProcessorTrackerGnss::establishFactors()
                 //std::cout << std::endl;
 
                 // reference ECEF position
-                Eigen::Vector3d x_r = sensor_gnss_->computeFrameAntennaPosEcef(KF);
+                Eigen::Vector3d x_r = sensor_gnss_->computeFrameAntennaPosEcef(ref_KF);
 
                 // compute TDCP batch
                 auto tdcp_output = GnssUtils::Tdcp(ref_cap_gnss->getSnapshot(),
@@ -527,7 +527,8 @@ void ProcessorTrackerGnss::establishFactors()
             {
                 // current feature
                 auto ftr_k = std::dynamic_pointer_cast<FeatureGnssSatellite>(ftr_k_pair.second);
-                assert(ftr_k != nullptr);
+                if(not ftr_k)
+                    continue;
 
                 // check valid measurement
                 assert(std::abs(ftr_k->getObservation().L[0]) > 1e-12);
@@ -543,7 +544,8 @@ void ProcessorTrackerGnss::establishFactors()
                 {
                     // cast reference feature
                     auto ftr_r = std::dynamic_pointer_cast<FeatureGnssSatellite>(ts_ftr_r_it->second);
-                    assert(ftr_r != nullptr);
+                    if(not ftr_r)
+                        continue;
 
                     // dt
                     double dt = ftr_k->getCapture()->getTimeStamp() - ts_ftr_r_it->first;