diff --git a/include/core/capture/capture_diff_drive.h b/include/core/capture/capture_diff_drive.h
index 2300a65b2a203ccc6bb9ca155fab6dbb6b2bdd96..f35be53d1fc9c9d60911a10b87421569b4012e5e 100644
--- a/include/core/capture/capture_diff_drive.h
+++ b/include/core/capture/capture_diff_drive.h
@@ -39,7 +39,7 @@ public:
 
         virtual ~CaptureDiffDrive() = default;
 
-        virtual Eigen::VectorXd correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const override;
+        virtual VectorComposite correctDelta(const VectorComposite& _delta, const VectorComposite& _delta_error) const override;
 
 };
 
diff --git a/include/core/capture/capture_odom_2d.h b/include/core/capture/capture_odom_2d.h
index d18217279601157c9a1b2eb3c4e7f4ba4dae6cbb..9b4358317bea0af940013336f42865f54cedcb45 100644
--- a/include/core/capture/capture_odom_2d.h
+++ b/include/core/capture/capture_odom_2d.h
@@ -33,14 +33,14 @@ class CaptureOdom2d : public CaptureMotion
 
         virtual ~CaptureOdom2d();
 
-        virtual VectorXd correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const override;
+        virtual VectorComposite correctDelta(const VectorComposite& _delta, const VectorComposite& _delta_error) const override;
 
 };
 
-inline Eigen::VectorXd CaptureOdom2d::correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const
+inline VectorComposite CaptureOdom2d::correctDelta(const VectorComposite& _delta, const VectorComposite& _delta_error) const
 {
-    Vector3d delta = _delta + _delta_error;
-    delta(2) = pi2pi(delta(2));
+    VectorComposite delta = _delta + _delta_error;
+    delta.at("O")(0) = pi2pi(delta.at("O")(0));
     return delta;
 }
 
diff --git a/include/core/capture/capture_odom_3d.h b/include/core/capture/capture_odom_3d.h
index 7e4ee02c8b694cc6ae2b8e8b6d9e6803d7587c65..bef7929365af9cc54eda8a91b1d48cbe2594818b 100644
--- a/include/core/capture/capture_odom_3d.h
+++ b/include/core/capture/capture_odom_3d.h
@@ -33,7 +33,7 @@ class CaptureOdom3d : public CaptureMotion
 
         virtual ~CaptureOdom3d();
 
-        virtual VectorXd correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const override;
+        virtual VectorComposite correctDelta(const VectorComposite& _delta, const VectorComposite& _delta_error) const override;
 
 };
 
diff --git a/include/core/processor/processor_tracker_feature.h b/include/core/processor/processor_tracker_feature.h
index ff5ebb2a66837675e2acc290a90cbdbe8435df10..be2545de4105f155c814be1259a63f2046928aac 100644
--- a/include/core/processor/processor_tracker_feature.h
+++ b/include/core/processor/processor_tracker_feature.h
@@ -111,7 +111,7 @@ class ProcessorTrackerFeature : public ProcessorTracker
          *   - Create the factors, of the correct type, derived from FactorBase
          *     (through FactorAnalytic or FactorSparse).
          */
-        virtual unsigned int processKnown();
+        virtual unsigned int processKnown() override;
 
         /** \brief Track provided features in \b _capture
          * \param _features_in input list of features in \b last to track
@@ -147,7 +147,7 @@ class ProcessorTrackerFeature : public ProcessorTracker
          *
          * WARNING! This function only votes! It does not create KeyFrames!
          */
-        virtual bool voteForKeyFrame() const = 0;
+        virtual bool voteForKeyFrame() const override = 0;
 
         // We overload the advance and reset functions to update the lists of matches
         virtual void advanceDerived() override;
@@ -156,7 +156,7 @@ class ProcessorTrackerFeature : public ProcessorTracker
         /**\brief Process new Features
          *
          */
-        virtual unsigned int processNew(const int& _max_features);
+        virtual unsigned int processNew(const int& _max_features) override;
 
         /** \brief Detect new Features
          * \param _max_features maximum number of features detected (-1: unlimited. 0: none)
@@ -190,7 +190,7 @@ class ProcessorTrackerFeature : public ProcessorTracker
 
         /** \brief Emplaces a new factor for each correspondence between a feature in Capture \b last and a feature in Capture \b origin
          */
