diff --git a/Build/types/TYPO3/index.d.ts b/Build/types/TYPO3/index.d.ts
index 09391b1b4890f04ea59e77db9dcce2af331c1090..077aa4d044db58ca50305a922b2a3220d560e71f 100644
--- a/Build/types/TYPO3/index.d.ts
+++ b/Build/types/TYPO3/index.d.ts
@@ -7,6 +7,7 @@
 declare namespace TYPO3 {
   export let Popover: any;
   export let Storage: any;
+  export let Utility: any;
   export const lang: any;
   export const settings: any;
   export namespace CMS {
diff --git a/typo3/sysext/backend/Resources/Private/TypeScript/Utility.ts b/typo3/sysext/backend/Resources/Private/TypeScript/Utility.ts
new file mode 100644
index 0000000000000000000000000000000000000000..895e880e038f7cdb0345151e8a7f63787ab45626
--- /dev/null
+++ b/typo3/sysext/backend/Resources/Private/TypeScript/Utility.ts
@@ -0,0 +1,84 @@
+/*
+ * This file is part of the TYPO3 CMS project.
+ *
+ * It is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License, either version 2
+ * of the License, or any later version.
+ *
+ * For the full copyright and license information, please read the
+ * LICENSE.txt file that was distributed with this source code.
+ *
+ * The TYPO3 project - inspiring people to share!
+ */
+
+/**
+ * Module: TYPO3/CMS/Backend/Utility
+ */
+class Utility {
+  /**
+   * Checks if a given number is really a number
+   *
+   * Taken from:
+   * http://dl.dropbox.com/u/35146/js/tests/isNumber.html
+   *
+   * @param {number} value
+   * @returns {boolean}
+   */
+  public isNumber = (value: number): boolean => {
+    return !isNaN(parseFloat(value.toString())) && isFinite(value);
+  }
+
+  /**
+   * Gets a parameter from a given url
+   *
+   * @param {string} url
+   * @param {string} parameter
+   * @returns {string}
+   */
+  public getParameterFromUrl = (url: string, parameter: string): string => {
+    if (typeof url.split !== 'function') {
+      return '';
+    }
+    const parts = url.split('?');
+    let value = '';
+
+    if (parts.length >= 2) {
+      const queryString = parts.join('?');
+
+      const prefix = encodeURIComponent(parameter) + '=';
+      const parameters = queryString.split(/[&;]/g);
+      for (let i = parameters.length; i-- > 0; ) {
+        if (parameters[i].lastIndexOf(prefix, 0) !== -1) {
+          value = parameters[i].split('=')[1];
+          break;
+        }
+      }
+    }
+
+    return value;
+  }
+
+  /**
+   * Updates a parameter inside of given url
+   *
+   * @param {string} url
+   * @param {string} key
+   * @param {string} value
+   * @returns {string}
+   */
+  public updateQueryStringParameter = (url: string, key: string, value: string): string => {
+    const re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');
+    const separator = url.indexOf('?') !== -1 ? '&' : '?';
+
+    if (url.match(re)) {
+      return url.replace(re, '$1' + key + '=' + value + '$2');
+    }
+    return url + separator + key + '=' + value;
+  }
+}
+
+const utilityObject = new Utility();
+
+// @deprecated since TYPO3 v9, will be removed in TYPO3 v10. Use the TYPO3/CMS/Backend/Utility module in AMD instead
+TYPO3.Utility = utilityObject;
+export = utilityObject;
diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/Utility.js b/typo3/sysext/backend/Resources/Public/JavaScript/Utility.js
index bc69091bc49a887746ae278c85d38613b3fa0c5a..b68e8a83bf2c04f1e0b23582ae18cbce70f4da34 100644
--- a/typo3/sysext/backend/Resources/Public/JavaScript/Utility.js
+++ b/typo3/sysext/backend/Resources/Public/JavaScript/Utility.js
@@ -10,81 +10,71 @@
  *
  * The TYPO3 project - inspiring people to share!
  */
-
-/**
- * Module: TYPO3/CMS/Backend/Utility
- */
-define(['jquery'], function($) {
-
-	/**
-	 * The main Utility object
-	 *
-	 * @type {{}}
-	 * @exports TYPO3/CMS/Backend/Utility
-	 */
-	var Utility = {
-	};
-
-	/**
-	 * Checks if a given number is really a number
-	 *
-	 * Taken from:
-	 * http://dl.dropbox.com/u/35146/js/tests/isNumber.html
-	 *
-	 * @param {String} number
-	 * @returns {boolean|*}
-	 */
-	Utility.isNumber = function(number) {
-		return !isNaN(parseFloat(number)) && isFinite(number);
-	};
-
-	/**
-	 * Gets a parameter from a given url
-	 *
-	 * @param {String} url
-	 * @param {String} parameter
-	 * @returns {String}
-	 */
-	Utility.getParameterFromUrl = function(url, parameter) {
-		if (typeof url.split !== 'function') {
-			return '';
-		}
-		var parts = url.split('?'),
-			value = '';
-
-		if (parts.length >= 2) {
-			var queryString = parts.join('?');
-
-			var prefix = encodeURIComponent(parameter) + '=';
-			var parameters = queryString.split(/[&;]/g);
-			for (var i = parameters.length; i-- > 0;) {
-				if (parameters[i].lastIndexOf(prefix, 0) !== -1) {
-					value = parameters[i].split('=')[1];
-					break;
-				}
-			}
-		}
-
-		return value;
-	};
-
-	/**
-	 * Updates a parameter inside of given url
-	 *
-	 * @param {String} url
-	 * @param {String} key
-	 * @param {String} value
-	 */
-	Utility.updateQueryStringParameter = function(url, key, value) {
-		var re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i'),
-			separator = url.indexOf('?') !== -1 ? '&' : '?';
-
-		if (url.match(re)) {
-			return url.replace(re, '$1' + key + '=' + value + '$2');
-		}
-		return url + separator + key + '=' + value;
-	};
-
-	TYPO3.Utility = Utility;
-	return Utility;
+define(["require", "exports"], function (require, exports) {
+    "use strict";
+    /**
+     * Module: TYPO3/CMS/Backend/Utility
+     */
+    var Utility = (function () {
+        function Utility() {
+            /**
+             * Checks if a given number is really a number
+             *
+             * Taken from:
+             * http://dl.dropbox.com/u/35146/js/tests/isNumber.html
+             *
+             * @param {number} value
+             * @returns {boolean}
+             */
+            this.isNumber = function (value) {
+                return !isNaN(parseFloat(value.toString())) && isFinite(value);
+            };
+            /**
+             * Gets a parameter from a given url
+             *
+             * @param {string} url
+             * @param {string} parameter
+             * @returns {string}
+             */
+            this.getParameterFromUrl = function (url, parameter) {
+                if (typeof url.split !== 'function') {
+                    return '';
+                }
+                var parts = url.split('?');
+                var value = '';
+                if (parts.length >= 2) {
+                    var queryString = parts.join('?');
+                    var prefix = encodeURIComponent(parameter) + '=';
+                    var parameters = queryString.split(/[&;]/g);
+                    for (var i = parameters.length; i-- > 0;) {
+                        if (parameters[i].lastIndexOf(prefix, 0) !== -1) {
+                            value = parameters[i].split('=')[1];
+                            break;
+                        }
+                    }
+                }
+                return value;
+            };
+            /**
+             * Updates a parameter inside of given url
+             *
+             * @param {string} url
+             * @param {string} key
+             * @param {string} value
+             * @returns {string}
+             */
+            this.updateQueryStringParameter = function (url, key, value) {
+                var re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');
+                var separator = url.indexOf('?') !== -1 ? '&' : '?';
+                if (url.match(re)) {
+                    return url.replace(re, '$1' + key + '=' + value + '$2');
+                }
+                return url + separator + key + '=' + value;
+            };
+        }
+        return Utility;
+    }());
+    var utilityObject = new Utility();
+    TYPO3.Utility = utilityObject;
+    return utilityObject;
 });
diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/Viewport.js b/typo3/sysext/backend/Resources/Public/JavaScript/Viewport.js
index 7b6aecc00fd2d877b0cea1f2a421a7a5df602574..485437267db3f5be2e7122a62cefd867c91e2d53 100644
--- a/typo3/sysext/backend/Resources/Public/JavaScript/Viewport.js
+++ b/typo3/sysext/backend/Resources/Public/JavaScript/Viewport.js
@@ -21,10 +21,11 @@ define(
 	[
 		'jquery',
 		'TYPO3/CMS/Backend/Icons',
+		'TYPO3/CMS/Backend/Utility',
 		'TYPO3/CMS/Backend/Event/ConsumerScope',
 		'TYPO3/CMS/Backend/Event/TriggerRequest'
 	],
-	function ($, Icons, ConsumerScope, TriggerRequest) {
+	function ($, Icons, Utility, ConsumerScope, TriggerRequest) {
 		'use strict';
 
 		function resolveIFrameElement() {
@@ -217,7 +218,7 @@ define(
 				},
 				getIdFromUrl: function() {
 					if(this.getUrl) {
-						return TYPO3.Utility.getParameterFromUrl(this.getUrl, 'id');
+						return Utility.getParameterFromUrl(this.getUrl, 'id');
 					} else {
 						return 0;
 					}
diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/actions.js b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/actions.js
index 3e640de39205efd2a13b186774f6d7060d4b0f61..0cece6fc3c2df752192341e04f1748f32f2a0615 100644
--- a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/actions.js
+++ b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/actions.js
@@ -12,793 +12,795 @@
  */
 Ext.namespace('TYPO3.Components.PageTree');
 
-/**
- * @class TYPO3.Components.PageTree.Actions
- *
- * Actions dedicated for the page tree
- *
- * @namespace TYPO3.Components.PageTree
- */
-TYPO3.Components.PageTree.Actions = {
-
-	/**
-	 * Evaluates a response from an ext direct call and shows a flash message
-	 * if it was an exceptional result
-	 *
-	 * @param {Object} response
-	 * @return {Boolean}
-	 */
-	evaluateResponse: function(response) {
-		if (response.success === false) {
-			top.TYPO3.Notification.error('Exception', response.message);
-			return false;
-		}
-
-		return true;
-	},
-
+require(['TYPO3/CMS/Backend/Utility'], function(Utility) {
 	/**
-	 * Releases the cut and copy mode from the context menu
+	 * @class TYPO3.Components.PageTree.Actions
 	 *
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	releaseCutAndCopyModes: function(tree) {
-		tree.t3ContextInfo.inCutMode = false;
-		tree.t3ContextInfo.inCopyMode = false;
-
-		if (tree.t3ContextNode) {
-			tree.t3ContextNode.attributes.nodeData.t3InCutMode = false;
-			tree.t3ContextNode.attributes.nodeData.t3InCopyMode = false;
-			tree.t3ContextNode = null;
-		}
-	},
-
-	/**
-	 * Updates an existing node with the given alternative. The new tree node
-	 * is returned afterwards.
+	 * Actions dedicated for the page tree
 	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {Boolean} isExpanded
-	 * @param {Object} updatedNode
-	 * @param {Function} callback
-	 * @return {Ext.tree.TreeNode}
+	 * @namespace TYPO3.Components.PageTree
 	 */
-	updateNode: function(node, isExpanded, updatedNode, callback) {
-		if (!updatedNode) {
-			return null;
-		}
-
-		updatedNode.uiProvider = node.ownerTree.uiProvider;
-		var newTreeNode = new Ext.tree.TreeNode(updatedNode);
+	TYPO3.Components.PageTree.Actions = {
 
-		var refreshCallback = this.restoreNodeStateAfterRefresh;
-		if (callback) {
-			refreshCallback = refreshCallback.createSequence(callback);
-		}
-
-		node.parentNode.replaceChild(newTreeNode, node);
-		newTreeNode.ownerTree.refreshNode(newTreeNode, refreshCallback);
-
-		return newTreeNode;
-	},
+		/**
+		 * Evaluates a response from an ext direct call and shows a flash message
+		 * if it was an exceptional result
+		 *
+		 * @param {Object} response
+		 * @return {Boolean}
+		 */
+		evaluateResponse: function (response) {
+			if (response.success === false) {
+				top.TYPO3.Notification.error('Exception', response.message);
+				return false;
+			}
 
-	/**
-	 * Restores the node state
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {Boolean} isExpanded
-	 * @return {void}
-	 */
-	restoreNodeStateAfterRefresh: function(node, isExpanded) {
-		node.parentNode.expand(false, false);
-		if (isExpanded) {
-			node.expand(false, false);
-		} else {
-			node.collapse(false, false);
-		}
-	},
+			return true;
+		},
+
+		/**
+		 * Releases the cut and copy mode from the context menu
+		 *
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		releaseCutAndCopyModes: function (tree) {
+			tree.t3ContextInfo.inCutMode = false;
+			tree.t3ContextInfo.inCopyMode = false;
+
+			if (tree.t3ContextNode) {
+				tree.t3ContextNode.attributes.nodeData.t3InCutMode = false;
+				tree.t3ContextNode.attributes.nodeData.t3InCopyMode = false;
+				tree.t3ContextNode = null;
+			}
+		},
+
+		/**
+		 * Updates an existing node with the given alternative. The new tree node
+		 * is returned afterwards.
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {Boolean} isExpanded
+		 * @param {Object} updatedNode
+		 * @param {Function} callback
+		 * @return {Ext.tree.TreeNode}
+		 */
+		updateNode: function (node, isExpanded, updatedNode, callback) {
+			if (!updatedNode) {
+				return null;
+			}
 
-	/**
-	 * Shows deletion confirmation window
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @param {Function} callback
-	 * @param {Boolean} recursiveDelete
-	 * @return {void}
-	 */
-	confirmDelete: function(node, tree, callback, recursiveDelete) {
-		callback = callback || null;
+			updatedNode.uiProvider = node.ownerTree.uiProvider;
+			var newTreeNode = new Ext.tree.TreeNode(updatedNode);
 
-		var title = TYPO3.Components.PageTree.LLL.deleteDialogTitle,
-			message = TYPO3.Components.PageTree.LLL.deleteDialogMessage;
-		if (recursiveDelete) {
-			message = TYPO3.Components.PageTree.LLL.recursiveDeleteDialogMessage;
-		}
+			var refreshCallback = this.restoreNodeStateAfterRefresh;
+			if (callback) {
+				refreshCallback = refreshCallback.createSequence(callback);
+			}
 
-		Ext.Msg.show({
-			title: title,
-			msg: message,
-			buttons: Ext.Msg.YESNO,
-			fn: function (answer) {
-				if (answer === 'yes') {
-					TYPO3.Components.PageTree.Actions.deleteNode(node, tree, callback);
-					return true;
-				}
-				return false;
-			},
-			animEl: 'elId'
-		});
-	},
+			node.parentNode.replaceChild(newTreeNode, node);
+			newTreeNode.ownerTree.refreshNode(newTreeNode, refreshCallback);
+
+			return newTreeNode;
+		},
+
+		/**
+		 * Restores the node state
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {Boolean} isExpanded
+		 * @return {void}
+		 */
+		restoreNodeStateAfterRefresh: function (node, isExpanded) {
+			node.parentNode.expand(false, false);
+			if (isExpanded) {
+				node.expand(false, false);
+			} else {
+				node.collapse(false, false);
+			}
+		},
+
+		/**
+		 * Shows deletion confirmation window
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @param {Function} callback
+		 * @param {Boolean} recursiveDelete
+		 * @return {void}
+		 */
+		confirmDelete: function (node, tree, callback, recursiveDelete) {
+			callback = callback || null;
+
+			var title = TYPO3.Components.PageTree.LLL.deleteDialogTitle,
+				message = TYPO3.Components.PageTree.LLL.deleteDialogMessage;
+			if (recursiveDelete) {
+				message = TYPO3.Components.PageTree.LLL.recursiveDeleteDialogMessage;
+			}
 
-	/**
-	 * Deletes a node directly
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @param {Function} callback
-	 * @return {void}
-	 */
-	deleteNode: function(node, tree, callback) {
-		TYPO3.Components.PageTree.Commands.deleteNode(
-			node.attributes.nodeData,
-			function(response) {
-				var succeeded = this.evaluateResponse(response);
-				if (Ext.isFunction(callback)) {
-					callback(node, tree, succeeded);
-				}
+			Ext.Msg.show({
+				title: title,
+				msg: message,
+				buttons: Ext.Msg.YESNO,
+				fn: function (answer) {
+					if (answer === 'yes') {
+						TYPO3.Components.PageTree.Actions.deleteNode(node, tree, callback);
+						return true;
+					}
+					return false;
+				},
+				animEl: 'elId'
+			});
+		},
+
+		/**
+		 * Deletes a node directly
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @param {Function} callback
+		 * @return {void}
+		 */
+		deleteNode: function (node, tree, callback) {
+			TYPO3.Components.PageTree.Commands.deleteNode(
+				node.attributes.nodeData,
+				function (response) {
+					var succeeded = this.evaluateResponse(response);
+					if (Ext.isFunction(callback)) {
+						callback(node, tree, succeeded);
+					}
 
-				if (succeeded) {
+					if (succeeded) {
 						// the node may not be removed in workspace mode
-					if (top.TYPO3.configuration.inWorkspace && response.id) {
-						this.updateNode(node, node.isExpanded(), response);
-					} else {
-						node.remove();
+						if (top.TYPO3.configuration.inWorkspace && response.id) {
+							this.updateNode(node, node.isExpanded(), response);
+						} else {
+							node.remove();
+						}
 					}
-				}
-			},
-			this
-		);
-	},
-
-	/**
-	 * Removes a node either directly or first shows deletion popup
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	removeNode: function(node, tree) {
-		if (TYPO3.Components.PageTree.Configuration.displayDeleteConfirmation) {
-			this.confirmDelete(node);
-		} else {
-			this.deleteNode(node, tree);
-		}
-	},
-
-	/**
-	 * Restores a given node and moves it to the given destination inside the tree. Use this
-	 * method if you want to add it as the first child of the destination.
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @param {Ext.tree.TreeNode} destination
-	 * @return {void}
-	 */
-	restoreNodeToFirstChildOfDestination: function(node, tree, destination) {
-		TYPO3.Components.PageTree.Commands.restoreNode(
-			node.attributes.nodeData,
-			destination.attributes.nodeData.id,
-			function(updatedNode) {
-				if (this.evaluateResponse(updatedNode)) {
-					var newTreeNode = new Ext.tree.TreeNode(
-						Ext.apply(node.attributes, updatedNode)
-					);
-					destination.insertBefore(newTreeNode, destination.firstChild);
-				}
-			},
-			this
-		);
-	},
-
-	/**
-	 * Restores a given node and moves it to the given destination inside the tree. Use this
-	 * method if you want to add the node after the destination node.
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @param {Ext.tree.TreeNode} destination
-	 * @return {void}
-	 */
-	restoreNodeAfterDestination: function(node, tree, destination) {
-		TYPO3.Components.PageTree.Commands.restoreNode(
-			node.attributes.nodeData,
-			-destination.attributes.nodeData.id,
-			function(updatedNode) {
-				if (this.evaluateResponse(updatedNode)) {
-					var newTreeNode = new Ext.tree.TreeNode(
-						Ext.apply(node.attributes, updatedNode)
-					);
-					destination.parentNode.insertBefore(newTreeNode, destination.nextSibling);
-				}
-			},
-			this
-		);
-	},
-
-	/**
-	 * Collapses a whole tree branch
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	collapseBranch: function(node) {
-		node.collapse(true);
-	},
-
-	/**
-	 * Expands a whole tree branch
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	expandBranch: function(node) {
-		node.expand(true);
-	},
-
-	/**
-	 * Opens a popup windows for previewing the given node/page
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	viewPage: function(node) {
-		var frontendWindow = window.open('', 'newTYPO3frontendWindow');
-		TYPO3.Components.PageTree.Commands.getViewLink(
-			node.attributes.nodeData,
-			function(result) {
-				frontendWindow.location = result;
-				frontendWindow.focus();
+				},
+				this
+			);
+		},
+
+		/**
+		 * Removes a node either directly or first shows deletion popup
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		removeNode: function (node, tree) {
+			if (TYPO3.Components.PageTree.Configuration.displayDeleteConfirmation) {
+				this.confirmDelete(node);
+			} else {
+				this.deleteNode(node, tree);
 			}
-		);
-	},
-
-	/**
-	 * Creates a temporary tree mount point
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	mountAsTreeRoot: function(node, tree) {
-		TYPO3.Components.PageTree.Commands.setTemporaryMountPoint(
-			node.attributes.nodeData,
-			function(response) {
-				if (TYPO3.Components.PageTree.Configuration.temporaryMountPoint) {
-					TYPO3.Backend.NavigationContainer.PageTree.removeIndicator(
-						TYPO3.Backend.NavigationContainer.PageTree.temporaryMountPointInfoIndicator
-					);
-				}
-
-				TYPO3.Components.PageTree.Configuration.temporaryMountPoint = response;
-				Ext.getCmp('typo3-pagetree-tree').app.addTemporaryMountPointIndicator();
-
-				var selectedNode = Ext.getCmp('typo3-pagetree-tree').app.getSelected();
-				tree.stateId = 'Pagetree' + TYPO3.Components.PageTree.Configuration.temporaryMountPoint;
-				tree.refreshTree(function() {
-					var nodeIsSelected = false;
-					if (selectedNode) {
-						nodeIsSelected = TYPO3.Backend.NavigationContainer.PageTree.select(
-							selectedNode.attributes.nodeData.id
+		},
+
+		/**
+		 * Restores a given node and moves it to the given destination inside the tree. Use this
+		 * method if you want to add it as the first child of the destination.
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @param {Ext.tree.TreeNode} destination
+		 * @return {void}
+		 */
+		restoreNodeToFirstChildOfDestination: function (node, tree, destination) {
+			TYPO3.Components.PageTree.Commands.restoreNode(
+				node.attributes.nodeData,
+				destination.attributes.nodeData.id,
+				function (updatedNode) {
+					if (this.evaluateResponse(updatedNode)) {
+						var newTreeNode = new Ext.tree.TreeNode(
+							Ext.apply(node.attributes, updatedNode)
 						);
+						destination.insertBefore(newTreeNode, destination.firstChild);
 					}
-
-					var node = (nodeIsSelected ? TYPO3.Backend.NavigationContainer.PageTree.getSelected() : null);
-					if (node) {
-						this.singleClick(node, tree);
-					} else {
-						this.singleClick(tree.getRootNode().firstChild, tree);
+				},
+				this
+			);
+		},
+
+		/**
+		 * Restores a given node and moves it to the given destination inside the tree. Use this
+		 * method if you want to add the node after the destination node.
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @param {Ext.tree.TreeNode} destination
+		 * @return {void}
+		 */
+		restoreNodeAfterDestination: function (node, tree, destination) {
+			TYPO3.Components.PageTree.Commands.restoreNode(
+				node.attributes.nodeData,
+				-destination.attributes.nodeData.id,
+				function (updatedNode) {
+					if (this.evaluateResponse(updatedNode)) {
+						var newTreeNode = new Ext.tree.TreeNode(
+							Ext.apply(node.attributes, updatedNode)
+						);
+						destination.parentNode.insertBefore(newTreeNode, destination.nextSibling);
+					}
+				},
+				this
+			);
+		},
+
+		/**
+		 * Collapses a whole tree branch
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		collapseBranch: function (node) {
+			node.collapse(true);
+		},
+
+		/**
+		 * Expands a whole tree branch
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		expandBranch: function (node) {
+			node.expand(true);
+		},
+
+		/**
+		 * Opens a popup windows for previewing the given node/page
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		viewPage: function (node) {
+			var frontendWindow = window.open('', 'newTYPO3frontendWindow');
+			TYPO3.Components.PageTree.Commands.getViewLink(
+				node.attributes.nodeData,
+				function (result) {
+					frontendWindow.location = result;
+					frontendWindow.focus();
+				}
+			);
+		},
+
+		/**
+		 * Creates a temporary tree mount point
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		mountAsTreeRoot: function (node, tree) {
+			TYPO3.Components.PageTree.Commands.setTemporaryMountPoint(
+				node.attributes.nodeData,
+				function (response) {
+					if (TYPO3.Components.PageTree.Configuration.temporaryMountPoint) {
+						TYPO3.Backend.NavigationContainer.PageTree.removeIndicator(
+							TYPO3.Backend.NavigationContainer.PageTree.temporaryMountPointInfoIndicator
+						);
 					}
-				}, this);
-			},
-			this
-		);
-	},
-
-	/**
-	 * Opens the edit page properties dialog
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	editPageProperties: function(node) {
-		var returnUrl = TYPO3.Backend.ContentContainer.getUrl();
-		if (returnUrl.indexOf('returnUrl') !== -1) {
-			returnUrl = TYPO3.Utility.getParameterFromUrl(returnUrl, 'returnUrl');
-		} else {
-			returnUrl = encodeURIComponent(returnUrl);
-		}
-
-		var decodeReturnUrl = decodeURIComponent(returnUrl);
-		var editPageId = TYPO3.Utility.getParameterFromUrl(decodeReturnUrl, 'id');
-		if (parseInt(editPageId, 10) !== parseInt(node.attributes.nodeData.id, 10)) {
-			returnUrl = encodeURIComponent(TYPO3.Utility.updateQueryStringParameter(decodeReturnUrl, 'id', node.attributes.nodeData.id));
-		}
-
-		TYPO3.Backend.ContentContainer.setUrl(
-			TYPO3.settings.FormEngine.moduleUrl + '&edit[pages][' + node.attributes.nodeData.id + ']=edit&returnUrl=' + returnUrl
-		).then(
-			node.select
-		);
-	},
-
-	/**
-	 * Opens the new page wizard
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	newPageWizard: function(node) {
-		TYPO3.Backend.ContentContainer.setUrl(
-			TYPO3.settings.NewRecord.moduleUrl + '&id=' + node.attributes.nodeData.id + '&pagesOnly=1'
-		).then(
-			node.select
-		);
-	},
-
-	/**
-	 * Opens the info popup
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	openInfoPopUp: function(node) {
-		launchView('pages', node.attributes.nodeData.id);
-	},
-
-	/**
-	 * Opens the history popup
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	openHistoryPopUp: function(node) {
-		TYPO3.Backend.ContentContainer.setUrl(
-			TYPO3.settings.RecordHistory.moduleUrl + '&element=pages:' + node.attributes.nodeData.id
-		).then(
-			node.select
-		);
-	},
-
-	/**
-	 * Opens the export .t3d file dialog
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	exportT3d: function(node) {
-		TYPO3.Backend.ContentContainer.setUrl(
-			TYPO3.settings.ImportExport.moduleUrl +
-			'&tx_impexp[action]=export&' +
-			'id=0&tx_impexp[pagetree][id]=' + node.attributes.nodeData.id +
-			'&tx_impexp[pagetree][levels]=0' +
-			'&tx_impexp[pagetree][tables][]=_ALL'
-		).then(
-			node.select
-		);
-	},
-
-	/**
-	 * Opens the import .t3d file dialog
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	importT3d: function(node) {
-		TYPO3.Backend.ContentContainer.setUrl(
-			TYPO3.settings.ImportExport.moduleUrl +
-			'&id=' + node.attributes.nodeData.id +
-			'&table=pages&tx_impexp[action]=import'
-		).then(
-			node.select
-		);
-	},
-
-	/**
-	 * Enables the cut mode of a node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	enableCutMode: function(node, tree) {
-		this.disableCopyMode(node, tree);
-		node.attributes.nodeData.t3InCutMode = true;
-		tree.t3ContextInfo.inCutMode = true;
-		tree.t3ContextNode = node;
-	},
-
-	/**
-	 * Disables the cut mode of a node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	disableCutMode: function(node, tree) {
-		this.releaseCutAndCopyModes(tree);
-		node.attributes.nodeData.t3InCutMode = false;
-	},
-
-	/**
-	 * Enables the copy mode of a node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	enableCopyMode: function(node, tree) {
-		this.disableCutMode(node, tree);
-		node.attributes.nodeData.t3InCopyMode = true;
-		tree.t3ContextInfo.inCopyMode = true;
-		tree.t3ContextNode = node;
-	},
-
-	/**
-	 * Disables the copy mode of a node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	disableCopyMode: function(node, tree) {
-		this.releaseCutAndCopyModes(tree);
-		node.attributes.nodeData.t3InCopyMode = false;
-	},
-
-	/**
-	 * Pastes the cut/copy context node into the given node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	pasteIntoNode: function(node, tree) {
-		if (!tree.t3ContextNode) {
-			return;
-		}
-
-		if (tree.t3ContextInfo.inCopyMode) {
-				 // This is hard stuff to do. So increase the timeout for the AJAX request
-			Ext.Ajax.timeout = 3600000;
 
-			var newNode = tree.t3ContextNode = new Ext.tree.TreeNode(tree.t3ContextNode.attributes);
-			newNode.id = 'fakeNode';
-			node.insertBefore(newNode, node.childNodes[0]);
-			node.attributes.nodeData.t3InCopyMode = false;
-			this.copyNodeToFirstChildOfDestination(newNode, tree);
+					TYPO3.Components.PageTree.Configuration.temporaryMountPoint = response;
+					Ext.getCmp('typo3-pagetree-tree').app.addTemporaryMountPointIndicator();
+
+					var selectedNode = Ext.getCmp('typo3-pagetree-tree').app.getSelected();
+					tree.stateId = 'Pagetree' + TYPO3.Components.PageTree.Configuration.temporaryMountPoint;
+					tree.refreshTree(function () {
+						var nodeIsSelected = false;
+						if (selectedNode) {
+							nodeIsSelected = TYPO3.Backend.NavigationContainer.PageTree.select(
+								selectedNode.attributes.nodeData.id
+							);
+						}
+
+						var node = (nodeIsSelected ? TYPO3.Backend.NavigationContainer.PageTree.getSelected() : null);
+						if (node) {
+							this.singleClick(node, tree);
+						} else {
+							this.singleClick(tree.getRootNode().firstChild, tree);
+						}
+					}, this);
+				},
+				this
+			);
+		},
+
+		/**
+		 * Opens the edit page properties dialog
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		editPageProperties: function (node) {
+			var returnUrl = TYPO3.Backend.ContentContainer.getUrl();
+			if (returnUrl.indexOf('returnUrl') !== -1) {
+				returnUrl = Utility.getParameterFromUrl(returnUrl, 'returnUrl');
+			} else {
+				returnUrl = encodeURIComponent(returnUrl);
+			}
 
-		} else if (tree.t3ContextInfo.inCutMode) {
-			if (node.getPath().indexOf(tree.t3ContextNode.id) !== -1) {
-				return;
+			var decodeReturnUrl = decodeURIComponent(returnUrl);
+			var editPageId = Utility.getParameterFromUrl(decodeReturnUrl, 'id');
+			if (parseInt(editPageId, 10) !== parseInt(node.attributes.nodeData.id, 10)) {
+				returnUrl = encodeURIComponent(Utility.updateQueryStringParameter(decodeReturnUrl, 'id', node.attributes.nodeData.id));
 			}
 
-			node.appendChild(tree.t3ContextNode);
+			TYPO3.Backend.ContentContainer.setUrl(
+				TYPO3.settings.FormEngine.moduleUrl + '&edit[pages][' + node.attributes.nodeData.id + ']=edit&returnUrl=' + returnUrl
+			).then(
+				node.select
+			);
+		},
+
+		/**
+		 * Opens the new page wizard
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		newPageWizard: function (node) {
+			TYPO3.Backend.ContentContainer.setUrl(
+				TYPO3.settings.NewRecord.moduleUrl + '&id=' + node.attributes.nodeData.id + '&pagesOnly=1'
+			).then(
+				node.select
+			);
+		},
+
+		/**
+		 * Opens the info popup
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		openInfoPopUp: function (node) {
+			launchView('pages', node.attributes.nodeData.id);
+		},
+
+		/**
+		 * Opens the history popup
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		openHistoryPopUp: function (node) {
+			TYPO3.Backend.ContentContainer.setUrl(
+				TYPO3.settings.RecordHistory.moduleUrl + '&element=pages:' + node.attributes.nodeData.id
+			).then(
+				node.select
+			);
+		},
+
+		/**
+		 * Opens the export .t3d file dialog
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		exportT3d: function (node) {
+			TYPO3.Backend.ContentContainer.setUrl(
+				TYPO3.settings.ImportExport.moduleUrl +
+				'&tx_impexp[action]=export&' +
+				'id=0&tx_impexp[pagetree][id]=' + node.attributes.nodeData.id +
+				'&tx_impexp[pagetree][levels]=0' +
+				'&tx_impexp[pagetree][tables][]=_ALL'
+			).then(
+				node.select
+			);
+		},
+
+		/**
+		 * Opens the import .t3d file dialog
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		importT3d: function (node) {
+			TYPO3.Backend.ContentContainer.setUrl(
+				TYPO3.settings.ImportExport.moduleUrl +
+				'&id=' + node.attributes.nodeData.id +
+				'&table=pages&tx_impexp[action]=import'
+			).then(
+				node.select
+			);
+		},
+
+		/**
+		 * Enables the cut mode of a node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		enableCutMode: function (node, tree) {
+			this.disableCopyMode(node, tree);
+			node.attributes.nodeData.t3InCutMode = true;
+			tree.t3ContextInfo.inCutMode = true;
+			tree.t3ContextNode = node;
+		},
+
+		/**
+		 * Disables the cut mode of a node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		disableCutMode: function (node, tree) {
+			this.releaseCutAndCopyModes(tree);
 			node.attributes.nodeData.t3InCutMode = false;
-			this.moveNodeToFirstChildOfDestination(node, tree);
-		}
-	},
-
-	/**
-	 * Pastes a cut/copy context node after the given node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	pasteAfterNode: function(node, tree) {
-		if (!tree.t3ContextNode) {
-			return;
-		}
-
-		if (tree.t3ContextInfo.inCopyMode) {
-				// This is hard stuff to do. So increase the timeout for the AJAX request
-			Ext.Ajax.timeout = 3600000;
-
-			var newNode = tree.t3ContextNode = new Ext.tree.TreeNode(tree.t3ContextNode.attributes);
-			newNode.id = 'fakeNode';
-			node.parentNode.insertBefore(newNode, node.nextSibling);
+		},
+
+		/**
+		 * Enables the copy mode of a node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		enableCopyMode: function (node, tree) {
+			this.disableCutMode(node, tree);
+			node.attributes.nodeData.t3InCopyMode = true;
+			tree.t3ContextInfo.inCopyMode = true;
+			tree.t3ContextNode = node;
+		},
+
+		/**
+		 * Disables the copy mode of a node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		disableCopyMode: function (node, tree) {
+			this.releaseCutAndCopyModes(tree);
 			node.attributes.nodeData.t3InCopyMode = false;
-			this.copyNodeAfterDestination(newNode, tree);
-
-		} else if (tree.t3ContextInfo.inCutMode) {
-			if (node.getPath().indexOf(tree.t3ContextNode.id) !== -1) {
+		},
+
+		/**
+		 * Pastes the cut/copy context node into the given node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		pasteIntoNode: function (node, tree) {
+			if (!tree.t3ContextNode) {
 				return;
 			}
 
-			node.parentNode.insertBefore(tree.t3ContextNode, node.nextSibling);
-			node.attributes.nodeData.t3InCutMode = false;
-			this.moveNodeAfterDestination(node, tree);
-		}
-	},
+			if (tree.t3ContextInfo.inCopyMode) {
+				// This is hard stuff to do. So increase the timeout for the AJAX request
+				Ext.Ajax.timeout = 3600000;
 
-	/**
-	 * Moves the current tree context node after the given node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	moveNodeAfterDestination: function(node, tree) {
-		TYPO3.Components.PageTree.Commands.moveNodeAfterDestination(
-			tree.t3ContextNode.attributes.nodeData,
-			node.attributes.nodeData.id,
-			function(response) {
-				if (this.evaluateResponse(response) && tree.t3ContextNode) {
-					this.updateNode(tree.t3ContextNode, tree.t3ContextNode.isExpanded(), response);
-				}
-				this.releaseCutAndCopyModes(tree);
-			},
-			this
-		);
-	},
+				var newNode = tree.t3ContextNode = new Ext.tree.TreeNode(tree.t3ContextNode.attributes);
+				newNode.id = 'fakeNode';
+				node.insertBefore(newNode, node.childNodes[0]);
+				node.attributes.nodeData.t3InCopyMode = false;
+				this.copyNodeToFirstChildOfDestination(newNode, tree);
 
-	/**
-	 * Moves the current tree context node as the first child of the given node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	moveNodeToFirstChildOfDestination: function(node, tree) {
-		TYPO3.Components.PageTree.Commands.moveNodeToFirstChildOfDestination(
-			tree.t3ContextNode.attributes.nodeData,
-			node.attributes.nodeData.id,
-			function(response) {
-				if (this.evaluateResponse(response) && tree.t3ContextNode) {
-					this.updateNode(tree.t3ContextNode, tree.t3ContextNode.isExpanded(), response);
+			} else if (tree.t3ContextInfo.inCutMode) {
+				if (node.getPath().indexOf(tree.t3ContextNode.id) !== -1) {
+					return;
 				}
-				this.releaseCutAndCopyModes(tree);
-			},
-			this
-		);
-	},
 
-	/**
-	 * Inserts a new node after the given node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	insertNodeAfterDestination: function(node, tree) {
-		TYPO3.Components.PageTree.Commands.insertNodeAfterDestination(
-			tree.t3ContextNode.attributes.nodeData,
-			node.previousSibling.attributes.nodeData.id,
-			tree.t3ContextInfo.serverNodeType,
-			function(response) {
-				if (this.evaluateResponse(response)) {
-					this.updateNode(node, node.isExpanded(), response, function(node) {
-						tree.triggerEdit(node);
-					});
-				}
-				this.releaseCutAndCopyModes(tree);
-			},
-			this
-		);
-	},
+				node.appendChild(tree.t3ContextNode);
+				node.attributes.nodeData.t3InCutMode = false;
+				this.moveNodeToFirstChildOfDestination(node, tree);
+			}
+		},
+
+		/**
+		 * Pastes a cut/copy context node after the given node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		pasteAfterNode: function (node, tree) {
+			if (!tree.t3ContextNode) {
+				return;
+			}
 
-	/**
-	 * Inserts a new node as the first child of the given node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	insertNodeToFirstChildOfDestination: function(node, tree) {
-		TYPO3.Components.PageTree.Commands.insertNodeToFirstChildOfDestination(
-			tree.t3ContextNode.attributes.nodeData,
-			tree.t3ContextInfo.serverNodeType,
-			function(response) {
-				if (this.evaluateResponse(response)) {
-					this.updateNode(node, true, response, function(node) {
-						tree.triggerEdit(node);
-					});
-				}
-				this.releaseCutAndCopyModes(tree);
-			},
-			this
-		);
-	},
+			if (tree.t3ContextInfo.inCopyMode) {
+				// This is hard stuff to do. So increase the timeout for the AJAX request
+				Ext.Ajax.timeout = 3600000;
 
-	/**
-	 * Copies the current tree context node after the given node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	copyNodeAfterDestination: function(node, tree) {
-		TYPO3.Components.PageTree.Commands.copyNodeAfterDestination(
-			tree.t3ContextNode.attributes.nodeData,
-			node.previousSibling.attributes.nodeData.id,
-			function(response) {
-				if (this.evaluateResponse(response)) {
-					this.updateNode(node, true, response, function(node) {
-						tree.triggerEdit(node);
-					});
-				}
-				this.releaseCutAndCopyModes(tree);
-			},
-			this
-		);
-	},
+				var newNode = tree.t3ContextNode = new Ext.tree.TreeNode(tree.t3ContextNode.attributes);
+				newNode.id = 'fakeNode';
+				node.parentNode.insertBefore(newNode, node.nextSibling);
+				node.attributes.nodeData.t3InCopyMode = false;
+				this.copyNodeAfterDestination(newNode, tree);
 
-	/**
-	 * Copies the current tree context node as the first child of the given node
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	copyNodeToFirstChildOfDestination: function(node, tree) {
-		TYPO3.Components.PageTree.Commands.copyNodeToFirstChildOfDestination(
-			tree.t3ContextNode.attributes.nodeData,
-			node.parentNode.attributes.nodeData.id,
-			function(response) {
-				if (this.evaluateResponse(response)) {
-					this.updateNode(node, true, response, function(node) {
-						tree.triggerEdit(node);
-					});
+			} else if (tree.t3ContextInfo.inCutMode) {
+				if (node.getPath().indexOf(tree.t3ContextNode.id) !== -1) {
+					return;
 				}
-				this.releaseCutAndCopyModes(tree);
-			},
-			this
-		);
-	},
 
-	/**
-	 * Visibilizes a page
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	enablePage: function(node) {
-		TYPO3.Components.PageTree.Commands.visiblyNode(
-			node.attributes.nodeData,
-			function(response) {
-				if (this.evaluateResponse(response)) {
-					this.updateNode(node, node.isExpanded(), response);
-				}
-			},
-			this
-		);
-	},
+				node.parentNode.insertBefore(tree.t3ContextNode, node.nextSibling);
+				node.attributes.nodeData.t3InCutMode = false;
+				this.moveNodeAfterDestination(node, tree);
+			}
+		},
+
+		/**
+		 * Moves the current tree context node after the given node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		moveNodeAfterDestination: function (node, tree) {
+			TYPO3.Components.PageTree.Commands.moveNodeAfterDestination(
+				tree.t3ContextNode.attributes.nodeData,
+				node.attributes.nodeData.id,
+				function (response) {
+					if (this.evaluateResponse(response) && tree.t3ContextNode) {
+						this.updateNode(tree.t3ContextNode, tree.t3ContextNode.isExpanded(), response);
+					}
+					this.releaseCutAndCopyModes(tree);
+				},
+				this
+			);
+		},
+
+		/**
+		 * Moves the current tree context node as the first child of the given node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		moveNodeToFirstChildOfDestination: function (node, tree) {
+			TYPO3.Components.PageTree.Commands.moveNodeToFirstChildOfDestination(
+				tree.t3ContextNode.attributes.nodeData,
+				node.attributes.nodeData.id,
+				function (response) {
+					if (this.evaluateResponse(response) && tree.t3ContextNode) {
+						this.updateNode(tree.t3ContextNode, tree.t3ContextNode.isExpanded(), response);
+					}
+					this.releaseCutAndCopyModes(tree);
+				},
+				this
+			);
+		},
+
+		/**
+		 * Inserts a new node after the given node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		insertNodeAfterDestination: function (node, tree) {
+			TYPO3.Components.PageTree.Commands.insertNodeAfterDestination(
+				tree.t3ContextNode.attributes.nodeData,
+				node.previousSibling.attributes.nodeData.id,
+				tree.t3ContextInfo.serverNodeType,
+				function (response) {
+					if (this.evaluateResponse(response)) {
+						this.updateNode(node, node.isExpanded(), response, function (node) {
+							tree.triggerEdit(node);
+						});
+					}
+					this.releaseCutAndCopyModes(tree);
+				},
+				this
+			);
+		},
+
+		/**
+		 * Inserts a new node as the first child of the given node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		insertNodeToFirstChildOfDestination: function (node, tree) {
+			TYPO3.Components.PageTree.Commands.insertNodeToFirstChildOfDestination(
+				tree.t3ContextNode.attributes.nodeData,
+				tree.t3ContextInfo.serverNodeType,
+				function (response) {
+					if (this.evaluateResponse(response)) {
+						this.updateNode(node, true, response, function (node) {
+							tree.triggerEdit(node);
+						});
+					}
+					this.releaseCutAndCopyModes(tree);
+				},
+				this
+			);
+		},
+
+		/**
+		 * Copies the current tree context node after the given node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		copyNodeAfterDestination: function (node, tree) {
+			TYPO3.Components.PageTree.Commands.copyNodeAfterDestination(
+				tree.t3ContextNode.attributes.nodeData,
+				node.previousSibling.attributes.nodeData.id,
+				function (response) {
+					if (this.evaluateResponse(response)) {
+						this.updateNode(node, true, response, function (node) {
+							tree.triggerEdit(node);
+						});
+					}
+					this.releaseCutAndCopyModes(tree);
+				},
+				this
+			);
+		},
+
+		/**
+		 * Copies the current tree context node as the first child of the given node
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		copyNodeToFirstChildOfDestination: function (node, tree) {
+			TYPO3.Components.PageTree.Commands.copyNodeToFirstChildOfDestination(
+				tree.t3ContextNode.attributes.nodeData,
+				node.parentNode.attributes.nodeData.id,
+				function (response) {
+					if (this.evaluateResponse(response)) {
+						this.updateNode(node, true, response, function (node) {
+							tree.triggerEdit(node);
+						});
+					}
+					this.releaseCutAndCopyModes(tree);
+				},
+				this
+			);
+		},
+
+		/**
+		 * Visibilizes a page
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		enablePage: function (node) {
+			TYPO3.Components.PageTree.Commands.visiblyNode(
+				node.attributes.nodeData,
+				function (response) {
+					if (this.evaluateResponse(response)) {
+						this.updateNode(node, node.isExpanded(), response);
+					}
+				},
+				this
+			);
+		},
+
+		/**
+		 * Disables a page
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		disablePage: function (node) {
+			TYPO3.Components.PageTree.Commands.disableNode(
+				node.attributes.nodeData,
+				function (response) {
+					if (this.evaluateResponse(response)) {
+						this.updateNode(node, node.isExpanded(), response);
+					}
+				},
+				this
+			);
+		},
+
+		/**
+		 * Clear cache of a page
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @return {void}
+		 */
+		clearCacheOfPage: function (node) {
+			TYPO3.Components.PageTree.Commands.clearCacheOfPage(
+				node.attributes.nodeData
+			);
+		},
+
+		/**
+		 * Reloads the content frame with the current module and node id
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @return {void}
+		 */
+		singleClick: function (node, tree) {
+			var separator = '?';
+			if (currentSubScript.indexOf('?') !== -1) {
+				separator = '&';
+			}
 
-	/**
-	 * Disables a page
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	disablePage: function(node) {
-		TYPO3.Components.PageTree.Commands.disableNode(
-			node.attributes.nodeData,
-			function(response) {
-				if (this.evaluateResponse(response)) {
-					this.updateNode(node, node.isExpanded(), response);
+			TYPO3.Backend.ContentContainer.setUrl(
+				currentSubScript + separator + 'id=' + node.attributes.nodeData.id
+			).then(function () {
+				node.select();
+				tree.currentSelectedNode = node;
+				if (tree.stateHash) {
+					tree.stateHash.lastSelectedNode = node.id;
 				}
-			},
-			this
-		);
-	},
-
-	/**
-	 * Clear cache of a page
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @return {void}
-	 */
-	clearCacheOfPage: function(node) {
-		TYPO3.Components.PageTree.Commands.clearCacheOfPage(
-			node.attributes.nodeData
-		);
-	},
-
-	/**
-	 * Reloads the content frame with the current module and node id
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @return {void}
-	 */
-	singleClick: function(node, tree) {
-		var separator = '?';
-		if (currentSubScript.indexOf('?') !== -1) {
-			separator = '&';
-		}
-
-		TYPO3.Backend.ContentContainer.setUrl(
-			currentSubScript + separator + 'id=' + node.attributes.nodeData.id
-		).then(function() {
-			node.select();
-			tree.currentSelectedNode = node;
-			if (tree.stateHash) {
-				tree.stateHash.lastSelectedNode = node.id;
+				fsMod.recentIds['web'] = node.attributes.nodeData.id;
+				fsMod.recentIds['system'] = node.attributes.nodeData.id;
+			});
+		},
+
+		/**
+		 * Opens a configured url inside the content frame
+		 *
+		 * @param {Ext.tree.TreeNode} node
+		 * @param {TYPO3.Components.PageTree.Tree} tree
+		 * @param {Object} contextItem
+		 * @return {void}
+		 */
+		openCustomUrlInContentFrame: function (node, tree, contextItem) {
+			if (!contextItem.customAttributes || !contextItem.customAttributes.contentUrl) {
+				return;
 			}
-			fsMod.recentIds['web'] = node.attributes.nodeData.id;
-			fsMod.recentIds['system'] = node.attributes.nodeData.id;
-		});
-	},
-
-	/**
-	 * Opens a configured url inside the content frame
-	 *
-	 * @param {Ext.tree.TreeNode} node
-	 * @param {TYPO3.Components.PageTree.Tree} tree
-	 * @param {Object} contextItem
-	 * @return {void}
-	 */
-	openCustomUrlInContentFrame: function(node, tree, contextItem) {
-		if (!contextItem.customAttributes || !contextItem.customAttributes.contentUrl) {
-			return;
-		}
-
-		var nodeId = node.attributes.nodeData.id,
-			idPattern = '###ID###';
-		TYPO3.Backend.ContentContainer.setUrl(
-			contextItem.customAttributes.contentUrl
-				.replace(idPattern, nodeId)
-				.replace(encodeURIComponent(idPattern), nodeId)
-		).then(
-			node.select
-		);
-	},
 
-	/**
-	 * Updates the title of a node
-	 *
-	 * @param {String} newText
-	 * @param {String} oldText
-	 * @param {TYPO3.Components.PageTree.TreeEditor} treeEditor
-	 * @return {void}
-	 */
-	saveTitle: function(newText, oldText, treeEditor) {
-		// Save current editNode in case treeEditor.editNode changes before the ajax call completes
-		var editedNode = treeEditor.editNode;
-
-		if (newText === oldText || newText == '') {
-			treeEditor.updateNodeText(
-				editedNode,
-				editedNode.attributes.nodeData.editableText,
-				Ext.util.Format.htmlEncode(oldText)
+			var nodeId = node.attributes.nodeData.id,
+				idPattern = '###ID###';
+			TYPO3.Backend.ContentContainer.setUrl(
+				contextItem.customAttributes.contentUrl
+					.replace(idPattern, nodeId)
+					.replace(encodeURIComponent(idPattern), nodeId)
+			).then(
+				node.select
 			);
-			return;
-		}
+		},
+
+		/**
+		 * Updates the title of a node
+		 *
+		 * @param {String} newText
+		 * @param {String} oldText
+		 * @param {TYPO3.Components.PageTree.TreeEditor} treeEditor
+		 * @return {void}
+		 */
+		saveTitle: function (newText, oldText, treeEditor) {
+			// Save current editNode in case treeEditor.editNode changes before the ajax call completes
+			var editedNode = treeEditor.editNode;
+
+			if (newText === oldText || newText == '') {
+				treeEditor.updateNodeText(
+					editedNode,
+					editedNode.attributes.nodeData.editableText,
+					Ext.util.Format.htmlEncode(oldText)
+				);
+				return;
+			}
 
-		TYPO3.Components.PageTree.Commands.updateLabel(
-			editedNode.attributes.nodeData,
-			newText,
-			function(response) {
-				if (this.evaluateResponse(response)) {
-					treeEditor.updateNodeText(editedNode, response.editableText, response.updatedText);
-				} else {
-					treeEditor.updateNodeText(
-						editedNode,
-						editedNode.attributes.nodeData.editableText,
-						Ext.util.Format.htmlEncode(oldText)
-					);
-				}
-				var currentTree = treeEditor.editNode.getOwnerTree();
-				if (currentTree.currentSelectedNode !== null) {
-					if (currentTree.currentSelectedNode.id === treeEditor.editNode.id) {
-						this.singleClick(treeEditor.editNode, treeEditor.editNode.ownerTree, currentTree);
+			TYPO3.Components.PageTree.Commands.updateLabel(
+				editedNode.attributes.nodeData,
+				newText,
+				function (response) {
+					if (this.evaluateResponse(response)) {
+						treeEditor.updateNodeText(editedNode, response.editableText, response.updatedText);
+					} else {
+						treeEditor.updateNodeText(
+							editedNode,
+							editedNode.attributes.nodeData.editableText,
+							Ext.util.Format.htmlEncode(oldText)
+						);
 					}
-					currentTree.currentSelectedNode.select();
-				}
-			},
-			this
-		);
-	}
-};
+					var currentTree = treeEditor.editNode.getOwnerTree();
+					if (currentTree.currentSelectedNode !== null) {
+						if (currentTree.currentSelectedNode.id === treeEditor.editNode.id) {
+							this.singleClick(treeEditor.editNode, treeEditor.editNode.ownerTree, currentTree);
+						}
+						currentTree.currentSelectedNode.select();
+					}
+				},
+				this
+			);
+		}
+	};
+});
diff --git a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/toppanel.js b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/toppanel.js
index c3706935d090e8257ecde08f0efbb10685e4cd59..0d1a1228644dfb9a7f7511155ec05fd78690b3b1 100644
--- a/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/toppanel.js
+++ b/typo3/sysext/backend/Resources/Public/JavaScript/extjs/components/pagetree/javascript/toppanel.js
@@ -12,495 +12,498 @@
  */
 Ext.namespace('TYPO3.Components.PageTree');
 
-/**
- * @class TYPO3.Components.PageTree.TopPanel
- *
- * Top Panel
- *
- * @namespace TYPO3.Components.PageTree
- * @extends Ext.Panel
- */
-TYPO3.Components.PageTree.TopPanel = Ext.extend(Ext.Panel, {
-	/**
-	 * Component Id
-	 *
-	 * @type {String}
-	 */
-	id: 'typo3-pagetree-topPanel',
-
-	/**
-	 * Component Class
-	 *
-	 * @type {String}
-	 */
-	cls: 'typo3-pagetree-toppanel',
-
-	/**
-	 * Border
-	 *
-	 * @type {Boolean}
-	 */
-	border: true,
-
-	/**
-	 * Toolbar Object
-	 *
-	 * @type {Ext.Toolbar}
-	 */
-	tbar: new Ext.Toolbar(),
-
-	/**
-	 * Currently Clicked Toolbar Button
-	 *
-	 * @type {Ext.Button}
-	 */
-	currentlyClickedButton: null,
-
-	/**
-	 * Currently Shown Panel
-	 *
-	 * @type {Ext.Component}
-	 */
-	currentlyShownPanel: null,
-
-	/**
-	 * Filtering Indicator Item
-	 *
-	 * @type {Ext.Panel}
-	 */
-	filteringIndicator: null,
-
-	/**
-	 * Drag and Drop Group
-	 *
-	 * @cfg {String}
-	 */
-	ddGroup: '',
-
-	/**
-	 * Data Provider
-	 *
-	 * @cfg {Object}
-	 */
-	dataProvider: null,
-
-	/**
-	 * Filtering Tree
-	 *
-	 * @cfg {TYPO3.Components.PageTree.FilteringTree}
-	 */
-	filteringTree: null,
-
-	/**
-	 * Page Tree
-	 *
-	 * @cfg {TYPO3.Components.PageTree.Tree}
-	 */
-	tree: null,
-
-	/**
-	 * Application Panel
-	 *
-	 * @cfg {TYPO3.Components.PageTree.App}
-	 */
-	app: null,
-
-	/**
-	 * Initializes the component
-	 *
-	 * @return {void}
-	 */
-	initComponent: function() {
-		this.currentlyShownPanel = new Ext.Panel({
-			id: this.id + '-defaultPanel',
-			cls: this.id + '-item typo3-pagetree-toppanel-item',
-			border: false
-		});
-		this.items = [this.currentlyShownPanel];
-
-		TYPO3.Components.PageTree.TopPanel.superclass.initComponent.apply(this, arguments);
-
-		this.addDragDropNodeInsertionFeature();
-
-		if (!TYPO3.Components.PageTree.Configuration.hideFilter
-			|| TYPO3.Components.PageTree.Configuration.hideFilter === '0'
-		) {
-			this.addFilterFeature();
-		}
-
-		this.getTopToolbar().addItem({xtype: 'tbfill'});
-		this.addRefreshTreeFeature();
-	},
-
-	/**
-	 * Returns a custom button template to fix some nasty webkit issues
-	 * by removing some useless wrapping html code
-	 *
-	 * @return {void}
-	 */
-	getButtonTemplate: function() {
-		return new Ext.Template(
-			'<div id="{4}" class="x-btn {3}"><button type="{0}">&nbsp;</button></div>'
-		);
-	},
-
-	/**
-	 * Adds a button to the components toolbar with a related component
-	 *
-	 * @param {Object} button
-	 * @param {Object} connectedWidget
-	 * @return {void}
-	 */
-	addButton: function(button, connectedWidget) {
-		button.template = this.getButtonTemplate();
-		button.on('toggle', this.topbarButtonToggleCallback);
-		if (!button.hasListener('click')) {
-			button.on('click', this.topbarButtonCallback);
-		}
-
-		if (connectedWidget) {
-			connectedWidget.hidden = true;
-			button.connectedWidget = connectedWidget;
-			this.add(connectedWidget);
-		}
-
-		this.getTopToolbar().addItem(button);
-		this.doLayout();
-	},
+require(['TYPO3/CMS/Backend/Utility'], function(Utility) {
 
 	/**
-	 * Toggle button state
+	 * @class TYPO3.Components.PageTree.TopPanel
 	 *
-	 * @return {void}
-	 */
-	topbarButtonToggleCallback: function() {
-		if (this.pressed) {
-			this.el.addClass(['active']);
-		} else {
-			this.el.removeClass(['active']);
-		}
-	},
-
-	/**
-	 * Usual button callback method that triggers the assigned component of the
-	 * clicked toolbar button
+	 * Top Panel
 	 *
-	 * @return {void}
+	 * @namespace TYPO3.Components.PageTree
+	 * @extends Ext.Panel
 	 */
-	topbarButtonCallback: function() {
-		var topPanel = this.ownerCt.ownerCt;
+	TYPO3.Components.PageTree.TopPanel = Ext.extend(Ext.Panel, {
+		/**
+		 * Component Id
+		 *
+		 * @type {String}
+		 */
+		id: 'typo3-pagetree-topPanel',
+
+		/**
+		 * Component Class
+		 *
+		 * @type {String}
+		 */
+		cls: 'typo3-pagetree-toppanel',
+
+		/**
+		 * Border
+		 *
+		 * @type {Boolean}
+		 */
+		border: true,
+
+		/**
+		 * Toolbar Object
+		 *
+		 * @type {Ext.Toolbar}
+		 */
+		tbar: new Ext.Toolbar(),
+
+		/**
+		 * Currently Clicked Toolbar Button
+		 *
+		 * @type {Ext.Button}
+		 */
+		currentlyClickedButton: null,
+
+		/**
+		 * Currently Shown Panel
+		 *
+		 * @type {Ext.Component}
+		 */
+		currentlyShownPanel: null,
+
+		/**
+		 * Filtering Indicator Item
+		 *
+		 * @type {Ext.Panel}
+		 */
+		filteringIndicator: null,
+
+		/**
+		 * Drag and Drop Group
+		 *
+		 * @cfg {String}
+		 */
+		ddGroup: '',
+
+		/**
+		 * Data Provider
+		 *
+		 * @cfg {Object}
+		 */
+		dataProvider: null,
+
+		/**
+		 * Filtering Tree
+		 *
+		 * @cfg {TYPO3.Components.PageTree.FilteringTree}
+		 */
+		filteringTree: null,
+
+		/**
+		 * Page Tree
+		 *
+		 * @cfg {TYPO3.Components.PageTree.Tree}
+		 */
+		tree: null,
+
+		/**
+		 * Application Panel
+		 *
+		 * @cfg {TYPO3.Components.PageTree.App}
+		 */
+		app: null,
+
+		/**
+		 * Initializes the component
+		 *
+		 * @return {void}
+		 */
+		initComponent: function () {
+			this.currentlyShownPanel = new Ext.Panel({
+				id: this.id + '-defaultPanel',
+				cls: this.id + '-item typo3-pagetree-toppanel-item',
+				border: false
+			});
+			this.items = [this.currentlyShownPanel];
+
+			TYPO3.Components.PageTree.TopPanel.superclass.initComponent.apply(this, arguments);
+
+			this.addDragDropNodeInsertionFeature();
+
+			if (!TYPO3.Components.PageTree.Configuration.hideFilter
+				|| TYPO3.Components.PageTree.Configuration.hideFilter === '0'
+			) {
+				this.addFilterFeature();
+			}
 
-		topPanel.currentlyShownPanel.hide();
-		if (topPanel.currentlyClickedButton) {
-			topPanel.currentlyClickedButton.toggle(false);
-		}
+			this.getTopToolbar().addItem({xtype: 'tbfill'});
+			this.addRefreshTreeFeature();
+		},
+
+		/**
+		 * Returns a custom button template to fix some nasty webkit issues
+		 * by removing some useless wrapping html code
+		 *
+		 * @return {void}
+		 */
+		getButtonTemplate: function () {
+			return new Ext.Template(
+				'<div id="{4}" class="x-btn {3}"><button type="{0}">&nbsp;</button></div>'
+			);
+		},
+
+		/**
+		 * Adds a button to the components toolbar with a related component
+		 *
+		 * @param {Object} button
+		 * @param {Object} connectedWidget
+		 * @return {void}
+		 */
+		addButton: function (button, connectedWidget) {
+			button.template = this.getButtonTemplate();
+			button.on('toggle', this.topbarButtonToggleCallback);
+			if (!button.hasListener('click')) {
+				button.on('click', this.topbarButtonCallback);
+			}
 
-		if (topPanel.currentlyClickedButton === this) {
-			topPanel.currentlyClickedButton = null;
-			topPanel.currentlyShownPanel = topPanel.get(topPanel.id + '-defaultPanel');
-		} else {
-			this.toggle(true);
-			topPanel.currentlyClickedButton = this;
-			topPanel.currentlyShownPanel = this.connectedWidget;
-		}
+			if (connectedWidget) {
+				connectedWidget.hidden = true;
+				button.connectedWidget = connectedWidget;
+				this.add(connectedWidget);
+			}
 
-		topPanel.currentlyShownPanel.show();
-	},
+			this.getTopToolbar().addItem(button);
+			this.doLayout();
+		},
+
+		/**
+		 * Toggle button state
+		 *
+		 * @return {void}
+		 */
+		topbarButtonToggleCallback: function () {
+			if (this.pressed) {
+				this.el.addClass(['active']);
+			} else {
+				this.el.removeClass(['active']);
+			}
+		},
+
+		/**
+		 * Usual button callback method that triggers the assigned component of the
+		 * clicked toolbar button
+		 *
+		 * @return {void}
+		 */
+		topbarButtonCallback: function () {
+			var topPanel = this.ownerCt.ownerCt;
+
+			topPanel.currentlyShownPanel.hide();
+			if (topPanel.currentlyClickedButton) {
+				topPanel.currentlyClickedButton.toggle(false);
+			}
 
-	/**
-	 * Loads the filtering tree nodes with the given search word
-	 *
-	 * @param {Ext.form.TextField} textField
-	 * @return {void}
-	 */
-	createFilterTree: function(textField) {
-		var searchWord = textField.getValue();
-		var isNumber = TYPO3.Utility.isNumber(searchWord);
-		var hasMinLength = (searchWord.length > 2 || searchWord.length <= 0);
-		if ((!hasMinLength && !isNumber) || searchWord === this.filteringTree.searchWord) {
-			return;
-		}
+			if (topPanel.currentlyClickedButton === this) {
+				topPanel.currentlyClickedButton = null;
+				topPanel.currentlyShownPanel = topPanel.get(topPanel.id + '-defaultPanel');
+			} else {
+				this.toggle(true);
+				topPanel.currentlyClickedButton = this;
+				topPanel.currentlyShownPanel = this.connectedWidget;
+			}
 
-		this.filteringTree.searchWord = searchWord;
-		if (this.filteringTree.searchWord === '') {
-			this.app.activeTree = this.tree;
-			this.tree.t3ContextNode = this.filteringTree.t3ContextNode;
+			topPanel.currentlyShownPanel.show();
+		},
+
+		/**
+		 * Loads the filtering tree nodes with the given search word
+		 *
+		 * @param {Ext.form.TextField} textField
+		 * @return {void}
+		 */
+		createFilterTree: function (textField) {
+			var searchWord = textField.getValue();
+			var isNumber = Utility.isNumber(searchWord);
+			var hasMinLength = (searchWord.length > 2 || searchWord.length <= 0);
+			if ((!hasMinLength && !isNumber) || searchWord === this.filteringTree.searchWord) {
+				return;
+			}
 
-			textField.setHideTrigger(true);
-			this.filteringTree.hide();
-			this.tree.show().refreshTree(function() {
-				textField.focus(false, 500);
-			}, this);
+			this.filteringTree.searchWord = searchWord;
+			if (this.filteringTree.searchWord === '') {
+				this.app.activeTree = this.tree;
+				this.tree.t3ContextNode = this.filteringTree.t3ContextNode;
 
-			if (this.filteringIndicator) {
-				this.app.removeIndicator(this.filteringIndicator);
-				this.filteringIndicator = null;
-			}
-		} else {
-			var selectedNode = this.app.getSelected();
-			this.app.activeTree = this.filteringTree;
-
-			if (!this.filteringIndicator) {
-				this.filteringIndicator = this.app.addIndicator(
-					this.createIndicatorItem(textField)
-				);
-			}
+				textField.setHideTrigger(true);
+				this.filteringTree.hide();
+				this.tree.show().refreshTree(function () {
+					textField.focus(false, 500);
+				}, this);
 
-			textField.setHideTrigger(false);
-			this.tree.hide();
-			this.filteringTree.show().refreshTree(function() {
-				if (selectedNode) {
-					this.app.select(selectedNode.attributes.nodeData.id, false);
+				if (this.filteringIndicator) {
+					this.app.removeIndicator(this.filteringIndicator);
+					this.filteringIndicator = null;
+				}
+			} else {
+				var selectedNode = this.app.getSelected();
+				this.app.activeTree = this.filteringTree;
+
+				if (!this.filteringIndicator) {
+					this.filteringIndicator = this.app.addIndicator(
+						this.createIndicatorItem(textField)
+					);
 				}
-				textField.focus();
-			}, this);
-		}
 
-		this.doLayout();
-	},
+				textField.setHideTrigger(false);
+				this.tree.hide();
+				this.filteringTree.show().refreshTree(function () {
+					if (selectedNode) {
+						this.app.select(selectedNode.attributes.nodeData.id, false);
+					}
+					textField.focus();
+				}, this);
+			}
 
-	/**
-	 * Adds an indicator item to the page tree application for the filtering feature
-	 *
-	 * @param {Ext.form.TextField} textField
-	 * @return {void}
-	 */
-	createIndicatorItem: function(textField) {
-		return {
-			border: false,
-			id: this.app.id + '-indicatorBar-filter',
-			cls: this.app.id + '-indicatorBar-item',
-			html: '' +
+			this.doLayout();
+		},
+
+		/**
+		 * Adds an indicator item to the page tree application for the filtering feature
+		 *
+		 * @param {Ext.form.TextField} textField
+		 * @return {void}
+		 */
+		createIndicatorItem: function (textField) {
+			return {
+				border: false,
+				id: this.app.id + '-indicatorBar-filter',
+				cls: this.app.id + '-indicatorBar-item',
+				html: '' +
 				'<div class="alert alert-info">' +
-					'<div class="media">' +
-						'<div class="media-left">' +
-							TYPO3.Components.PageTree.Icons.Info +
-						'</div>' +
-						'<div class="media-body">' +
-							TYPO3.Components.PageTree.LLL.activeFilterMode +
-						'</div>' +
-						'<div class="media-right">' +
-							'<a href="#" id="' + this.app.id + '-indicatorBar-filter-clear">' +
-								TYPO3.Components.PageTree.Icons.Close +
-							'</a>' +
-						'</div>' +
-					'</div>' +
+				'<div class="media">' +
+				'<div class="media-left">' +
+				TYPO3.Components.PageTree.Icons.Info +
+				'</div>' +
+				'<div class="media-body">' +
+				TYPO3.Components.PageTree.LLL.activeFilterMode +
+				'</div>' +
+				'<div class="media-right">' +
+				'<a href="#" id="' + this.app.id + '-indicatorBar-filter-clear">' +
+				TYPO3.Components.PageTree.Icons.Close +
+				'</a>' +
+				'</div>' +
+				'</div>' +
 				'</div>',
-			filteringTree: this.filteringTree,
-
-			listeners: {
-				afterrender: {
-					scope: this,
-					fn: function() {
-						var element = Ext.fly(this.app.id + '-indicatorBar-filter-clear');
-						element.on('click', function() {
-							textField.setValue('');
-							this.createFilterTree(textField);
-						}, this);
+				filteringTree: this.filteringTree,
+
+				listeners: {
+					afterrender: {
+						scope: this,
+						fn: function () {
+							var element = Ext.fly(this.app.id + '-indicatorBar-filter-clear');
+							element.on('click', function () {
+								textField.setValue('');
+								this.createFilterTree(textField);
+							}, this);
+						}
 					}
 				}
-			}
-		};
-	},
+			};
+		},
+
+		/**
+		 * Adds the necessary functionality and components for the filtering feature
+		 *
+		 * @return {void}
+		 */
+		addFilterFeature: function () {
+			var topPanelButton = new Ext.Button({
+				id: this.id + '-button-filter',
+				cls: 'btn btn-default btn-sm',
+				text: TYPO3.Components.PageTree.Icons.Filter,
+				tooltip: TYPO3.Components.PageTree.LLL.buttonFilter
+			});
+
+			var textField = new Ext.form.TriggerField({
+				id: this.id + '-filter',
+				cls: 'form-control input-sm typo3-pagetree-toppanel-filter',
+				enableKeyEvents: true,
+				triggerConfig: {
+					tag: 'span',
+					html: TYPO3.Components.PageTree.Icons.InputClear,
+					cls: 'typo3-pagetree-toppanel-filter-clear'
+				},
+				value: TYPO3.Components.PageTree.LLL.searchTermInfo,
+
+				listeners: {
+					blur: {
+						scope: this,
+						fn: function (textField) {
+							if (textField.getValue() === '') {
+								textField.setValue(TYPO3.Components.PageTree.LLL.searchTermInfo);
+								textField.addClass(this.id + '-filter-defaultText');
+							}
+						}
+					},
+
+					focus: {
+						scope: this,
+						fn: function (textField) {
+							if (textField.getValue() === TYPO3.Components.PageTree.LLL.searchTermInfo) {
+								textField.setValue('');
+								textField.removeClass(this.id + '-filter-defaultText');
+							}
+						}
+					},
 
-	/**
-	 * Adds the necessary functionality and components for the filtering feature
-	 *
-	 * @return {void}
-	 */
-	addFilterFeature: function() {
-		var topPanelButton = new Ext.Button({
-			id: this.id + '-button-filter',
-			cls: 'btn btn-default btn-sm',
-			text: TYPO3.Components.PageTree.Icons.Filter,
-			tooltip: TYPO3.Components.PageTree.LLL.buttonFilter
-		});
-
-		var textField = new Ext.form.TriggerField({
-			id: this.id + '-filter',
-			cls: 'form-control input-sm typo3-pagetree-toppanel-filter',
-			enableKeyEvents: true,
-			triggerConfig: {
-				tag: 'span',
-				html: TYPO3.Components.PageTree.Icons.InputClear,
-				cls: 'typo3-pagetree-toppanel-filter-clear'
-			},
-			value: TYPO3.Components.PageTree.LLL.searchTermInfo,
-
-			listeners: {
-				blur: {
-					scope: this,
-					fn:function(textField) {
-						if (textField.getValue() === '') {
-							textField.setValue(TYPO3.Components.PageTree.LLL.searchTermInfo);
-							textField.addClass(this.id + '-filter-defaultText');
+					keydown: {
+						fn: this.createFilterTree,
+						scope: this,
+						buffer: 1000
+					}
+				}
+			});
+
+			textField.setHideTrigger(true);
+			textField.onTriggerClick = function () {
+				textField.setValue('');
+				this.createFilterTree(textField);
+			}.createDelegate(this);
+
+			var topPanelWidget = new Ext.Container({
+				border: false,
+				id: this.id + '-filterWrap',
+				cls: this.id + '-item typo3-pagetree-toppanel-item',
+				border: false,
+				items: [textField],
+
+				listeners: {
+					show: {
+						scope: this,
+						fn: function (panel) {
+							panel.get(this.id + '-filter').focus();
 						}
 					}
+				}
+			});
+
+			this.addButton(topPanelButton, topPanelWidget);
+		},
+
+		/**
+		 * Creates the entries for the new node drag zone toolbar
+		 *
+		 * @return {void}
+		 */
+		createNewNodeToolbar: function () {
+			this.dragZone = new Ext.dd.DragZone(this.getEl(), {
+				ddGroup: this.ownerCt.ddGroup,
+				topPanel: this.ownerCt,
+
+				endDrag: function () {
+					this.topPanel.app.activeTree.dontSetOverClass = false;
 				},
 
-				focus: {
-					scope: this,
-					fn: function(textField) {
-						if (textField.getValue() === TYPO3.Components.PageTree.LLL.searchTermInfo) {
-							textField.setValue('');
-							textField.removeClass(this.id + '-filter-defaultText');
+				getDragData: function (event) {
+					this.proxyElement = document.createElement('div');
+					if (event.getTarget('.x-btn') !== null) {
+						var node = Ext.getCmp(event.getTarget('.x-btn').id);
+						node.shouldCreateNewNode = true;
+						return {
+							ddel: this.proxyElement,
+							item: node
 						}
 					}
 				},
 
-				keydown: {
-					fn: this.createFilterTree,
-					scope: this,
-					buffer: 1000
-				}
-			}
-		});
-
-		textField.setHideTrigger(true);
-		textField.onTriggerClick = function() {
-			textField.setValue('');
-			this.createFilterTree(textField);
-		}.createDelegate(this);
-
-		var topPanelWidget = new Ext.Container({
-			border: false,
-			id: this.id + '-filterWrap',
-			cls: this.id + '-item typo3-pagetree-toppanel-item',
-			border: false,
-			items: [textField],
-
-			listeners: {
-				show: {
-					scope: this,
-					fn: function(panel) {
-						panel.get(this.id + '-filter').focus();
-					}
-				}
-			}
-		});
+				onInitDrag: function () {
+					this.topPanel.app.activeTree.dontSetOverClass = true;
+					var clickedButton = this.dragData.item;
 
-		this.addButton(topPanelButton, topPanelWidget);
-	},
+					this.proxyElement.shadow = false;
+					this.proxyElement.innerHTML = '<div class="x-dd-drag-ghost-pagetree">' +
+						'<span class="x-dd-drag-ghost-pagetree-icon">' + clickedButton.initialConfig.html + '</span>' +
+						'<span class="x-dd-drag-ghost-pagetree-text">' + clickedButton.title + '</span>' +
+						'</div>';
 
-	/**
-	 * Creates the entries for the new node drag zone toolbar
-	 *
-	 * @return {void}
-	 */
-	createNewNodeToolbar: function() {
-		this.dragZone = new Ext.dd.DragZone(this.getEl(), {
-			ddGroup: this.ownerCt.ddGroup,
-			topPanel: this.ownerCt,
-
-			endDrag: function() {
-				this.topPanel.app.activeTree.dontSetOverClass = false;
-			},
-
-			getDragData: function(event) {
-				this.proxyElement = document.createElement('div');
-				if (event.getTarget('.x-btn') !== null){
-					var node = Ext.getCmp(event.getTarget('.x-btn').id);
-					node.shouldCreateNewNode = true;
-					return {
-						ddel: this.proxyElement,
-						item: node
-					}
+					this.proxy.update(this.proxyElement);
 				}
-			},
-
-			onInitDrag: function() {
-				this.topPanel.app.activeTree.dontSetOverClass = true;
-				var clickedButton = this.dragData.item;
-
-				this.proxyElement.shadow = false;
-				this.proxyElement.innerHTML = '<div class="x-dd-drag-ghost-pagetree">' +
-					'<span class="x-dd-drag-ghost-pagetree-icon">' + clickedButton.initialConfig.html + '</span>' +
-					'<span class="x-dd-drag-ghost-pagetree-text">'  + clickedButton.title + '</span>' +
-				'</div>';
-
-				this.proxy.update(this.proxyElement);
-			}
-		});
+			});
 
 			// listens on the escape key to stop the dragging
-		(new Ext.KeyMap(document, {
-			key: Ext.EventObject.ESC,
-			scope: this,
-			buffer: 250,
-			fn: function(event) {
-				if (this.dragZone.dragging) {
-					Ext.dd.DragDropMgr.stopDrag(event);
-					this.dragZone.onInvalidDrop(event);
+			(new Ext.KeyMap(document, {
+				key: Ext.EventObject.ESC,
+				scope: this,
+				buffer: 250,
+				fn: function (event) {
+					if (this.dragZone.dragging) {
+						Ext.dd.DragDropMgr.stopDrag(event);
+						this.dragZone.onInvalidDrop(event);
+					}
 				}
-			}
-		}, 'keydown'));
-	},
-
-	/**
-	 * Creates the necessary components for new node drag and drop feature
-	 *
-	 * @return {void}
-	 */
-	addDragDropNodeInsertionFeature: function() {
-		var newNodeToolbar = new Ext.Toolbar({
-			border: false,
-			id: this.id + '-item-newNode',
-			listeners: {
-				render: {
-					fn: this.createNewNodeToolbar
+			}, 'keydown'));
+		},
+
+		/**
+		 * Creates the necessary components for new node drag and drop feature
+		 *
+		 * @return {void}
+		 */
+		addDragDropNodeInsertionFeature: function () {
+			var newNodeToolbar = new Ext.Toolbar({
+				border: false,
+				id: this.id + '-item-newNode',
+				listeners: {
+					render: {
+						fn: this.createNewNodeToolbar
+					}
 				}
-			}
-		});
-
-		this.dataProvider.getNodeTypes(function(response) {
-			var amountOfNodeTypes = response.length;
-			if (amountOfNodeTypes > 0) {
-				topPanelButton.show();
-				for (var i = 0; i < amountOfNodeTypes; ++i) {
-					response[i].template = this.getButtonTemplate();
-					response[i].cls = 'typo3-pagetree-toppanel-drag-node';
-					newNodeToolbar.addItem(response[i]);
+			});
+
+			this.dataProvider.getNodeTypes(function (response) {
+				var amountOfNodeTypes = response.length;
+				if (amountOfNodeTypes > 0) {
+					topPanelButton.show();
+					for (var i = 0; i < amountOfNodeTypes; ++i) {
+						response[i].template = this.getButtonTemplate();
+						response[i].cls = 'typo3-pagetree-toppanel-drag-node';
+						newNodeToolbar.addItem(response[i]);
+					}
+					newNodeToolbar.doLayout();
 				}
-				newNodeToolbar.doLayout();
-			}
-		}, this);
-
-		var topPanelButton = new Ext.Button({
-			id: this.id + '-button-newNode',
-			cls: 'btn btn-default btn-sm',
-			text: TYPO3.Components.PageTree.Icons.NewNode,
-			tooltip: TYPO3.Components.PageTree.LLL.buttonNewNode,
-			hidden: true
-		});
-
-		this.addButton(topPanelButton, newNodeToolbar);
-	},
+			}, this);
 
-	/**
-	 * Adds a button to the toolbar for the refreshing feature
-	 *
-	 * @return {void}
-	 */
-	addRefreshTreeFeature: function() {
-		var topPanelButton = new Ext.Button({
-			id: this.id + '-button-refresh',
-			cls: 'btn btn-default btn-sm',
-			text: TYPO3.Components.PageTree.Icons.Refresh,
-			tooltip: TYPO3.Components.PageTree.LLL.buttonRefresh,
-
-			listeners: {
-				click: {
-					scope: this,
-					fn: function() {
-						this.app.activeTree.refreshTree();
+			var topPanelButton = new Ext.Button({
+				id: this.id + '-button-newNode',
+				cls: 'btn btn-default btn-sm',
+				text: TYPO3.Components.PageTree.Icons.NewNode,
+				tooltip: TYPO3.Components.PageTree.LLL.buttonNewNode,
+				hidden: true
+			});
+
+			this.addButton(topPanelButton, newNodeToolbar);
+		},
+
+		/**
+		 * Adds a button to the toolbar for the refreshing feature
+		 *
+		 * @return {void}
+		 */
+		addRefreshTreeFeature: function () {
+			var topPanelButton = new Ext.Button({
+				id: this.id + '-button-refresh',
+				cls: 'btn btn-default btn-sm',
+				text: TYPO3.Components.PageTree.Icons.Refresh,
+				tooltip: TYPO3.Components.PageTree.LLL.buttonRefresh,
+
+				listeners: {
+					click: {
+						scope: this,
+						fn: function () {
+							this.app.activeTree.refreshTree();
+						}
 					}
 				}
-			}
-		});
+			});
 
-		this.addButton(topPanelButton);
-	}
-});
+			this.addButton(topPanelButton);
+		}
+	});
 
-// XTYPE Registration
-Ext.reg('TYPO3.Components.PageTree.TopPanel', TYPO3.Components.PageTree.TopPanel);
+	// XTYPE Registration
+	Ext.reg('TYPO3.Components.PageTree.TopPanel', TYPO3.Components.PageTree.TopPanel);
+});
diff --git a/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82609-DeprecateTYPO3Utility.rst b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82609-DeprecateTYPO3Utility.rst
new file mode 100644
index 0000000000000000000000000000000000000000..7e56dcb93c344672810c813c50a8d03c6e32da35
--- /dev/null
+++ b/typo3/sysext/core/Documentation/Changelog/master/Deprecation-82609-DeprecateTYPO3Utility.rst
@@ -0,0 +1,35 @@
+.. include:: ../../Includes.txt
+
+=============================================
+Deprecation: #82609 - Deprecate TYPO3.Utility
+=============================================
+
+See :issue:`82609`
+
+Description
+===========
+
+The public property :js:`TYPO3.Utility` has been marked as deprecated. `Utility` may be used in AMD based modules by
+importing :js:`TYPO3/CMS/Backend/Utility` instead.
+
+
+Affected Installations
+======================
+
+All extensions using :js:`TYPO3.Utility` are affected.
+
+
+Migration
+=========
+
+Import :js:`TYPO3/CMS/Backend/Utility` in your AMD module.
+
+Example code:
+
+.. code-block:: javascript
+
+	define(['TYPO3/CMS/Backend/Utility'], function(Utility) {
+		// use Utility here
+	});
+
+.. index:: JavaScript, NotScanned