diff --git a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/MicroManager.java b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/MicroManager.java
index 12211da22a6386da76796333fb767226637f0730..6717a895f4c3b3a1a9d4e0c9d7d28e4d892d4fcb 100644
--- a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/MicroManager.java
+++ b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/MicroManager.java
@@ -38,6 +38,7 @@ import mmcorej.StrVector;
 import mmcorej.TaggedImage;
 import plugins.tprovoost.Microscopy.MicroManager.core.AcquisitionResult;
 import plugins.tprovoost.Microscopy.MicroManager.event.AcquisitionListener;
+import plugins.tprovoost.Microscopy.MicroManager.event.CoreListener;
 import plugins.tprovoost.Microscopy.MicroManager.event.LiveListener;
 import plugins.tprovoost.Microscopy.MicroManager.gui.LiveSettingsPanel;
 import plugins.tprovoost.Microscopy.MicroManager.gui.LoadFrame;
@@ -55,6 +56,7 @@ public class MicroManager
      */
     private static final Map<Integer, JSONObject> metadatas = new HashMap<Integer, JSONObject>(4);
 
+    static final List<CoreListener> coreListeners = new ArrayList<CoreListener>();
     static final List<AcquisitionListener> acqListeners = new ArrayList<AcquisitionListener>();
     static final List<LiveListener> liveListeners = new ArrayList<LiveListener>();
 
@@ -83,6 +85,45 @@ public class MicroManager
         return new Version(MMVersion.VERSION_STRING);
     }
 
+    /**
+     * @return the core listener list.
+     */
+    public static List<CoreListener> getCoreListeners()
+    {
+        final List<CoreListener> result;
+
+        // create safe copy
+        synchronized (coreListeners)
+        {
+            result = new ArrayList<CoreListener>(coreListeners);
+        }
+
+        return result;
+    };
+
+    /**
+     * Register this listener to get base MM core events.
+     * 
+     * @param listener
+     *        Your listener
+     */
+    public static void addCoreListener(CoreListener listener)
+    {
+        synchronized (coreListeners)
+        {
+            if (!coreListeners.contains(listener))
+                coreListeners.add(listener);
+        }
+    }
+
+    public static void removeCoreListener(CoreListener listener)
+    {
+        synchronized (coreListeners)
+        {
+            coreListeners.remove(listener);
+        }
+    }
+
     /**
      * @return the acquisition listener list.
      */
@@ -1865,8 +1906,10 @@ public class MicroManager
 
                     // set sequence prefix for acquisition
                     final LiveSettingsPanel livePanel = instance.livePanel;
-                    if (livePanel.hasCustomAcqName()) settings.prefix = livePanel.getAcqName();
-                    else settings.prefix = "Acquisition";
+                    if (livePanel.hasCustomAcqName())
+                        settings.prefix = livePanel.getAcqName();
+                    else
+                        settings.prefix = "Acquisition";
 
                     // create the acquisition manager
                     acquisitionManager = new AcquisitionResult(settings, metadata, livePanel.hasDateSuffix());
diff --git a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/event/CoreListener.java b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/event/CoreListener.java
new file mode 100644
index 0000000000000000000000000000000000000000..e7a36bc2c68bcec1339be3ebf60423c085ed0612
--- /dev/null
+++ b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/event/CoreListener.java
@@ -0,0 +1,18 @@
+package plugins.tprovoost.Microscopy.MicroManager.event;
+
+public interface CoreListener
+{
+    public void onPropertiesChanged();
+
+    public void onConfigGroupChanged(String groupName, String newConfig);
+
+    public void onExposureChanged(String deviceName, double exposure);
+
+    public void onPropertyChanged(String deviceName, String propName, String propValue);
+
+    public void onStagePositionChanged(String deviceName, double pos);
+
+    public void onXYStagePositionChanged(String deviceName, double xPos, double yPos);
+
+    public void onSystemConfigurationLoaded();
+}
diff --git a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/MMMainFrame.java b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/MMMainFrame.java
index 0e3947fac63a159f22b2464fa2fa2ee8cb29dfef..09599ea335ffeb334cd6f591d36f1ff7d0fefeaf 100644
--- a/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/MMMainFrame.java
+++ b/src/main/java/plugins/tprovoost/Microscopy/MicroManager/gui/MMMainFrame.java
@@ -55,6 +55,7 @@ import mmcorej.MMCoreJ;
 import mmcorej.MMEventCallback;
 import plugins.tprovoost.Microscopy.MicroManager.MicroManager;
 import plugins.tprovoost.Microscopy.MicroManager.core.AcquisitionHandler;
