diff --git a/frontend-js/src/main/js/map/CustomMap.js b/frontend-js/src/main/js/map/CustomMap.js
index 36497cd2e704329f9a7f1f4a78951c0b92f8d6be..ca76ab33ced81255ff3923af3cea7328fefd2bd2 100644
--- a/frontend-js/src/main/js/map/CustomMap.js
+++ b/frontend-js/src/main/js/map/CustomMap.js
@@ -36,6 +36,8 @@ function CustomMap(options) {
   AbstractCustomMap.call(this, options.getProject().getModel(), options);
 
   this.registerListenerType("onBioEntityClick");
+  this.registerListenerType("onShowOverlay");
+  this.registerListenerType("onHideOverlay");
 
   this._selectedOverlays = [];
 
@@ -242,6 +244,8 @@ CustomMap.prototype.openDataOverlay = function (param) {
         }
         return Promise.resolve();
       }
+    }).then(function () {
+      return self.callListeners("onShowOverlay", overlayToOpen);
     });
   }
 };
@@ -538,6 +542,10 @@ CustomMap.prototype.hideDataOverlay = function (identifier) {
       }
       ServerConnector.getSessionData(self.getProject()).setVisibleOverlays(ids);
       return self.redrawSelectedDataOverlays();
+    }).then(function () {
+      return self.getProject().getDataOverlayById(identifier);
+    }).then(function (overlay) {
+      return self.callListeners("onHideOverlay", overlay);
     });
   }
 };
diff --git a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
index f9fd55bb7c995b0aefa9f792a669e99c4369b30a..fcf85d76f905da564daa38452f04bb4625d9b302 100644
--- a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
+++ b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
@@ -5,6 +5,8 @@ var IdentifiedElement = require('../map/data/IdentifiedElement');
 var UserDbOverlay = require('../map/overlay/UserDbOverlay');
 var Configuration = require('../Configuration');
 
+var logger= require('../logger');
+
 var Promise = require("bluebird");
 
 function getOverlayByName(customMap, dbOverlayName) {
@@ -244,6 +246,7 @@ function createProjectMap(options) {
     addListener: function (param) {
       var object = null;
       var listenerWrapper = null;
+      var listenerType = param.type;
       if (param.dbOverlayName !== undefined) {
         object = getOverlayByName(map, param.dbOverlayName);
         listenerWrapper = function (e) {
@@ -256,12 +259,24 @@ function createProjectMap(options) {
         listenerWrapper = function () {
           return param.callback();
         };
+      } else if (param.object === "overlay") {
+        object = map;
+        if (param.type === "onShow") {
+          listenerType = "onShowOverlay";
+        } else if (param.type === "onHide") {
+          listenerType = "onHideOverlay";
+        } else {
+          throw new Error("Unknown listener type: " + param.type);
+        }
+        listenerWrapper = function (e) {
+          return param.callback(e.arg);
+        };
       } else {
         throw new Error("Invalid argument");
       }
 
-      object.addListener(param.type, listenerWrapper);
-      listenersData.push({listener: param.callback, wrapper: listenerWrapper, object: object, type: param.type});
+      object.addListener(listenerType, listenerWrapper);
+      listenersData.push({listener: param.callback, wrapper: listenerWrapper, object: object, type: listenerType});
     },
     removeListener: function (param) {
       var dbOverlay = getOverlayByName(map, param.dbOverlayName);
diff --git a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
index 31fdd59f88a3c9e2ae4baeaede3571f5c4936f16..406d45524ce65a50cabf550c9ed98ab5def83c6c 100644
--- a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
+++ b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
@@ -3,6 +3,7 @@
 require("../mocha-config");
 
 var Alias = require('../../../main/js/map/data/Alias');
+var DataOverlay = require('../../../main/js/map/data/DataOverlay');
 var MinervaPluginProxy = require('../../../main/js/plugin/MinervaPluginProxy');
 var ServerConnector = require('../ServerConnector-mock');
 
@@ -487,5 +488,55 @@ describe('MinervaPluginProxy', function () {
     });
   });
 
+  describe('addListener', function () {
+    it('on show overlay', function () {
+      var callbackOk = false;
+      var map;
+      return ServerConnector.getProject().then(function (project) {
+        map = helper.createCustomMap(project);
+        helper.createSearchDbOverlay(map);
+        var proxy = createProxy(map);
+
+        proxy.project.map.addListener({
+          object: "overlay",
+          type: "onShow",
+          callback: function (overlay) {
+            assert.ok(overlay instanceof DataOverlay);
+            callbackOk = true;
+          }
+        });
+        return map.openDataOverlay(map.getProject().getDataOverlays()[0]);
+      }).then(function () {
+        assert.ok(callbackOk);
+        return map.destroy();
+      });
+    });
+    it('on hide overlay', function () {
+      var callbackOk = false;
+      var map;
+      return ServerConnector.getProject().then(function (project) {
+        map = helper.createCustomMap(project);
+        helper.createSearchDbOverlay(map);
+        var proxy = createProxy(map);
+
+        proxy.project.map.addListener({
+          object: "overlay",
+          type: "onHide",
+          callback: function (overlay) {
+            assert.ok(overlay instanceof DataOverlay);
+            callbackOk = true;
+          }
+        });
+        return map.openDataOverlay(18077);
+      }).then(function () {
+        assert.notOk(callbackOk);
+        return map.hideDataOverlay(18077);
+      }).then(function () {
+        assert.ok(callbackOk);
+        return map.destroy();
+      });
+    });
+  });
+
 
 });