diff --git a/frontend-js/src/main/js/map/canvas/Bounds.js b/frontend-js/src/main/js/map/canvas/Bounds.js
index 420934ef04559ac0621f526a9628ead0d1535d51..210e7484774d27156809bd26498fa32e75cb9352 100644
--- a/frontend-js/src/main/js/map/canvas/Bounds.js
+++ b/frontend-js/src/main/js/map/canvas/Bounds.js
@@ -4,6 +4,12 @@
 var logger = require('../../logger');
 var Point = require('./Point');
 
+/**
+ *
+ * @param {Point} [p1]
+ * @param {Point} [p2]
+ * @constructor
+ */
 function Bounds(p1, p2) {
   this._topLeft = undefined;
   this._rightBottom = undefined;
@@ -11,6 +17,10 @@ function Bounds(p1, p2) {
   this.extend(p2);
 }
 
+/**
+ *
+ * @param {Point} [point]
+ */
 Bounds.prototype.extend = function (point) {
   if (point !== undefined) {
     if (point instanceof Bounds) {
diff --git a/frontend-js/src/main/js/map/canvas/GoogleMaps/GoogleMapsApiCanvas.js b/frontend-js/src/main/js/map/canvas/GoogleMaps/GoogleMapsApiCanvas.js
index d0909e07a6543ee3ac053af015b1a3a579059a2e..4386bbdc3fcb6262e00d738d2cf1272b371279a0 100644
--- a/frontend-js/src/main/js/map/canvas/GoogleMaps/GoogleMapsApiCanvas.js
+++ b/frontend-js/src/main/js/map/canvas/GoogleMaps/GoogleMapsApiCanvas.js
@@ -193,7 +193,7 @@ GoogleMapsApiCanvas.prototype.latLngToTile = function (latLng, z) {
  *
  * @param {Point} options.position
  * @param {string} options.icon
- * @param {string} options.id
+ * @param {string} [options.id]
  * @returns {GoogleMapsApiMarker}
  */
 GoogleMapsApiCanvas.prototype.createMarker = function (options) {
diff --git a/frontend-js/src/main/js/map/canvas/InfoWindow.js b/frontend-js/src/main/js/map/canvas/InfoWindow.js
index a6e3e683ac4f481cec3ba7ff367db3b07714b5b1..9072826958fee52f6f272668bc5129b4021a5c8c 100644
--- a/frontend-js/src/main/js/map/canvas/InfoWindow.js
+++ b/frontend-js/src/main/js/map/canvas/InfoWindow.js
@@ -5,6 +5,11 @@ var MapCanvas = require('./MapCanvas');
 // noinspection JSUnusedLocalSymbols
 var logger = require('../../logger');
 
+/**
+ *
+ * @param {MapCanvas} options.map
+ * @constructor
+ */
 function InfoWindow(options) {
   this.setMap(options.map);
 }
@@ -17,6 +22,10 @@ InfoWindow.prototype.hide = function () {
   throw new Error("Not implemented");
 };
 
+/**
+ *
+ * @param {MapCanvas} map
+ */
 InfoWindow.prototype.setMap = function (map) {
   if (!(map instanceof MapCanvas)) {
     throw new Error("Map must be of MapCanvas class");
@@ -24,14 +33,29 @@ InfoWindow.prototype.setMap = function (map) {
   this._map = map;
 };
 
+/**
+ *
+ * @returns {MapCanvas}
+ */
 InfoWindow.prototype.getMap = function () {
   return this._map;
 };
 
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {Marker} marker
+ */
 InfoWindow.prototype.setMarker = function (marker) {
   throw new Error("Not implemented");
 };
-InfoWindow.prototype.setContent= function (content) {
+
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {HTMLElement|string} content
+ */
+InfoWindow.prototype.setContent = function (content) {
   throw new Error("Not implemented");
 };
 
diff --git a/frontend-js/src/main/js/map/canvas/MapCanvas.js b/frontend-js/src/main/js/map/canvas/MapCanvas.js
index f63e6a4e48866f855c0c57fa6c2afb236ee63579..0e59cc6345d63fe83570c7ec93eedca6a8ef020c 100644
--- a/frontend-js/src/main/js/map/canvas/MapCanvas.js
+++ b/frontend-js/src/main/js/map/canvas/MapCanvas.js
@@ -7,7 +7,17 @@ var Functions = require('../../Functions');
 var ObjectWithListeners = require('../../ObjectWithListeners');
 var Point = require('./Point');
 
-
+/**
+ *
+ * @param {HTMLElement} element
+ * @param {Object} options
+ * @param {number} options.tileSize
+ * @param {number} options.minZoom
+ * @param {number} options.height
+ * @param {number} options.width
+ * @constructor
+ * @extends ObjectWithListeners
+ */
 function MapCanvas(element, options) {
   ObjectWithListeners.call(this);
   //map canvas listeners
@@ -37,53 +47,124 @@ function MapCanvas(element, options) {
 MapCanvas.prototype = Object.create(ObjectWithListeners.prototype);
 MapCanvas.prototype.constructor = ObjectWithListeners;
 
+/**
+ *
+ * @param {Object} options
+ * @param {number} options.tileSize
+ * @param {number} options.minZoom
+ * @param {number} options.height
+ * @param {number} options.width
+ */
 MapCanvas.prototype.setOptions = function (options) {
   this._options = options;
 };
+
+/**
+ *
+ * @returns {{tileSize: number, minZoom: number, height: number, width: number}}
+ */
 MapCanvas.prototype.getOptions = function () {
   return this._options;
 };
-
+/**
+ *
+ * @returns {number}
+ */
 MapCanvas.prototype.getTileSize = function () {
   return this.getOptions().tileSize;
 };
+
+/**
+ *
+ * @returns {number}
+ */
 MapCanvas.prototype.getMaxZoom = function () {
   return this.getOptions().maxZoom;
 };
+
+/**
+ *
+ * @returns {number}
+ */
 MapCanvas.prototype.getMinZoom = function () {
   return this.getOptions().minZoom;
 };
+
+/**
+ *
+ * @returns {number}
+ */
 MapCanvas.prototype.getWidth = function () {
   return this.getOptions().width;
 };
+
+/**
+ *
+ * @returns {number}
+ */
 MapCanvas.prototype.getHeight = function () {
   return this.getOptions().height;
 };
 
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {Object} options
+ * @returns {Marker}
+ */
 MapCanvas.prototype.createMarker = function (options) {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {Object} options
+ * @returns {InfoWindow}
+ */
 MapCanvas.prototype.createInfoWindow = function (options) {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {Object} options
+ * @returns {Rectangle}
+ */
 MapCanvas.prototype.createRectangle = function (options) {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {Object} options
+ * @returns {Polyline}
+ */
 MapCanvas.prototype.createPolyline = function (options) {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {HTMLElement} element
+ */
 MapCanvas.prototype.addLeftBottomControl = function (element) {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {HTMLElement} element
+ */
 MapCanvas.prototype.addRightBottomControl = function (element) {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
 /**
  *
  * @param {Bounds} bounds
@@ -92,6 +173,7 @@ MapCanvas.prototype.fitBounds = function (bounds) {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
 /**
  *
  * @param {Point} center
@@ -106,12 +188,16 @@ MapCanvas.prototype.setCenter = function (center) {
 MapCanvas.prototype.getCenter = function () {
   throw new Error("Not implemented");
 };
+
 /**
  * @returns {number}
  */
 MapCanvas.prototype.getZoom = function () {
   throw new Error("Not implemented");
 };
+
+
+// noinspection JSUnusedLocalSymbols
 /**
  *
  * @param {number} zoom
@@ -126,11 +212,13 @@ MapCanvas.prototype.setZoom = function (zoom) {
 MapCanvas.prototype.getBackgroundId = function () {
   throw new Error("Not implemented");
 };
+
+// noinspection JSUnusedLocalSymbols
 /**
  *
  * @param {number|string} backgroundId
  */
-MapCanvas.prototype.setBackgroundId = function (backgroundId) {
+MapCanvas.prototype.getBackgroundId = function (backgroundId) {
   throw new Error("Not implemented");
 };
 
@@ -154,9 +242,16 @@ MapCanvas.prototype.toggleDrawing = function () {
   }
 };
 
+/**
+ * Turns on drawing library.
+ */
 MapCanvas.prototype.turnOnDrawing = function () {
   throw new Error("Not implemented");
 };
+
+/**
+ * Turns off drawing library.
+ */
 MapCanvas.prototype.turnOffDrawing = function () {
   throw new Error("Not implemented");
 };
@@ -167,10 +262,19 @@ MapCanvas.prototype.isDrawingOn = function () {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {Object} area
+ */
 MapCanvas.prototype.setSelectedArea = function (area) {
   throw new Error("Not implemented");
 };
 
+/**
+ *
+ * @returns {Object}
+ */
 MapCanvas.prototype.getSelectedArea = function () {
   throw new Error("Not implemented");
 };
@@ -179,6 +283,12 @@ MapCanvas.prototype.removeSelection = function () {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {string} type
+ * @param [data]
+ */
 MapCanvas.prototype.triggerListeners = function (type, data) {
   throw new Error("Not implemented");
 };
diff --git a/frontend-js/src/main/js/map/canvas/Marker.js b/frontend-js/src/main/js/map/canvas/Marker.js
index a08b91a1bc1135dc64ce222fb5cf9cd3325a73ca..dac47734f1205f0c26ae156f935e173a0c4f34eb 100644
--- a/frontend-js/src/main/js/map/canvas/Marker.js
+++ b/frontend-js/src/main/js/map/canvas/Marker.js
@@ -8,6 +8,8 @@ var logger = require('../../logger');
 var ObjectWithListeners = require('../../ObjectWithListeners');
 
 /**
+ *
+ * @param {MapCanvas} options.map
  *
  * @constructor
  * @augments {ObjectWithListeners}
@@ -39,6 +41,7 @@ Marker.prototype.getBounds = function () {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
 /**
  *
  * @param {string} icon
@@ -47,6 +50,10 @@ Marker.prototype.setIcon = function (icon) {
   throw new Error("Not implemented");
 };
 
+/**
+ *
+ * @param {MapCanvas} map
+ */
 Marker.prototype.setMap = function (map) {
   if (!(map instanceof MapCanvas)) {
     throw new Error("Map must be of MapCanvas class");
@@ -54,6 +61,10 @@ Marker.prototype.setMap = function (map) {
   this._map = map;
 };
 
+/**
+ *
+ * @returns {MapCanvas}
+ */
 Marker.prototype.getMap = function () {
   return this._map;
 };
diff --git a/frontend-js/src/main/js/map/canvas/Point.js b/frontend-js/src/main/js/map/canvas/Point.js
index 5ba8a1ecf5e55196f4d7f2576ce28ade40c92770..fc4bbd218d7d95cbcd698b150288edfd783c7dba 100644
--- a/frontend-js/src/main/js/map/canvas/Point.js
+++ b/frontend-js/src/main/js/map/canvas/Point.js
@@ -3,6 +3,12 @@
 // noinspection JSUnusedLocalSymbols
 var logger = require('../../logger');
 
+/**
+ *
+ * @param {number} x
+ * @param {number} y
+ * @constructor
+ */
 function Point(x, y) {
   if (x instanceof Point) {
     this.x = x.x;
diff --git a/frontend-js/src/main/js/map/canvas/Polyline.js b/frontend-js/src/main/js/map/canvas/Polyline.js
index 65ce02c6d60db4a8d38c93858d5337d46dc4afea..3bd7cefcf8321dd0fae0bb97672418355c5fdc92 100644
--- a/frontend-js/src/main/js/map/canvas/Polyline.js
+++ b/frontend-js/src/main/js/map/canvas/Polyline.js
@@ -6,6 +6,12 @@ var MapCanvas = require('./MapCanvas');
 var logger = require('../../logger');
 var ObjectWithListeners = require('../../ObjectWithListeners');
 
+/**
+ * @param {MapCanvas} options.map
+ *
+ * @constructor
+ * @augments {ObjectWithListeners}
+ */
 function Polyline(options) {
   ObjectWithListeners.call(this);
   this.setMap(options.map);
@@ -23,14 +29,26 @@ Polyline.prototype.hide = function () {
   throw new Error("Not implemented");
 };
 
+/**
+ * @returns {Bounds}
+ */
 Polyline.prototype.getBounds = function () {
   throw new Error("Not implemented");
 };
 
+// noinspection JSUnusedLocalSymbols
+/**
+ *
+ * @param {Object} options
+ */
 Polyline.prototype.setOptions = function (options) {
   throw new Error("Not implemented");
 };
 
+/**
+ *
+ * @param {MapCanvas} map
+ */
 Polyline.prototype.setMap = function (map) {
   if (!(map instanceof MapCanvas) && map !== null) {
     throw new Error("Map must be of MapCanvas class");
@@ -38,6 +56,10 @@ Polyline.prototype.setMap = function (map) {
   this._map = map;
 };
 
+/**
+ *
+ * @returns {MapCanvas}
+ */
 Polyline.prototype.getMap = function () {
   return this._map;
 };
diff --git a/frontend-js/src/main/js/map/canvas/Rectangle.js b/frontend-js/src/main/js/map/canvas/Rectangle.js
index 9cc2b462f7ed2c68f817b12b5d4b4754862ac67d..01c5986b1cc12422e9e59f9ba77598b8ce87fbc8 100644
--- a/frontend-js/src/main/js/map/canvas/Rectangle.js
+++ b/frontend-js/src/main/js/map/canvas/Rectangle.js
@@ -6,6 +6,13 @@ var MapCanvas = require('./MapCanvas');
 var logger = require('../../logger');
 var ObjectWithListeners = require('../../ObjectWithListeners');
 
+/**
+ * @param {MapCanvas} options.map
+ *
+ * @constructor
+ * @augments {ObjectWithListeners}
+ */
+
 function Rectangle(options) {
   ObjectWithListeners.call(this);
   this.registerListenerType("click");
@@ -23,18 +30,33 @@ Rectangle.prototype.hide = function () {
   throw new Error("Not implemented");
 };
 
+/**
+ * @returns {Bounds}
+ */
 Rectangle.prototype.getBounds = function () {
   throw new Error("Not implemented");
 };
 
-Rectangle.prototype.setBounds = function () {
+/**
+ *
+ * @param {Bounds} bounds
+ */
+Rectangle.prototype.setBounds = function (bounds) {
   throw new Error("Not implemented");
 };
 
+/**
+ *
+ * @param {Object} options
+ */
 Rectangle.prototype.setOptions = function (options) {
   throw new Error("Not implemented");
 };
 
+/**
+ *
+ * @param {MapCanvas} map
+ */
 Rectangle.prototype.setMap = function (map) {
   if (!(map instanceof MapCanvas) && map !== null) {
     throw new Error("Map must be of MapCanvas class");
@@ -42,6 +64,10 @@ Rectangle.prototype.setMap = function (map) {
   this._map = map;
 };
 
+/**
+ *
+ * @returns {MapCanvas}
+ */
 Rectangle.prototype.getMap = function () {
   return this._map;
 };
diff --git a/frontend-js/src/test/js/helper.js b/frontend-js/src/test/js/helper.js
index 31951dc59d2b8834188800acdb2489853e7a9666..8ce42ecdcf5c4b3d69c2dcdadbee77f9acce76ec 100644
--- a/frontend-js/src/test/js/helper.js
+++ b/frontend-js/src/test/js/helper.js
@@ -520,6 +520,11 @@ Helper.prototype.createAnnotation = function () {
     type: "DOI"
   });
 };
+
+/**
+ *
+ * @returns {GoogleMapsApiCanvas}
+ */
 Helper.prototype.createGoogleCanvas = function () {
   return new GoogleMapsApiCanvas(testDiv, {
     center: new Point(0, 0),
diff --git a/frontend-js/src/test/js/map/canvas/MapCanvas-test.js b/frontend-js/src/test/js/map/canvas/MapCanvas-test.js
new file mode 100644
index 0000000000000000000000000000000000000000..06bf740aa7a49ff9744224c21e88130e9175f9ae
--- /dev/null
+++ b/frontend-js/src/test/js/map/canvas/MapCanvas-test.js
@@ -0,0 +1,36 @@
+"use strict";
+require("../../mocha-config");
+
+var MapCanvas = require('../../../../main/js/map/canvas/MapCanvas');
+
+var chai = require('chai');
+var assert = chai.assert;
+
+describe('MapCanvas', function () {
+  it("test existence of abstract methods", function () {
+
+    var canvas = new MapCanvas(testDiv, {
+      tileSize: 256,
+      minZoom: 2,
+      height: 600,
+      width: 800
+    });
+    assert.ok(canvas.createMarker);
+    assert.ok(canvas.createInfoWindow);
+    assert.ok(canvas.createRectangle);
+    assert.ok(canvas.createPolyline);
+    assert.ok(canvas.addLeftBottomControl);
+    assert.ok(canvas.addRightBottomControl);
+    assert.ok(canvas.fitBounds);
+    assert.ok(canvas.setCenter);
+    assert.ok(canvas.getCenter);
+    assert.ok(canvas.getZoom);
+    assert.ok(canvas.getBackgroundId);
+    assert.ok(canvas.getSelectedArea);
+    assert.ok(canvas.getBounds);
+    assert.ok(canvas.setSelectedArea);
+    assert.ok(canvas.removeSelection);
+    assert.ok(canvas.triggerListeners);
+  });
+
+});