diff --git a/src/calng/base_correction.py b/src/calng/base_correction.py
index 875b5c74d10fa1c2c01a8c49de7153286487b747..459ef83f37da4c27d289b9d0b71ff53f47252204 100644
--- a/src/calng/base_correction.py
+++ b/src/calng/base_correction.py
@@ -523,10 +523,6 @@ class BaseCorrection(PythonDevice):
             f"preview:{spec.name}" for spec in self._preview_outputs
         ]
 
-        geom_utils.subscribe_to_geometry_bound(
-            self, self.get("geometryDevice"), warn_fun=self.log_status_warn
-        )
-
         self._buffered_status_update = Hash()
         self._processing_time_tracker = trackers.ExponentialMovingAverage(
             alpha=0.3
@@ -573,6 +569,18 @@ class BaseCorrection(PythonDevice):
             # update device schema in one fell swoop
             self.updateSchema(schema_override)
 
+        self._geometry = None
+        def _on_geometry(geometry):
+            self._geometry = geometry
+            for addon in self._enabled_addons:
+                addon.on_new_geometry(self._geometry)
+        geom_utils.subscribe_to_geometry_bound(
+            self,
+            self.get("geometryDevice"),
+            on_geometry=_on_geometry,
+            warn_fun=self.log_status_warn,
+        )
+
         self.updateState(State.ON)
 
     def __del__(self):
diff --git a/src/calng/correction_addons/base_addon.py b/src/calng/correction_addons/base_addon.py
index 8e6d8690b8e2c04ae49c13566cdba7b84cc02e95..b5578c1e5166948d5bbfbad8cf5075c28c477dd7 100644
--- a/src/calng/correction_addons/base_addon.py
+++ b/src/calng/correction_addons/base_addon.py
@@ -19,12 +19,6 @@ class BaseCorrectionAddon:
         """Will be given the node from extend_device_schema, no prefix needed here"""
         pass
 
-    @property
-    def geometry(self):
-        """Helper to get current geometry (host device should be monitoring a geometry
-        device)"""
-        return self._device._geometry
-
     def post_correction(
         self, train_id, processed_data, cell_table, pulse_table, output_hash
     ):
@@ -43,3 +37,16 @@ class BaseCorrectionAddon:
         for an example of caching and reinstanting complex kernels using many parameters
         when any change."""
         pass
+
+    @property
+    def geometry(self):
+        """Helper to get current geometry from host device. If addon will do expensive
+        precomputation only when geometry changes, use the on_new_geometry hook to
+        trigger this."""
+        return self._device._geometry
+
+    def on_new_geometry(self, geometry):
+        """Hook which is called whenever the host device receives a new geometry from
+        the geometry device. Useful to know when geometry changes in case you plan to
+        do expensive precomputation based on it (ex. azimuthal integration)."""
+        pass