diff --git a/include/core/processor/track_matrix.h b/include/core/processor/track_matrix.h
index f609dc8efefbbb6fb7c74b7dac46ec8f052b0403..3b06c46381d24a2191ec271b7a741b121b26fbbb 100644
--- a/include/core/processor/track_matrix.h
+++ b/include/core/processor/track_matrix.h
@@ -45,8 +45,8 @@ using std::list;
 using std::pair;
 using std::shared_ptr;
 
-typedef map<TimeStamp, FeatureBasePtr>                                Track;
-typedef map<TimeStamp, FeatureBaseConstPtr>                           TrackConst;
+typedef map<TimeStamp, FeatureBasePtr>                                 Track;
+typedef map<TimeStamp, FeatureBaseConstPtr>                            TrackConst;
 typedef map<SizeStd, FeatureBasePtr >                                  Snapshot;
 typedef map<SizeStd, FeatureBaseConstPtr >                             SnapshotConst;
 typedef map<SizeStd, pair<FeatureBasePtr, FeatureBasePtr> >            TrackMatches; // matched feature pairs indexed by track_id
@@ -102,41 +102,40 @@ class TrackMatrix
         TrackMatrix();
         virtual ~TrackMatrix();
 
-        void            newTrack    (FeatureBasePtr _ftr);
-        void            add         (const SizeStd& _track_id, const FeatureBasePtr& _ftr);
-        void            add         (const FeatureBasePtr& _ftr_existing, const FeatureBasePtr&  _ftr_new);
-        void            remove      (FeatureBasePtr _ftr);
-        void            remove      (const SizeStd&  _track_id);
-        void            remove      (CaptureBasePtr _cap);
-        SizeStd         numTracks   () const;
-        SizeStd         trackSize   (const SizeStd&  _track_id) const;
-        TrackConst      track       (const SizeStd& _track_id) const;
-        Track           track       (const SizeStd& _track_id);
-        SnapshotConst   snapshot    (CaptureBaseConstPtr _capture) const;
-        Snapshot        snapshot    (CaptureBasePtr _capture);
+        void                        newTrack    (FeatureBasePtr _ftr);
+        void                        add         (const SizeStd& _track_id, const FeatureBasePtr& _ftr);
+        void                        add         (const FeatureBasePtr& _ftr_existing, const FeatureBasePtr&  _ftr_new);
+        void                        remove      (FeatureBasePtr _ftr);
+        void                        remove      (const SizeStd&  _track_id);
+        void                        remove      (CaptureBasePtr _cap);
+
+        SizeStd                     numTracks   () const;
+        SizeStd                     trackSize   (const SizeStd&  _track_id) const;
+        TrackConst                  track       (const SizeStd& _track_id) const;
+        Track                       track       (const SizeStd& _track_id);
+        SnapshotConst               snapshot    (CaptureBaseConstPtr _capture) const;
+        Snapshot                    snapshot    (CaptureBasePtr _capture);
         vector<FeatureBaseConstPtr> trackAsVector(const SizeStd& _track_id) const;
-        vector<FeatureBasePtr>  trackAsVector(const SizeStd& _track_id);
-        FeatureBaseConstPtrList snapshotAsList(CaptureBaseConstPtr _cap) const;
-        FeatureBasePtrList      snapshotAsList(CaptureBasePtr _cap);
-        TrackMatchesConst       matches     (CaptureBaseConstPtr _cap_1, CaptureBaseConstPtr _cap_2) const;
-        TrackMatches            matches     (CaptureBasePtr _cap_1, CaptureBasePtr _cap_2);
-        FeatureBaseConstPtr     firstFeature(const SizeStd& _track_id) const;
-        FeatureBasePtr          firstFeature(const SizeStd& _track_id);
-        FeatureBaseConstPtr     lastFeature (const SizeStd& _track_id) const;
-        FeatureBasePtr          lastFeature (const SizeStd& _track_id);
-        FeatureBaseConstPtr     feature     (const SizeStd& _track_id, CaptureBaseConstPtr _cap) const;
-        FeatureBasePtr          feature     (const SizeStd& _track_id, CaptureBasePtr _cap);
-        CaptureBaseConstPtr     firstCapture(const SizeStd& _track_id) const;
-        CaptureBasePtr          firstCapture(const SizeStd& _track_id);
-
-        list<SizeStd>    trackIds() const;
+        vector<FeatureBasePtr>      trackAsVector(const SizeStd& _track_id);
+        FeatureBaseConstPtrList     snapshotAsList(CaptureBaseConstPtr _cap) const;
+        FeatureBasePtrList          snapshotAsList(CaptureBasePtr _cap);
+        TrackMatchesConst           matches     (CaptureBaseConstPtr _cap_1, CaptureBaseConstPtr _cap_2) const;
+        TrackMatches                matches     (CaptureBasePtr _cap_1, CaptureBasePtr _cap_2);
+
+        FeatureBaseConstPtr         firstFeature(const SizeStd& _track_id) const;
+        FeatureBasePtr              firstFeature(const SizeStd& _track_id);
+        FeatureBaseConstPtr         lastFeature (const SizeStd& _track_id) const;
+        FeatureBasePtr              lastFeature (const SizeStd& _track_id);
+        FeatureBaseConstPtr         feature     (const SizeStd& _track_id, CaptureBaseConstPtr _cap) const;
+        FeatureBasePtr              feature     (const SizeStd& _track_id, CaptureBasePtr _cap);
+        CaptureBaseConstPtr         firstCapture(const SizeStd& _track_id) const;
+        CaptureBasePtr              firstCapture(const SizeStd& _track_id);
+
+        list<SizeStd>               trackIds(CaptureBaseConstPtr _capture = nullptr) const;
 
         // tracks across captures that belong to keyframe
