diff --git a/CHANGELOG b/CHANGELOG
index cd0d0115d5a4e3194d4ab7b13624c823249e5508..494b81d535191f26552aa8780a2d881648da6626 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,7 @@
+minerva (15.0.0~alpha.1) stable; urgency=medium
+  * Small improvement: sort order of tables in admin panel is preserved among
+    sessions (#836)
+
 minerva (15.0.0~alpha.0) stable; urgency=medium
   * Improvement: logs provided for validation data model are structurized (#325)
   * Improvement: import/export of GPML implemented
@@ -19,6 +23,8 @@ minerva (15.0.0~alpha.0) stable; urgency=medium
     file (#671)
   * Bug fix: problematic notes doesn't crash CellDesigner upload (#968)
 
+ -- Piotr Gawron <piotr.gawron@uni.lu>  Wed, 4 Nov 2019 11:00:00 +0200
+
 minerva (14.0.3) stable; urgency=medium
   * Bug fix: default zoom level on main map works even when x or y are
     undefined (#993)
diff --git a/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js b/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js
index bebc8f95f6b81b0bb3d5c911dd1a2b7cb585a789..58752e135caa6bd6472aacef9c4bf4799425889c 100644
--- a/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/ConfigurationAdminPanel.js
@@ -141,7 +141,7 @@ ConfigurationAdminPanel.prototype.createOptionsTable = function (options, type)
 
   self.getGuiUtils().addTab(self, {name: type, content: configurationDiv});
 
-  return self.bindUserGuiPreference({
+  return Promise.all([self.bindUserGuiPreference({
     jQueryObject: $(configurationTable),
     event: 'length.dt',
     preferenceName: 'admin-configuration-datatable-length',
@@ -152,7 +152,26 @@ ConfigurationAdminPanel.prototype.createOptionsTable = function (options, type)
     setter: function (value) {
       return $(configurationTable).DataTable().page.len(value).draw();
     }
-  });
+  }), self.bindUserGuiPreference({
+    jQueryObject: $(configurationTable),
+    event: 'order.dt',
+    preferenceName: 'admin-configuration-' + type + '-datatable-order',
+    defaultValue: '0-asc',
+    getter: function () {
+      var order = $(configurationTable).DataTable().order();
+      return order[0][0] + "-" + order[0][1];
+    },
+    setter: function (value) {
+      var tmp = value.split("-");
+      var column = parseInt(tmp[0]);
+      var order = tmp[1];
+      if (Functions.isInt(column) && (order === "asc" || order === "desc")) {
+        return $(configurationTable).DataTable().order([column, order]).draw();
+      } else {
+        logger.warn("Invalid order: " + column + "; " + order);
+      }
+    }
+  })]);
 };
 
 /**
diff --git a/frontend-js/src/main/js/gui/admin/GenomeAdminPanel.js b/frontend-js/src/main/js/gui/admin/GenomeAdminPanel.js
index 5aacb3a37a9dd97ed5cd599ad3ef519596076d9f..e9c725637036de01df906a0b67b61992af86d43f 100644
--- a/frontend-js/src/main/js/gui/admin/GenomeAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/GenomeAdminPanel.js
@@ -177,6 +177,30 @@ GenomeAdminPanel.prototype.init = function () {
     } else {
       self.disablePanel("You have no privilege to manage genomes");
     }
+
+  }).then(function () {
+    var genomesTable = $("[name='genomeTable']", self.getElement())[0];
+
+    return self.bindUserGuiPreference({
+      jQueryObject: $(genomesTable),
+      event: 'order.dt',
+      preferenceName: 'admin-genome-datatable-order',
+      defaultValue: '0-asc',
+      getter: function () {
+        var order = $(genomesTable).DataTable().order();
+        return order[0][0] + "-" + order[0][1];
+      },
+      setter: function (value) {
+        var tmp = value.split("-");
+        var column = parseInt(tmp[0]);
+        var order = tmp[1];
+        if (Functions.isInt(column) && (order === "asc" || order === "desc")) {
+          return $(genomesTable).DataTable().order([column, order]).draw();
+        } else {
+          logger.warn("Invalid order: " + column + "; " + order);
+        }
+      }
+    });
   });
 };
 
@@ -267,7 +291,7 @@ GenomeAdminPanel.prototype.destroy = function () {
 /**
  *
  * @param {ReferenceGenome} [genome]
- * @returns {Promise}
+ * @returns {Promise<EditGenomeDialog>}
  */
 GenomeAdminPanel.prototype.getDialog = function (genome) {
   var self = this;
diff --git a/frontend-js/src/main/js/gui/admin/PluginAdminPanel.js b/frontend-js/src/main/js/gui/admin/PluginAdminPanel.js
index 02103ff2ba143463aafddca5f5faaaa9b316cf35..82e6b0dacbbadf75a20174a3c0911fa07677b2f1 100644
--- a/frontend-js/src/main/js/gui/admin/PluginAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/PluginAdminPanel.js
@@ -150,6 +150,29 @@ PluginAdminPanel.prototype.init = function () {
     } else {
       self.disablePanel("You have no privilege to manage plugins");
     }
+  }).then(function () {
+    var pluginsTable = $("[name='pluginsTable']", self.getElement())[0];
+
+    return self.bindUserGuiPreference({
+      jQueryObject: $(pluginsTable),
+      event: 'order.dt',
+      preferenceName: 'admin-plugins-datatable-order',
+      defaultValue: '0-asc',
+      getter: function () {
+        var order = $(pluginsTable).DataTable().order();
+        return order[0][0] + "-" + order[0][1];
+      },
+      setter: function (value) {
+        var tmp = value.split("-");
+        var column = parseInt(tmp[0]);
+        var order = tmp[1];
+        if (Functions.isInt(column) && (order === "asc" || order === "desc")) {
+          return $(pluginsTable).DataTable().order([column, order]).draw();
+        } else {
+          logger.warn("Invalid order: " + column + "; " + order);
+        }
+      }
+    });
   });
 };
 
diff --git a/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js b/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js
index 03f58b48837f8825699a62388270a45e7463eea0..34bc6cec1f9cec1559788f77be3c54c746343119 100644
--- a/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/UsersAdminPanel.js
@@ -265,6 +265,30 @@ UsersAdminPanel.prototype.init = function () {
     } else {
       self.disablePanel("You have no privilege to manage users");
     }
+
+  }).then(function () {
+    var usersTable = $("[name='usersTable']", self.getElement())[0];
+
+    return self.bindUserGuiPreference({
+      jQueryObject: $(usersTable),
+      event: 'order.dt',
+      preferenceName: 'admin-users-datatable-order',
+      defaultValue: '0-asc',
+      getter: function () {
+        var order = $(usersTable).DataTable().order();
+        return order[0][0] + "-" + order[0][1];
+      },
+      setter: function (value) {
+        var tmp = value.split("-");
+        var column = parseInt(tmp[0]);
+        var order = tmp[1];
+        if (Functions.isInt(column) && (order === "asc" || order === "desc")) {
+          return $(usersTable).DataTable().order([column, order]).draw();
+        } else {
+          logger.warn("Invalid order: " + column + "; " + order);
+        }
+      }
+    });
   });
 };