diff --git a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
index ebe1fe64980963f0d7894433ad28c3b5910e7e93..5e72c1e755757c32a757eb92c4a9476f4749e56d 100644
--- a/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
+++ b/frontend-js/src/main/js/plugin/MinervaPluginProxy.js
@@ -1,17 +1,11 @@
 "use strict";
 
 var IdentifiedElement = require('../map/data/IdentifiedElement');
-var ObjectWithListeners = require('../ObjectWithListeners');
 var UserDbOverlay = require('../map/overlay/UserDbOverlay');
 var Configuration = require('../Configuration');
 
 var Promise = require("bluebird");
 
-var logger = require('../logger');
-var Functions = require('../Functions');
-
-var id = 0;
-
 function getOverlayByName(customMap, dbOverlayName) {
   var dbOverlay = customMap.getOverlayByName(dbOverlayName);
   if (dbOverlay === null) {
@@ -294,7 +288,7 @@ function createProjectMap(options) {
       return submap.setCenter(new google.maps.Point(params.x, params.y));
     },
     fitBounds: function (params) {
-      var submap = customMap.getSubmapById(params.modelId);
+      var submap = map.getSubmapById(params.modelId);
       if (submap === null) {
         throw new Error("Unknown modelId: " + params.modelId);
       }
diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js
index 8bc1f7f2c3a62c3703f963574a4005e4c63ebee7..d734ef48aa9fcda079a1a58eefb616f347efac0a 100644
--- a/frontend-js/src/main/js/plugin/Plugin.js
+++ b/frontend-js/src/main/js/plugin/Plugin.js
@@ -84,8 +84,6 @@ Plugin.prototype.load = function () {
     global.define = oldDefine;
     if (error) {
       return Promise.reject(error);
-    } else if (pluginData === undefined) {
-      return Promise.reject("Invalid plugin. Expected 'define(...)' expression.");
     }
   })
 
diff --git a/frontend-js/src/main/js/plugin/PluginManager.js b/frontend-js/src/main/js/plugin/PluginManager.js
index 631daa46732ded4e52c15efe1fbdf77d4ada1ddf..f29bac0572b5cda1f42d28da39bb3410feaf8249 100644
--- a/frontend-js/src/main/js/plugin/PluginManager.js
+++ b/frontend-js/src/main/js/plugin/PluginManager.js
@@ -103,7 +103,7 @@ PluginManager.prototype.removePlugin = function (plugin) {
     }
   }
   if (!found) {
-    throw new Error("Plugin not registered");
+    return Promise.reject(new Error("Plugin not registered"));
   }
   return plugin.unload();
 };