-        TrackConst              trackAtKeyframes(const SizeStd& _track_id) const;
-        Track                   trackAtKeyframes(const SizeStd& _track_id);
-
-        const map<SizeStd, Track>& getTracks() {return tracks_;}
-        const map<CaptureBasePtr, Snapshot >& getSnapshots() {return snapshots_;}
+        TrackConst                  trackAtKeyframes(const SizeStd& _track_id) const;
+        Track                       trackAtKeyframes(const SizeStd& _track_id);
 
     private:
 
diff --git a/src/processor/track_matrix.cpp b/src/processor/track_matrix.cpp
index de101750edfe66eec72fae0c3be295164e8b7d45..ed4215d12e13403c135b433c440f7f1493612bca 100644
--- a/src/processor/track_matrix.cpp
+++ b/src/processor/track_matrix.cpp
@@ -369,12 +369,26 @@ Track TrackMatrix::trackAtKeyframes(const SizeStd& _track_id)
         return Track();
 }
 
-list<SizeStd> TrackMatrix::trackIds() const
+list<SizeStd> TrackMatrix::trackIds(CaptureBaseConstPtr _capture) const
 {
     list<SizeStd> track_ids;
-    for (auto track : tracks_)
+    
+    if (not _capture)
+        for (auto track_pair : tracks_)
+            track_ids.push_back(track_pair.first);
+    else 
     {
-        track_ids.push_back(track.first);
+        auto it = std::find_if(snapshots_.begin(),
+                               snapshots_.end(),
+                               [_capture](const std::pair<CaptureBasePtr, Snapshot>& pair)
+                               {
+                                   return pair.first == _capture;
+                               }
+                               );
+
+        if (it != snapshots_.end())
+            for (auto track_pair : it->second)
+                track_ids.push_back(track_pair.first);
     }
     return track_ids;
 }
diff --git a/test/gtest_track_matrix.cpp b/test/gtest_track_matrix.cpp
index 130a3495c8469a0b4dbcecb8ebbc68b55412835c..aabfada74ff97166ff7468ffe48cd8c46db4034f 100644
--- a/test/gtest_track_matrix.cpp
+++ b/test/gtest_track_matrix.cpp
@@ -42,7 +42,7 @@ class TrackMatrixTest : public testing::Test
 
         FrameBasePtr   F0, F1, F2, F3, F4;
         CaptureBasePtr C0, C1, C2, C3, C4;
-        FeatureBasePtr f0, f1, f2, f3, f4;
+        FeatureBasePtr f0, f1, f2, f3, f4, f5;
         ProblemPtr problem;
 
         void SetUp() override
@@ -71,6 +71,7 @@ class TrackMatrixTest : public testing::Test
             f2 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov);
             f3 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov);
             f4 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov);
+            f5 = FeatureBase::emplace<FeatureBase>(nullptr, "FeatureBase", m, m_cov);
 
             // F0 and F4 are keyframes
             F0->link(problem);
@@ -507,6 +508,37 @@ TEST_F(TrackMatrixTest, trackAtKeyframes)
     ASSERT_EQ(trk_kf_1.size(), 0);
 }
 
+TEST_F(TrackMatrixTest, trackIds)
+{
+    f0->link(C0);
+    f1->link(C1);
+    f2->link(C1);
+    f3->link(C1);
+    f4->link(C2);
+    f5->link(C2);
+
+    track_matrix.newTrack(f0);
+    track_matrix.add(f0->trackId(), f1);
+    track_matrix.newTrack(f2);
+    track_matrix.newTrack(f3);
+    track_matrix.add(f0->trackId(), f4);
+    track_matrix.add(f2->trackId(), f5);
+    
+    /* KC0   C1   C2
+     *
+     *  f0---f1---f4   trk 0
+     *       |    |
+     *       f2---f5   trk 1
+     *       |
+     *       f3        trk 2
+     */
+
+    ASSERT_EQ(track_matrix.trackIds().size(),   3);
+    ASSERT_EQ(track_matrix.trackIds(C0).size(), 1);
+    ASSERT_EQ(track_matrix.trackIds(C1).size(), 3);
+    ASSERT_EQ(track_matrix.trackIds(C2).size(), 2);
+}
+
 
 int main(int argc, char **argv)
 {