diff --git a/CHANGELOG b/CHANGELOG
index b52f97704a8c7539c1d4437e59e5d396727a0471..0ab4fff7fee1ccebcf60421562a9d86dfc9e156f 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -27,6 +27,13 @@ minerva (14.0.0~alpha.0) unstable; urgency=low
 
  -- Sascha Herzinger <sascha.herzinger@uni.lu>  Wed, 22 May 2019 10:30:00 +0200
 
+minerva (13.1.2) stable; urgency=medium
+  * Bug fix: Information about problematic zip file is more specific (#865)
+  * Bug fix: Url didn't contain list of opened plugins and they weren't reload
+    automatically on refresh (#866)
+
+ -- Piotr Gawron <piotr.gawron@uni.lu> Mon, 22 Jul 2019 17:00:00 +0200
+
 minerva (13.1.1) stable; urgency=medium
   * Bug fix: adding gene mapping before the genome caused an error (#835)
   * Bug fix: "Terms of Use" change to "Terms of Service" in all places (#843)
diff --git a/frontend-js/src/main/js/ServerConnector.js b/frontend-js/src/main/js/ServerConnector.js
index 2932d855a5691532a61bb332c562df3e00d791a4..10f8a5872451f8fd30200abfa50e1e5d55215588 100644
--- a/frontend-js/src/main/js/ServerConnector.js
+++ b/frontend-js/src/main/js/ServerConnector.js
@@ -1355,6 +1355,19 @@ ServerConnector.getPluginsData = function () {
   });
 };
 
+/**
+ *
+ * @param {string} hash
+ * @returns {Promise<PluginData>}
+ */
+ServerConnector.getPluginData = function (hash) {
+  var self = this;
+  return self.sendGetRequest(self.getPluginUrl({hash: hash})).then(function (content) {
+    var data = JSON.parse(content);
+    return new PluginData(data);
+  }).catch(self.processNetworkError);
+};
+
 /**
  *
  * @param {Object} params
diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
index 13a64f3a094dd371ea1e2152c84ee9af5fd328e9..7f821bd6a90d7031f7eb4af60776c44b9ba3d28d 100644
--- a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
+++ b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
@@ -157,7 +157,7 @@ AddProjectDialog.prototype.createGeneralTabContent = function () {
     name: "project-file"
   });
   fileInput.addEventListener("change", function () {
-    return self.callListeners("onFileUpload", fileInput.files[0]).then(null, GuiConnector.alert);
+    return self.callListeners("onFileUpload", fileInput.files[0]).catch(GuiConnector.alert);
   }, false);
   self.addListener("onFileUpload", function (e) {
     var file = e.arg;
@@ -1449,7 +1449,12 @@ AddProjectDialog.prototype.createZipEntry = function (jsZipEntry, zipObject) {
     type = "MAP";
     data.root = true;
   } else {
-    throw new ValidationError("Unrecognized file: " + filename);
+    var version = self.getConfiguration().getVersion();
+    var minorVersion = version.split(".")[0] + "." + version.split(".")[1];
+
+    var url = 'https://minerva.pages.uni.lu/doc/admin_manual/v' + minorVersion + '/advanced_upload/';
+    throw new ValidationError("Unrecognized file: " + filename + ". Please refer to <a target='#' href='" + url +
+      "'>manual</a> for information about allowed zip file content");
   }
   if (type === "MAP") {
     var name = jsZipEntry.name.toLowerCase();
diff --git a/frontend-js/src/main/js/minerva.js b/frontend-js/src/main/js/minerva.js
index 3cc3ebde00ce30c352b3690ac50a4d529307d0f0..041461972608c65ef9a178b61fd177b89a040ff6 100644
--- a/frontend-js/src/main/js/minerva.js
+++ b/frontend-js/src/main/js/minerva.js
@@ -584,6 +584,18 @@ function create(params) {
     for (var i = 0; i < params.getPlugins().length; i++) {
       promises.push(leftPanel.getPluginManager().addPlugin(params.getPlugins()[i]))
     }
+    if (GuiConnector.getParams['plugins'] !== undefined) {
+      var hashes = GuiConnector.getParams['plugins'].split(",");
+      for (i = 0; i < hashes.length; i++) {
+        promises.push(ServerConnector.getPluginData(hashes[i]).then(function (plugin) {
+          if (plugin !== null) {
+            return leftPanel.getPluginManager().addPlugin({url: plugin.getUrls()[0]});
+          } else {
+            GuiConnector.warn("Plugin list contains invalid object.");
+          }
+        }))
+      }
+    }
     return Promise.all(promises);
   }).then(function () {
     return ServerConnector.getLoggedUser();
diff --git a/frontend-js/src/main/js/plugin/Plugin.js b/frontend-js/src/main/js/plugin/Plugin.js
index c513e2839d1593b6869f83a2809ab84d84f8bcea..e1c97d61db3396a0f2ec89db3d53fd8efbcbe871 100644
--- a/frontend-js/src/main/js/plugin/Plugin.js
+++ b/frontend-js/src/main/js/plugin/Plugin.js
@@ -39,6 +39,12 @@ var pluginId = 0;
 function Plugin(options) {
   ObjectWithListeners.call(this);
   var self = this;
+  /**
+   *
+   * @type {string}
+   * @private
+   */
+  self._hash = '';
   self.setOptions(options);
   self.registerListenerType("onUnload");
   self.registerListenerType("onResize");
@@ -162,6 +168,7 @@ Plugin.prototype.load = function () {
       version: self.getVersion()
     }));
   }).then(function () {
+    self._hash = hash;
     if (error) {
       return Promise.reject(error);
     }
@@ -243,6 +250,14 @@ Plugin.prototype.getName = function () {
   return this.getLoadedPluginData().getName();
 };
 
+/**
+ *
+ * @returns {string}
+ */
+Plugin.prototype.getHash = function () {
+  return this._hash;
+};
+
 /**
  *
  * @returns {string}
diff --git a/frontend-js/src/main/js/plugin/PluginManager.js b/frontend-js/src/main/js/plugin/PluginManager.js
index a04aa1628d816b381b5c08bec12e2bcf2c7e57ad..d577830ae4baf19d4e5e47b1b959c090f967f9cb 100644
--- a/frontend-js/src/main/js/plugin/PluginManager.js
+++ b/frontend-js/src/main/js/plugin/PluginManager.js
@@ -27,6 +27,10 @@ var Functions = require('../Functions');
 function PluginManager(options) {
   AbstractGuiElement.call(this, options);
   var self = this;
+  /**
+   * @type Plugin[]
+   */
+
   self._plugins = [];
   self._pluginOnResizeHandlers = {};
 
@@ -132,6 +136,7 @@ PluginManager.prototype.addPlugin = function (options) {
       }
     }
   }).then(function () {
+    GuiConnector.setUrlParam("plugins", self._getLoadedPluginsAsHashList());
     return plugin;
   }).catch(function (e) {
     return plugin.unload().then(function () {
@@ -149,6 +154,26 @@ PluginManager.prototype.isValidUrl = function (url) {
   return isUrl(url);
 };
 
+/**
+ *
+ * @return {string}
+ * @private
+ */
+PluginManager.prototype._getLoadedPluginsAsHashList = function () {
+  var self = this;
+  var hashes = '';
+  for (var i = 0; i < self._plugins.length; i++) {
+    if (hashes !== '') {
+      hashes += ",";
+    }
+    hashes += self._plugins[i].getHash();
+  }
+  if (hashes === '') {
+    hashes = undefined;
+  }
+  return hashes;
+};
+
 /**
  *
  * @returns {Promise|PromiseLike}
@@ -193,6 +218,7 @@ PluginManager.prototype.removePlugin = function (plugin) {
   }
   GuiConnector.removeWindowResizeEvent(self._pluginOnResizeHandlers[plugin.getPluginId()]);
   return plugin.unload().then(function () {
+    GuiConnector.setUrlParam("plugins", self._getLoadedPluginsAsHashList());
     if (self._plugins.length === 0) {
       $(self.getElement()).hide();
       return self.getMap().getMapCanvas().triggerListeners("resize");
diff --git a/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js b/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js
index ab76c0c9c4724f41d9f8fd2d12715b134b891ea1..4460649174c7f6cc2fee3caabd5c9625dba3a204 100644
--- a/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js
+++ b/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js
@@ -97,6 +97,20 @@ describe('AddProjectDialog', function () {
         return dialog.destroy();
       });
     });
+    it('invalid zip', function () {
+      var dialog = createDialog();
+      var file;
+
+      var buf = fs.readFileSync("testFiles/map/invalid-project.zip");
+      buf.name = "invalid-project.zip";
+      return dialog.init().then(function () {
+        return dialog.setZipFileContent(buf);
+      }).catch(function (e) {
+        assert.ok(e instanceof ValidationError);
+      }).finally(function () {
+        return dialog.destroy();
+      });
+    });
     it('CellDesigner file', function () {
       var dialog = createDialog();
       var file;
diff --git a/frontend-js/src/test/js/plugin/PluginManager-test.js b/frontend-js/src/test/js/plugin/PluginManager-test.js
index b8ff7f823d3d0c7d1a40b8ba183cb32c652d595a..3daf81da2473b2a5e3f1e6202fdb76edaf70f287 100644
--- a/frontend-js/src/test/js/plugin/PluginManager-test.js
+++ b/frontend-js/src/test/js/plugin/PluginManager-test.js
@@ -6,6 +6,8 @@ var Plugin = require('../../../main/js/plugin/Plugin');
 var PluginManager = require('../../../main/js/plugin/PluginManager');
 var ProxyAccessPlugin = require('./ProxyAccessPlugin');
 
+var GuiConnector = require('../../../main/js/GuiConnector');
+
 var logger = require('../logger');
 var chai = require('chai');
 var assert = chai.assert;
@@ -45,6 +47,12 @@ describe('PluginManager', function () {
         assert.equal(1, manager.getPlugins().length);
       });
     });
+    it('check url', function () {
+      var manager = createPluginManager();
+      return manager.addPlugin({url: "./testFiles/plugin/empty.js"}).then(function () {
+        assert.ok(GuiConnector.getParams['plugins']);
+      });
+    });
     it('with min width', function () {
       var manager = createPluginManager();
       return manager.addPlugin({url: "./testFiles/plugin/min-width.js"}).then(function () {
@@ -125,6 +133,16 @@ describe('PluginManager', function () {
         assert.equal(-1, testDiv.innerHTML.indexOf("tab-pane"));
       });
     });
+
+    it('check url', function () {
+      var manager = createPluginManager();
+      return manager.addPlugin({url: "./testFiles/plugin/empty.js"}).then(function (plugin) {
+        return manager.removePlugin(plugin);
+      }).then(function () {
+        assert.notOk(GuiConnector.getParams['plugins']);
+      });
+    });
+
     it('removing non existing plugin', function () {
       var manager = createPluginManager();
       var plugin = new Plugin({url: "testFiles/plugin/empty.js"});
diff --git a/frontend-js/testFiles/map/invalid-project.zip b/frontend-js/testFiles/map/invalid-project.zip
new file mode 100644
index 0000000000000000000000000000000000000000..af75098cf794ec71062a223af5338e0823819100
Binary files /dev/null and b/frontend-js/testFiles/map/invalid-project.zip differ