diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 25d8c530677fc6b3052b77e5c5a0cedad44a0925..6b8524bdc8f6d293803f7a6371f09c0b39656e72 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -77,7 +77,9 @@ SET(HDRS
     frame_base.h
     landmark_base.h
     landmark_corner_2D.h
+    landmark_container.h
     map_base.h
+    map_containers.h
     node_base.h
     node_terminus.h
     node_linked.h
@@ -117,7 +119,9 @@ SET(SRCS
     frame_base.cpp
     landmark_base.cpp
     landmark_corner_2D.cpp
+    landmark_container.cpp
     map_base.cpp
+    map_containers.cpp
     node_base.cpp
     node_terminus.cpp
     sensor_base.cpp
diff --git a/src/capture_laser_2D.cpp b/src/capture_laser_2D.cpp
index 2d6629d3ab6373792e5468a2501315b51d2ff5c5..27d1f68cb468ef17b462d25fd30f9a0958fa029f 100644
--- a/src/capture_laser_2D.cpp
+++ b/src/capture_laser_2D.cpp
@@ -127,7 +127,7 @@ void CaptureLaser2D::establishConstraints()
         WolfScalar min_distance_sq = max_distance_matching_sq;
 
         //Find the closest landmark to the feature
-        LandmarkCorner2D* correspondent_landmark = nullptr;
+        LandmarkBase* correspondent_landmark = nullptr;
         const Eigen::Vector2s& feature_position = (*feature_it)->getMeasurement().head(2);
         const WolfScalar& feature_orientation = (*feature_it)->getMeasurement()(2);
         const WolfScalar& feature_aperture = (*feature_it)->getMeasurement()(3);
@@ -173,7 +173,7 @@ void CaptureLaser2D::establishConstraints()
             //            std::cout << " OK!" << std::endl;
             //            std::cout << "Closer landmark found (satisfying orientation and aperture)" << std::endl;
 
-                        correspondent_landmark = (LandmarkCorner2D*) (*landmark_it);
+                        correspondent_landmark = (*landmark_it);
                         min_distance_sq = distance_sq;
                     }
 //          else
@@ -190,18 +190,18 @@ void CaptureLaser2D::establishConstraints()
 //          std::cout << "+++++ No landmark found. Creating a new one..." << std::endl;
             StateBase* new_landmark_state_position = new StatePoint2D(getTop()->getNewStatePtr());
             getTop()->addState(new_landmark_state_position, feature_global_position);
-            StateBase* new_landmark_state_orientation = new StateTheta(getTop()->getNewStatePtr());
+            StateOrientation* new_landmark_state_orientation = new StateTheta(getTop()->getNewStatePtr());
             getTop()->addState(new_landmark_state_orientation, Eigen::Map < Eigen::Vector1s > (&feature_global_orientation, 1));
 
-            correspondent_landmark = new LandmarkCorner2D(new_landmark_state_position, new_landmark_state_orientation, feature_aperture);
-            LandmarkBase* corr_landmark(correspondent_landmark);
-            getTop()->getMapPtr()->addLandmark(corr_landmark);
+            correspondent_landmark = (LandmarkBase*)new LandmarkCorner2D(new_landmark_state_position, new_landmark_state_orientation, feature_aperture);
+            getTop()->getMapPtr()->addLandmark(correspondent_landmark);
 
 //          std::cout << "Landmark created: " <<
 //                       getTop()->getMapPtr()->getLandmarkListPtr()->back()->nodeId() << std::endl <<
 //                       feature_global_position.transpose() <<
 //                       "\t" << feature_global_orientation <<
 //                       "\t" << feature_aperture << std::endl;
+
         }
         else
         {
@@ -212,7 +212,7 @@ void CaptureLaser2D::establishConstraints()
         //        << (*feature_it)->nodeId() << std::endl;
 
         // Add constraint to the correspondent landmark
-        (*feature_it)->addConstraint(new ConstraintCorner2DTheta(*feature_it, correspondent_landmark, getFramePtr()->getPPtr(),                 //_robotPPtr,
+        (*feature_it)->addConstraint(new ConstraintCorner2DTheta(*feature_it, (LandmarkCorner2D*)correspondent_landmark, getFramePtr()->getPPtr(),                 //_robotPPtr,
                 getFramePtr()->getOPtr(),                   //_robotOPtr,
                 correspondent_landmark->getPPtr(), //_landmarkPPtr,
                 correspondent_landmark->getOPtr())); //_landmarkOPtr,
@@ -229,7 +229,7 @@ void CaptureLaser2D::establishConstraintsMHTree()
     std::vector<bool> associated_mask;
     Eigen::Vector2s feature_global_position;
     WolfScalar feature_global_orientation; 
-    LandmarkCorner2D* correspondent_landmark = nullptr;
+    LandmarkBase* correspondent_landmark = nullptr;
     
     // Global transformation TODO: Change by a function
     Eigen::Vector2s t_robot = getFramePtr()->getPPtr()->getVector();
@@ -251,17 +251,26 @@ void CaptureLaser2D::establishConstraintsMHTree()
         jj = 0;
         for (auto j_it = getTop()->getMapPtr()->getLandmarkListPtr()->begin(); j_it != getTop()->getMapPtr()->getLandmarkListPtr()->end(); j_it++, jj++)
         {
-            //If aperture difference is small enough, proceed with Mahalanobis distance. Otherwise Set prob to 0 to force unassociation 
-            apert_diff = fabs( (*i_it)->getMeasurement(3) - (*j_it)->getDescriptor(0) );
-            if (apert_diff < MAX_ACCEPTED_APERTURE_DIFF)
+            if ((*j_it)->getType() == LANDMARK_CORNER)
+            {
+                //If aperture difference is small enough, proceed with Mahalanobis distance. Otherwise Set prob to 0 to force unassociation
+                apert_diff = fabs( (*i_it)->getMeasurement(3) - (*j_it)->getDescriptor(0) );
+                if (apert_diff < MAX_ACCEPTED_APERTURE_DIFF)
+                {
+                    dm2 = computeMahalanobisDistance(*i_it, *j_it);//Mahalanobis squared
+                    if (dm2 < 5*5)
+                        prob = erfc( sqrt(dm2)/1.4142136 );// sqrt(2) = 1.4142136
+                    else
+                        prob = 0;
+                    tree.setScore(ii,jj,prob);
+                }
+                else
+                    tree.setScore(ii,jj,0.);//prob to 0
+            }
+            else if ((*j_it)->getType() == LANDMARK_CONTAINER)
             {
-                dm2 = computeMahalanobisDistance(*i_it, *j_it);//Mahalanobis squared
-                if (dm2 < 5*5) prob = erfc( sqrt(dm2)/1.4142136 );// sqrt(2) = 1.4142136
-                else prob = 0; 
-                tree.setScore(ii,jj,prob);
+                //TODO
             }
-            else 
-                tree.setScore(ii,jj,0.);//prob to 0
         }
     }
     
@@ -295,13 +304,15 @@ void CaptureLaser2D::establishConstraintsMHTree()
             //create new landmark at global coordinates
             StateBase* new_landmark_state_position = new StatePoint2D(getTop()->getNewStatePtr());
             getTop()->addState(new_landmark_state_position, feature_global_position);
-            StateBase* new_landmark_state_orientation = new StateTheta(getTop()->getNewStatePtr());
+            StateOrientation* new_landmark_state_orientation = new StateTheta(getTop()->getNewStatePtr());
             getTop()->addState(new_landmark_state_orientation, Eigen::Map < Eigen::Vector1s > (&feature_global_orientation, 1));
                         
             //add it to the slam map as a new landmark
             correspondent_landmark = new LandmarkCorner2D(new_landmark_state_position, new_landmark_state_orientation, feature_aperture);
-            LandmarkBase* corr_landmark(correspondent_landmark);
-            getTop()->getMapPtr()->addLandmark(corr_landmark);
+            getTop()->getMapPtr()->addLandmark(correspondent_landmark);
+
+            // Try to build a container
+            tryContainer((LandmarkCorner2D*)correspondent_landmark);
         }
         else //feature-landmark association case
         {
@@ -311,7 +322,7 @@ void CaptureLaser2D::establishConstraintsMHTree()
             {
                 if ( jj == ft_lk_pairs[kk].second ) 
                 {
-                    correspondent_landmark = (LandmarkCorner2D*) (*j_it);
+                    correspondent_landmark = (*j_it);
                     correspondent_landmark->hit();
                     break; 
                 }
@@ -324,7 +335,7 @@ void CaptureLaser2D::establishConstraintsMHTree()
         // Add constraint to the correspondent landmark
         (*i_it)->addConstraint(new ConstraintCorner2DTheta(
                             *i_it,                      //feature pointer
-                            correspondent_landmark,     //landmark pointer
+                            (LandmarkCorner2D*)correspondent_landmark,     //landmark pointer
                             getFramePtr()->getPPtr(),       //_robotPPtr,
                             getFramePtr()->getOPtr(),       //_robotOPtr,
                             correspondent_landmark->getPPtr(),   //_landmarkPPtr,
@@ -426,3 +437,49 @@ WolfScalar CaptureLaser2D::computeMahalanobisDistance(const FeatureBase* _featur
         return 0;
     }
 }
+
+void CaptureLaser2D::tryContainer(const LandmarkCorner2D* _corner_ptr)
+{
+    LandmarkContainer* container_ptr = nullptr;
+    Eigen::Matrix2s R_corner = (_corner_ptr->getOPtr())->getRotationMatrix().topLeftCorner<2,2>();
+
+    // It has to be 90º corner
+    if (std::fabs(_corner_ptr->getAperture() - M_PI / 2) < MAX_ACCEPTED_APERTURE_DIFF)
+    {
+        // Check all existing corners searching a container
+        for (auto landmark_it = getTop()->getMapPtr()->getLandmarkListPtr()->begin(); landmark_it != getTop()->getMapPtr()->getLandmarkListPtr()->end(); landmark_it++)
+        {
+            // should be a 90º corner
+            if ((*landmark_it)->getType() == LANDMARK_CORNER && std::fabs(((LandmarkCorner2D*)(*landmark_it))->getAperture() - M_PI / 2) < MAX_ACCEPTED_APERTURE_DIFF)
+            {
+                if (container_ptr == nullptr)
+                {
+                    Eigen::Vector2s difference = _corner_ptr->getPPtr()->getVector() - (*landmark_it)->getPPtr()->getVector();
+
+                    // Short side
+                    if (std::fabs(difference.norm() - 2.44) < 0.15)
+                    {
+                        std::cout << "Container detected by the short size!" << std::endl;
+                    }
+                    // Long side
+                    else if (std::fabs(difference.norm() - 12.2) < 0.15)
+                    {
+                        std::cout << "Container detected by the long size!" << std::endl;
+                    }
+                    // Diagonal
+                    else if (std::fabs(difference.norm() - 12.44) < 0.15)
+                    {
+                        std::cout << "Container detected by the diagonal!" << std::endl;
+                    }
+                }
+                else
+                {
+                    container_ptr->tryCorner((LandmarkCorner2D*)(*landmark_it));
+                }
+            }
+        }
+    }
+
+    if (container_ptr != nullptr)
+        getTop()->getMapPtr()->addLandmark((LandmarkBase*)(container_ptr));
+}
diff --git a/src/capture_laser_2D.h b/src/capture_laser_2D.h
index cab6248f17389418b5a22d1ca57414f1758deef1..62464b70bbd9c28e7a7469ca5efc1d9f7b5e641f 100644
--- a/src/capture_laser_2D.h
+++ b/src/capture_laser_2D.h
@@ -23,6 +23,7 @@
 #include "sensor_laser_2D.h"
 #include "feature_corner_2D.h"
 #include "landmark_corner_2D.h"
+#include "landmark_container.h"
 #include "state_point.h"
 #include "state_orientation.h"
 #include "state_theta.h"
@@ -126,5 +127,7 @@ class CaptureLaser2D : public CaptureBase
         virtual Eigen::VectorXs computePrior(const TimeStamp& _now) const;
 
         WolfScalar computeMahalanobisDistance(const FeatureBase* _feature, const LandmarkBase* _landmark);
+
+        void tryContainer(const LandmarkCorner2D* _corner_ptr);
 };
 #endif /* CAPTURE_LASER_2D_H_ */
diff --git a/src/capture_odom_2D.cpp b/src/capture_odom_2D.cpp
index e6ce37ed46cae2620f9fdb7bc34e527db912b8fe..7d48f39ffb0b7e6ed4302ffc7d98bbcef8359c17 100644
--- a/src/capture_odom_2D.cpp
+++ b/src/capture_odom_2D.cpp
@@ -1,17 +1,13 @@
 #include "capture_odom_2D.h"
 
 CaptureOdom2D::CaptureOdom2D(const TimeStamp& _init_ts, const TimeStamp& _final_ts, SensorBase* _sensor_ptr) :
-        CaptureRelative(_init_ts, _sensor_ptr),
-        initial_time_stamp_(_init_ts),
-        final_time_stamp_(_final_ts)
+        CaptureRelative(_init_ts, _final_ts, _sensor_ptr)
 {
     //
 }
 
 CaptureOdom2D::CaptureOdom2D(const TimeStamp& _init_ts, const TimeStamp& _final_ts, SensorBase* _sensor_ptr, const Eigen::Vector3s& _data) :
-        CaptureRelative(_init_ts, _sensor_ptr, _data),
-        initial_time_stamp_(_init_ts),
-        final_time_stamp_(_final_ts)
+        CaptureRelative(_init_ts, _final_ts, _sensor_ptr, _data)
 {
     data_covariance_ = Eigen::Matrix3s::Zero();
     data_covariance_(0, 0) = std::max(1e-10, _data(0) * _data(0) * ((SensorOdom2D*) _sensor_ptr)->getDisplacementNoiseFactor() * ((SensorOdom2D*) _sensor_ptr)->getDisplacementNoiseFactor());
@@ -21,16 +17,14 @@ CaptureOdom2D::CaptureOdom2D(const TimeStamp& _init_ts, const TimeStamp& _final_
 }
 
 CaptureOdom2D::CaptureOdom2D(const TimeStamp& _init_ts, const TimeStamp& _final_ts, SensorBase* _sensor_ptr, const Eigen::Vector3s& _data, const Eigen::Matrix3s& _data_covariance) :
-        CaptureRelative(_init_ts, _sensor_ptr, _data, _data_covariance),
-        initial_time_stamp_(_init_ts),
-        final_time_stamp_(_final_ts)
+        CaptureRelative(_init_ts, _final_ts, _sensor_ptr, _data, _data_covariance)
 {
     //
 }
 
 CaptureOdom2D::~CaptureOdom2D()
 {
-    //std::cout << "Destroying GPS fix capture...\n";
+    //std::cout << "Destroying CaptureOdom2D capture...\n";
 }
 
 inline void CaptureOdom2D::processCapture()
@@ -110,7 +104,7 @@ void CaptureOdom2D::integrateCapture(CaptureRelative* _new_capture)
     // TODO Jacobians!
     data_covariance_ += _new_capture->getDataCovariance();
 
-    final_time_stamp_ = _new_capture->final_time_stamp_;
+    this->final_time_stamp_ = _new_capture->getFinalTimeStamp();
 
     getFeatureListPtr()->front()->setMeasurement(data_);
     getFeatureListPtr()->front()->setMeasurementCovariance(data_covariance_);
@@ -119,7 +113,7 @@ void CaptureOdom2D::integrateCapture(CaptureRelative* _new_capture)
 
 CaptureOdom2D* CaptureOdom2D::interpolateCapture(const TimeStamp& _ts)
 {
-    WolfScalar ratio = (_ts.get() - initial_time_stamp_.get()) / (final_time_stamp_.get() - initial_time_stamp_.get());
+    WolfScalar ratio = (_ts.get() - this->time_stamp_.get()) / (this->final_time_stamp_.get() - this->time_stamp_.get());
 
     // Second part
     CaptureOdom2D* second_odom_ptr = new CaptureOdom2D(_ts, final_time_stamp_, sensor_ptr_, data_ * (1-ratio), data_covariance_ * (1-ratio));
diff --git a/src/capture_odom_2D.h b/src/capture_odom_2D.h
index d8c671d2fd55c26ee8a4f89c14fdd07a2e68470d..26f71aa48847763144c0642f732eea149fa97a81 100644
--- a/src/capture_odom_2D.h
+++ b/src/capture_odom_2D.h
@@ -13,9 +13,6 @@
 //class CaptureGPSFix
 class CaptureOdom2D : public CaptureRelative
 {
-    protected:
-        TimeStamp initial_time_stamp_; ///< Initial Time stamp
-        TimeStamp final_time_stamp_; ///< Final Time stamp
 
     public:
       CaptureOdom2D(const TimeStamp& _init_ts, const TimeStamp& _final_ts, SensorBase* _sensor_ptr);
@@ -28,7 +25,7 @@ class CaptureOdom2D : public CaptureRelative
 
       virtual void processCapture();
 
-      virtual Eigen::VectorXs computePrior(const TimeStamp& _now) const;
+      virtual Eigen::VectorXs computePrior(const TimeStamp& _now = 0) const;
 
       virtual void addConstraints();
 
diff --git a/src/capture_relative.cpp b/src/capture_relative.cpp
index 4036d5f1d9da36540ec9b79e17ca5e7517aebb47..54e0c8b0d504052d79a8686bf3da1874a4dd3e05 100644
--- a/src/capture_relative.cpp
+++ b/src/capture_relative.cpp
@@ -1,19 +1,22 @@
 #include "capture_relative.h"
 
-CaptureRelative::CaptureRelative(const TimeStamp& _ts, SensorBase* _sensor_ptr) :
-    CaptureBase(_ts, _sensor_ptr)
+CaptureRelative::CaptureRelative(const TimeStamp& _init_ts, const TimeStamp& _final_ts, SensorBase* _sensor_ptr) :
+    CaptureBase(_init_ts, _sensor_ptr),
+    final_time_stamp_(_final_ts)
 {
     //
 }
 
-CaptureRelative::CaptureRelative(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data) :
-	CaptureBase(_ts, _sensor_ptr, _data)
+CaptureRelative::CaptureRelative(const TimeStamp& _init_ts, const TimeStamp& _final_ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data) :
+	CaptureBase(_init_ts, _sensor_ptr, _data),
+    final_time_stamp_(_final_ts)
 {
 	//
 }
 
-CaptureRelative::CaptureRelative(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data, const Eigen::MatrixXs& _data_covariance) :
-	CaptureBase(_ts, _sensor_ptr, _data, _data_covariance)
+CaptureRelative::CaptureRelative(const TimeStamp& _init_ts, const TimeStamp& _final_ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data, const Eigen::MatrixXs& _data_covariance) :
+	CaptureBase(_init_ts, _sensor_ptr, _data, _data_covariance),
+    final_time_stamp_(_final_ts)
 {
 	//
 }
@@ -21,3 +24,23 @@ CaptureRelative::~CaptureRelative()
 {
 	//
 }
+
+TimeStamp CaptureRelative::getInitTimeStamp() const
+{
+    return this->getTimeStamp();
+}
+
+TimeStamp CaptureRelative::getFinalTimeStamp() const
+{
+    return final_time_stamp_;
+}
+
+void CaptureRelative::setInitTimeStamp(const TimeStamp & _ts)
+{
+    this->setTimeStamp(_ts);
+}
+
+void CaptureRelative::setFinalTimeStamp(const TimeStamp & _ts)
+{
+    final_time_stamp_ = _ts;
+}
diff --git a/src/capture_relative.h b/src/capture_relative.h
index 4c4707aea46dbfb8ef96972b3be20613b41c6cf4..6fb665e830950f2c936ba193b3b584faac0bf6ca 100644
--- a/src/capture_relative.h
+++ b/src/capture_relative.h
@@ -12,17 +12,28 @@
 //class CaptureBase
 class CaptureRelative : public CaptureBase
 {
+    protected:
+        TimeStamp final_time_stamp_; ///< Final Time stamp
+
     public:
-        CaptureRelative(const TimeStamp& _ts, SensorBase* _sensor_ptr);
+        CaptureRelative(const TimeStamp& _init_ts, const TimeStamp& _final_ts, SensorBase* _sensor_ptr);
         
-        CaptureRelative(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data);
+        CaptureRelative(const TimeStamp& _init_ts, const TimeStamp& _final_ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data);
 
-        CaptureRelative(const TimeStamp& _ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data, const Eigen::MatrixXs& _data_covariance);
+        CaptureRelative(const TimeStamp& _init_ts, const TimeStamp& _final_ts, SensorBase* _sensor_ptr, const Eigen::VectorXs& _data, const Eigen::MatrixXs& _data_covariance);
 
         virtual ~CaptureRelative();
 
         virtual void integrateCapture(CaptureRelative* _new_capture) = 0;
 
         virtual CaptureRelative* interpolateCapture(const TimeStamp& _ts) = 0;
+
+        TimeStamp getInitTimeStamp() const;
+
+        TimeStamp getFinalTimeStamp() const;
+
+        void setInitTimeStamp(const TimeStamp & _ts);
+
+        void setFinalTimeStamp(const TimeStamp & _ts);
 };
 #endif
diff --git a/src/ceres_wrapper/ceres_manager.cpp b/src/ceres_wrapper/ceres_manager.cpp
index 2f38937a2b963f50169261cdbe86f4acc77d7df4..dfc720d395c7c130ca14c10481bb5b008032222a 100644
--- a/src/ceres_wrapper/ceres_manager.cpp
+++ b/src/ceres_wrapper/ceres_manager.cpp
@@ -36,7 +36,7 @@ ceres::Solver::Summary CeresManager::solve(const ceres::Solver::Options& _ceres_
 	return ceres_summary_;
 }
 
-void CeresManager::computeCovariances(RadarOdom+* _problem_ptr)
+void CeresManager::computeCovariances(WolfProblem* _problem_ptr)
 {
     //std::cout << "computing covariances..." << std::endl;
 
@@ -128,7 +128,7 @@ void CeresManager::computeCovariances(RadarOdom+* _problem_ptr)
     }
 }
 
-void CeresManager::update(RadarOdom+* _problem_ptr)
+void CeresManager::update(WolfProblem* _problem_ptr)
 {
 	// IF REALLOCATION OF STATE, REMOVE EVERYTHING AND BUILD THE PROBLEM AGAIN
 	if (_problem_ptr->isReallocated())
diff --git a/src/ceres_wrapper/ceres_manager.h b/src/ceres_wrapper/ceres_manager.h
index f156a31780cc8486c2e3acc052b4fe949ae6d514..da9cdca74a9ec35983578eed338ef6a7b654a4fd 100644
--- a/src/ceres_wrapper/ceres_manager.h
+++ b/src/ceres_wrapper/ceres_manager.h
@@ -39,7 +39,7 @@ class CeresManager
 
 		ceres::Solver::Summary solve(const ceres::Solver::Options& _ceres_options);
 
-		void computeCovariances(RadarOdom+* _problem_ptr);
+		void computeCovariances(WolfProblem* _problem_ptr);
 
 		void update(const WolfProblemPtr _problem_ptr);
 
diff --git a/src/constraint_corner_2D_theta.h b/src/constraint_corner_2D_theta.h
index 47e4babe0095f76a46c6b87003e1bc2ab6cf3f62..62fd1e45b999b32f775797d7cc538f432491b6d6 100644
--- a/src/constraint_corner_2D_theta.h
+++ b/src/constraint_corner_2D_theta.h
@@ -21,7 +21,7 @@ class ConstraintCorner2DTheta: public ConstraintSparse<3,2,1,2,1>
 //			//
 //		}
 
-		ConstraintCorner2DTheta(FeatureBase* _ftr_ptr, LandmarkCorner2D* _lmk_ptr, StateBase* _robotPPtr, StateBase* _robotOPtr, StateBase* _landmarkPPtr, StateBase* _landmarkOPtr) :
+		ConstraintCorner2DTheta(FeatureBase* _ftr_ptr, LandmarkCorner2D* _lmk_ptr, StateBase* _robotPPtr, StateOrientation* _robotOPtr, StateBase* _landmarkPPtr, StateOrientation* _landmarkOPtr) :
 			ConstraintSparse<3,2,1,2,1>(_ftr_ptr,CTR_CORNER_2D_THETA,  _robotPPtr, _robotOPtr,_landmarkPPtr, _landmarkOPtr),
 			lmk_ptr_(_lmk_ptr)
 		{
diff --git a/src/constraint_odom_2D_theta.h b/src/constraint_odom_2D_theta.h
index 3cc76af752fcaf3f2c6b6b427088879cec46e83a..167ac61f87b856396b56e561d040802b934d7157 100644
--- a/src/constraint_odom_2D_theta.h
+++ b/src/constraint_odom_2D_theta.h
@@ -16,7 +16,7 @@ class ConstraintOdom2DTheta : public ConstraintSparse<3, 2, 1, 2, 1>
 //            //
 //        }
 
-        ConstraintOdom2DTheta(FeatureBase* _ftr_ptr, StateBase* _state0Ptr, StateBase* _state1Ptr, StateBase* _state2Ptr, StateBase* _state3Ptr) :
+        ConstraintOdom2DTheta(FeatureBase* _ftr_ptr, StateBase* _state0Ptr, StateOrientation* _state1Ptr, StateBase* _state2Ptr, StateOrientation* _state3Ptr) :
                 ConstraintSparse<3, 2, 1, 2, 1>(_ftr_ptr, CTR_ODOM_2D_THETA, _state0Ptr, _state1Ptr, _state2Ptr, _state3Ptr)
         {
             //
diff --git a/src/examples/test_ceres_2_lasers.cpp b/src/examples/test_ceres_2_lasers.cpp
index 5ec7d26e1eef8e298a0623d9afe56eb84ece33c4..0c69241e989a7fa44d6e12afa5a485914f3b161b 100644
--- a/src/examples/test_ceres_2_lasers.cpp
+++ b/src/examples/test_ceres_2_lasers.cpp
@@ -235,7 +235,7 @@ int main(int argc, char** argv)
         std::cout << "ADD CAPTURES..." << std::endl;
         t1 = clock();
         // adding new sensor captures
-        wolf_manager->addCapture(new CaptureOdom2D(TimeStamp(), &odom_sensor, odom_reading));		//, odom_std_factor * Eigen::MatrixXs::Identity(2,2)));
+        wolf_manager->addCapture(new CaptureOdom2D(TimeStamp(),TimeStamp(), &odom_sensor, odom_reading));		//, odom_std_factor * Eigen::MatrixXs::Identity(2,2)));
 		wolf_manager->addCapture(new CaptureGPSFix(TimeStamp(), &gps_sensor, gps_fix_reading, gps_std * Eigen::MatrixXs::Identity(3,3)));
 //        wolf_manager->addCapture(new CaptureLaser2D(TimeStamp(), &laser_1_sensor, scan1));
 //        wolf_manager->addCapture(new CaptureLaser2D(TimeStamp(), &laser_2_sensor, scan2));
diff --git a/src/examples/test_iQR_wolf2.cpp b/src/examples/test_iQR_wolf2.cpp
index 6aee8612fe645561573cf894d9ebc8d7d1634ab7..f99aeb028750d6fbc2b5c210b86f860ebfe504a3 100644
--- a/src/examples/test_iQR_wolf2.cpp
+++ b/src/examples/test_iQR_wolf2.cpp
@@ -244,9 +244,9 @@ int main(int argc, char *argv[])
         // ADD CAPTURES ---------------------------
         //std::cout << "ADD CAPTURES..." << std::endl;
         // adding new sensor captures
-        wolf_manager_QR->addCapture(new CaptureOdom2D(TimeStamp(), &odom_sensor, odom_reading));       //, odom_std_factor * Eigen::MatrixXs::Identity(2,2)));
+        wolf_manager_QR->addCapture(new CaptureOdom2D(TimeStamp(), TimeStamp(), &odom_sensor, odom_reading));       //, odom_std_factor * Eigen::MatrixXs::Identity(2,2)));
         wolf_manager_QR->addCapture(new CaptureGPSFix(TimeStamp(), &gps_sensor, gps_fix_reading, gps_std * gps_std * Eigen::MatrixXs::Identity(3,3)));
-        wolf_manager_ceres->addCapture(new CaptureOdom2D(TimeStamp(), &odom_sensor, odom_reading));       //, odom_std_factor * Eigen::MatrixXs::Identity(2,2)));
+        wolf_manager_ceres->addCapture(new CaptureOdom2D(TimeStamp(), TimeStamp(), &odom_sensor, odom_reading));       //, odom_std_factor * Eigen::MatrixXs::Identity(2,2)));
         wolf_manager_ceres->addCapture(new CaptureGPSFix(TimeStamp(), &gps_sensor, gps_fix_reading, gps_std * gps_std * Eigen::MatrixXs::Identity(3,3)));
         //wolf_manager->addCapture(new CaptureLaser2D(TimeStamp(), &laser_1_sensor, scan1));
         //wolf_manager->addCapture(new CaptureLaser2D(TimeStamp(), &laser_2_sensor, scan2));
diff --git a/src/examples/test_node_linked.cpp b/src/examples/test_node_linked.cpp
index 3326040dba103c297522e6caf037cfcac3919271..3a1f1bec7383bd258ac61324a00491297d091936 100644
--- a/src/examples/test_node_linked.cpp
+++ b/src/examples/test_node_linked.cpp
@@ -13,10 +13,10 @@ using namespace std;
 class TrajectoryN;
 class FrameN;
 class MeasurementN;
-class RadarOdom+;
+class WolfProblem;
 
 //class TrajectoryN
-class TrajectoryN : public NodeLinked<RadarOdom+,FrameN>
+class TrajectoryN : public NodeLinked<WolfProblem,FrameN>
 {
     protected:
         unsigned int length_; //just something to play
@@ -99,7 +99,7 @@ int main()
     cout << "========================================================" << endl;
 
     cout << endl << "TEST 1. Constructors" << endl;
-    RadarOdom+* problem_(new RadarOdom+());
+    WolfProblem* problem_(new WolfProblem());
     TrajectoryN* trajectory_(new TrajectoryN(2));
     FrameN* frame_1_(new FrameN(1.011));
     FrameN* frame_2_(new FrameN(2.022));
@@ -136,7 +136,7 @@ int main()
     cout << "========================================================" << endl;    
     
     cout << endl << "TEST 5. getTop()" << endl;
-    RadarOdom+* nb_ptr = sensor_data_radar_->getTop();
+    WolfProblem* nb_ptr = sensor_data_radar_->getTop();
     //shared_ptr<TrajectoryN> nb_shptr((TrajectoryN*)nb_ptr);
     cout << "TOP node is: " << nb_ptr->nodeId() << endl;
     //cout << "nb_shptr.use_count(): " << nb_shptr.use_count() << "; value: " << nb_shptr.get() << endl;
diff --git a/src/frame_base.cpp b/src/frame_base.cpp
index c0a40563e634ba1b2aa2c79351dfe6a262c48ae9..5f09e480c762d2b6f6165e9c5b4204f3e341ac01 100644
--- a/src/frame_base.cpp
+++ b/src/frame_base.cpp
@@ -1,7 +1,7 @@
 
 #include "frame_base.h"
 
-FrameBase::FrameBase(const TimeStamp& _ts, StateBase* _p_ptr, StateBase* _o_ptr, StateBase* _v_ptr, StateBase* _w_ptr) :
+FrameBase::FrameBase(const TimeStamp& _ts, StateBase* _p_ptr, StateOrientation* _o_ptr, StateBase* _v_ptr, StateBase* _w_ptr) :
             //NodeLinked(MID, "FRAME", _traj_ptr),
             NodeLinked(MID, "FRAME"),
             type_(REGULAR_FRAME),
@@ -15,7 +15,7 @@ FrameBase::FrameBase(const TimeStamp& _ts, StateBase* _p_ptr, StateBase* _o_ptr,
 	//
 }
 
-FrameBase::FrameBase(const FrameType & _tp, const TimeStamp& _ts, StateBase* _p_ptr, StateBase* _o_ptr, StateBase* _v_ptr, StateBase* _w_ptr) :
+FrameBase::FrameBase(const FrameType & _tp, const TimeStamp& _ts, StateBase* _p_ptr, StateOrientation* _o_ptr, StateBase* _v_ptr, StateBase* _w_ptr) :
             //NodeLinked(MID, "FRAME", _traj_ptr),
             NodeLinked(MID, "FRAME"),
             type_(_tp),
@@ -203,7 +203,7 @@ StateBase* FrameBase::getPPtr() const
 	return p_ptr_;
 }
 
-StateBase* FrameBase::getOPtr() const
+StateOrientation* FrameBase::getOPtr() const
 {
 	return o_ptr_;
 }
diff --git a/src/frame_base.h b/src/frame_base.h
index fec673a1237ed3f720d838de1a8c7be337362f02..51c3742027641ce7984cc28910ab2b7f08e0d2a7 100644
--- a/src/frame_base.h
+++ b/src/frame_base.h
@@ -28,7 +28,7 @@ class FrameBase : public NodeLinked<TrajectoryBase,CaptureBase>
         TimeStamp time_stamp_; //frame time stamp
         StateStatus status_; // status of the estimation of the frame state
 		StateBase* p_ptr_; // Position state unit pointer
-		StateBase* o_ptr_; // Orientation state unit pointer
+		StateOrientation* o_ptr_; // Orientation state unit pointer
 		StateBase* v_ptr_; // Velocity state unit pointer
 		StateBase* w_ptr_; // Angular velocity state unit pointer
 		//TODO: accelerations?
@@ -45,7 +45,7 @@ class FrameBase : public NodeLinked<TrajectoryBase,CaptureBase>
          * \param _w_ptr StateBase pointer to the angular velocity (default: nullptr)
          *
          **/
-        FrameBase(const TimeStamp& _ts, StateBase* _p_ptr, StateBase* _o_ptr = nullptr, StateBase* _v_ptr = nullptr, StateBase* _w_ptr = nullptr); //ACM: Either remove all pointer arguments from this header, or merge both constructors in a single one
+        FrameBase(const TimeStamp& _ts, StateBase* _p_ptr, StateOrientation* _o_ptr = nullptr, StateBase* _v_ptr = nullptr, StateBase* _w_ptr = nullptr); //ACM: Either remove all pointer arguments from this header, or merge both constructors in a single one
         
         /** \brief Constructor with type, time stamp and state pointer
          * 
@@ -59,7 +59,7 @@ class FrameBase : public NodeLinked<TrajectoryBase,CaptureBase>
          * \param _w_ptr StateBase pointer to the angular velocity (default: nullptr)
          * 
          **/        
-        FrameBase(const FrameType & _tp, const TimeStamp& _ts, StateBase* _p_ptr, StateBase* _o_ptr = nullptr, StateBase* _v_ptr = nullptr, StateBase* _w_ptr = nullptr);
+        FrameBase(const FrameType & _tp, const TimeStamp& _ts, StateBase* _p_ptr, StateOrientation* _o_ptr = nullptr, StateBase* _v_ptr = nullptr, StateBase* _w_ptr = nullptr);
         
         /** \brief Destructor
          * 
@@ -111,7 +111,7 @@ class FrameBase : public NodeLinked<TrajectoryBase,CaptureBase>
 
         StateBase* getPPtr() const;
 
-        StateBase* getOPtr() const;
+        StateOrientation* getOPtr() const;
 
         StateBase* getVPtr() const;
 
diff --git a/src/landmark_base.cpp b/src/landmark_base.cpp
index 3a235217ba14a3a4c0e7837dfa8f3090382cb167..e80a0f9892234b3428b08672a3d50acfcbb42f01 100644
--- a/src/landmark_base.cpp
+++ b/src/landmark_base.cpp
@@ -1,7 +1,7 @@
 
 #include "landmark_base.h"
 
-LandmarkBase::LandmarkBase(const LandmarkType & _tp, StateBase* _p_ptr, StateBase* _o_ptr, StateBase* _v_ptr, StateBase* _w_ptr) :
+LandmarkBase::LandmarkBase(const LandmarkType & _tp, StateBase* _p_ptr, StateOrientation* _o_ptr, StateBase* _v_ptr, StateBase* _w_ptr) :
             NodeLinked(MID, "LANDMARK"),
             type_(_tp),
             status_(LANDMARK_CANDIDATE),
@@ -96,7 +96,7 @@ StateBase* LandmarkBase::getPPtr() const
 	return p_ptr_;
 }
 
-StateBase* LandmarkBase::getOPtr() const
+StateOrientation* LandmarkBase::getOPtr() const
 {
 	return o_ptr_;
 }
@@ -126,6 +126,11 @@ WolfScalar LandmarkBase::getDescriptor(unsigned int _ii) const
     return descriptor_(_ii);
 }
 
+const LandmarkType LandmarkBase::getType() const
+{
+    return type_;
+}
+
 //const StateBasePtr LandmarkBase::getStatePtr() const
 //{
 //	return st_list_.front();
diff --git a/src/landmark_base.h b/src/landmark_base.h
index b7052c50e13bb37a4200d1e6b90d2e079694b28d..4ccdc187af375119a81c7466d79305f5000b6454 100644
--- a/src/landmark_base.h
+++ b/src/landmark_base.h
@@ -16,6 +16,7 @@ class NodeTerminus;
 #include "time_stamp.h"
 #include "node_linked.h"
 #include "map_base.h"
+#include "state_orientation.h"
 
 // why v, w and a ?
 // add descriptor as a StateBase -> Could be estimated or not. Aperture could be one case of "descriptor"that can be estimated or not
@@ -33,7 +34,7 @@ class LandmarkBase : public NodeLinked<MapBase, NodeTerminus>
         TimeStamp stamp_; // stamp of the creation of the landmark (and stamp of destruction when status is LANDMARK_OLD)
         //StateBaseList st_list_; //List of pointers to the state corresponding to the landmark estimation
         StateBase* p_ptr_; // Position state unit pointer
-        StateBase* o_ptr_; // Orientation state unit pointer
+        StateOrientation* o_ptr_; // Orientation state unit pointer
         StateBase* v_ptr_; // Velocity state unit pointer
         StateBase* w_ptr_; // Angular velocity state unit pointer
         //TODO: accelerations?
@@ -45,12 +46,12 @@ class LandmarkBase : public NodeLinked<MapBase, NodeTerminus>
          * Constructor with type, and state pointer
          * \param _tp indicates landmark type.(types defined at wolf.h)
          * \param _p_ptr StateBase pointer to the position
-         * \param _o_ptr StateBase pointer to the orientation (default: nullptr)
+         * \param _o_ptr StateOrientation pointer to the orientation (default: nullptr)
          * \param _v_ptr StateBase pointer to the velocity (default: nullptr)
          * \param _w_ptr StateBase pointer to the angular velocity (default: nullptr)
          *
          **/
-        LandmarkBase(const LandmarkType & _tp, StateBase* _p_ptr, StateBase* _o_ptr = nullptr, StateBase* _v_ptr = nullptr, StateBase* _w_ptr = nullptr);
+        LandmarkBase(const LandmarkType & _tp, StateBase* _p_ptr, StateOrientation* _o_ptr = nullptr, StateBase* _v_ptr = nullptr, StateBase* _w_ptr = nullptr);
 
         /** \brief Constructor with type, time stamp and state list
          *
@@ -81,7 +82,7 @@ class LandmarkBase : public NodeLinked<MapBase, NodeTerminus>
 
         StateBase* getPPtr() const;
 
-        StateBase* getOPtr() const;
+        StateOrientation* getOPtr() const;
 
         StateBase* getVPtr() const;
 
@@ -99,6 +100,8 @@ class LandmarkBase : public NodeLinked<MapBase, NodeTerminus>
          **/
         WolfScalar getDescriptor(unsigned int _ii) const;
 
+        const LandmarkType getType() const;
+
         //const StateBase* getStatePtr() const;
 
         //const StateBaseList* getStateListPtr() const;
diff --git a/src/landmark_corner_2D.cpp b/src/landmark_corner_2D.cpp
index 176effa1820cfb32c61f20a432e6910981322c93..d0d35e3732f92b166f8ad337490b3989f5062605 100644
--- a/src/landmark_corner_2D.cpp
+++ b/src/landmark_corner_2D.cpp
@@ -1,7 +1,7 @@
 
 #include "landmark_corner_2D.h"
 
-LandmarkCorner2D::LandmarkCorner2D(StateBase* _p_ptr, StateBase* _o_ptr, const WolfScalar& _aperture) :
+LandmarkCorner2D::LandmarkCorner2D(StateBase* _p_ptr, StateOrientation* _o_ptr, const WolfScalar& _aperture) :
 	LandmarkBase(LANDMARK_CORNER, _p_ptr, _o_ptr)
 {
   	setDescriptor(Eigen::VectorXs::Constant(1,_aperture));
diff --git a/src/landmark_corner_2D.h b/src/landmark_corner_2D.h
index cb6645840316f6aa803928c5cb8987a637d2836b..bd9afb65d13ca211dcfe5fae5f596f15fda7c489 100644
--- a/src/landmark_corner_2D.h
+++ b/src/landmark_corner_2D.h
@@ -28,7 +28,7 @@ class LandmarkCorner2D : public LandmarkBase
          * \param _aperture descriptor of the landmark: aperture of the corner
          *
          **/
-		LandmarkCorner2D(StateBase* _p_ptr, StateBase* _o_ptr, const WolfScalar& _aperture=0);
+		LandmarkCorner2D(StateBase* _p_ptr, StateOrientation* _o_ptr, const WolfScalar& _aperture=0);
         
         /** \brief Destructor
          * 
diff --git a/src/map_base.h b/src/map_base.h
index 7be3110e732b0a68fd14cff7a3f8cf009b10b798..e33edb0c902d4a767ae03c29218cbe503ce7f502 100644
--- a/src/map_base.h
+++ b/src/map_base.h
@@ -2,7 +2,7 @@
 #ifndef MAP_BASE_H_
 #define MAP_BASE_H_
 
-class RadarOdom+;
+class WolfProblem;
 class LandmarkBase;
 
 //std includes
@@ -20,7 +20,7 @@ class LandmarkBase;
 #include "landmark_base.h"
 
 //class MapBase
-class MapBase : public NodeLinked<RadarOdom+,LandmarkBase>
+class MapBase : public NodeLinked<WolfProblem,LandmarkBase>
 {
     public:
         /** \brief Constructor
@@ -42,7 +42,7 @@ class MapBase : public NodeLinked<RadarOdom+,LandmarkBase>
 		 * Adds a landmark
 		 *
 		 **/
-        void addLandmark(LandmarkBase* _landmark_ptr);
+        virtual void addLandmark(LandmarkBase* _landmark_ptr);
 
         /** \brief Removes a landmark
 		 *
diff --git a/src/node_base.h b/src/node_base.h
index 93733cd226bac5a9c73d6ff759131ff96cb062e6..0716fff5118be42392977308365732eb047714fa 100644
--- a/src/node_base.h
+++ b/src/node_base.h
@@ -4,7 +4,7 @@
 #include <iostream>
 #include "wolf.h"
 
-class RadarOdom+;
+class WolfProblem;
 
 /** \brief Base class for Nodes
  *
diff --git a/src/node_linked.h b/src/node_linked.h
index 841267fbb45edc834b475bda808c537f9d23040a..776e3c01887cf33986732c85bdb15dceee4c6a32 100644
--- a/src/node_linked.h
+++ b/src/node_linked.h
@@ -12,7 +12,7 @@
 #ifndef NODE_LINKED_H_
 #define NODE_LINKED_H_
 
-class RadarOdom+;
+class WolfProblem;
 
 //wolf includes
 #include "node_base.h"
@@ -172,7 +172,7 @@ class NodeLinked : public NodeBase
          * TODO: Review if it could return a pointer to a derived class instead of NodeBase JVN: I tried to do so...
          * 
          **/
-        virtual RadarOdom+* getTop();
+        virtual WolfProblem* getTop();
 
         /** \brief Prints node information
          * 
@@ -349,7 +349,7 @@ inline void NodeLinked<UpperType, LowerType>::removeDownNode(const LowerNodeIter
 
 //TODO: confirm this change by the others :)
 template<class UpperType, class LowerType>
-RadarOdom+* NodeLinked<UpperType, LowerType>::getTop()
+WolfProblem* NodeLinked<UpperType, LowerType>::getTop()
 {
 	return up_node_ptr_->getTop();
 }
diff --git a/src/node_terminus.cpp b/src/node_terminus.cpp
index 91f6817f26881f4ec3371018efd39cff2238b077..633626558fbf422d6214bd40c2599d821435e6cf 100644
--- a/src/node_terminus.cpp
+++ b/src/node_terminus.cpp
@@ -12,7 +12,7 @@ NodeTerminus::~NodeTerminus()
   //
 }
 
-RadarOdom+* NodeTerminus::getTop()
+WolfProblem* NodeTerminus::getTop()
 {
 	return nullptr;
 }
diff --git a/src/node_terminus.h b/src/node_terminus.h
index 26319773fa4f9a6a7cd234f2c4246a1396beab87..b4d5a98a11e12b174bb896cc4a5fca6a341f86d9 100644
--- a/src/node_terminus.h
+++ b/src/node_terminus.h
@@ -24,7 +24,7 @@ class NodeTerminus : public NodeBase
 
         virtual ~NodeTerminus();
 
-        RadarOdom+* getTop();
+        WolfProblem* getTop();
 
 };
 #endif /* NODE_TERMINUS_H_ */
diff --git a/src/solver/qr_solver.h b/src/solver/qr_solver.h
index d459f645836d58ab4c7c984089ca1e2695551c11..bd44b91bd7b4a87291f2f2484212afb95c7731dd 100644
--- a/src/solver/qr_solver.h
+++ b/src/solver/qr_solver.h
@@ -73,7 +73,7 @@ class SolverQR
 
         }
 
-        void update(RadarOdom+* _problem_ptr)
+        void update(WolfProblem* _problem_ptr)
         {
             // ADD/UPDATE STATE UNITS
             for(auto state_unit_it = _problem_ptr->getStateListPtr()->begin(); state_unit_it!=_problem_ptr->getStateListPtr()->end(); state_unit_it++)
diff --git a/src/solver/solver_manager.cpp b/src/solver/solver_manager.cpp
index 9d8bb2cb700bd47008b64cde0209581044a50548..4ae845e2dcdee7d8874fdbae74f7ca819d78815c 100644
--- a/src/solver/solver_manager.cpp
+++ b/src/solver/solver_manager.cpp
@@ -19,7 +19,7 @@ void SolverManager::solve()
 //{
 //}
 
-void SolverManager::update(RadarOdom+* _problem_ptr)
+void SolverManager::update(const WolfProblemPtr _problem_ptr)
 {
 	// IF REALLOCATION OF STATE, REMOVE EVERYTHING AND BUILD THE PROBLEM AGAIN
 	if (_problem_ptr->isReallocated())
diff --git a/src/trajectory_base.h b/src/trajectory_base.h
index bb2909845bef2c5108f4e7b95ca276674ae6c7cf..709c164c996d5eba3f96f98fc21306288d7752ab 100644
--- a/src/trajectory_base.h
+++ b/src/trajectory_base.h
@@ -2,7 +2,7 @@
 #ifndef TRAJECTORY_BASE_H_
 #define TRAJECTORY_BASE_H_
 
-class RadarOdom+;
+class WolfProblem;
 class FrameBase;
 
 //std includes
@@ -21,7 +21,7 @@ class FrameBase;
 #include "state_base.h"
 
 //class TrajectoryBase
-class TrajectoryBase : public NodeLinked<RadarOdom+,FrameBase>
+class TrajectoryBase : public NodeLinked<WolfProblem,FrameBase>
 {
     protected:
 		// TODO: JVN: No seria millor que això ho tingui el wolf_problem o el wolf_manager?
diff --git a/src/wolf.h b/src/wolf.h
index 2e98f0cdeac3dcc493ff6b64eb50e67248f214c6..701c710182e2875bbed37c1e6f85308b1e79ad7e 100644
--- a/src/wolf.h
+++ b/src/wolf.h
@@ -182,7 +182,7 @@ typedef enum
 {
     LANDMARK_POINT,		  ///< A point landmark, either 3D or 2D
     LANDMARK_CORNER,	  ///< A corner landmark (2D)
-    LANDMARK_CONTAINER	///< A container landmark
+    LANDMARK_CONTAINER	///< A container landmark (2D)
 } LandmarkType;
 
 typedef enum
@@ -215,7 +215,7 @@ typedef enum
 //class VehicleBase;
 
 class NodeTerminus;
-class RadarOdom+;
+class WolfProblem;
 class MapBase;
 class LandmarkBase;
 class LandmarkCorner2D;
@@ -246,7 +246,7 @@ class PinHole;
 
 //Problem
 //typedef std::shared_ptr<WolfProblem> WolfProblemShPtr;
-typedef RadarOdom+* WolfProblemPtr;
+typedef WolfProblem* WolfProblemPtr;
 
 //Map
 typedef std::list<MapBase*> MapBaseList;
diff --git a/src/wolf_manager.h b/src/wolf_manager.h
index 54fe4c158364fd76be547ff11d282f52d7b0d701..ab8c68ffcb19a4f5a57d40c92c149bffaaa72cf2 100644
--- a/src/wolf_manager.h
+++ b/src/wolf_manager.h
@@ -45,7 +45,7 @@ class WolfManager
 {
     protected:
         //sets the problem 
-        RadarOdom+* problem_;
+        WolfProblem* problem_;
 
         //pointer to a sensor providing predictions
         SensorBase* sensor_prior_;
@@ -84,9 +84,9 @@ class WolfManager
 
         void update();
 
-        Eigen::VectorXs getVehiclePose();
+        Eigen::VectorXs getVehiclePose(const TimeStamp& _now = 0);
 
-        RadarOdom+* getProblemPtr();
+        WolfProblem* getProblemPtr();
 
         void setWindowSize(const unsigned int& _size);
 
@@ -105,7 +105,7 @@ WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::Wol
                                                                                          const unsigned int& _w_size,
                                                                                          const WolfScalar& _new_frame_elapsed_time) :
                     
-        problem_(new RadarOdom+(_state_length)),
+        problem_(new WolfProblem(_state_length)),
         sensor_prior_(_sensor_prior),
         current_frame_(nullptr),
         last_frame_(nullptr),
@@ -129,7 +129,7 @@ WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::Wol
     first_window_frame_++;
 
     // Initial covariance (fake ODOM 2D capture from fake frame to initial frame)
-    CaptureRelative* initial_covariance = new CaptureOdom2D(TimeStamp(0), nullptr, Eigen::Vector3s::Zero(), _init_frame_cov);
+    CaptureRelative* initial_covariance = new CaptureOdom2D(TimeStamp(0), TimeStamp(0), nullptr, Eigen::Vector3s::Zero(), _init_frame_cov);
     last_frame_->addCapture(initial_covariance);
     initial_covariance->processCapture();
     last_capture_relative_ = initial_covariance;
@@ -149,10 +149,23 @@ WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::~Wo
 template <class StatePositionT, class StateOrientationT, class StateVelocityT, class StateOmegaT>
 void WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::createFrame(const Eigen::VectorXs& _frame_state, const TimeStamp& _time_stamp)
 {
-    std::cout << "creating new frame..." << std::endl;
+    //std::cout << "creating new frame..." << std::endl;
 
     assert(_frame_state.size() == StatePositionT::BLOCK_SIZE + StateOrientationT::BLOCK_SIZE + StateVelocityT::BLOCK_SIZE + StateOmegaT::BLOCK_SIZE && "Wrong frame vector when creating a new frame");
 
+    // Process current frame non-odometry captures
+    if (current_frame_ != nullptr)
+    {
+        //std::cout << "Processing last frame non-odometry captures " << current_frame_->getCaptureListPtr()->size() << std::endl;
+        for (auto capture_it = current_frame_->getCaptureListPtr()->begin(); capture_it != current_frame_->getCaptureListPtr()->end(); capture_it++)
+            if ((*capture_it)->getSensorPtr() != sensor_prior_)
+            {
+                //std::cout << "processing capture " << (*capture_it)->nodeId() << std::endl;
+                (*capture_it)->processCapture();
+            }
+    }
+    //std::cout << "Last frame non-odometry captures processed" << std::endl;
+
     // Store last frame
     last_frame_ = current_frame_;
 
@@ -192,13 +205,13 @@ void WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>
 
     // Fixing or removing old frames
     manageWindow();
-    std::cout << "new frame created" << std::endl;
+    //std::cout << "new frame created" << std::endl;
 }
 
 template <class StatePositionT, class StateOrientationT, class StateVelocityT, class StateOmegaT>
 void WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::createFrame(const TimeStamp& _time_stamp)
 {
-    std::cout << "creating new frame from prior..." << std::endl;
+    //std::cout << "creating new frame from prior..." << std::endl;
     createFrame(last_capture_relative_->computePrior(_time_stamp), _time_stamp);
 }
 
@@ -206,15 +219,15 @@ template <class StatePositionT, class StateOrientationT, class StateVelocityT, c
 void WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::addCapture(CaptureBase* _capture)
 {
     new_captures_.push(_capture);
-    std::cout << "added new capture: " << _capture->nodeId() << " stamp: ";
-    _capture->getTimeStamp().print();
-    std::cout << std::endl;
+    //std::cout << "added new capture: " << _capture->nodeId() << " stamp: ";
+    //_capture->getTimeStamp().print();
+    //std::cout << std::endl;
 }
 
 template <class StatePositionT, class StateOrientationT, class StateVelocityT, class StateOmegaT>
 void WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::manageWindow()
 {
-    std::cout << "managing window..." << std::endl;
+    //std::cout << "managing window..." << std::endl;
     // WINDOW of FRAMES (remove or fix old frames)
     if (problem_->getTrajectoryPtr()->getFrameListPtr()->size() > window_size_+1)
     {
@@ -223,22 +236,22 @@ void WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>
         (*first_window_frame_)->fix();
         first_window_frame_++;
     }
-    std::cout << "window managed" << std::endl;
+    //std::cout << "window managed" << std::endl;
 }
 
 template <class StatePositionT, class StateOrientationT, class StateVelocityT, class StateOmegaT>
 bool WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::checkNewFrame(CaptureBase* new_capture)
 {
-    std::cout << "checking if new frame..." << std::endl;
+    //std::cout << "checking if new frame..." << std::endl;
     // TODO: not only time, depending on the sensor...
-    std::cout << new_capture->getTimeStamp().get() - last_frame_->getTimeStamp().get() << std::endl;
+    //std::cout << new_capture->getTimeStamp().get() - last_frame_->getTimeStamp().get() << std::endl;
     return new_capture->getTimeStamp().get() - last_frame_->getTimeStamp().get() > new_frame_elapsed_time_;
 }
 
 template <class StatePositionT, class StateOrientationT, class StateVelocityT, class StateOmegaT>
 void WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::update()
 {
-    std::cout << "updating..." << std::endl;
+    //std::cout << "updating..." << std::endl;
     while (!new_captures_.empty())
     {
         // EXTRACT NEW CAPTURE
@@ -255,7 +268,7 @@ void WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>
         // ODOMETRY SENSOR
         if (new_capture->getSensorPtr() == sensor_prior_)
         {
-            std::cout << "adding odometry capture..." << new_capture->nodeId() << std::endl;
+            //std::cout << "adding odometry capture..." << new_capture->nodeId() << std::endl;
             // NEW KEY FRAME ?
             if (checkNewFrame(new_capture))
                 createFrame(new_capture->getTimeStamp());
@@ -274,41 +287,42 @@ void WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>
         }
         else
         {
-            std::cout << "adding not odometry capture..." << new_capture->nodeId() << std::endl;
+            //std::cout << "adding not odometry capture..." << new_capture->nodeId() << std::endl;
             // NEW KEY FRAME ?
             if (checkNewFrame(new_capture))
                 createFrame(new_capture->getTimeStamp());
 
             // ADD CAPTURE TO THE CURRENT FRAME (or substitute the same sensor previous capture)
-            std::cout << "searching repeated capture..." << new_capture->nodeId() << std::endl;
+            //std::cout << "searching repeated capture..." << new_capture->nodeId() << std::endl;
             CaptureBaseIter repeated_capture_it = current_frame_->hasCaptureOf(new_capture->getSensorPtr());
 
             if (repeated_capture_it != current_frame_->getCaptureListPtr()->end()) // repeated capture
             {
-                std::cout << "repeated capture, keeping old capture" << new_capture->nodeId() << std::endl;
-                //current_frame_->removeCapture(repeated_capture_it);
+                //std::cout << "repeated capture, keeping new capture" << new_capture->nodeId() << std::endl;
+                current_frame_->removeCapture(repeated_capture_it);
+                current_frame_->addCapture(new_capture);
             }
             else
             {
-                std::cout << "not repeated, adding capture..." << new_capture->nodeId() << std::endl;
-                last_frame_->addCapture(new_capture);
-                std::cout << "processing capture..." << new_capture->nodeId() << std::endl;
-                new_capture->processCapture();
-                std::cout << "processed" << std::endl;
+                //std::cout << "not repeated, adding capture..." << new_capture->nodeId() << std::endl;
+                current_frame_->addCapture(new_capture);
             }
         }
     }
-    std::cout << "updated" << std::endl;
+    //std::cout << "updated" << std::endl;
 }
 
 template <class StatePositionT, class StateOrientationT, class StateVelocityT, class StateOmegaT>
 Eigen::VectorXs WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::getVehiclePose(const TimeStamp& _now)
 {
-    return last_capture_relative_->computePrior(_now);
+    if (last_capture_relative_ == nullptr)
+        return Eigen::Map<Eigen::Vector3s>(current_frame_->getPPtr()->getPtr());
+    else
+        return last_capture_relative_->computePrior(_now);
 }
 
 template <class StatePositionT, class StateOrientationT, class StateVelocityT, class StateOmegaT>
-RadarOdom+* WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::getProblemPtr()
+WolfProblem* WolfManager<StatePositionT, StateOrientationT, StateVelocityT, StateOmegaT>::getProblemPtr()
 {
     return problem_;
 }
diff --git a/src/wolf_problem.cpp b/src/wolf_problem.cpp
index 625fc62f635389a4c9438f22930a294b78ee45fd..3b794498e5c4a517d90678002f790dc8f36da059 100644
--- a/src/wolf_problem.cpp
+++ b/src/wolf_problem.cpp
@@ -1,6 +1,6 @@
 #include "wolf_problem.h"
 
-RadarOdom+::WolfProblem(unsigned int _size) :
+WolfProblem::WolfProblem(unsigned int _size) :
         NodeBase("WOLF_PROBLEM"), //
         state_(_size),
         covariance_(_size,_size),
@@ -16,7 +16,7 @@ RadarOdom+::WolfProblem(unsigned int _size) :
 	trajectory_ptr_->linkToUpperNode( this );
 }
 
-RadarOdom+::WolfProblem(TrajectoryBase* _trajectory_ptr, MapBase* _map_ptr, unsigned int _size) :
+WolfProblem::WolfProblem(TrajectoryBase* _trajectory_ptr, MapBase* _map_ptr, unsigned int _size) :
         NodeBase("WOLF_PROBLEM"), //
 		state_(_size),
         covariance_(_size,_size),
@@ -30,13 +30,13 @@ RadarOdom+::WolfProblem(TrajectoryBase* _trajectory_ptr, MapBase* _map_ptr, unsi
 	trajectory_ptr_->linkToUpperNode( this );
 }
 
-RadarOdom+::~RadarOdom+()
+WolfProblem::~WolfProblem()
 {
 	delete trajectory_ptr_;
 	delete map_ptr_;
 }
 
-bool RadarOdom+::addState(StateBase* _new_state_ptr, const Eigen::VectorXs& _new_state_values)
+bool WolfProblem::addState(StateBase* _new_state_ptr, const Eigen::VectorXs& _new_state_values)
 {
 	// Check if resize should be done
 	if (state_idx_last_+_new_state_ptr->getStateSize() > state_.size())
@@ -73,7 +73,7 @@ bool RadarOdom+::addState(StateBase* _new_state_ptr, const Eigen::VectorXs& _new
 	return reallocated_;
 }
 
-void RadarOdom+::addCovarianceBlock(StateBase* _state1, StateBase* _state2, const Eigen::MatrixXs& _cov)
+void WolfProblem::addCovarianceBlock(StateBase* _state1, StateBase* _state2, const Eigen::MatrixXs& _cov)
 {
     assert(_state1 != nullptr);
     assert(_state1->getPtr() != nullptr);
@@ -101,7 +101,7 @@ void RadarOdom+::addCovarianceBlock(StateBase* _state1, StateBase* _state2, cons
            covariance_.coeffRef(i+row,j+col) = (flip ? _cov(j,i) : _cov(i,j));
 }
 
-void RadarOdom+::getCovarianceBlock(StateBase* _state1, StateBase* _state2, Eigen::MatrixXs& _cov_block) const
+void WolfProblem::getCovarianceBlock(StateBase* _state1, StateBase* _state2, Eigen::MatrixXs& _cov_block) const
 {
     assert(_state1 != nullptr);
     assert(_state1->getPtr() != nullptr);
@@ -126,7 +126,7 @@ void RadarOdom+::getCovarianceBlock(StateBase* _state1, StateBase* _state2, Eige
     _cov_block = (flip ? Eigen::MatrixXs(covariance_.block(row, col, block_rows, block_cols)) : Eigen::MatrixXs(covariance_.block(row, col, block_rows, block_cols)).transpose() );
 }
 
-void RadarOdom+::getCovarianceBlock(StateBase* _state1, StateBase* _state2, Eigen::Map<Eigen::MatrixXs>& _cov_block) const
+void WolfProblem::getCovarianceBlock(StateBase* _state1, StateBase* _state2, Eigen::Map<Eigen::MatrixXs>& _cov_block) const
 {
     assert(_state1 != nullptr);
     assert(_state1->getPtr() != nullptr);
@@ -151,7 +151,7 @@ void RadarOdom+::getCovarianceBlock(StateBase* _state1, StateBase* _state2, Eige
     _cov_block = (flip ? Eigen::MatrixXs(covariance_.block(row, col, block_rows, block_cols)).transpose() : Eigen::MatrixXs(covariance_.block(row, col, block_rows, block_cols)) );
 }
 
-void RadarOdom+::removeState(StateBase* _state_ptr)
+void WolfProblem::removeState(StateBase* _state_ptr)
 {
 	// TODO: Reordering? Mandatory for filtering...
 	state_list_.remove(_state_ptr);
@@ -159,93 +159,93 @@ void RadarOdom+::removeState(StateBase* _state_ptr)
 	delete _state_ptr;
 }
 
-WolfScalar* RadarOdom+::getStatePtr()
+WolfScalar* WolfProblem::getStatePtr()
 {
 	return state_.data();
 }
 
-WolfScalar* RadarOdom+::getNewStatePtr()
+WolfScalar* WolfProblem::getNewStatePtr()
 {
 	return state_.data()+state_idx_last_;
 }
 
-const unsigned int RadarOdom+::getStateSize() const
+const unsigned int WolfProblem::getStateSize() const
 {
 	return state_idx_last_;
 }
 
-void RadarOdom+::addMap(MapBase* _map_ptr)
+void WolfProblem::addMap(MapBase* _map_ptr)
 {
 	map_ptr_ = _map_ptr;
 	map_ptr_->linkToUpperNode( this );
 }
 
-void RadarOdom+::addTrajectory(TrajectoryBase* _trajectory_ptr)
+void WolfProblem::addTrajectory(TrajectoryBase* _trajectory_ptr)
 {
 	trajectory_ptr_ = _trajectory_ptr;
 	trajectory_ptr_->linkToUpperNode( this );
 }
 
-MapBase* RadarOdom+::getMapPtr()
+MapBase* WolfProblem::getMapPtr()
 {
 	return map_ptr_;
 }
 
-TrajectoryBase* RadarOdom+::getTrajectoryPtr()
+TrajectoryBase* WolfProblem::getTrajectoryPtr()
 {
 	return trajectory_ptr_;
 }
 
-FrameBase* RadarOdom+::getLastFramePtr()
+FrameBase* WolfProblem::getLastFramePtr()
 {
     return trajectory_ptr_->getLastFramePtr();
 }
 
-StateBaseList* RadarOdom+::getStateListPtr()
+StateBaseList* WolfProblem::getStateListPtr()
 {
 	return &state_list_;
 }
 
-std::list<WolfScalar*>* RadarOdom+::getRemovedStateListPtr()
+std::list<WolfScalar*>* WolfProblem::getRemovedStateListPtr()
 {
 	return &removed_state_ptr_list_;
 }
 
-void RadarOdom+::print(unsigned int _ntabs, std::ostream& _ost) const
+void WolfProblem::print(unsigned int _ntabs, std::ostream& _ost) const
 {
     printSelf(_ntabs, _ost); //one line
     printLower(_ntabs, _ost);
 }
 
-void RadarOdom+::printSelf(unsigned int _ntabs, std::ostream& _ost) const
+void WolfProblem::printSelf(unsigned int _ntabs, std::ostream& _ost) const
 {
     printTabs(_ntabs);
     _ost << nodeLabel() << " " << nodeId() << " : ";
     _ost << "TOP" << std::endl;
 }
 
-const Eigen::VectorXs RadarOdom+::getState() const
+const Eigen::VectorXs WolfProblem::getState() const
 {
 	return state_;
 }
 
-bool RadarOdom+::isReallocated() const
+bool WolfProblem::isReallocated() const
 {
 	return reallocated_;
 }
 
 
-void RadarOdom+::reallocationDone()
+void WolfProblem::reallocationDone()
 {
 	reallocated_ = false;
 }
 
-RadarOdom+* RadarOdom+::getTop()
+WolfProblem* WolfProblem::getTop()
 {
 	return this;
 }
 
-void RadarOdom+::printLower(unsigned int _ntabs, std::ostream& _ost) const
+void WolfProblem::printLower(unsigned int _ntabs, std::ostream& _ost) const
 {
     printTabs(_ntabs);
     _ost << "\tLower Nodes  ==> [ ";
diff --git a/src/wolf_problem.h b/src/wolf_problem.h
index f6b57b59a8043c7ed723f8f1876fbf8d40ccd7bd..e8bbe5f8c3df416a474a57e95d1f28f217bc4c43 100644
--- a/src/wolf_problem.h
+++ b/src/wolf_problem.h
@@ -17,7 +17,7 @@
  * - up_node_: A regular pointer to a derived node object, specified by the template parameter UpperType.
  *
  */
-class RadarOdom+: public NodeBase
+class WolfProblem: public NodeBase
 {
     protected:
         Eigen::VectorXs state_;
@@ -52,7 +52,7 @@ class RadarOdom+: public NodeBase
          * Default destructor
 		 * 
          */		
-        virtual ~RadarOdom+();
+        virtual ~WolfProblem();
 
         /** \brief Adds a new state unit to the state
 		 *
@@ -200,7 +200,7 @@ class RadarOdom+: public NodeBase
 		 * Returns a pointer to this
 		 *
 		 */
-        virtual RadarOdom+* getTop();
+        virtual WolfProblem* getTop();
 
         /** \brief Prints node information
          *