diff --git a/frontend-js/src/test/js/Configuration-test.js b/frontend-js/src/test/js/Configuration-test.js
index 2a8afc46006870b45d07c24ef825601127b858c4..1d26da921f35b11fd143568ec44588a68feca1d6 100644
--- a/frontend-js/src/test/js/Configuration-test.js
+++ b/frontend-js/src/test/js/Configuration-test.js
@@ -32,9 +32,7 @@ describe('Configuration', function () {
     });
     it('copy', function () {
       return ServerConnector.getConfiguration().then(function (configuration) {
-        logger.debug(configuration.getOption(ConfigurationType.LEGEND_FILES));
         var copy = new Configuration(configuration);
-        logger.debug(copy.getOption(ConfigurationType.LEGEND_FILES));
 
         assert.equal(configuration.getElementTypes().length, copy.getElementTypes().length)
       });
diff --git a/frontend-js/src/test/js/minerva-test.js b/frontend-js/src/test/js/minerva-test.js
index f08fc415327a52465d3215757227d6db33e6ae25..3be929789d6eeeb2b65c1f99fd82d8be15fe43a8 100644
--- a/frontend-js/src/test/js/minerva-test.js
+++ b/frontend-js/src/test/js/minerva-test.js
@@ -134,7 +134,7 @@ describe('minerva global', function () {
     }).then(function (result) {
       assert.ok(result);
       // input file is not available so it's the background
-      return plugin.getProxy().project.map.getVisibleDataOverlays();
+      return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays();
     }).then(function (visibleDataOverlays) {
       // input file is available so it's not the background file but overlay
       assert.equal(visibleDataOverlays.length, 0);
@@ -170,7 +170,7 @@ describe('minerva global', function () {
     }).then(function (result) {
       globalObject = result;
       assert.ok(result);
-      return plugin.getProxy().project.map.getVisibleDataOverlays();
+      return plugin.getMinervaPluginProxy().project.map.getVisibleDataOverlays();
     }).then(function (visibleDataOverlays) {
       // input file is available so it's not the background file but overlay
       assert.equal(visibleDataOverlays.length, 1);
@@ -190,7 +190,7 @@ describe('minerva global', function () {
       return minerva.create(options);
     }).then(function (result) {
       globalObject = result;
-      return plugin.getProxy().project.map.getHighlightedBioEntities("search");
+      return plugin.getMinervaPluginProxy().project.map.getHighlightedBioEntities("search");
     }).then(function (elements) {
       assert.ok(elements.length > 0);
       return globalObject.destroy();
diff --git a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
index 9f9800c390533027fde9453ac589ffbc5119974d..7d75b82467d94f1d3531183032ce3e5979afecfd 100644
--- a/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
+++ b/frontend-js/src/test/js/plugin/MinervaPluginProxy-test.js
@@ -1,8 +1,5 @@
 "use strict";
 
-/* exported logger */
-/* exported assert */
-
 require("../mocha-config");
 
 var Alias = require('../../../main/js/map/data/Alias');
@@ -36,6 +33,7 @@ describe('MinervaPluginProxy', function () {
     assert.ok(proxy.element);
     assert.ok(proxy.project);
     assert.ok(proxy.configuration);
+    assert.equal(0, logger.getWarnings().length);
   });
 
   it('add search listener', function () {
@@ -284,4 +282,23 @@ describe('MinervaPluginProxy', function () {
     });
   });
 
+  it("fitBounds", function () {
+    var map, proxy;
+    return ServerConnector.getProject().then(function (project) {
+      map = helper.createCustomMap(project);
+      proxy = createProxy(map);
+      var center = map.getGoogleMap().getCenter();
+      proxy.project.map.fitBounds({
+        id: 329177,
+        modelId: 15781,
+        type: "ALIAS"
+      });
+      var center2 = map.getGoogleMap().getCenter();
+      assert.ok(center.lat() !== center2.lat() || center.lng() !== center2.lng());
+    }).then(function () {
+      map.destroy();
+    });
+  });
+
+
 });
diff --git a/frontend-js/src/test/js/plugin/Plugin-test.js b/frontend-js/src/test/js/plugin/Plugin-test.js
index bc4ccddc3c93fc33e13cded40ad50bfa357cee1c..601df1310b2314bd23688e27fcb5a6273cd66384 100644
--- a/frontend-js/src/test/js/plugin/Plugin-test.js
+++ b/frontend-js/src/test/js/plugin/Plugin-test.js
@@ -20,20 +20,6 @@ describe('Plugin', function () {
     });
     assert.ok(plugin);
   });
-  it('load', function () {
-    var map = helper.createCustomMap();
-
-    var plugin = new Plugin({
-      url: "./testFiles/plugin/empty.js",
-      map: map,
-      configuration: helper.getConfiguration()
-    });
-    return plugin.load().then(function () {
-      assert.equal("test plugin", plugin.getName());
-      assert.equal("0.0.1", plugin.getVersion());
-      assert.equal(0, logger.getWarnings().length);
-    });
-  });
 
   it('test plugins', function () {
     var map = helper.createCustomMap();
@@ -52,4 +38,47 @@ describe('Plugin', function () {
     });
     return Promise.all(promises);
   });
+
+  describe('load', function () {
+    it('default', function () {
+      var map = helper.createCustomMap();
+
+      var plugin = new Plugin({
+        url: "./testFiles/plugin/empty.js",
+        map: map,
+        configuration: helper.getConfiguration()
+      });
+      return plugin.load().then(function () {
+        assert.equal("test plugin", plugin.getName());
+        assert.equal("0.0.1", plugin.getVersion());
+        assert.equal(0, logger.getWarnings().length);
+      });
+    });
+
+    it('invalid javascript code', function () {
+      var plugin = new Plugin({
+        url: "./testFiles/plugin-invalid/invalid_javascript.js",
+        map: helper.createCustomMap(),
+        configuration: helper.getConfiguration()
+      });
+      return plugin.load().then(function () {
+        assert.false("expected error");
+      }, function (error) {
+        assert.ok(error.message.indexOf("Unexpected identifier") >= 0);
+      });
+    });
+
+    it('plugin register crash', function () {
+      var plugin = new Plugin({
+        url: "./testFiles/plugin-invalid/invalid_register.js",
+        map: helper.createCustomMap(),
+        configuration: helper.getConfiguration()
+      });
+      return plugin.load().then(function () {
+        assert.false("expected error");
+      }, function (error) {
+        assert.ok(error.message.indexOf("Let's crash") >= 0);
+      });
+    });
+  });
 });
diff --git a/frontend-js/src/test/js/plugin/PluginManager-test.js b/frontend-js/src/test/js/plugin/PluginManager-test.js
index 8a726b453bd0bde35fbcf6cc4f881eccc06761df..61d8ac2df925f77b5b8f9fe3bceb686641a030e7 100644
--- a/frontend-js/src/test/js/plugin/PluginManager-test.js
+++ b/frontend-js/src/test/js/plugin/PluginManager-test.js
@@ -5,6 +5,7 @@
 
 require("../mocha-config");
 
+var Plugin = require('../../../main/js/plugin/Plugin');
 var PluginManager = require('../../../main/js/plugin/PluginManager');
 
 var logger = require('../logger');
@@ -49,12 +50,23 @@ describe('PluginManager', function () {
     });
   });
 
