diff --git a/frontend-js/src/main/js/map/canvas/MapCanvas.js b/frontend-js/src/main/js/map/canvas/MapCanvas.js
index 0e59cc6345d63fe83570c7ec93eedca6a8ef020c..11cd3b73fd590eb34a11a9895d03d927b517e599 100644
--- a/frontend-js/src/main/js/map/canvas/MapCanvas.js
+++ b/frontend-js/src/main/js/map/canvas/MapCanvas.js
@@ -33,6 +33,7 @@ function MapCanvas(element, options) {
   this.registerListenerType("shape-rightclick");
 
   this.setOptions(options);
+  this.setElement(element);
 
   // following fields are used in conversion between x,y coordinates and lat,lng
   // coordinates
@@ -66,6 +67,15 @@ MapCanvas.prototype.setOptions = function (options) {
 MapCanvas.prototype.getOptions = function () {
   return this._options;
 };
+
+MapCanvas.prototype.setElement = function (element) {
+  this._element = element;
+};
+
+MapCanvas.prototype.getElement = function () {
+  return this._element;
+};
+
 /**
  *
  * @returns {number}
diff --git a/frontend-js/src/main/js/map/canvas/OpenLayers/OpenLayerInfoWindow.js b/frontend-js/src/main/js/map/canvas/OpenLayers/OpenLayerInfoWindow.js
index 0e1f6403c17b2dfcc521be85a1db155486ce4d27..1a7c39ed6de73b7ce3b493c47d73cb6e5c363993 100644
--- a/frontend-js/src/main/js/map/canvas/OpenLayers/OpenLayerInfoWindow.js
+++ b/frontend-js/src/main/js/map/canvas/OpenLayers/OpenLayerInfoWindow.js
@@ -9,6 +9,9 @@ var Functions = require('../../../Functions');
 
 var Promise = require('bluebird');
 
+/**
+ * https://stackoverflow.com/a/45092467/1127920
+ */
 function modifyPopover() {
   if ($.fn.popover.Constructor.prototype.reposition === undefined) {
     $.fn.popover.Constructor.prototype.reposition = function () {
@@ -38,10 +41,11 @@ function modifyPopover() {
           .removeClass(orgPlacement)
           .addClass(placement)
       }
-
       var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight);
 
-      this.applyPlacement(calculatedOffset, placement)
+      this.applyPlacement(calculatedOffset, placement);
+
+      this.$element[0].__calculatedToolTipOffset = calculatedOffset;
     }
   }
 }
@@ -78,7 +82,7 @@ function OpenLayerInfoWindow(options) {
   self._visible = false;
   self.setContent(options.content);
 
-  //the only way that I found how to keep track if the window is opened or noth
+  //the only way that I found how to keep track if the window is opened or not
   $(element).on('hidden.bs.popover', function () {
     self._visible = false;
   });
@@ -105,7 +109,25 @@ OpenLayerInfoWindow.prototype.updatePosition = function () {
   popup.setPosition(position);
 
   return Promise.delay(100).then(function () {
+    var oldOffset = self._element.__calculatedToolTipOffset;
+    var oldDy = 0;
+    if (oldOffset) {
+      oldDy = oldOffset.top;
+    }
     $(self._element).popover('reposition');
+    var dy = self._element.__calculatedToolTipOffset.top;
+    if (!self.isOpened()) {
+      self._element.__calculatedToolTipOffset = oldOffset;
+    } else {
+      var mapOffset = self.getMap().getElement().getBoundingClientRect();
+      if (dy < mapOffset.y && self.isOpened() && oldDy !== dy) {
+        dy -= mapOffset.y;
+        dy *= self.getMap().zoomFactor / Math.pow(2, self.getMap().getZoom());
+        var center = self.getMap().getCenter();
+        center.y += dy;
+        return self.getMap().setCenter(center);
+      }
+    }
   });
 };