diff --git a/frontend-js/src/main/js/ObjectWithListeners.js b/frontend-js/src/main/js/ObjectWithListeners.js
index 41b332c6d21c8e2259321b4ec0eab7d23f199d24..219b102584047cffa147a2700984cd134a2cb59b 100644
--- a/frontend-js/src/main/js/ObjectWithListeners.js
+++ b/frontend-js/src/main/js/ObjectWithListeners.js
@@ -144,7 +144,7 @@ ObjectWithListeners.prototype.removePropertyListener = function (name, fun) {
  *
  * @param {string} type
  *          type of the listener (string)
- * @param arg
+ * @param {Object} [arg]
  *          argument data passed to the handler
  *
  * @returns {PromiseLike}
diff --git a/frontend-js/src/main/js/map/Submap.js b/frontend-js/src/main/js/map/Submap.js
index 37979fe92a2dd4e454daced37f806fb7441fec97..26dcb67cd97e4cf3bbb982d3c02115bf74e304c1 100644
--- a/frontend-js/src/main/js/map/Submap.js
+++ b/frontend-js/src/main/js/map/Submap.js
@@ -19,9 +19,10 @@ var CustomMapOptions = require('./CustomMapOptions');
  * @extends AbstractCustomMap
  */
 function Submap(customMap, model) {
+  var self = this;
   this.setCustomMap(customMap);
 
-  AbstractCustomMap.call(this, model, new CustomMapOptions({
+  AbstractCustomMap.call(self, model, new CustomMapOptions({
     element: customMap.getElement(),
     bigLogo: customMap.isBigLogo(),
     project: customMap.getProject(),
@@ -31,7 +32,17 @@ function Submap(customMap, model) {
     serverConnector: customMap.getServerConnector()
   }));
 
-  this.initialized = false;
+  self.registerListenerType("onOpen");
+  self.registerListenerType("onClose");
+  self.registerListenerType("onDrag");
+  self.registerListenerType("onDragStart");
+  self.registerListenerType("onDragStop");
+  self.registerListenerType("onResize");
+  self.registerListenerType("onResizeStart");
+  self.registerListenerType("onResizeStop");
+  self.registerListenerType("onFocus");
+
+  self.initialized = false;
 }
 
 // implementation of object inheritance
@@ -62,6 +73,7 @@ Submap.prototype.open = function (htmlTag) {
     mapDiv.style.height = "100%";
     contentDiv.appendChild(mapDiv);
 
+    // noinspection JSUnusedGlobalSymbols
     $(self.getElement()).dialog({
       title: self.getModel().getName(),
       width: Math.floor(window.innerWidth * 2 / 3),
@@ -72,7 +84,33 @@ Submap.prototype.open = function (htmlTag) {
         of: $(self.getTopMap().getElement())
       },
       resize: function () {
-        self.getMapCanvas().triggerListeners('resize');
+        return self.getMapCanvas().triggerListeners('resize').then(function () {
+          return self.callListeners('onResize');
+        });
+      },
+      resizeStart: function () {
+        return self.callListeners('onResizeStart');
+      },
+      resizeStop: function () {
+        return self.callListeners('onResizeStop');
+      },
+      open: function () {
+        return self.callListeners('onOpen');
+      },
+      close: function () {
+        return self.callListeners('onClose');
+      },
+      focus: function () {
+        return self.callListeners('onFocus');
+      },
+      dragStop: function () {
+        return self.callListeners('onDragStop');
+      },
+      dragStart: function () {
+        return self.callListeners('onDragStart');
+      },
+      drag: function () {
+        return self.callListeners('onDrag');
       }
     });
 
@@ -89,9 +127,16 @@ Submap.prototype.open = function (htmlTag) {
   } else {
     $(self.getElement()).dialog("open");
   }
+};
 
+Submap.prototype.close = function () {
+  var self = this;
+  if (self.isInitialized()) {
+    $(self.getElement()).dialog("close");
+  }
 };
 
+
 /**
  *
  * @param {number} identifier
diff --git a/frontend-js/src/main/js/map/data/MapModel.js b/frontend-js/src/main/js/map/data/MapModel.js
index 7e75d0e1d5eba0034b7002142b8d8e0cef042e1b..0586050a26ec45b08cf8ad0c2ae677cf777a330a 100644
--- a/frontend-js/src/main/js/map/data/MapModel.js
+++ b/frontend-js/src/main/js/map/data/MapModel.js
@@ -90,9 +90,9 @@ function MapModel(configuration) {
  * Return list of all aliases that were added to the model.
  *
  * @param {Object} params
- * @param {string} params.type
- * @param {number[]} params.includedCompartmentIds
- * @param {number[]} params.excludedCompartmentIds
+ * @param {string|string[]} params.type
+ * @param {number[]} [params.includedCompartmentIds]
+ * @param {number[]} [params.excludedCompartmentIds]
  * @param {boolean} params.complete
  * @returns {Promise}
  */
diff --git a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
index 594cd2fb9452cb8b902654d337b6ee8492e1790a..036c4e9e78a00d450eb634c5d348aa4c732541a1 100644
--- a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
+++ b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
@@ -8,6 +8,7 @@ var Configuration = require('../Configuration');
 var Bounds = require('../map/canvas/Bounds');
 var Point = require('../map/canvas/Point');
 
+// noinspection JSUnusedLocalSymbols
 var logger = require('../logger');
 
 var Promise = require("bluebird");
@@ -279,6 +280,32 @@ function createMarkerElements(options) {
   return markerElements;
 }
 
+/**
+ *
+ * @param {Object} param
+ * @returns {function(*): *}
+ */
+function createWrapperFunctionForDialogGuiUpdate(param) {
+  /**
+   *
+   * @param {AbstractCustomMap} e.object
+   * @returns {Promise}
+   */
+  return function (e) {
+    var submap = e.object;
+    var div = $("[name^='submap-div-']", submap.getElement())[0];
+    var x = div.getBoundingClientRect().left - document.body.getBoundingClientRect().left;
+    var y = div.getBoundingClientRect().top - document.body.getBoundingClientRect().top;
+    var width = div.getBoundingClientRect().width;
+    var height = div.getBoundingClientRect().height;
+    return param.callback({
+      modelId: submap.getId(),
+      position: new Point(x, y),
+      size: {width: width, height: height}
+    });
+  }
+}
+
 /**
  *
  * @param {Object} options
@@ -341,6 +368,25 @@ function createProjectMap(options) {
           throw new Error("Unknown listener type: " + param.type);
         }
         objects = objects.concat(map.getSubmaps());
+      } else if (param.object === "map-dialog") {
+        objects = objects.concat(map.getSubmaps());
+        if (param.type === "onDrag" || param.type === "onDragStart" || param.type === "onDragStop" ||
+          param.type === "onResize" || param.type === "onResizeStart" || param.type === "onResizeStop" ||
+          param.type === "onOpen") {
+          listenerWrapper = createWrapperFunctionForDialogGuiUpdate(param);
+        } else if (param.type === "onFocus") {
+          listenerWrapper = function (e) {
+            var submap = e.object;
+            return param.callback({modelId: submap.getId()});
+          };
+        } else if (param.type === "onClose") {
+          listenerWrapper = function (e) {
+            var submap = e.object;
+            return param.callback({modelId: submap.getId()});
+          };
+        } else {
+          throw new Error("Unknown listener type: " + param.type);
+        }
       } else {
         throw new Error("Invalid argument");
       }
diff --git a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
index 010051e604d0db1bf76b3c749bbeb57d593512d3..098fb45f4e64005468fa0c3f2a6b059a477da773 100644
--- a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
+++ b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
@@ -429,10 +429,10 @@ describe('MinervaPluginProxy', function () {
       center = map.getCenter();
       return proxy.project.map.fitBounds({
         modelId: 15781,
-        x1:10,
-        x2:10,
-        y1:20,
-        y2:30
+        x1: 10,
+        x2: 10,
+        y1: 20,
+        y2: 30
       });
     }).then(function () {
       var center2 = map.getCenter();
@@ -622,7 +622,7 @@ describe('MinervaPluginProxy', function () {
           type: "onCenterChanged",
           callback: function (data) {
             assert.equal(map.getId(), data.modelId);
-            var center =  data.center;
+            var center = data.center;
             assert.ok(center instanceof Point);
             assert.closeTo(parseFloat(center.x), 10, helper.EPSILON);
             assert.closeTo(parseFloat(center.y), 20, helper.EPSILON);
@@ -639,7 +639,83 @@ describe('MinervaPluginProxy', function () {
         return map.destroy();
       });
     });
-  });
 
+    describe('map-dialog', function () {
+      it('onOpen', function () {
+        helper.setUrl("http://test/?id=complex_model_with_submaps");
+        var callbackOk = false;
+        var map, submap;
+        return ServerConnector.getProject().then(function (project) {
+          map = helper.createCustomMap(project);
+          submap = map.getSubmaps()[0];
+          var proxy = createProxy(map);
+
+          proxy.project.map.addListener({
+            object: "map-dialog",
+            type: "onOpen",
+            callback: function (data) {
+              assert.equal(submap.getId(), data.modelId);
+              assert.ok(data.position);
+              assert.ok(data.size);
+              callbackOk = true;
+            }
+          });
+          return submap.open(testDiv);
+        }).then(function () {
+          assert.ok(callbackOk);
+          return map.destroy();
+        });
+      });
+
+      it('onClose', function () {
+        helper.setUrl("http://test/?id=complex_model_with_submaps");
+        var callbackOk = false;
+        var map, submap;
+        return ServerConnector.getProject().then(function (project) {
+          map = helper.createCustomMap(project);
+          submap = map.getSubmaps()[0];
+          var proxy = createProxy(map);
+
+          proxy.project.map.addListener({
+            object: "map-dialog",
+            type: "onClose",
+            callback: function (data) {
+              assert.equal(submap.getId(), data.modelId);
+              callbackOk = true;
+            }
+          });
+          return submap.open(testDiv);
+        }).then(function () {
+          return submap.close();
+        }).then(function () {
+          assert.ok(callbackOk);
+          return map.destroy();
+        });
+      });
+    });
+
+    it('onFocus', function () {
+      helper.setUrl("http://test/?id=complex_model_with_submaps");
+      var callbackOk = false;
+      var map, submap;
+      return ServerConnector.getProject().then(function (project) {
+        map = helper.createCustomMap(project);
+        submap = map.getSubmaps()[0];
+        var proxy = createProxy(map);
 
+        proxy.project.map.addListener({
+          object: "map-dialog",
+          type: "onFocus",
+          callback: function (data) {
+            assert.equal(submap.getId(), data.modelId);
+            callbackOk = true;
+          }
+        });
+        return submap.open(testDiv);
+      }).then(function () {
+        assert.ok(callbackOk);
+        return map.destroy();
+      });
+    });
+  });
 });