diff --git a/include/core/processor/processor_motion.h b/include/core/processor/processor_motion.h
index 8533e66caf5da96a06680098b44236a4fb420482..41787e38eee63f02fec7012f64684a4b887c5537 100644
--- a/include/core/processor/processor_motion.h
+++ b/include/core/processor/processor_motion.h
@@ -484,7 +484,8 @@ class ProcessorMotion : public ProcessorBase, public IsMotion
         CaptureMotionPtr origin_ptr_;
         CaptureMotionPtr last_ptr_;
         CaptureMotionPtr incoming_ptr_;
-
+        bool last_nullptr_;
+        
     protected:
         // helpers to avoid allocation
         double dt_;                             ///< Time step
diff --git a/src/processor/processor_motion.cpp b/src/processor/processor_motion.cpp
index ead3fc9e5d0bcbd56367ef12e1a703e658541478..5cb8b42909b9fe93be361983a4f664fef17ce608 100644
--- a/src/processor/processor_motion.cpp
+++ b/src/processor/processor_motion.cpp
@@ -33,6 +33,7 @@ ProcessorMotion::ProcessorMotion(const std::string& _type,
         origin_ptr_(),
         last_ptr_(),
         incoming_ptr_(),
+        last_nullptr_(false),
         dt_(0.0), 
         x_(_state_size),
         delta_(_delta_size),
@@ -95,10 +96,19 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
 
     preProcess(); // Derived class operations
 
+    // integrate data
+    if (last_ptr_ != nullptr)
+    {
+        integrateOneStep();
+    }
+    else {
+        last_nullptr_ = true;
+    }
+
     PackKeyFramePtr pack = computeProcessingStep();
     if (pack)
         buffer_pack_kf_.removeUpTo( pack->key_frame->getTimeStamp() );
-
+    
     switch(processing_step_)
     {
         case FIRST_TIME_WITHOUT_KF :
@@ -161,13 +171,15 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
 
             // extract pack elements
             FrameBasePtr keyframe_from_callback = pack->key_frame;
+            TimeStamp ts_from_callback          = keyframe_from_callback->getTimeStamp();
+            keyframe_from_callback->setState(getState(ts_from_callback));
 
             // find the capture whose buffer is affected by the new keyframe
-            auto capture_existing   = findCaptureContainingTimeStamp(keyframe_from_callback->getTimeStamp()); // k
+            auto capture_existing   = findCaptureContainingTimeStamp(ts_from_callback); // k
 
             if (!capture_existing)
             {
-                WOLF_WARN("A KF before first motion capture (TS = ", keyframe_from_callback->getTimeStamp(), "). ProcessorMotion cannot do anything.");
+                WOLF_WARN("A KF before first motion capture (TS = ", ts_from_callback, "). ProcessorMotion cannot do anything.");
                 break;
             }
 
@@ -178,7 +190,6 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
             VectorXd calib_origin   = getCalibration(capture_origin);
 
             // emplace a new motion capture to the new keyframe
-            TimeStamp ts_from_callback          = keyframe_from_callback->getTimeStamp();
             auto capture_for_keyframe_callback  = emplaceCapture(keyframe_from_callback, // j
                                                                  getSensor(),
                                                                  ts_from_callback,
@@ -260,6 +271,8 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
 
             // extract pack elements
             FrameBasePtr keyframe_from_callback = pack->key_frame;
+            TimeStamp ts_from_callback          = keyframe_from_callback->getTimeStamp();
+            keyframe_from_callback->setState(getState(ts_from_callback));
 
             auto & capture_existing = last_ptr_;
 
@@ -270,7 +283,6 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
             VectorXd calib_origin   = getCalibration(capture_origin);
 
             // emplace a new motion capture to the new keyframe
-            TimeStamp    ts_from_callback      = keyframe_from_callback->getTimeStamp();
             auto capture_for_keyframe_callback = emplaceCapture(keyframe_from_callback,
                                                                 getSensor(),
                                                                 ts_from_callback,
@@ -300,17 +312,18 @@ void ProcessorMotion::processCapture(CaptureBasePtr _incoming_ptr)
             break;
     }
 
-    ////////////////////////////////////////////////////
-    // NOW on with the received data
+    if (last_nullptr_){
+        integrateOneStep();
+        last_nullptr_ = false;
+    }
 
-    // integrate data
-    integrateOneStep();
 
     // Update state and time stamps
     const auto& ts = getTimeStamp();
     last_ptr_->setTimeStamp( ts );
     last_ptr_->getFrame()->setTimeStamp( ts );
-    last_ptr_->getFrame()->setState( getProblem()->getState( ts ) );
+    VectorComposite state_propa = getState( ts );
+    last_ptr_->getFrame()->setState( state_propa );
 
     if (permittedKeyFrame() && voteForKeyFrame())
     {