+import plugins.tprovoost.Microscopy.MicroManager.event.CoreListener;
 import plugins.tprovoost.Microscopy.MicroManager.tools.FrameUtils;
 import plugins.tprovoost.Microscopy.MicroManager.tools.MMUtils;
 import plugins.tprovoost.Microscopy.MicroManager.tools.StageMover;
@@ -957,21 +958,35 @@ public class MMMainFrame extends IcyFrame
         @Override
         public void onPropertiesChanged()
         {
+            super.onPropertiesChanged();
+
             refreshGUI();
+
+            // dispatch to listeners
+            for (CoreListener listener : MicroManager.getCoreListeners())
+                listener.onPropertiesChanged();
         }
 
         @Override
         public void onConfigGroupChanged(String groupName, String newConfig)
         {
+            super.onConfigGroupChanged(groupName, newConfig);
+
             if (configPanel != null)
                 configPanel.refreshGroup(groupName);
             if (acquisitionInfoPanel != null)
                 acquisitionInfoPanel.refresh();
+
+            // dispatch to listeners
+            for (CoreListener listener : MicroManager.getCoreListeners())
+                listener.onConfigGroupChanged(groupName, newConfig);
         }
 
         @Override
         public void onExposureChanged(String deviceName, double exposure)
         {
+            super.onExposureChanged(deviceName, exposure);
+
             // only if device name match current set camera name
             if ((cameraPanel != null) && StringUtil.equals(deviceName, cameraPanel.getCameraName()))
             {
@@ -982,11 +997,17 @@ public class MMMainFrame extends IcyFrame
 
             if (acquisitionInfoPanel != null)
                 acquisitionInfoPanel.refresh();
+
+            // dispatch to listeners
+            for (CoreListener listener : MicroManager.getCoreListeners())
+                listener.onExposureChanged(deviceName, exposure);
         }
 
         @Override
         public void onPropertyChanged(String deviceName, String propName, String propValue)
         {
+            super.onPropertyChanged(deviceName, propName, propValue);
+
             // only if device name match current set camera name
             if ((cameraPanel != null) && StringUtil.equals(deviceName, cameraPanel.getCameraName()))
             {
@@ -998,31 +1019,53 @@ public class MMMainFrame extends IcyFrame
                 acquisitionInfoPanel.refresh();
             if (pluginsPanel != null)
                 pluginsPanel.onCorePropertyChanged(deviceName, propName, propValue);
+
+            // dispatch to listeners
+            for (CoreListener listener : MicroManager.getCoreListeners())
+                listener.onPropertyChanged(deviceName, propName, propValue);
         }
 
         @Override
         public void onStagePositionChanged(String deviceName, double pos)
         {
+            super.onStagePositionChanged(deviceName, pos);
+
             StageMover.onStagePositionChanged(deviceName, pos);
             if (acquisitionInfoPanel != null)
                 acquisitionInfoPanel.refresh();
+
+            // dispatch to listeners
+            for (CoreListener listener : MicroManager.getCoreListeners())
+                listener.onStagePositionChanged(deviceName, pos);
         }
 
         @Override
         public void onXYStagePositionChanged(String deviceName, double xPos, double yPos)
         {
+            super.onXYStagePositionChanged(deviceName, xPos, yPos);
+
             StageMover.onXYStagePositionChanged(deviceName, xPos, yPos);
             if (acquisitionInfoPanel != null)
                 acquisitionInfoPanel.refresh();
+
+            // dispatch to listeners
+            for (CoreListener listener : MicroManager.getCoreListeners())
+                listener.onXYStagePositionChanged(deviceName, xPos, yPos);
         };
 
         @Override
         public void onSystemConfigurationLoaded()
         {
+            super.onSystemConfigurationLoaded();
+
             if (pluginsPanel != null)
                 pluginsPanel.onSystemConfigurationLoaded();
             if (acquisitionInfoPanel != null)
                 acquisitionInfoPanel.refresh();
+
+            // dispatch to listeners
+            for (CoreListener listener : MicroManager.getCoreListeners())
+                listener.onSystemConfigurationLoaded();
         }
     }
 }
\ No newline at end of file