-  it('removePlugin', function () {
-    var manager = new PluginManager(createParams());
-    return manager.addPlugin({url: "testFiles/plugin/empty.js"}).then(function (plugin) {
-      return manager.removePlugin(plugin);
-    }).then(function () {
-      assert.equal(0, manager.getPlugins().length);
+  describe('removePlugin', function () {
+    it('default', function () {
+      var manager = new PluginManager(createParams());
+      return manager.addPlugin({url: "testFiles/plugin/empty.js"}).then(function (plugin) {
+        return manager.removePlugin(plugin);
+      }).then(function () {
+        assert.equal(0, manager.getPlugins().length);
+      });
+    });
+    it('removing non existing plugin', function () {
+      var manager = new PluginManager(createParams());
+      var plugin = new Plugin({url: "testFiles/plugin/empty.js"});
+      return manager.removePlugin(plugin).then(function () {
+        assert.false("Error expected");
+      }, function (error) {
+        assert.ok(error.message.indexOf("Plugin not registered") >= 0);
+      });
     });
   });
 
diff --git a/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js b/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js
index e1dc9b28261d0124924263fe7fe5c3cbfc116e56..3f084b8ed5fbda5a1300d118a0bd7c7e419bcb1c 100644
--- a/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js
+++ b/frontend-js/src/test/js/plugin/ProxyAccessPlugin.js
@@ -5,6 +5,8 @@ var MinervaPluginProxy = require('../../../main/js/plugin/MinervaPluginProxy');
 
 var Promise = require('bluebird');
 
+var logger = require('../logger');
+
 function ProxyAccessPlugin() {
 }
 
@@ -12,12 +14,9 @@ ProxyAccessPlugin.prototype = Object.create(Plugin.prototype);
 ProxyAccessPlugin.prototype.constructor = ProxyAccessPlugin;
 
 ProxyAccessPlugin.prototype.setOptions = function (options) {
-  this._proxy = new MinervaPluginProxy(options);
+  this.setMinervaPluginProxy(new MinervaPluginProxy(options));
 };
 
-ProxyAccessPlugin.prototype.getProxy = function () {
-  return this._proxy;
-};
 ProxyAccessPlugin.prototype.load = function () {
   this.setLoadedPluginData({
     getName: function () {
@@ -27,8 +26,10 @@ ProxyAccessPlugin.prototype.load = function () {
       return "0.0.1";
     },
     unregister: function () {
+      logger.debug("un-registering ProxyAccessPlugin");
     },
     register: function () {
+      logger.debug("registering ProxyAccessPlugin");
     }
   });
   return Promise.resolve();
diff --git a/frontend-js/testFiles/plugin-invalid/invalid_javascript.js b/frontend-js/testFiles/plugin-invalid/invalid_javascript.js
new file mode 100644
index 0000000000000000000000000000000000000000..66cfdc0c68bc2e46f3ba4b0100f9f58638365010
--- /dev/null
+++ b/frontend-js/testFiles/plugin-invalid/invalid_javascript.js
@@ -0,0 +1 @@
+some invalid js code
\ No newline at end of file
diff --git a/frontend-js/testFiles/plugin-invalid/invalid_register.js b/frontend-js/testFiles/plugin-invalid/invalid_register.js
new file mode 100644
index 0000000000000000000000000000000000000000..f8b555f8c9aecccb91ace2d921e8964e8006ed11
--- /dev/null
+++ b/frontend-js/testFiles/plugin-invalid/invalid_register.js
@@ -0,0 +1,15 @@
+define(function () {
+  return {
+    register: function (object) {
+      throw new Error("Let's crash");
+    },
+    unregister: function () {
+    },
+    getName: function () {
+      return "test plugin";
+    },
+    getVersion: function () {
+      return "0.0.1";
+    }
+  };
+});
\ No newline at end of file
diff --git a/frontend-js/testFiles/plugin/empty-without-function.js b/frontend-js/testFiles/plugin/empty-without-function.js
new file mode 100644
index 0000000000000000000000000000000000000000..bafb6d13a6cf3b927941251b270111f11b70ffc2
--- /dev/null
+++ b/frontend-js/testFiles/plugin/empty-without-function.js
@@ -0,0 +1,14 @@
+define({
+  register: function (object) {
+    console.log("registering test plugin");
+  },
+  unregister: function () {
+    console.log("unregistering test plugin");
+  },
+  getName: function () {
+    return "test plugin";
+  },
+  getVersion: function () {
+    return "0.0.1";
+  }
+});
\ No newline at end of file