diff --git a/src/processor/track_matrix.cpp b/src/processor/track_matrix.cpp
index 9e385b519511301e2083bf9caf1600d19bb1cfae..b6af398c7270b4881553eeb5fad941601138e480 100644
--- a/src/processor/track_matrix.cpp
+++ b/src/processor/track_matrix.cpp
@@ -220,8 +220,26 @@ CaptureBasePtr TrackMatrix::firstCapture(size_t _track_id)
 
 Track TrackMatrix::trackAtKeyframes(size_t _track_id)
 {
-    if (tracks_kf_.count(_track_id) > 0)
-        return tracks_kf_.at(_track_id);
+//    // This requires tracks_kf_
+//    if (tracks_kf_.count(_track_id) > 0)
+//        return tracks_kf_.at(_track_id);
+//    else
+//        return Track();
+
+
+    // This does not require any tracks_kf_; it assembles a track_kf on the fly by checking each capture's frame.
+    if (tracks_.count(_track_id))
+    {
+        Track track_kf;
+        for (auto& pair_ts_ftr : tracks_.at(_track_id))
+        {
+            auto& ts  = pair_ts_ftr.first;
+            auto& ftr = pair_ts_ftr.second;
+            if (ftr && ftr->getCapture() && ftr->getCapture()->getFrame() && ftr->getCapture()->getFrame()->isKey())
+                track_kf[ts] = ftr;
+        }
+        return track_kf;
+    }
     else
         return Track();
 }
@@ -250,14 +268,21 @@ bool TrackMatrix::markKeyframe(CaptureBasePtr _capture)
 bool TrackMatrix::unmarkKeyframe(CaptureBasePtr _capture)
 {
     bool removed = false;
-    auto ts = _capture->getTimeStamp();
-    for (auto pair_id_trk : tracks_kf_)
+    if (_capture)
     {
-        if (pair_id_trk.second.erase(ts))
+        auto ts = _capture->getTimeStamp();
+        for (auto& pair_id_trk : tracks_kf_)
         {
-            if (pair_id_trk.second.empty())
-                tracks_kf_.erase(pair_id_trk.first);
-            removed = true;
+            if (pair_id_trk.second.erase(ts))   // remove feature from track
+            {
+                if (pair_id_trk.second.empty()) // remove empty tracks
+                {
+                    tracks_kf_.erase(pair_id_trk.first);
+                    if (tracks_kf_.empty())
+                        break;
+                }
+                removed = true;
+            }
         }
     }
     return removed;
diff --git a/test/gtest_track_matrix.cpp b/test/gtest_track_matrix.cpp
index e9b3a620c382ebb1404546874879e4c519f6f192..a11537156af399c2b6018c643f51c9fef78cd9aa 100644
--- a/test/gtest_track_matrix.cpp
+++ b/test/gtest_track_matrix.cpp
@@ -403,6 +403,8 @@ TEST_F(TrackMatrixTest, trackAtKeyframes)
 
     wolf::Track trk_kf_0 = track_matrix.trackAtKeyframes(f0->trackId());
     ASSERT_EQ(trk_kf_0.size(), 2);
+    ASSERT_EQ(trk_kf_0[0.0], f0);
+    ASSERT_EQ(trk_kf_0[4.0], f4);
 
     wolf::Track trk_kf_1 = track_matrix.trackAtKeyframes(f3->trackId());
     ASSERT_EQ(trk_kf_1.size(), 0);