diff --git a/docs/en_US/images/preferences_misc_layout.png b/docs/en_US/images/preferences_misc_layout.png
new file mode 100644
index 0000000000000000000000000000000000000000..d04d3c85b07c9809cbabdc01f152c4273ab59139
GIT binary patch
diff --git a/docs/en_US/preferences.rst b/docs/en_US/preferences.rst
index 1f27961..241f24c 100644
--- a/docs/en_US/preferences.rst
+++ b/docs/en_US/preferences.rst
@@ -91,6 +91,11 @@ Expand the *Miscellaneous* node to specify miscellaneous display preferences.
 
 * Use the *User language* drop-down listbox to select the display language for the client.
 
+.. image:: images/preferences_misc_layout.png
+    :alt: Preferences dialog user layout section
+
+* When the *Lock layout?* switch is set to *True*, user will not be able to drag and drop panels.
+
 **The Paths Node**
 
 Expand the *Paths* node to specify the locations of supporting utility and help files.
diff --git a/web/pgadmin/browser/__init__.py b/web/pgadmin/browser/__init__.py
index 724e677..0adaf21 100644
--- a/web/pgadmin/browser/__init__.py
+++ b/web/pgadmin/browser/__init__.py
@@ -854,6 +854,9 @@ def utils():
     except Exception as e:
         pg_libpq_version = 0
 
+    misc_preference = Preferences.module('miscellaneous')
+    panel_setting = misc_preference.preference('docker_panel_layout').get()
+
     for submodule in current_blueprint.submodules:
         snippets.extend(submodule.jssnippets)
     return make_response(
@@ -870,7 +873,8 @@ def utils():
             editor_insert_pair_brackets=insert_pair_brackets,
             editor_indent_with_tabs=editor_indent_with_tabs,
             app_name=config.APP_NAME,
-            pg_libpq_version=pg_libpq_version
+            pg_libpq_version=pg_libpq_version,
+            panel_setting=panel_setting
         ),
         200, {'Content-Type': 'application/x-javascript'})
 
diff --git a/web/pgadmin/browser/static/js/panel.js b/web/pgadmin/browser/static/js/panel.js
index ab0681a..7327687 100644
--- a/web/pgadmin/browser/static/js/panel.js
+++ b/web/pgadmin/browser/static/js/panel.js
@@ -9,7 +9,7 @@ define(
       var defaults = [
         'name', 'title', 'width', 'height', 'showTitle', 'isCloseable',
         'isPrivate', 'content', 'icon', 'events', 'onCreate', 'elContainer',
-        'canHide', 'limit',
+        'canHide', 'limit', 'isMoveable',
       ];
       _.extend(this, _.pick(options, defaults));
     };
@@ -22,6 +22,7 @@ define(
       showTitle: true,
       isCloseable: true,
       isPrivate: false,
+      isMoveable: pgBrowser.utils ? pgBrowser.utils.is_panel_moveable : true,
       content: '',
       icon: '',
       panel: null,
@@ -53,6 +54,7 @@ define(
               }).append($(that.content));
 
               myPanel.closeable(!!that.isCloseable);
