diff --git a/include/core/processor/track_matrix.h b/include/core/processor/track_matrix.h
index 8a976ea84b2ba575f69b57746a3b0380cb78c342..ca7e71d1a7de39fbb496a3f9eb00ab276815ed28 100644
--- a/include/core/processor/track_matrix.h
+++ b/include/core/processor/track_matrix.h
@@ -78,8 +78,9 @@ class TrackMatrix
         TrackMatrix();
         virtual ~TrackMatrix();
 
-        void            newTrack    (CaptureBasePtr _cap, FeatureBasePtr _ftr);
-        void            add         (size_t _track_id, CaptureBasePtr _cap, FeatureBasePtr _ftr);
+        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);
diff --git a/src/processor/track_matrix.cpp b/src/processor/track_matrix.cpp
index e9fdc9bf38f8f0f3548ee27c463927018a4ee8fa..9b5a4fa25ad4e09ebf693e2fffb2298d68388684 100644
--- a/src/processor/track_matrix.cpp
+++ b/src/processor/track_matrix.cpp
@@ -38,21 +38,24 @@ Snapshot TrackMatrix::snapshot(CaptureBasePtr _capture)
         return Snapshot();
 }
 
-void TrackMatrix::newTrack(CaptureBasePtr _cap, FeatureBasePtr _ftr)
+void TrackMatrix::newTrack(FeatureBasePtr _ftr)
 {
     track_id_count_ ++;
-    add(track_id_count_, _cap, _ftr);
+    add(track_id_count_, _ftr);
 }
 
-void TrackMatrix::add(size_t _track_id, CaptureBasePtr _cap, FeatureBasePtr _ftr)
+void TrackMatrix::add(const SizeStd& _track_id, const FeatureBasePtr& _ftr)
 {
-    assert( (_track_id > 0) && (_track_id <= track_id_count_) && "Provided track ID does not exist. Use newTrack() instead.");
+    assert( tracks_.count(_track_id) != 0 &&  "Provided track ID does not exist. Use newTrack() instead.");
+    assert( _ftr->getCapture() != nullptr && "adding a feature not linked to any capture");
 
-    _ftr->setTrackId(_track_id);
-    if (_cap != _ftr->getCapture())
-        _ftr->setCapture(_cap);
-    tracks_[_track_id].emplace(_cap->getTimeStamp(), _ftr);
-    snapshots_[_cap->id()].emplace(_track_id, _ftr);        // will create new snapshot if _cap_id   is not present
+    tracks_[_track_id].emplace(_ftr->getCapture()->getTimeStamp(), _ftr);
+    snapshots_[_ftr->getCapture()->id()].emplace(_track_id, _ftr);        // will create new snapshot if _cap_id   is not present
+}
+
+void TrackMatrix::add(const FeatureBasePtr& _ftr_existing,const FeatureBasePtr& _ftr_new)
+{
+    add(_ftr_existing->trackId(), _ftr_new);
 }
 
 void TrackMatrix::remove(const SizeStd& _track_id)