diff --git a/include/gnss/processor/processor_gnss_fix.h b/include/gnss/processor/processor_gnss_fix.h
index e6b3adfc815439ef9b92c36bc62510f2e54376b1..f2f1d4a511e367c4da84fbae3ac8ccb998cd48ac 100644
--- a/include/gnss/processor/processor_gnss_fix.h
+++ b/include/gnss/processor/processor_gnss_fix.h
@@ -44,7 +44,33 @@ class ProcessorGnssFix : public ProcessorBase
         ProcessorGnssFix(ProcessorParamsGnssFixPtr _params, SensorGnssPtr _sensor_gnss_ptr);
         virtual ~ProcessorGnssFix();
         virtual void configure(SensorBasePtr _sensor);
-        virtual void process(CaptureBasePtr _capture_ptr);
+
+    protected:
+        /** \brief process an incoming capture
+         *
+         * Each derived processor should implement this function. It will be called if:
+         *  - A new capture arrived and triggerInCapture() returned true.
+         */
+        virtual void processCapture(CaptureBasePtr) override;
+
+        /** \brief process an incoming key-frame
+         *
+         * The ProcessorTracker only processes incoming captures (it is not called).
+         */
+        virtual void processKeyFrame(FrameBasePtr _keyframe_ptr, const Scalar& _time_tolerance) override {};
+
+        /** \brief trigger in capture
+         *
+         * Returns true if processCapture() should be called after the provided capture arrived.
+         */
+        virtual bool triggerInCapture(CaptureBasePtr) override;
+
+        /** \brief trigger in key-frame
+         *
+         * The ProcessorTracker only processes incoming captures, then it returns false.
+         */
+        virtual bool triggerInKeyFrame(FrameBasePtr _keyframe_ptr, const Scalar& _time_tolerance) override {return false;}
+
         virtual bool voteForKeyFrame();
 
     private:
@@ -56,6 +82,11 @@ class ProcessorGnssFix : public ProcessorBase
 
 };
 
+inline bool ProcessorGnssFix::triggerInCapture(CaptureBasePtr)
+{
+    return true;
+}
+
 } // namespace wolf
 
 #endif //WOLF_PROCESSOR_GNSS_FIX_H
diff --git a/include/gnss/processor/processor_gnss_single_diff.h b/include/gnss/processor/processor_gnss_single_diff.h
index 405caeb16d5541bfa12468b8ecdeaa2324c99335..708b5c2804a9344c6c3321b7d39bc5c8abe7ac99 100644
--- a/include/gnss/processor/processor_gnss_single_diff.h
+++ b/include/gnss/processor/processor_gnss_single_diff.h
@@ -25,9 +25,36 @@ class ProcessorGnssSingleDiff : public ProcessorBase
         ProcessorGnssSingleDiff(ProcessorParamsBasePtr _params, SensorGnssPtr _sensor_gnss_ptr);
         virtual ~ProcessorGnssSingleDiff();
         virtual void configure(SensorBasePtr _sensor);
-        virtual void process(CaptureBasePtr _capture_ptr);
+
+    protected:
+        /** \brief process an incoming capture
+         *
+         * Each derived processor should implement this function. It will be called if:
+         *  - A new capture arrived and triggerInCapture() returned true.
+         */
+        virtual void processCapture(CaptureBasePtr) override;
+
+        /** \brief process an incoming key-frame
+         *
+         * The ProcessorTracker only processes incoming captures (it is not called).
+         */
+        virtual void processKeyFrame(FrameBasePtr _keyframe_ptr, const Scalar& _time_tolerance) override {};
+
+        /** \brief trigger in capture
+         *
+         * Returns true if processCapture() should be called after the provided capture arrived.
+         */
+        virtual bool triggerInCapture(CaptureBasePtr) override;
+
+        /** \brief trigger in key-frame
+         *
+         * The ProcessorTracker only processes incoming captures, then it returns false.
+         */
+        virtual bool triggerInKeyFrame(FrameBasePtr _keyframe_ptr, const Scalar& _time_tolerance) override {return false;}
+
         virtual bool voteForKeyFrame();
 
+
     private:
         FactorBasePtr emplaceFactor(FeatureBasePtr& ftr_ptr);
 
@@ -36,6 +63,11 @@ class ProcessorGnssSingleDiff : public ProcessorBase
 
 };
 
+inline bool ProcessorGnssSingleDiff::triggerInCapture(CaptureBasePtr)
+{
+    return true;
+}
+
 } // namespace wolf
 
 #endif //WOLF_PROCESSOR_GNSS_SINGLE_DIFF_H
diff --git a/src/processor/processor_gnss_fix.cpp b/src/processor/processor_gnss_fix.cpp
index 82a23ec2d4ed380fb095c93e9ad32d3338e3265b..68becb54e0aad02b1c673ea68eb42e340edd19d4 100644
--- a/src/processor/processor_gnss_fix.cpp
+++ b/src/processor/processor_gnss_fix.cpp
@@ -21,7 +21,7 @@ ProcessorGnssFix::~ProcessorGnssFix()
     //
 }
 
-void ProcessorGnssFix::process(CaptureBasePtr _capture_ptr)
+void ProcessorGnssFix::processCapture(CaptureBasePtr _capture_ptr)
 {
     // TODO: keep captures in a buffer and deal with KFpacks
 
diff --git a/src/processor/processor_gnss_single_diff.cpp b/src/processor/processor_gnss_single_diff.cpp
index 6fdecea33ff4fa873c545866ca9af038d4347210..42b246c6cd6efedbe26dcb7c1ece24e2ea4a9f4d 100644
--- a/src/processor/processor_gnss_single_diff.cpp
+++ b/src/processor/processor_gnss_single_diff.cpp
@@ -19,7 +19,7 @@ ProcessorGnssSingleDiff::~ProcessorGnssSingleDiff()
     //
 }
 
-void ProcessorGnssSingleDiff::process(CaptureBasePtr _capture_ptr)
+void ProcessorGnssSingleDiff::processCapture(CaptureBasePtr _capture_ptr)
 {
     // TODO: keep captures in a buffer and deal with KFpacks