+              myPanel.moveable(!!that.isMoveable);
               myPanel.layout().addItem($container);
               that.panel = myPanel;
               if (that.events && _.isObject(that.events)) {
diff --git a/web/pgadmin/browser/templates/browser/js/utils.js b/web/pgadmin/browser/templates/browser/js/utils.js
index be3b712..e021a06 100644
--- a/web/pgadmin/browser/templates/browser/js/utils.js
+++ b/web/pgadmin/browser/templates/browser/js/utils.js
@@ -26,6 +26,7 @@ define('pgadmin.browser.utils',
     is_indent_with_tabs: '{{ editor_indent_with_tabs }}' == 'True',
     app_name: '{{ app_name }}',
     pg_libpq_version: {{pg_libpq_version|e}},
+    is_panel_moveable: '{{ panel_setting }}' == 'False',
 
     counter: {total: 0, loaded: 0},
     registerScripts: function (ctx) {
diff --git a/web/pgadmin/misc/__init__.py b/web/pgadmin/misc/__init__.py
index 19e1828..923e224 100644
--- a/web/pgadmin/misc/__init__.py
+++ b/web/pgadmin/misc/__init__.py
@@ -68,6 +68,12 @@ class MiscModule(PgAdminModule):
             category_label=gettext('User language'),
             options=lang_options
         )
+        self.misc_preference.register(
+            'layout', 'docker_panel_layout',
+            gettext("Lock layout?"), 'boolean', False,
+            category_label=gettext('Layout')
+        )
+
 
     def get_exposed_url_endpoints(self):
         """
diff --git a/web/pgadmin/tools/datagrid/static/js/datagrid.js b/web/pgadmin/tools/datagrid/static/js/datagrid.js
index 473f20a..d8edc8f 100644
--- a/web/pgadmin/tools/datagrid/static/js/datagrid.js
+++ b/web/pgadmin/tools/datagrid/static/js/datagrid.js
@@ -525,6 +525,7 @@ define('pgadmin.datagrid', [
           // Set panel title and icon
           queryToolPanel.title('<span title="'+panel_title+'">'+panel_title+'</span>');
           queryToolPanel.icon('fa fa-bolt');
+          queryToolPanel.moveable(pgBrowser.utils.is_panel_moveable);
           queryToolPanel.focus();
 
           // Listen on the panel closed event.
diff --git a/web/pgadmin/tools/debugger/static/js/debugger_ui.js b/web/pgadmin/tools/debugger/static/js/debugger_ui.js
index f9049d8..3710024 100644
--- a/web/pgadmin/tools/debugger/static/js/debugger_ui.js
+++ b/web/pgadmin/tools/debugger/static/js/debugger_ui.js
@@ -725,6 +725,7 @@ define([
                         );
 
                       panel.focus();
+                      panel.moveable(pgBrowser.utils.is_panel_moveable);
 
                       // Panel Closed event
                       panel.on(wcDocker.EVENT.CLOSED, function() {
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 923ccea..ab96aac 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -176,6 +176,7 @@ define('tools.querytool', [
         height: '20%',
         isCloseable: false,
         isPrivate: true,
+        isMoveable: true,
       });
 
       sql_panel.load(main_docker);
diff --git a/web/regression/javascript/browser/panel_spec.js b/web/regression/javascript/browser/panel_spec.js
new file mode 100644
index 0000000..2ad5dd5
--- /dev/null
+++ b/web/regression/javascript/browser/panel_spec.js
@@ -0,0 +1,59 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2018, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+define([
+  'pgadmin',
+  'browser/panel',
+], function (pgAdmin) {
+  describe('Panel', function () {
+    let Panel = pgAdmin.Browser.Panel;
+    let testPanel_1, testPanel_2, testPanel_3;
+
+    describe('when we create a panel', function () {
+      describe('and it is moveable panel', function () {
+        beforeEach(function () {
+          testPanel_1 = new Panel({
+            name: 'test',
+            title: 'Test',
+            isMoveable: true,
+          });
+        });
+        it('it should call moveable method with true as argument', function () {
+          expect(testPanel_1.isMoveable).toBe(true);
+        });
+      });
+
+      describe('and it is non-moveable panel', function () {
+        beforeEach(function () {
+          testPanel_2 = new Panel({
+            name: 'test',
+            title: 'Test',
+            isMoveable: false,
+          });
+        });
+        it('it should call moveable method with false as argument', function () {
+          expect(testPanel_2.isMoveable).toBe(false);
+        });
+      });
+
+      describe('and user created panel without defining isMoveable then it should be moveable', function () {
+        beforeEach(function () {
+          testPanel_3 = new Panel({
+            name: 'test',
+            title: 'Test',
+          });
+        });
+        it('it should call moveable method with true as argument', function () {
+          expect(testPanel_3.isMoveable).toBe(true);
+        });
+      });
+
+    });
+  });
+});
diff --git a/web/webpack.test.config.js b/web/webpack.test.config.js
index 306a030..9932907 100644
--- a/web/webpack.test.config.js
+++ b/web/webpack.test.config.js
@@ -80,6 +80,7 @@ module.exports = {
       'pgadmin.alertifyjs': sourcesDir + '/js/alertify.pgadmin.defaults',
       'pgadmin.backgrid': sourcesDir + '/js/backgrid.pgadmin',
       'pgadmin.backform': sourcesDir + '/js/backform.pgadmin',
+      'wcdocker': path.join(__dirname, './node_modules/webcabin-docker/Build/wcDocker'),
     },
   },
 };