-        virtual void establishFactors();
+        virtual void establishFactors() override;
 };
 
 } // namespace wolf
diff --git a/include/core/state_block/state_composite.h b/include/core/state_block/state_composite.h
index 5c947f386efcd4270ed14e02cf1886d8e6acd3ee..1b506aeaeb3498eeaf1b46293589f7364dc5aea9 100644
--- a/include/core/state_block/state_composite.h
+++ b/include/core/state_block/state_composite.h
@@ -34,6 +34,9 @@ namespace Eigen
 std::ostream& operator <<(std::ostream &_os, const wolf::VectorComposite &_x);
 
 wolf::VectorComposite& operator + (wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2);
+wolf::VectorComposite operator + (const wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2);
+wolf::VectorComposite& operator - (wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2);
+wolf::VectorComposite operator - (const wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2);
 }
 
 namespace wolf{
diff --git a/src/capture/capture_diff_drive.cpp b/src/capture/capture_diff_drive.cpp
index 05f8a5c49fb73e228b135fffc4de398e9e4ba038..ec0b14e6a9cc14fe7b4f4cbe30b44ded70aefc04 100644
--- a/src/capture/capture_diff_drive.cpp
+++ b/src/capture/capture_diff_drive.cpp
@@ -28,11 +28,11 @@ CaptureDiffDrive::CaptureDiffDrive(const TimeStamp& _ts,
     //
 }
 
-Eigen::VectorXd CaptureDiffDrive::correctDelta(const VectorXd& _delta,
-                                               const VectorXd& _delta_error) const
+VectorComposite CaptureDiffDrive::correctDelta(const VectorComposite& _delta,
+                                               const VectorComposite& _delta_error) const
 {
-    Vector3d delta_corrected = _delta + _delta_error;
-    delta_corrected(2) = pi2pi(delta_corrected(2));
+    VectorComposite delta_corrected = _delta + _delta_error;
+    delta_corrected.at("O")(0) = pi2pi(delta_corrected.at("O")(0));
     return delta_corrected;
 }
 
diff --git a/src/capture/capture_motion.cpp b/src/capture/capture_motion.cpp
index 13b11dda7909e80d1c81687eb4e7313e79994a50..5a12a68828d0d6e5a0472a4e70c9e557000fb106 100644
--- a/src/capture/capture_motion.cpp
+++ b/src/capture/capture_motion.cpp
@@ -51,23 +51,23 @@ CaptureMotion::~CaptureMotion()
     //
 }
 
-VectorComposite CaptureMotion::getDeltaCorrected(const VectorXd& _calib_current) const
+VectorComposite CaptureMotion::getDeltaCorrected(const VectorComposite& _calib_current) const
 {
-    VectorXd calib_preint    = getCalibrationPreint();
-    VectorXd delta_preint    = getBuffer().get().back().delta_integr_;
-    MatrixXd jac_calib       = getBuffer().get().back().jacobian_calib_;
-    VectorXd delta_error     = jac_calib * (_calib_current - calib_preint);
-    VectorXd delta_corrected = correctDelta(delta_preint, delta_error);
+    VectorComposite calib_preint    = getCalibrationPreint();
+    VectorComposite delta_preint    = getBuffer().get().back().delta_integr_;
+    MatrixComposite jac_calib       = getBuffer().get().back().jacobian_calib_;
+    VectorComposite delta_error     = jac_calib * (_calib_current - calib_preint);
+    VectorComposite delta_corrected = correctDelta(delta_preint, delta_error);
     return   delta_corrected;
 }
 
