diff --git a/include/laser/processor/processor_odom_icp.h b/include/laser/processor/processor_odom_icp.h
index 0ae859483afd1b78fb2fac5723cb4c656f5aee40..5c6c16e25c2db253a23a52b07184997df8ca94a1 100644
--- a/include/laser/processor/processor_odom_icp.h
+++ b/include/laser/processor/processor_odom_icp.h
@@ -70,7 +70,6 @@ struct ProcessorParamsOdomICP : public ProcessorParamsTracker
 class ProcessorOdomICP : public ProcessorTracker
 {
     protected:
-
         // Useful sensor stuff
         SensorLaser2DPtr sensor_laser_; // casted pointer to parent
         laserscanutils::LaserScanParams laser_scan_params_;
@@ -83,31 +82,31 @@ class ProcessorOdomICP : public ProcessorTracker
         laserscanutils::icpOutput trf_origin_incoming_;
         laserscanutils::icpOutput trf_last_incoming_;
 
+    public:
+        laserscanutils::icpParams icp_params_;
+        ProcessorParamsOdomICPPtr proc_params_;
 
     public:
         ProcessorOdomICP(ProcessorParamsOdomICPPtr _params);
         virtual ~ProcessorOdomICP();
-
-        laserscanutils::icpParams icp_params_;
-        ProcessorParamsOdomICPPtr proc_params_;
+        static ProcessorBasePtr create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr);
+        static ProcessorBasePtr createAutoConf(const std::string& _unique_name, const ParamsServer& _server, const SensorBasePtr sensor_ptr);
+        virtual void configure(SensorBasePtr _sensor) override;
 
     protected:
+        virtual void preProcess() override;
+
         virtual unsigned int processKnown() override;
+        virtual unsigned int processNew(const int& _max_features) override;
 
         virtual bool voteForKeyFrame() override;
 
         virtual void advanceDerived() override;
-
-        virtual unsigned int processNew(const int& _max_features) override;
-
-        virtual void establishFactors() override;
-
         virtual void resetDerived() override;
 
-        virtual void preProcess() override;
 
+        virtual void establishFactors() override;
         FeatureBasePtr emplaceFeature(CaptureBasePtr _capture_laser);
-
         FactorBasePtr emplaceFactor(FeatureBasePtr _feature);
 
         inline bool voteForKeyFrameDistance();
@@ -115,11 +114,6 @@ class ProcessorOdomICP : public ProcessorTracker
         inline bool voteForKeyFrameTime();
         inline bool voteForKeyFrameMatchQuality();
 
-    public:
-        virtual void configure(SensorBasePtr _sensor) override;
-
-        static ProcessorBasePtr create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr);
-        static ProcessorBasePtr createAutoConf(const std::string& _unique_name, const ParamsServer& _server, const SensorBasePtr sensor_ptr);
 
 
 
diff --git a/src/processor/processor_odom_icp.cpp b/src/processor/processor_odom_icp.cpp
index 5098018960752bd65352baacfadc76fd5df42f3d..5d17f0bbbc9f9f41b22a3d63dc47df542ac7b17e 100644
--- a/src/processor/processor_odom_icp.cpp
+++ b/src/processor/processor_odom_icp.cpp
@@ -31,6 +31,21 @@ ProcessorOdomICP::~ProcessorOdomICP()
 
 }
 
