diff --git a/src/processor/processor_tracker.cpp b/src/processor/processor_tracker.cpp
index d00fa30bf291483edf696086902cab57c913963c..48c7cc51a42ca9f9cbf8f7d586f99d9851666b6a 100644
--- a/src/processor/processor_tracker.cpp
+++ b/src/processor/processor_tracker.cpp
@@ -95,25 +95,12 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
             }
             else
             {
-                WOLF_DEBUG("PT ", getName(), " Incoming capture had not been processed previously!")
-                // Append incoming to KF
+                WOLF_DEBUG("PT ", getName(), " Incoming capture had not been processed by any other processor!")
+                
+                // Join KF
                 incoming_ptr_->link(keyframe_from_callback);
             }
 
-
-            // // Check if incoming has already a Frame
-            // auto frame_incoming = incoming_ptr_->getFrame();
-            // if (frame_incoming != nullptr and keyframe_from_callback == frame_incoming)
-            // {
-            //     WOLF_DEBUG("PT ", getName(), " Incoming capture had been processed previously!")
-            // }
-            // else
-            // {
-            //     WOLF_DEBUG("PT ", getName(), " Incoming capture had not been processed previously!")
-            //     // Append incoming to KF
-            //     incoming_ptr_->link(keyframe_from_callback);
-            // }
-            // Process info
             // TrackerFeature:  We only process new features in Last, here last = nullptr, so we do not have anything to do.
             // TrackerLandmark: If we have been given a map, all landmarks in the map are known. Process them.
             if (not getProblem()->getMap()->getLandmarkList().empty())
@@ -133,36 +120,19 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
         {
             WOLF_DEBUG( "PT ", getName(), " FIRST_TIME_WITHOUT_KEYFRAME" );
 
-
-            FrameBasePtr keyframe;
-
             // Check if incoming has already a Frame
             auto frame_incoming = incoming_ptr_->getFrame();
-            if (frame_incoming != nullptr)
-            {
-                WOLF_DEBUG("PT ", getName(), "Incoming capture had been processed previously!")
-                assert(frame_incoming->getCaptureOf(getSensor()) == incoming_ptr_ && " Incoming has a frame, but not from a capture of this sensor");
-                keyframe = frame_incoming;
+            assert(frame_incoming == nullptr and " Incoming capture has been processed and linked by another processor, but no keyframe callback was received!");
 
-                // We do not link incoming to keyframe since it is already linked
+            WOLF_DEBUG("PT ", getName(), " Incoming capture has not been processed by another processor!")
 
-                // We do not issue KF callback since the KF was already there
-            }
-            else
-            {
-                WOLF_DEBUG("PT ", getName(), " Incoming capture had not been processed previously!")
-
-                // make a new KF at incoming
-                keyframe = FrameBase::emplace<FrameBase>(getProblem()->getTrajectory(),
-                                                                    incoming_ptr_->getTimeStamp(),
-                                                                    getProblem()->getFrameStructure(),
-                                                                    getProblem()->getState());
-                // Append incoming to KF
-                incoming_ptr_->link(keyframe);
-
-                // Issue KF callback with new KF
-                getProblem()->keyFrameCallback(keyframe, shared_from_this());
-            }
+            // make a new KF at incoming
+            FrameBasePtr keyframe = FrameBase::emplace<FrameBase>(getProblem()->getTrajectory(),
+                                                                incoming_ptr_->getTimeStamp(),
+                                                                getProblem()->getFrameStructure(),
+                                                                getProblem()->getState(incoming_ptr_->getTimeStamp()));
+            // Append incoming to KF
+            incoming_ptr_->link(keyframe);
 
             // Process info
             // TrackerFeature:  We only process new features in Last, here last = nullptr, so we do not have anything to do.
@@ -170,6 +140,9 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
             if (not getProblem()->getMap()->getLandmarkList().empty())
                 processKnown();
 
+            // Issue KF callback with new KF
+            getProblem()->keyFrameCallback(keyframe, shared_from_this());
+
             // Reset this
             resetDerived();
             // Update pointers
@@ -204,13 +177,10 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
             // Make a NON KEY Frame to hold incoming capture
             FrameBasePtr frame = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(),
                                                                 getProblem()->getFrameStructure(),
-                                                                getProblem()->getState());
-            // incoming_ptr_->link(frame);
+                                                                getProblem()->getState(incoming_ptr_->getTimeStamp()));
 
-            // Process info
-            // If we have known landmarks or features. Process them.
-            if (not getProblem()->getMap()->getLandmarkList().empty() or not known_features_last_.empty())
-                processKnown();
+            // Process known information
+            processKnown();
             
             // Both Trackers:  We have a last_ Capture with not enough features, so populate it.
             processNew(params_tracker_->max_new_features);
@@ -239,21 +209,21 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
             processKnown();
 
             // chack if the received KF has a capture of this sensor, and if it matches with last_ptr
-            // check if the callback keyframe has a capture of this sensor
-            auto capture_from_callback = keyframe_from_callback->getCaptureOf(this->getSensor());
-
-            if (last_ptr_ == capture_from_callback)
+            if (last_ptr_ == keyframe_from_callback->getCaptureOf(this->getSensor()))
             {
+                WOLF_DEBUG("PT ", getName(), " Last capture has been processed previously by another processor!")
+
                 // If captures match, then frames must match too
-                assert(last_ptr_->getFrame() != nullptr 
-                        and last_ptr_->getFrame() == keyframe_from_callback 
+                assert( last_ptr_->getFrame() == keyframe_from_callback 
                         and "The keyframe has a Capture from this sensor, but this capture is not last!");
-                WOLF_DEBUG("PT ", getName(), " Last capture has been processed previously by another processor!")
+
+                // No need to join KF since it is the same capture, and it was already joined by the other processor
             }
             else
             {
                 WOLF_DEBUG("PT ", getName(), " Last capture had not been processed previously!")
-                // Append incoming to KF
+                
+                // join KF
                 last_ptr_->link(keyframe_from_callback);
             }
 
@@ -261,7 +231,6 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
             FrameBasePtr frame = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(),
                                                            getProblem()->getFrameStructure(),
                                                            getProblem()->getState());
-            // incoming_ptr_->link(frame);
 
             // Detect new Features, initialize Landmarks, ...
             processNew(params_tracker_->max_new_features);
@@ -299,7 +268,7 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
                 // Establish factors
                 establishFactors();
 
-                // Call the new keyframe callback in order to let the other processors to establish their factors
+                // Call the new keyframe callback in order to let the other processors to join
                 getProblem()->keyFrameCallback(last_frame_ptr_, shared_from_this());
 
 
@@ -307,7 +276,6 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
                 FrameBasePtr frame = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(),
                                                                  getProblem()->getFrameStructure(),
                                                                  getProblem()->getState(incoming_ptr_->getTimeStamp()));
-                // incoming_ptr_   ->link(frame);
 
                 // Reset this
                 resetDerived();
@@ -326,8 +294,6 @@ void ProcessorTracker::processCapture(CaptureBasePtr _incoming_ptr)
                 FrameBasePtr frame = std::make_shared<FrameBase>(incoming_ptr_->getTimeStamp(),
                                                                  getProblem()->getFrameStructure(),
                                                                  getProblem()->getState(incoming_ptr_->getTimeStamp()));
-                // incoming_ptr_->link(frame);
-                // last_ptr_->unlink(); // unlink last (destroying the frame) instead of frame destruction that would implicitly destroy last
 
                 // Advance this
                 advanceDerived();