-VectorComposite CaptureMotion::getDeltaCorrected(const VectorXd& _calib_current, const TimeStamp& _ts) const
+VectorComposite CaptureMotion::getDeltaCorrected(const VectorComposite& _calib_current, const TimeStamp& _ts) const
 {
-    Motion   motion          = getBuffer().getMotion(_ts);
-    VectorXd delta_preint    = motion.delta_integr_;
-    MatrixXd jac_calib       = motion.jacobian_calib_;
-    VectorXd delta_error     = jac_calib * (_calib_current - calib_preint_);
-    VectorXd delta_corrected = correctDelta(delta_preint, delta_error);
+    Motion          motion          = getBuffer().getMotion(_ts);
+    VectorComposite delta_preint    = motion.delta_integr_;
+    MatrixComposite jac_calib       = motion.jacobian_calib_;
+    VectorComposite delta_error     = jac_calib * (_calib_current - calib_preint_);
+    VectorComposite delta_corrected = correctDelta(delta_preint, delta_error);
     return   delta_corrected;
 }
 
diff --git a/src/capture/capture_odom_3d.cpp b/src/capture/capture_odom_3d.cpp
index 447e1d500f072e2754de4ed107aeb61e6e6299c0..dd1e79f31f6ea493173b673e8eee2ab64dbba333 100644
--- a/src/capture/capture_odom_3d.cpp
+++ b/src/capture/capture_odom_3d.cpp
@@ -34,11 +34,11 @@ CaptureOdom3d::~CaptureOdom3d()
     //
 }
 
-Eigen::VectorXd CaptureOdom3d::correctDelta(const VectorXd& _delta, const VectorXd& _delta_error) const
+VectorComposite CaptureOdom3d::correctDelta(const VectorComposite& _delta, const VectorComposite& _delta_error) const
 {
-    VectorXd delta(7);
-    delta.head(3) = _delta.head(3) + _delta_error.head(3);
-    delta.tail(4) = (Quaterniond(_delta.data()+3) * exp_q(_delta_error.tail(3))).coeffs();
+    VectorComposite delta;
+    delta.at("P") = _delta.at("P") + _delta_error.at("P");
+    delta.at("O") = (Quaterniond(_delta.at("O").data()) * exp_q(_delta_error.at("O"))).coeffs();
     return delta;
 }
 
diff --git a/src/state_block/state_composite.cpp b/src/state_block/state_composite.cpp
index 80ed5d181c609f0e9eee82ff98e26c1d147a8b3f..e8e0ec769f1810bb4870fe508a708f314adad2ba 100644
--- a/src/state_block/state_composite.cpp
+++ b/src/state_block/state_composite.cpp
@@ -16,7 +16,7 @@ std::ostream& operator <<(std::ostream &_os, const wolf::VectorComposite &_x)
     return _os;
 }
 
-wolf::VectorComposite& operator + (const wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2)
+wolf::VectorComposite& operator + (wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2)
 {
     wolf::VectorComposite v;
     for (const auto& pair_key_vec1 : _v1)
@@ -29,6 +29,45 @@ wolf::VectorComposite& operator + (const wolf::VectorComposite& _v1, const wolf:
     return v;
 }
 
+wolf::VectorComposite operator + (const wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2)
+{
+    wolf::VectorComposite v;
+    for (const auto& pair_key_vec1 : _v1)
+    {
+        const auto &key  = pair_key_vec1.first;
+        const auto &vec1 = pair_key_vec1.second;
+        const auto& vec2 = _v2.at(key);
+        v.at(key) = vec1 + vec2;
+    }
+    return v;
+}
+
+wolf::VectorComposite& operator - (wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2)
+{
+    wolf::VectorComposite v;
+    for (const auto& pair_key_vec1 : _v1)
+    {
+        const auto &key  = pair_key_vec1.first;
+        const auto &vec1 = pair_key_vec1.second;
+        const auto& vec2 = _v2.at(key);
+        v.at(key) = vec1 - vec2;
+    }
+    return v;
+}
+
+wolf::VectorComposite operator - (const wolf::VectorComposite& _v1, const wolf::VectorComposite& _v2)
+{
+    wolf::VectorComposite v;
+    for (const auto& pair_key_vec1 : _v1)
+    {
+        const auto &key  = pair_key_vec1.first;
+        const auto &vec1 = pair_key_vec1.second;
+        const auto& vec2 = _v2.at(key);
+        v.at(key) = vec1 - vec2;
+    }
+    return v;
+}
+
 }
 
 namespace wolf