+void ProcessorOdomICP::preProcess()
+{
+
+}
+
+
+
+void ProcessorOdomICP::configure(SensorBasePtr _sensor)
+{
+    sensor_laser_       = std::static_pointer_cast<SensorLaser2D>(_sensor);
+    laser_scan_params_  = sensor_laser_->getScanParams();
+}
+
+
+
 unsigned int ProcessorOdomICP::processKnown()
 {
     // Match the incoming with the origin, passing the transform from origin to last as initialization
@@ -120,20 +135,40 @@ inline bool ProcessorOdomICP::voteForKeyFrameMatchQuality()
 
 void ProcessorOdomICP::advanceDerived()
 {
-    trf_origin_last_ = trf_origin_incoming_;
-}
+    using namespace Eigen;
 
-void ProcessorOdomICP::establishFactors()
-{
-  auto ftr_ptr = emplaceFeature(last_ptr_);
-  emplaceFactor(ftr_ptr);
+    WOLF_TRACE("========================== ADVANCE =================================");
+    WOLF_TRACE("========================== ADVANCE =================================");
+    WOLF_TRACE("========================== ADVANCE =================================");
+    // overwrite last frame's state
+
+    Isometry2ds  w_T_ro = Translation2ds(origin_ptr_->getFrame()->getState().head(2)) * Rotation2Ds(origin_ptr_->getFrame()->getState()(2));
+    Isometry2ds ro_T_so = Translation2ds(origin_ptr_->getSensorP()->getState())       * Rotation2Ds(origin_ptr_->getSensorO()->getState()(0));
+
+    // incoming
+
+    Isometry2ds so_T_si = Translation2ds(trf_origin_incoming_.res_transf.head(2))     * Rotation2Ds(trf_origin_incoming_.res_transf(2));
+    Isometry2ds  w_T_ri = w_T_ro * ro_T_so * so_T_si * ro_T_so.inverse();
+    Vector3s x_inc; x_inc << w_T_ri.translation() , Rotation2Ds(w_T_ri.rotation()).angle();
+
+    WOLF_TRACE("x_inc  ", x_inc.transpose());
+
+    // Put the state of incoming in last
+    last_ptr_->getFrame()->setState(x_inc);
+
+    trf_origin_last_ = trf_origin_incoming_;
 }
 
 void ProcessorOdomICP::resetDerived()
 {
+
+    WOLF_TRACE("========================== RESET =================================");
+
     // Using processing_step_ to ensure that origin, last and incoming are different
     if (processing_step_ != FIRST_TIME_WITH_PACK && processing_step_ != FIRST_TIME_WITHOUT_PACK)
     {
+        WOLF_TRACE("========================== RESET =================================");
+        WOLF_TRACE("========================== RESET =================================");
         // Notation explanation:
         // x1_R_x2: Rotation from frame x1 to frame x2
         // x1_p_y1_y2: translation vector from y1 to y2 expressed in frame x1
@@ -141,7 +176,7 @@ void ProcessorOdomICP::resetDerived()
         // Rotation composition
         Eigen::Rotation2D<Scalar>   w_R_ro  = Eigen::Rotation2D<Scalar>(origin_ptr_->getFrame()->getState()(2));
         Eigen::Rotation2D<Scalar>   r_R_s   = Eigen::Rotation2D<Scalar>(origin_ptr_->getSensorO()->getState()(0));
-        Eigen::Rotation2D<Scalar>& ro_R_so  = r_R_s;
+        Eigen::Rotation2D<Scalar>& ro_R_so  = r_R_s; // just a ref for bettter chaining trf. names
         Eigen::Rotation2D<Scalar>  so_R_sl  = Eigen::Rotation2D<Scalar>(trf_origin_last_.res_transf(2));
 
         // Eigen::Rotation2D<Scalar> w_R_rl = w_R_ro*r_R_s*so_R_sl*r_R_s.inverse();
@@ -161,6 +196,8 @@ void ProcessorOdomICP::resetDerived()
         curr_state.head(2)  = w_p_w_rl;
         curr_state(2)       = origin_ptr_->getFrame()->getState()(2) + trf_origin_last_.res_transf(2);
 
+        WOLF_TRACE("x_last ", curr_state.transpose());
+
         last_ptr_->getFrame()->setState(curr_state);
         std::cout << "[KEY FRAME DONE: ]" << '\n';
         std::cout << "Current state" << last_ptr_->getFrame()->getState() << '\n';
@@ -169,17 +206,28 @@ void ProcessorOdomICP::resetDerived()
     }
 }
 
-void ProcessorOdomICP::configure(SensorBasePtr _sensor)
+void ProcessorOdomICP::establishFactors()
 {
-    sensor_laser_       = std::static_pointer_cast<SensorLaser2D>(getSensor());
-    laser_scan_params_  = sensor_laser_->getScanParams();
+  auto ftr_ptr = emplaceFeature(last_ptr_);
+  emplaceFactor(ftr_ptr);
 }
 
-void ProcessorOdomICP::preProcess()
+FeatureBasePtr ProcessorOdomICP::emplaceFeature(CaptureBasePtr _capture_laser)
 {
+    CaptureLaser2DPtr capture_laser = std::static_pointer_cast<CaptureLaser2D>(_capture_laser);
+    return FeatureBase::emplace<FeatureICPAlign>(capture_laser,
+                                                trf_origin_last_);
+}
 
+FactorBasePtr ProcessorOdomICP::emplaceFactor(FeatureBasePtr _feature)
+{
+    return FactorBase::emplace<FactorOdom2D>(_feature, _feature, origin_ptr_->getFrame(),
+                                                      shared_from_this());
 }
 
+
+
+/// FACTORY METHODS -- to be replaced by macro after PR !313 addressing issue #248 is merged.
 ProcessorBasePtr ProcessorOdomICP::create(const std::string& _unique_name, const ProcessorParamsBasePtr _params, const SensorBasePtr)
 {
     ProcessorOdomICPPtr prc_ptr;
@@ -209,19 +257,6 @@ ProcessorBasePtr ProcessorOdomICP::createAutoConf(const std::string& _unique_nam
     return prc_ptr;
 }
 
-FeatureBasePtr ProcessorOdomICP::emplaceFeature(CaptureBasePtr _capture_laser)
-{
-    CaptureLaser2DPtr capture_laser = std::static_pointer_cast<CaptureLaser2D>(_capture_laser);
-    return FeatureBase::emplace<FeatureICPAlign>(capture_laser,
-                                                trf_origin_last_);
-}
-
-FactorBasePtr ProcessorOdomICP::emplaceFactor(FeatureBasePtr _feature)
-{
-    return FactorBase::emplace<FactorOdom2D>(_feature, _feature, origin_ptr_->getFrame(),
-                                                      shared_from_this());
-}
-
 
 
 // Register in the SensorFactory