diff --git a/web/pgadmin/browser/static/js/browser.js b/web/pgadmin/browser/static/js/browser.js
index 38252887..f492a1f5 100644
--- a/web/pgadmin/browser/static/js/browser.js
+++ b/web/pgadmin/browser/static/js/browser.js
@@ -12,7 +12,7 @@ define('pgadmin.browser', [
   'sources/gettext', 'sources/url_for', 'require', 'jquery', 'underscore', 'underscore.string',
   'bootstrap', 'sources/pgadmin', 'pgadmin.alertifyjs', 'bundled_codemirror',
   'sources/check_node_visibility', './toolbar', 'pgadmin.help',
-  'sources/csrf', 'sources/utils', 'pgadmin.browser.utils',
+  'sources/csrf', 'sources/utils', 'sources/window', 'pgadmin.browser.utils',
   'wcdocker', 'jquery.contextmenu', 'jquery.aciplugin', 'jquery.acitree',
   'pgadmin.browser.preferences', 'pgadmin.browser.messages',
   'pgadmin.browser.menu', 'pgadmin.browser.panel', 'pgadmin.browser.layout',
@@ -24,7 +24,7 @@ define('pgadmin.browser', [
   tree,
   gettext, url_for, require, $, _, S,
   Bootstrap, pgAdmin, Alertify, codemirror,
-  checkNodeVisibility, toolBar, help, csrfToken, pgadminUtils,
+  checkNodeVisibility, toolBar, help, csrfToken, pgadminUtils, pgWindow
 ) {
   window.jQuery = window.$ = $;
   // Some scripts do export their object in the window only.
@@ -714,8 +714,7 @@ define('pgadmin.browser', [
     bind_beforeunload: function() {
       $(window).on('beforeunload', function(e) {
         /* Can open you in new tab */
-        let openerBrowser = window.opener ?
-          window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+        let openerBrowser = pgWindow.default.pgAdmin.Browser;
 
         let tree_save_interval = pgBrowser.get_preference('browser', 'browser_tree_state_save_interval'),
           confirm_on_refresh_close = openerBrowser.get_preference('browser', 'confirm_on_refresh_close');
diff --git a/web/pgadmin/browser/static/js/layout.js b/web/pgadmin/browser/static/js/layout.js
index a4aaa0e7..36669783 100644
--- a/web/pgadmin/browser/static/js/layout.js
+++ b/web/pgadmin/browser/static/js/layout.js
@@ -13,6 +13,7 @@ import $ from 'jquery';
 import * as Alertify from 'pgadmin.alertifyjs';
 import gettext from 'sources/gettext';
 import 'wcdocker';
+import pgWindow from 'sources/window';
 
 const pgBrowser = pgAdmin.Browser = pgAdmin.Browser || {};
 
@@ -74,8 +75,7 @@ _.extend(pgBrowser, {
     }
 
     /* preference available only with top/opener browser. */
-    let browser = window.opener ?
-      window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+    let browser = pgWindow.pgAdmin.Browser;
 
     /* interval required initially as preference load may take time */
     let cacheIntervalId = setInterval(()=> {
@@ -93,8 +93,7 @@ _.extend(pgBrowser, {
   },
 
   reflectLocklayoutChange: function(docker) {
-    let browser = window.opener ?
-      window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+    let browser = pgWindow.pgAdmin.Browser;
 
     let browserPref = browser.get_preferences_for_module('browser');
     browser.lock_layout(docker, browserPref.lock_layout);
@@ -125,8 +124,7 @@ _.extend(pgBrowser, {
   },
 
   save_lock_layout: function(op) {
-    let browser = window.opener ?
-      window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+    let browser = pgWindow.pgAdmin.Browser;
 
     $.ajax({
       url: url_for('browser.lock_layout'),
diff --git a/web/pgadmin/browser/static/js/preferences.js b/web/pgadmin/browser/static/js/preferences.js
index 680d18f4..00f566fc 100644
--- a/web/pgadmin/browser/static/js/preferences.js
+++ b/web/pgadmin/browser/static/js/preferences.js
@@ -12,6 +12,7 @@ import url_for from 'sources/url_for';
 import $ from 'jquery';
 import * as Alertify from 'pgadmin.alertifyjs';
 import * as SqlEditorUtils from 'sources/sqleditor_utils';
+import pgWindow from 'sources/window';
 
 var modifyAnimation = require('sources/modify_animation');
 
@@ -148,16 +149,8 @@ _.extend(pgBrowser, {
   },
 
   onPreferencesChange: function(module, eventHandler) {
-    window.parent.$(parent.document).on('prefchange:'+module, function(event) {
-      /* If a sqleditor is closed, event handler will be called
-       * but the window.top will be null. Unbind the event handler
-       */
-      if(window.top === null) {
-        window.$(document).off(event);
-      }
-      else {
-        eventHandler(event);
-      }
+    $(pgWindow).on('prefchange:'+module, function(event) {
+      eventHandler(event);
     });
   },
 
diff --git a/web/pgadmin/dashboard/static/js/dashboard.js b/web/pgadmin/dashboard/static/js/dashboard.js
index 77572618..39132dd5 100644
--- a/web/pgadmin/dashboard/static/js/dashboard.js
+++ b/web/pgadmin/dashboard/static/js/dashboard.js
@@ -11,10 +11,10 @@ define('pgadmin.dashboard', [
   'sources/url_for', 'sources/gettext', 'require', 'jquery', 'underscore',
   'sources/pgadmin', 'backbone', 'backgrid', './charting',
   'pgadmin.alertifyjs', 'pgadmin.backform', 'sources/nodes/dashboard',
-  'sources/utils', 'pgadmin.browser', 'bootstrap', 'wcdocker',
+  'sources/utils', 'sources/window', 'pgadmin.browser', 'bootstrap', 'wcdocker',
 ], function(
   url_for, gettext, r, $, _, pgAdmin, Backbone, Backgrid, charting,
-  Alertify, Backform, NodesDashboard, commonUtils
+  Alertify, Backform, NodesDashboard, commonUtils, pgWindow
 ) {
 
   pgAdmin.Browser = pgAdmin.Browser || {};
@@ -770,7 +770,7 @@ define('pgadmin.dashboard', [
        */
       let cacheIntervalId = setInterval(function() {
         try {
-          if(window.top.pgAdmin.Browser.preference_version() > 0) {
+          if(pgWindow.default.pgAdmin.Browser.preference_version() > 0) {
             clearInterval(cacheIntervalId);
             self.reflectPreferences();
           }
@@ -794,10 +794,10 @@ define('pgadmin.dashboard', [
       /* We will use old preferences for selective graph updates on preference change */
       if(self.preferences) {
         self.old_preferences = self.preferences;
-        self.preferences = window.top.pgAdmin.Browser.get_preferences_for_module('dashboards');
+        self.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('dashboards');
       }
       else {
-        self.preferences = window.top.pgAdmin.Browser.get_preferences_for_module('dashboards');
+        self.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('dashboards');
         self.old_preferences = self.preferences;
       }
 
diff --git a/web/pgadmin/static/js/backform.pgadmin.js b/web/pgadmin/static/js/backform.pgadmin.js
index 33d264ab..559a4dd5 100644
--- a/web/pgadmin/static/js/backform.pgadmin.js
+++ b/web/pgadmin/static/js/backform.pgadmin.js
@@ -10,10 +10,10 @@
 define([
   'sources/gettext', 'underscore', 'underscore.string', 'jquery',
   'backbone', 'backform', 'backgrid', 'codemirror', 'sources/sqleditor_utils',
-  'sources/keyboard_shortcuts',
+  'sources/keyboard_shortcuts', 'sources/window',
   'spectrum', 'pgadmin.backgrid', 'select2', 'bootstrap.toggle',
 ], function(gettext, _, S, $, Backbone, Backform, Backgrid, CodeMirror,
-  SqlEditorUtils, keyboardShortcuts) {
+  SqlEditorUtils, keyboardShortcuts, pgWindow) {
 
   var pgAdmin = (window.pgAdmin = window.pgAdmin || {}),
     pgBrowser = pgAdmin.Browser;
@@ -1303,7 +1303,7 @@ define([
 
       let tmp_browser = pgBrowser;
       if (pgBrowser.preferences_cache.length == 0)
-        tmp_browser = window.opener ? window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+        tmp_browser = pgWindow.default.pgAdmin.Browser;
 
       let preferences = tmp_browser.get_preferences_for_module('browser');
 
@@ -1602,7 +1602,7 @@ define([
 
       let tmp_browser = pgBrowser;
       if (pgBrowser.preferences_cache.length == 0)
-        tmp_browser = window.opener ? window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+        tmp_browser = pgWindow.default.pgAdmin.Browser;
 
       let preferences = tmp_browser.get_preferences_for_module('browser');
 
@@ -2383,8 +2383,7 @@ define([
         /* This control is used by filter dialog in query editor, so taking preferences from window
          * SQL Editor can be in different tab
          */
-        let browser = window.opener ?
-          window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+        let browser = pgWindow.default.pgAdmin.Browser;
 
         let sqlEditPreferences = browser.get_preferences_for_module('sqleditor');
 
diff --git a/web/pgadmin/static/js/modify_animation.js b/web/pgadmin/static/js/modify_animation.js
index 420c9433..8852ecd0 100644
--- a/web/pgadmin/static/js/modify_animation.js
+++ b/web/pgadmin/static/js/modify_animation.js
@@ -9,13 +9,10 @@
 
 import $ from 'jquery';
 import _ from 'underscore';
+import pgWindow from 'sources/window';
 
 function getBrowserInstance() {
-  if (!_.isUndefined(window.opener) && !_.isNull(window.opener)) {
-    return window.opener.pgAdmin.Browser;
-  } else {
-    return window.parent.pgAdmin.Browser;
-  }
+  return pgWindow.pgAdmin.Browser;
 }
 
 function modifyAcitreeAnimation(pgBrowser, tree) {
diff --git a/web/pgadmin/static/js/selection/xcell_selection_model.js b/web/pgadmin/static/js/selection/xcell_selection_model.js
index 9a9a66f3..cfb7bded 100644
--- a/web/pgadmin/static/js/selection/xcell_selection_model.js
+++ b/web/pgadmin/static/js/selection/xcell_selection_model.js
@@ -11,9 +11,9 @@ define([
   'jquery',
   'underscore',
   'sources/selection/range_selection_helper',
-
+  'sources/window',
   'slickgrid',
-], function ($, _, RangeSelectionHelper) {
+], function ($, _, RangeSelectionHelper, pgWindow) {
   var XCellSelectionModel = function (options) {
 
     var KEY_ARROW_RIGHT = 39;
@@ -50,7 +50,7 @@ define([
       grid.registerPlugin(_selector);
       _selector.onCellRangeSelected.subscribe(handleCellRangeSelected);
       _selector.onBeforeCellRangeSelected.subscribe(handleBeforeCellRangeSelected);
-      $(window.parent).on('mouseup',handleWindowMouseUp);
+      $(pgWindow.default).on('mouseup',handleWindowMouseUp);
     }
 
     function destroy() {
@@ -59,7 +59,7 @@ define([
       _selector.onCellRangeSelected.unsubscribe(handleCellRangeSelected);
       _selector.onBeforeCellRangeSelected.unsubscribe(handleBeforeCellRangeSelected);
       _grid.unregisterPlugin(_selector);
-      $(window.parent).off('mouseup', handleWindowMouseUp);
+      $(pgWindow.default).off('mouseup', handleWindowMouseUp);
     }
 
     function removeInvalidRanges(ranges) {
diff --git a/web/pgadmin/static/js/sqleditor/query_tool_actions.js b/web/pgadmin/static/js/sqleditor/query_tool_actions.js
index 34b6827a..c804ff45 100644
--- a/web/pgadmin/static/js/sqleditor/query_tool_actions.js
+++ b/web/pgadmin/static/js/sqleditor/query_tool_actions.js
@@ -8,6 +8,7 @@
 //////////////////////////////////////////////////////////////
 
 import $ from 'jquery';
+import pgWindow from 'sources/window';
 
 let queryToolActions = {
   _verbose: function () {
@@ -124,7 +125,7 @@ let queryToolActions = {
 
   focusOut: function () {
     document.activeElement.blur();
-    window.top.document.activeElement.blur();
+    pgWindow.document.activeElement.blur();
   },
 
   toggleCaseOfSelectedText: function (sqlEditorController) {
diff --git a/web/pgadmin/static/js/window.js b/web/pgadmin/static/js/window.js
new file mode 100644
index 00000000..5969b93a
--- /dev/null
+++ b/web/pgadmin/static/js/window.js
@@ -0,0 +1,28 @@
+/////////////////////////////////////////////////////////////
+//
+// pgAdmin 4 - PostgreSQL Tools
+//
+// Copyright (C) 2013 - 2019, The pgAdmin Development Team
+// This software is released under the PostgreSQL Licence
+//
+//////////////////////////////////////////////////////////////
+
+let pgWindow = function() {
+  let pgWindow = null;
+  try {
+    if(window.opener && window.opener.pgAdmin) {
+      pgWindow = window.opener;
+    } else if(window.parent && window.parent.pgAdmin){
+      pgWindow = window.parent;
+    } else if(window.top && window.top.pgAdmin){
+      pgWindow = window.top;
+    } else {
+      pgWindow = window;
+    }
+  } catch (error) {
+    pgWindow = window;
+  }
+  return pgWindow;
+}();
+
+export default pgWindow;
diff --git a/web/pgadmin/tools/debugger/static/js/debugger_ui.js b/web/pgadmin/tools/debugger/static/js/debugger_ui.js
index f05a22dc..4c95d7c1 100644
--- a/web/pgadmin/tools/debugger/static/js/debugger_ui.js
+++ b/web/pgadmin/tools/debugger/static/js/debugger_ui.js
@@ -10,9 +10,9 @@
 define([
   'sources/gettext', 'sources/url_for', 'jquery', 'underscore', 'backbone',
   'pgadmin.alertifyjs', 'sources/pgadmin', 'pgadmin.browser',
-  'pgadmin.backgrid', 'wcdocker',
+  'pgadmin.backgrid', 'sources/window', 'wcdocker',
 ], function(
-  gettext, url_for, $, _, Backbone, Alertify, pgAdmin, pgBrowser, Backgrid
+  gettext, url_for, $, _, Backbone, Alertify, pgAdmin, pgBrowser, Backgrid, pgWindow
 ) {
 
   var wcDocker = window.wcDocker;
@@ -168,7 +168,7 @@ define([
       Alertify.dialog('debuggerInputArgsDialog', function factory() {
         return {
           main: function(title, debug_info, restart_debug, is_edb_proc, trans_id) {
-            this.preferences = window.top.pgAdmin.Browser.get_preferences_for_module('debugger');
+            this.preferences = pgWindow.default.pgAdmin.Browser.get_preferences_for_module('debugger');
             this.set('title', title);
 
             // setting value in alertify settings allows us to access it from
diff --git a/web/pgadmin/tools/debugger/static/js/direct.js b/web/pgadmin/tools/debugger/static/js/direct.js
index b7ee19c8..96a0eaa5 100644
--- a/web/pgadmin/tools/debugger/static/js/direct.js
+++ b/web/pgadmin/tools/debugger/static/js/direct.js
@@ -12,10 +12,11 @@ define([
   'pgadmin.alertifyjs', 'sources/pgadmin', 'pgadmin.browser', 'backbone',
   'pgadmin.backgrid', 'pgadmin.backform', 'sources/../bundle/codemirror',
   'pgadmin.tools.debugger.ui', 'sources/keyboard_shortcuts',
-  'pgadmin.tools.debugger.utils', 'wcdocker',
+  'pgadmin.tools.debugger.utils', 'sources/window', 'wcdocker',
 ], function(
   gettext, url_for, $, _, Alertify, pgAdmin, pgBrowser, Backbone, Backgrid,
-  Backform, codemirror, debug_function_again, keyboardShortcuts, debuggerUtils
+  Backform, codemirror, debug_function_again, keyboardShortcuts, debuggerUtils,
+  pgWindow
 ) {
 
   var CodeMirror = codemirror.default,
@@ -1525,8 +1526,7 @@ define([
       this.function_name_with_arguments = function_name_with_arguments;
       this.layout = layout;
 
-      let browser = window.opener ?
-        window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+      let browser = pgWindow.default.pgAdmin.Browser;
       this.preferences = browser.get_preferences_for_module('debugger');
 
       this.docker = new wcDocker(
@@ -1835,7 +1835,7 @@ define([
 
         let cacheIntervalId = setInterval(function() {
           try {
-            let browser = window.opener ? window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+            let browser = pgWindow.default.pgAdmin.Browser;
             if(browser.preference_version() > 0) {
               clearInterval(cacheIntervalId);
               self.reflectPreferences();
@@ -1846,7 +1846,7 @@ define([
               if(self.preferences.debugger_new_browser_tab) {
                 pgBrowser.bind_beforeunload();
                 let pollIntervalId = setInterval(()=>{
-                  if(window.opener && window.opener.pgAdmin) {
+                  if(pgWindow.default.pgAdmin) {
                     self.reflectPreferences();
                   }
                   else {
@@ -1888,13 +1888,13 @@ define([
       /* Register for preference changed event broadcasted in parent
        * to reload the shorcuts.
        */
-      pgBrowser.onPreferencesChange('debugger', function() {
+      pgWindow.default.pgAdmin.Browser.onPreferencesChange('debugger', function() {
         self.reflectPreferences();
       });
     },
     reflectPreferences: function() {
       let self = this,
-        browser = window.opener ? window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+        browser = pgWindow.default.pgAdmin.Browser;
       self.preferences = browser.get_preferences_for_module('debugger');
       self.toolbarView.preferences = self.preferences;
 
diff --git a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
index 37d15a9c..3f082b77 100644
--- a/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
+++ b/web/pgadmin/tools/sqleditor/static/js/sqleditor.js
@@ -38,6 +38,7 @@ define('tools.querytool', [
   'sources/sqleditor/query_tool_preferences',
   'sources/csrf',
   'tools/datagrid/static/js/datagrid_panel_title',
+  'sources/window',
   'sources/../bundle/slickgrid',
   'pgadmin.file_manager',
   'backgrid.sizeable.columns',
@@ -52,7 +53,8 @@ define('tools.querytool', [
   XCellSelectionModel, setStagedRows, SqlEditorUtils, ExecuteQuery, httpErrorHandler, FilterHandler,
   GeometryViewer, historyColl, queryHist, querySources,
   keyboardShortcuts, queryToolActions, queryToolNotifications, Datagrid,
-  modifyAnimation, calculateQueryRunTime, callRenderAfterPoll, queryToolPref, csrfToken, panelTitleFunc) {
+  modifyAnimation, calculateQueryRunTime, callRenderAfterPoll, queryToolPref, csrfToken, panelTitleFunc,
+  pgWindow) {
   /* Return back, this has been called more than once */
   if (pgAdmin.SqlEditor)
     return pgAdmin.SqlEditor;
@@ -77,8 +79,7 @@ define('tools.querytool', [
       this.$el = opts.el;
       this.handler = opts.handler;
       this.handler['col_size'] = {};
-      let browser = window.opener ?
-        window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+      let browser = pgWindow.default.pgAdmin.Browser;
       this.preferences = browser.get_preferences_for_module('sqleditor');
       this.handler.preferences = this.preferences;
       this.connIntervalId = null;
@@ -142,10 +143,9 @@ define('tools.querytool', [
 
     reflectPreferences: function() {
       let self = this,
-        browser = window.opener ?
-          window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+        browser = pgWindow.default.pgAdmin.Browser;
 
-      /* pgBrowser is different obj from window.top.pgAdmin.Browser
+      /* pgBrowser is different obj from pgWindow.default.pgAdmin.Browser
        * Make sure to get only the latest update. Older versions will be discarded
        * if function is called by older events.
        * This works for new tab sql editor also as it polls if latest version available
@@ -405,7 +405,7 @@ define('tools.querytool', [
 
       if (!self.preferences.new_browser_tab) {
         // Listen on the panel closed event and notify user to save modifications.
-        _.each(window.top.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) {
+        _.each(pgWindow.default.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) {
           if (p.isVisible()) {
             p.on(wcDocker.EVENT.CLOSING, function() {
               return self.handler.check_needed_confirmations_before_closing_panel(true);
@@ -635,7 +635,7 @@ define('tools.querytool', [
        * to reload the shorcuts. As sqleditor is in iFrame of wcDocker
        * window parent is referred
        */
-      pgBrowser.onPreferencesChange('sqleditor', function() {
+      pgWindow.default.pgAdmin.Browser.onPreferencesChange('sqleditor', function() {
         self.reflectPreferences();
       });
 
@@ -645,7 +645,7 @@ define('tools.querytool', [
       if(self.preferences.new_browser_tab) {
         pgBrowser.bind_beforeunload();
         setInterval(()=>{
-          if(window.opener.pgAdmin) {
+          if(pgWindow.default.pgAdmin) {
             self.reflectPreferences();
           }
         }, 1000);
@@ -3270,7 +3270,7 @@ define('tools.querytool', [
         if (self.preferences.new_browser_tab) {
           window.document.title = title;
         } else {
-          _.each(window.top.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) {
+          _.each(pgWindow.default.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) {
             if (p.isVisible()) {
               panelTitleFunc.setQueryToolDockerTitle(p, self.is_query_tool, title, is_file);
             }
@@ -3431,7 +3431,7 @@ define('tools.querytool', [
               title = window.document.title + ' *';
             } else {
               // Find the title of the visible panel
-              _.each(window.top.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) {
+              _.each(pgWindow.default.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(p) {
                 if (p.isVisible()) {
                   self.gridView.panel_title = $(p._title).text();
                 }
@@ -3993,8 +3993,7 @@ define('tools.querytool', [
       },
 
       call_cache_preferences: function() {
-        let browser = window.opener ?
-          window.opener.pgAdmin.Browser : window.top.pgAdmin.Browser;
+        let browser = pgWindow.default.pgAdmin.Browser;
         browser.cache_preferences('sqleditor');
 
         /* This will make sure to get latest updates only and not older events */
@@ -4312,7 +4311,7 @@ define('tools.querytool', [
         var self = this;
 
         pgBrowser.Events.off('pgadmin:user:logged-in', this.initTransaction);
-        _.each(window.top.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(panel) {
+        _.each(pgWindow.default.pgAdmin.Browser.docker.findPanels('frm_datagrid'), function(panel) {
           if (panel.isVisible()) {
             window.onbeforeunload = null;
             panel.off(wcDocker.EVENT.CLOSING);
@@ -4320,7 +4319,7 @@ define('tools.querytool', [
             if (!_.isUndefined(self.col_size)) {
               delete self.col_size;
             }
-            window.top.pgAdmin.Browser.docker.removePanel(panel);
+            pgWindow.default.pgAdmin.Browser.docker.removePanel(panel);
           }
         });
       },
