diff --git a/src/processor/processor_visual_odometry.cpp b/src/processor/processor_visual_odometry.cpp
index 151cd31fdf64f1bf474e7083be4e786364b1de45..e9a807b6fe8719c92bf9f995781d8a1fd23c362c 100644
--- a/src/processor/processor_visual_odometry.cpp
+++ b/src/processor/processor_visual_odometry.cpp
@@ -68,6 +68,7 @@ TracksMap ProcessorVisualOdometry::mergeTracks(TracksMap tracks_prev_curr, Track
 
 void ProcessorVisualOdometry::preProcess()
 {
+
     auto t1 = std::chrono::system_clock::now();
     
     // Get Capture
@@ -127,8 +128,9 @@ void ProcessorVisualOdometry::preProcess()
 
     // TracksMap between last and incoming
     // Input: ID of Wkp in last. Output: ID of the tracked Wkp in incoming.
+    WOLF_INFO( "Tracking " , mwkps_last.size(), " keypoints in last" );
     TracksMap tracks_last_incoming = kltTrack(img_last, img_incoming, mwkps_last, mwkps_incoming);
-    WOLF_INFO( "Tracked " , mwkps_incoming.size(), " keypoints..." );
+    WOLF_INFO( "Tracked " , mwkps_incoming.size(), " keypoints to incoming" );
 
     // TracksMap between origin and last
     // Input: ID of Wkp in origin. Output: ID of the tracked Wkp in last.
@@ -223,11 +225,13 @@ void ProcessorVisualOdometry::preProcess()
     auto dt_preprocess = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now() - t1).count();
     WOLF_INFO( "dt_preprocess (ms): " , dt_preprocess );
 
+
 }
 
 
 unsigned int ProcessorVisualOdometry::processKnown()
 {
+
     auto t1 = std::chrono::system_clock::now();
     // Extend the process track matrix by using information stored in the incoming capture
 
@@ -319,12 +323,21 @@ void ProcessorVisualOdometry::establishFactors()
     //        For bookkeeping, define the landmark id as the track id.
 
     std::list<FeatureBasePtr> tracks_snapshot_last = track_matrix_.snapshotAsList(last_ptr_);
-    for (auto feat: tracks_snapshot_last){
+
+    if(tracks_snapshot_last.empty())
+    {
+        WOLF_WARN("Trying to establish factors but no features exist in last Capture!");
+        return;
+    }
+
+    for (auto feat: tracks_snapshot_last)
+    {
         auto feat_pi = std::static_pointer_cast<FeaturePointImage>(feat);
 
         // verify if a landmark is associated to this track (BAD implementation)
         LandmarkBasePtr associated_lmk = nullptr;
-        for (auto lmk: getProblem()->getMap()->getLandmarkList()){
+        for (auto lmk: getProblem()->getMap()->getLandmarkList())
+        {
             if (lmk->id() == feat_pi->trackId()){
                 associated_lmk = lmk;
             }
@@ -350,6 +363,7 @@ void ProcessorVisualOdometry::establishFactors()
         }
     }
 
+    return;
 }
 
 LandmarkBasePtr ProcessorVisualOdometry::emplaceLandmark(FeatureBasePtr _feat)
@@ -403,6 +417,7 @@ void ProcessorVisualOdometry::postProcess()
 
 bool ProcessorVisualOdometry::voteForKeyFrame() const
 {
+
     // If the last capture was repopulated in preProcess, it means that the number of tracks fell
     // below a threshold in the current incoming track and that, as a consequence, last capture keypoints
     // was repopulated. In this case, the processor needs to create a new Keyframe whatever happens.
@@ -415,6 +430,7 @@ bool ProcessorVisualOdometry::voteForKeyFrame() const
     vote = vote || incoming_ptr_->getFeatureList().size() < params_visual_odometry_->min_features_for_keyframe;
 
     std::cout << "vote " << vote << std::endl;
+
     return vote;
 }
 
@@ -440,6 +456,8 @@ void ProcessorVisualOdometry::setParams(const ParamsProcessorVisualOdometryPtr _
 
 TracksMap ProcessorVisualOdometry::kltTrack(const cv::Mat _img_prev, const cv::Mat _img_curr, const KeyPointsMap &_mwkps_prev, KeyPointsMap &_mwkps_curr)
 {
+    if (_mwkps_prev.empty()) return TracksMap();
+
     TracksMap tracks_prev_curr;
 
     // Create cv point list for tracking, we initialize optical flow with previous keypoints
@@ -456,6 +474,8 @@ TracksMap ProcessorVisualOdometry::kltTrack(const cv::Mat _img_prev, const cv::M
     std::vector<uchar> status;
     std::vector<float> err;
 
+
+
     // Process one way: previous->current with current init with previous
     ParamsProcessorVisualOdometry::KltParams prms = params_visual_odometry_->klt_params_;
     cv::calcOpticalFlowPyrLK(
@@ -506,6 +526,7 @@ TracksMap ProcessorVisualOdometry::kltTrack(const cv::Mat _img_prev, const cv::M
 
 bool ProcessorVisualOdometry::filterWithEssential(const KeyPointsMap _mwkps_prev, const KeyPointsMap _mwkps_curr, TracksMap &_tracks_prev_curr, cv::Mat &_E)
 {
+
     // We need to build lists of pt2f for openCV function
     std::vector<cv::Point2f> p2f_prev, p2f_curr;
     std::vector<size_t> all_indices;
@@ -533,6 +554,7 @@ bool ProcessorVisualOdometry::filterWithEssential(const KeyPointsMap _mwkps_prev
             _tracks_prev_curr.erase(all_indices.at(k));
         }
     }
+
     return true;
 }