Merge branch 'master' of ssh://git.eclipse.org/gitroot/orion/org.eclipse.orion.client
diff --git a/bundles/org.eclipse.orion.client.core/web/css/ide.css b/bundles/org.eclipse.orion.client.core/web/css/ide.css
index 5e4e365..7f49107 100644
--- a/bundles/org.eclipse.orion.client.core/web/css/ide.css
+++ b/bundles/org.eclipse.orion.client.core/web/css/ide.css
@@ -461,7 +461,7 @@
 }
 
 .progressPane_operations {
-	background: url(../images/progress_none.gif) no-repeat center;  /* TODO move icon to sprite*/
+	background: url(../images/progress_none.png) no-repeat center;  /* TODO move icon to sprite*/
 }
 
 .progressPane_running {
@@ -761,12 +761,12 @@
 	padding: 0px;
 }
 
-.lightTreeTableRow {
-	background-color: #FFFFFF;
+.lightTreeTableRow > td {
+	border-bottom: 1px solid #e6e6e6;
 }
 
-.darkTreeTableRow {
-	background-color: #f7f7f7;
+.darkTreeTableRow > td {
+	border-bottom: 1px solid #e6e6e6;
 }
 
 .testNavTreetable {
diff --git a/bundles/org.eclipse.orion.client.core/web/images/check.gif b/bundles/org.eclipse.orion.client.core/web/images/check.gif
index 54b07f7..d94417f 100644
--- a/bundles/org.eclipse.orion.client.core/web/images/check.gif
+++ b/bundles/org.eclipse.orion.client.core/web/images/check.gif
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.core/web/images/check_on.gif b/bundles/org.eclipse.orion.client.core/web/images/check_on.gif
index d577ef8..53c76e8 100644
--- a/bundles/org.eclipse.orion.client.core/web/images/check_on.gif
+++ b/bundles/org.eclipse.orion.client.core/web/images/check_on.gif
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.core/web/images/progress_gray.gif b/bundles/org.eclipse.orion.client.core/web/images/progress_gray.gif
deleted file mode 100644
index a0172ad..0000000
--- a/bundles/org.eclipse.orion.client.core/web/images/progress_gray.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.core/web/images/progress_none.gif b/bundles/org.eclipse.orion.client.core/web/images/progress_none.gif
deleted file mode 100644
index 4d4cb9b..0000000
--- a/bundles/org.eclipse.orion.client.core/web/images/progress_none.gif
+++ /dev/null
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.core/web/images/progress_none.png b/bundles/org.eclipse.orion.client.core/web/images/progress_none.png
new file mode 100644
index 0000000..838a162
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.core/web/images/progress_none.png
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.core/web/images/progress_running.gif b/bundles/org.eclipse.orion.client.core/web/images/progress_running.gif
index 4c605d4..fc6bd80 100644
--- a/bundles/org.eclipse.orion.client.core/web/images/progress_running.gif
+++ b/bundles/org.eclipse.orion.client.core/web/images/progress_running.gif
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.core/web/images/twistie_closed.gif b/bundles/org.eclipse.orion.client.core/web/images/twistie_closed.gif
index 8415bac..991fa57 100644
--- a/bundles/org.eclipse.orion.client.core/web/images/twistie_closed.gif
+++ b/bundles/org.eclipse.orion.client.core/web/images/twistie_closed.gif
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.core/web/images/twistie_open.gif b/bundles/org.eclipse.orion.client.core/web/images/twistie_open.gif
index b25b097..f7fca3c 100644
--- a/bundles/org.eclipse.orion.client.core/web/images/twistie_open.gif
+++ b/bundles/org.eclipse.orion.client.core/web/images/twistie_open.gif
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.core/web/images/twistie_partOpen.gif b/bundles/org.eclipse.orion.client.core/web/images/twistie_partOpen.gif
index c3d0b9f..f4861d0 100644
--- a/bundles/org.eclipse.orion.client.core/web/images/twistie_partOpen.gif
+++ b/bundles/org.eclipse.orion.client.core/web/images/twistie_partOpen.gif
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.core/web/js-tests/jsTestSuite.js b/bundles/org.eclipse.orion.client.core/web/js-tests/jsTestSuite.js
index 1f26efa..8418f08 100644
--- a/bundles/org.eclipse.orion.client.core/web/js-tests/jsTestSuite.js
+++ b/bundles/org.eclipse.orion.client.core/web/js-tests/jsTestSuite.js
@@ -54,7 +54,7 @@
 				"/js-tests/preferences/test.html",
 				"/js-tests/pluginRegistry/test.html",
 				"/js-tests/testRunAsynch/test.html",
-				"/js-tests/editor/test-editor.html",
+				"/js-tests/editor/test.html",
 				"/js-tests/textview/test.html",
 				"/js-tests/jsContentAssist/test.html",
 				"/js-tests/contentTypes/test.html"
diff --git a/bundles/org.eclipse.orion.client.core/web/navigate/table.js b/bundles/org.eclipse.orion.client.core/web/navigate/table.js
index 88cbbe4..7fbc999 100644
--- a/bundles/org.eclipse.orion.client.core/web/navigate/table.js
+++ b/bundles/org.eclipse.orion.client.core/web/navigate/table.js
@@ -68,7 +68,7 @@
 			tooltip: "Open or close the left pane",
 			id: "eclipse.toggleSplitter",
 			callback: function() {
-				var splitArea = dijit.byId("orion.innerNavigator");
+				var splitArea = dijit.byId("eclipse.navigate-table");
 				splitArea.toggle();}
 		});
 		commandService.addCommand(toggleOutlineCommand, "dom");
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/commands.js b/bundles/org.eclipse.orion.client.core/web/orion/commands.js
index 69f8ba1..2d9f5dd 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/commands.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/commands.js
@@ -708,7 +708,7 @@
 					var keyBinding = null;
 					var urlBinding = null;
 					if (command) {
-						if (scope === "dom") {
+						if (scope === "dom" || scope === "global") {
 							if (renderType === "tool" || renderType === "button") {
 								render = parent.id === positionOrder[i].scopeId;
 							} else if (renderType=== "menu") {
@@ -720,7 +720,7 @@
 							// if there is a scope id on the contribution it's not supposed to show up here
 							// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=368699
 							render = !positionOrder[i].scopeId;
-						}
+						} 
 						// only check bindings that would otherwise render (ie, dom id matches parent, etc.)
 						var checkBinding = render && (scope === "global" || scope === "dom");
 						invocation = new CommandInvocation(this, handler, items, userData, command);
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/commonHTMLFragments.js b/bundles/org.eclipse.orion.client.core/web/orion/commonHTMLFragments.js
new file mode 100644
index 0000000..4ae1a4a
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.core/web/orion/commonHTMLFragments.js
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * @license
+ * Copyright (c) 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials are made 
+ * available under the terms of the Eclipse Public License v1.0 
+ * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 
+ * License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html). 
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*global window document define login logout localStorage orion */
+/*browser:true*/
+
+define(['require'], 
+        function(require){
+	
+	/**
+	 * This class contains static utility methods. It is not intended to be instantiated.
+	 * @class This class contains HTML fragments for the common banner, footer, toolbars
+	 * @name orion.commonHTMLFragments
+	 */
+
+	// BEGIN TOP BANNER FRAGMENT
+	var topHTMLFragment =
+	//Top row:  Logo + discovery links + user
+	'<div id="staticBanner" class="layoutBlock topRowBanner">' +
+		'<a id="home" class="layoutLeft primaryNav" href="' + require.toUrl("index.html") + '"><img src="' + require.toUrl("images/orion-small-lightondark.gif") + '" alt="Orion Logo"/></a>' +
+		'<div id="primaryNav" class="layoutLeft primaryNav"></div>' +
+		'<div id="help" class="layoutRight help"><a id="help" href="' + require.toUrl("help/index.jsp") + '"><img src="' + require.toUrl("images/help.gif") + '" alt="Help"/></a></div>'+
+		'<div id="userInfo" class="layoutRight primaryNav"></div>' +
+		'<div class="layoutRight primaryNav">|</div>' +
+	'</div>' +
+	//Title area
+	'<div id="titleArea" class="layoutBlock titleArea">' +
+		'<div id="pageTitle" class="layoutLeft pageTitle"></div>' +
+		'<input type="search" id="search" placeholder="Search root" title="Type a keyword or wild card to search in root" class="layoutRight searchbox">' +
+		'<div id="relatedLinks" class="layoutRight pageNav"></div>' +
+		'<div id="globalActions" class="layoutRight pageNav"></div>' +
+		'<div id="dimension" class="layoutBlock dimension"></div>' +
+		'<div id="location" class="layoutBlock currentLocation"></div>' +
+	'</div>';
+	// END TOP BANNER FRAGMENT
+	
+	// BEGIN BOTTOM BANNER FRAGMENT
+	// styling of the surrounding div (text-align, etc) is in ide.css "footer"
+	var bottomHTMLFragment = 
+		'<div class="layoutBlock">' +
+			'<div class="footerBlock">' +
+				'This is a Beta build of Orion. Please try it out but BEWARE your data may be lost.' +
+			'</div>' +
+			'<div class="footerRightBlock">' +
+				'<a href="http://wiki.eclipse.org/Orion/FAQ" target="_blank">FAQ</a> | ' + 
+				'<a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Orion&version=0.4" target="_blank">Report a Bug</a> | ' +
+				'<a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a> | ' + 
+				'<a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a> | '+ 
+				'<a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a> | '+
+				'<a href="' + require.toUrl("/operations/list.html") +'" target="_blank">Server Operations</a>' +
+			'</div>' +
+		'</div>';
+	// END BOTTOM BANNER FRAGEMENT
+
+	var toolbarHTMLFragment = 
+		'<div class="layoutLeft pageToolbarLeft pageActions" id="pageActions"></div>' +
+		'<img class="layoutRight progressPane" src="'+ require.toUrl("images/none.png") +'" id="progressPane"></img>' +
+		'<div class="layoutRight pageToolbarRight pageActions pageNavigationActions" id="statusPane"></div>' +
+		'<div class="layoutRight pageToolbarRight pageActions pageNavigationActions" id="pageNavigationActions"></div>' +
+		'<div id="notificationArea" class="layoutLeft layoutBlock slideContainer">' +
+				'<div class="layoutLeft" id="notifications"></div>' +
+		'</div>' +
+		'<div id="parameterArea" class="layoutBlock slideContainer">' +
+			'<span id="pageParameterArea" class="leftSlide">' +
+				'<span id="pageCommandParameters" class="parameters"></span>' +
+				'<span id="pageCommandDismiss" class="parameters"></span>' +
+			'</span>' +
+			'<span id="pageNavigationParameterArea" class="rightSlide">' +
+				'<span id="pageNavigationCommandParameters" class="parameters"></span>' +
+				'<span id="pageNavigationDismiss" class="parameters"></span>' +
+			'</span>' +
+		'</div>';
+	
+	//return the module exports
+	return {
+		topHTMLFragment: topHTMLFragment,
+		bottomHTMLFragment: bottomHTMLFragment,
+		toolbarHTMLFragment: toolbarHTMLFragment
+	};
+});
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/explorer-table.js b/bundles/org.eclipse.orion.client.core/web/orion/explorer-table.js
index ae20787..b10420c 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/explorer-table.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/explorer-table.js
@@ -203,7 +203,7 @@
 		this.selectionToolsId = options.selectionToolsId;
 		this.model = null;
 		this.myTree = null;
-		this.renderer = new FileRenderer({checkbox: true, cachePrefix: "Navigator"}, this, this.commandService, this.contentTypeService);
+		this.renderer = new FileRenderer({checkbox: true, decorateAlternatingLines: false, cachePrefix: "Navigator"}, this, this.commandService, this.contentTypeService);
 	}
 	
 	FileExplorer.prototype = new mExplorer.Explorer();
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/explorer.js b/bundles/org.eclipse.orion.client.core/web/orion/explorer.js
index 76fd80f..e08c71e 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/explorer.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/explorer.js
@@ -446,15 +446,17 @@
 		},
 		
 		rowsChanged: function() {
-			dojo.query(".treeTableRow").forEach(function(node, i) {
-				if (i % 2) {
-					dojo.addClass(node, "darkTreeTableRow");
-					dojo.removeClass(node, "lightTreeTableRow");
-				} else {
-					dojo.addClass(node, "lightTreeTableRow");
-					dojo.removeClass(node, "darkTreeTableRow");
-				}
-			});
+			if (this._decorateAlternatingLines) {
+				dojo.query(".treeTableRow").forEach(function(node, i) {
+					if (i % 2) {
+						dojo.addClass(node, "darkTreeTableRow");
+						dojo.removeClass(node, "lightTreeTableRow");
+					} else {
+						dojo.addClass(node, "lightTreeTableRow");
+						dojo.removeClass(node, "darkTreeTableRow");
+					}
+				});
+			}
 			// notify the selection service of the change in state.
 			if(this.explorer.selection) {
 				this.explorer.selection.setSelections(this.getSelected());
@@ -481,9 +483,13 @@
 				this.getCheckedFunc = options.getCheckedFunc;
 				this.onCheckedFunc = options.onCheckedFunc;
 				this._highlightSelection = true;
-				if(options.highlightSelection === false){
+				if (options.highlightSelection === false){
 					this._highlightSelection = false;
 				}
+				this._decorateAlternatingLines = true;
+				if (options.decorateAlternatingLines === false) {
+					this._decorateAlternatingLines = false;
+				}
 			}
 		},
 		
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/globalCommands.js b/bundles/org.eclipse.orion.client.core/web/orion/globalCommands.js
index 3828787..9fb76d0 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/globalCommands.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/globalCommands.js
@@ -12,263 +12,10 @@
 /*global window document define login logout localStorage orion */
 /*browser:true*/
 
-define(['require', 'dojo', 'dijit', 'orion/commands', 'orion/extensionCommands', 'orion/util', 'orion/textview/keyBinding',
+define(['require', 'dojo', 'dijit', 'orion/commonHTMLFragments', 'orion/commands', 'orion/parameterCollectors', 'orion/extensionCommands', 'orion/util', 'orion/textview/keyBinding',
         'dijit/Menu', 'dijit/MenuItem', 'dijit/form/DropDownButton', 'orion/widgets/OpenResourceDialog', 'orion/widgets/LoginDialog'], 
-        function(require, dojo, dijit, mCommands, mExtensionCommands, mUtil, mKeyBinding){
+        function(require, dojo, dijit, commonHTML, mCommands, mParameterCollectors, mExtensionCommands, mUtil, mKeyBinding){
 
-	
-	/**
-	 * Constructs a new command parameter collector
-	 * @param {DOMElement} the toolbar containing the parameter collector
-	 * @class CommandParameterCollector can collect parameters in a way that is integrated with the 
-	 * common header elements.  It is used for "tool" commands to define a custom parameter gathering
-	 * technique that is appropriate for the page.  Note that "menu" commands render their own parameter
-	 * collector since it is integrated with the menu itself generated by the command framework.
-	 * @name orion.globalCommands.CommandParameterCollector
-	 */	
-	function CommandParameterCollector (toolbar) {
-		// get node's parent.  If it is managed by dijit, we will need to layout
-		if (toolbar) {
-			this.layoutWidgetId = toolbar.parentNode.id;
-		}
-	}
-	CommandParameterCollector.prototype =  {
-	
-		/**
-		 * Closes any active parameter collectors
-		 *
-		 * @param {DOMElement} commandNode the node representing the command
-		 */
-		close: function (commandNode) {
-			if (this.parameterArea) {
-				dojo.empty(this.parameterArea);
-			}
-			if (this.parameterContainer) {
-				dojo.removeClass(this.parameterContainer, this.activeClass);
-				dojo.removeClass(this.parameterContainer.parentNode, "slideContainerActive");
-			}
-			if (this.dismissArea) {
-				 dojo.empty(this.dismissArea);
-			}
-			if (commandNode) {
-				dojo.removeClass(commandNode, "activeCommand");
-			}
-			mUtil.forceLayout(this.parameterContainer);
-			if (this._oldFocusNode) {
-				this._oldFocusNode.focus();
-				this._oldFocusNode = null;
-			}
-			this.parameterContainer = null;
-			this.activeClass = null;
-			this.parameterArea = null;
-			this.dismissArea = null;
-		},
-		
-		/**
-		 * Open a parameter collector and return the dom node where parameter 
-		 * information should be inserted
-		 *
-		 * @param {DOMElement} commandNode the node containing the triggering command
-		 * @param {String} id the id of parent node containing the triggering command
-		 * @param {Function} fillFunction a function that will fill the parameter area
-		 */
-		open: function(commandNode, id, fillFunction) {
-			this.close(commandNode);
-			this.parameterContainer = null;
-			this.activeClass = null;
-			this.parameterArea = null;
-			this.dismissArea = null;
-			if (id === "pageActions") {
-				this.parameterArea = dojo.byId("pageCommandParameters");
-				this.parameterContainer = dojo.byId("pageParameterArea");
-				this.activeClass = "leftSlideActive";
-				this.dismissArea = dojo.byId("pageCommandDismiss");
-			} else if (id === "pageNavigationActions") {
-				this.parameterArea = dojo.byId("pageNavigationCommandParameters");
-				this.parameterContainer = dojo.byId("pageNavigationParameterArea");
-				this.activeClass = "rightSlideActive";
-				this.dismissArea = dojo.byId("pageNavigationDismiss");
-			}
-			if (commandNode) {
-				dojo.addClass(commandNode, "activeCommand");
-			}
-			if (this.parameterArea) {
-				var focusNode = fillFunction(this.parameterArea);
-				if (!dojo.byId("parameterClose") && this.dismissArea) {
-				// add the close button if the fill function did not.
-					var spacer = dojo.create("span", null, this.dismissArea, "last");
-					dojo.addClass(spacer, "dismiss");
-					var close = dojo.create("span", {id: "parameterClose", role: "button", tabindex: "0"}, this.dismissArea, "last");
-					dojo.addClass(close, "imageSprite");
-					dojo.addClass(close, "core-sprite-delete");
-					dojo.addClass(close, "dismiss");
-					close.title = "Close";
-					dojo.connect(close, "onclick", dojo.hitch(this, function(event) {
-						this.close(commandNode);
-					}));
-					// onClick events do not register for spans when using the keyboard without a screen reader
-					dojo.connect(close, "onkeypress", dojo.hitch(this, function (e) {
-						if(e.keyCode === dojo.keys.ENTER) {
-							this.close(commandNode);
-						}
-					}));
-				}
-
-
-				// all parameters have been generated.  Activate the area.
-				dojo.addClass(this.parameterContainer.parentNode, "slideContainerActive");
-				dojo.addClass(this.parameterContainer, this.activeClass);
-				mUtil.forceLayout(this.parameterContainer);
-				if (focusNode) {
-					this._oldFocusNode = window.document.activeElement;
-					window.setTimeout(function() {
-						focusNode.focus();
-						focusNode.select();
-					}, 0);
-				}
-				return true;
-			}
-			return false;
-		},
-		
-		_collectAndCall: function(commandInvocation, parent) {
-			dojo.query("input", parent).forEach(function(field) {
-				if (field.type !== "button") {
-					commandInvocation.parameters.setValue(field.parameterName, field.value);
-				}
-			});
-			if (commandInvocation.command.callback) {
-				commandInvocation.command.callback.call(commandInvocation.handler, commandInvocation);
-			}
-
-		},
-		
-		/**
-		 * Collect parameters for the given command.
-		 * 
-		 * @param {orion.commands.CommandInvocation} the command invocation
-		 * @returns {Boolean} whether or not required parameters were collected.
-		 */
-		collectParameters: function(commandInvocation) {
-			if (commandInvocation.parameters) {
-				return this.open(commandInvocation.domNode, commandInvocation.domParent.id, this.getFillFunction(commandInvocation));
-			}
-			return false;
-		},
-		
-		/**
-		 * Returns a function that can be used to fill a specified parent node with parameter information.
-		 *
-		 * @param {orion.commands.CommandInvocation} the command invocation used when gathering parameters
-		 * @param {Function} an optional function called when the area must be closed. 
-		 * @returns {Function} a function that can fill the specified dom node with parameter collection behavior
-		 */
-		 getFillFunction: function(commandInvocation, closeFunction) {
-			return dojo.hitch(this, function(parameterArea) {
-				var first = null;
-				var localClose = dojo.hitch(this, function() {
-					if (closeFunction) {
-						closeFunction();
-					} else {
-						this.close(commandInvocation.domNode);
-					}
-				});
-				var keyHandler = dojo.hitch(this, function(event) {
-					if (event.keyCode === dojo.keys.ENTER) {
-						this._collectAndCall(commandInvocation, parameterArea);
-					}
-					if (event.keyCode === dojo.keys.ESCAPE || event.keyCode === dojo.keys.ENTER) {
-						localClose();
-						dojo.stopEvent(event);
-					}
-				});
-				commandInvocation.parameters.forEach(function(parm) {
-					if (parm.label) {
-						dojo.place(document.createTextNode(parm.label), parameterArea, "last");
-					} 
-					var field = dojo.create("input", {type: parm.type}, parameterArea, "last");
-					dojo.addClass(field, "parameterInput");
-					// we define special classes for some parameter types
-					dojo.addClass(field, "parameterInput"+parm.type);
-					field.setAttribute("speech", "speech");
-					field.setAttribute("x-webkit-speech", "x-webkit-speech");
-					field.parameterName = parm.name;
-					if (!first) {
-						first = field;
-					}
-					if (parm.value) {
-						field.value = parm.value;
-					}
-					dojo.connect(field, "onkeypress", keyHandler);
-				});
-				var spacer;
-				var parentDismiss = parameterArea;
-				var finish = function (collector) {
-					collector._collectAndCall(commandInvocation, parameterArea);
-					localClose();
-				};
-
-				if (commandInvocation.parameters.options) {
-					commandInvocation.parameters.optionsRequested = false;
-					spacer = dojo.create("span", null, parentDismiss, "last");
-					dojo.addClass(spacer, "dismiss");
-					
-					var options = dojo.create("span", {role: "button", tabindex: "0"}, parentDismiss, "last");
-					dojo.addClass(options, "core-sprite-options");
-					dojo.addClass(options, "dismiss");
-					options.title = "More options...";
-					dojo.connect(options, "onclick", dojo.hitch(this, function() {
-						commandInvocation.parameters.optionsRequested = true;
-						finish(this);
-					}));
-					// onClick events do not register for spans when using the keyboard without a screen reader
-					dojo.connect(options, "onkeypress", dojo.hitch(this, function (e) {
-						if(e.keyCode === dojo.keys.ENTER) {			
-							commandInvocation.parameters.optionsRequested = true;
-							finish(this);
-						}
-					}));
-				}
-				// OK and cancel buttons
-				spacer = dojo.create("span", null, parentDismiss, "last");
-				dojo.addClass(spacer, "dismiss");
-
-				var ok = dojo.create("span", {role: "button", tabindex: "0"}, parentDismiss, "last");
-				ok.title = "Submit";
-				dojo.addClass(ok, "core-sprite-ok");
-				dojo.addClass(ok, "dismiss");
-				dojo.connect(ok, "onclick", dojo.hitch(this, function() {
-					finish(this);
-				}));
-				// onClick events do not register for spans when using the keyboard without a screen reader
-				dojo.connect(ok, "onkeypress", dojo.hitch(this, function (e) {
-					if(e.keyCode === dojo.keys.ENTER) {
-						finish(this);
-					}
-				}));
-				
-				spacer = dojo.create("span", null, parentDismiss, "last");
-				dojo.addClass(spacer, "dismiss");
-				var close = dojo.create("span", {id: "parameterClose", role: "button", tabindex: "0"}, parentDismiss, "last");
-				dojo.addClass(close, "imageSprite");
-				dojo.addClass(close, "core-sprite-delete");
-				dojo.addClass(close, "dismiss");
-				close.title = "Close";
-				dojo.connect(close, "onclick", dojo.hitch(this, function(event) {
-					localClose();
-				}));
-				// onClick events do not register for spans when using the keyboard without a screen reader
-				dojo.connect(close, "onkeypress", dojo.hitch(this, function (e) {
-					if(e.keyCode === dojo.keys.ENTER) {
-						localClose();
-					}
-				}));
-				return first;
-			});
-		 }
-	};
-	CommandParameterCollector.prototype.constructor = CommandParameterCollector;
-	
 	/**
 	 * This class contains static utility methods. It is not intended to be instantiated.
 	 * @class This class contains static utility methods for creating and managing 
@@ -276,63 +23,7 @@
 	 * @name orion.globalCommands
 	 */
 
-	// BEGIN TOP BANNER FRAGMENT
-	var topHTMLFragment =
-	//Top row:  Logo + discovery links + user
-	'<div id="staticBanner" class="layoutBlock topRowBanner">' +
-		'<a id="home" class="layoutLeft primaryNav" href="' + require.toUrl("index.html") + '"><img src="' + require.toUrl("images/orion-small-lightondark.gif") + '" alt="Orion Logo"/></a>' +
-		'<div id="primaryNav" class="layoutLeft primaryNav"></div>' +
-		'<div id="help" class="layoutRight help"><a id="help" href="' + require.toUrl("help/index.jsp") + '"><img src="' + require.toUrl("images/help.gif") + '" alt="Help"/></a></div>'+
-		'<div id="userInfo" class="layoutRight primaryNav"></div>' +
-		'<div class="layoutRight primaryNav">|</div>' +
-	'</div>' +
-	//Title area
-	'<div id="titleArea" class="layoutBlock titleArea">' +
-		'<div id="pageTitle" class="layoutLeft pageTitle"></div>' +
-		'<input type="search" id="search" placeholder="Search root" title="Type a keyword or wild card to search in root" class="layoutRight searchbox">' +
-		'<div id="relatedLinks" class="layoutRight pageNav"></div>' +
-		'<div id="globalActions" class="layoutRight pageNav"></div>' +
-		'<div id="dimension" class="layoutBlock dimension"></div>' +
-		'<div id="location" class="layoutBlock currentLocation"></div>' +
-	'</div>';
-	// END TOP BANNER FRAGMENT
-	
-	// BEGIN BOTTOM BANNER FRAGMENT
-	// styling of the surrounding div (text-align, etc) is in ide.css "footer"
-	var bottomHTMLFragment = 
-		'<div class="layoutBlock">' +
-			'<div class="footerBlock">' +
-				'This is a Beta build of Orion. Please try it out but BEWARE your data may be lost.' +
-			'</div>' +
-			'<div class="footerRightBlock">' +
-				'<a href="http://wiki.eclipse.org/Orion/FAQ" target="_blank">FAQ</a> | ' + 
-				'<a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Orion&version=0.4" target="_blank">Report a Bug</a> | ' +
-				'<a href="http://www.eclipse.org/legal/privacy.php" target="_blank">Privacy Policy</a> | ' + 
-				'<a href="http://www.eclipse.org/legal/termsofuse.php" target="_blank">Terms of Use</a> | '+ 
-				'<a href="http://www.eclipse.org/legal/copyright.php" target="_blank">Copyright Agent</a> | '+
-				'<a href="' + require.toUrl("/operations/list.html") +'" target="_blank">Server Operations</a>' +
-			'</div>' +
-		'</div>';
-	// END BOTTOM BANNER FRAGEMENT
 
-	var toolbarFragment = 
-		'<div class="layoutLeft pageToolbarLeft pageActions" id="pageActions"></div>' +
-		'<img class="layoutRight progressPane" src="'+ require.toUrl("images/none.png") +'" id="progressPane"></img>' +
-		'<div class="layoutRight pageToolbarRight pageActions pageNavigationActions" id="statusPane"></div>' +
-		'<div class="layoutRight pageToolbarRight pageActions pageNavigationActions" id="pageNavigationActions"></div>' +
-		'<div id="notificationArea" class="layoutLeft layoutBlock slideContainer">' +
-				'<div class="layoutLeft" id="notifications"></div>' +
-		'</div>' +
-		'<div id="parameterArea" class="layoutBlock slideContainer">' +
-			'<span id="pageParameterArea" class="leftSlide">' +
-				'<span id="pageCommandParameters" class="parameters"></span>' +
-				'<span id="pageCommandDismiss" class="parameters"></span>' +
-			'</span>' +
-			'<span id="pageNavigationParameterArea" class="rightSlide">' +
-				'<span id="pageNavigationCommandParameters" class="parameters"></span>' +
-				'<span id="pageNavigationDismiss" class="parameters"></span>' +
-			'</span>' +
-		'</div>';
 	function qualifyURL(url){
 	    var a = document.createElement('a');
 	    a.href = url; // set string url
@@ -578,6 +269,17 @@
 		mUtil.forceLayout(related);
 	}
 	
+	function renderGlobalCommands(commandService, handler, pageItem) {
+		var globalTools = dojo.byId("globalActions");
+		if (globalTools) {	
+			dojo.empty(globalTools);
+			// need to have some item associated with the command
+			var item = dojo.isArray(pageItem) ? pageItem[0] : pageItem;
+			item = item || handler || {};
+			commandService.renderCommands(globalTools, "global", item, handler, "tool");
+		}
+	}
+	
 	/**
 	 * Support for establishing a page item associated with global commands and related links
 	 */
@@ -589,6 +291,7 @@
 	function setPageTarget(itemOrArray, serviceRegistry, commandService, itemLabels) {
 		pageItem = itemOrArray;
 		generateRelatedLinks(serviceRegistry, itemOrArray, itemLabels, exclusions, commandService);
+		renderGlobalCommands(commandService, null, itemOrArray);
 	}
 	
 	
@@ -607,18 +310,18 @@
 		}
 				
 		// place the HTML fragment from above.
-		dojo.place(topHTMLFragment, parent, "only");
+		dojo.place(commonHTML.topHTMLFragment, parent, "only");
 		
 		var toolbar = dojo.byId("pageToolbar");
 		if (toolbar) {
-			dojo.place(toolbarFragment, toolbar, "only");
+			dojo.place(commonHTML.toolbarHTMLFragment, toolbar, "only");
 		} else {
 			toolbar = dojo.create ("div", {id: "pageToolbar", "class": "toolbar layoutBlock"}, "titleArea", "after");
-			dojo.place(toolbarFragment, toolbar, "only");
+			dojo.place(commonHTML.toolbarHTMLFragment, toolbar, "only");
 		}
 		
 		// Set up a custom parameter collector that slides out of the toolbar.
-		commandService.setParameterCollector("tool", new CommandParameterCollector(toolbar));
+		commandService.setParameterCollector("tool", new mParameterCollectors.CommandParameterCollector(toolbar));
 
 		
 		// place an empty div for keyAssist
@@ -680,7 +383,7 @@
 		// Assemble global commands
 		var favoriteCommand = new mCommands.Command({
 			name: "Make Favorite",
-			tooltip: "Add a file or folder to the favorites list",
+			tooltip: "Add to the favorites list",
 			imageClass: "core-sprite-makeFavorite",
 			id: "orion.makeFavorite",
 			visibleWhen: function(item) {
@@ -840,14 +543,7 @@
 			editor.getTextView().setAction("Show Keys", keyAssistCommand.callback);
 		}
 		
-		// render global commands
-		var globalTools = dojo.byId("globalActions");
-		if (globalTools) {	
-			dojo.empty(globalTools);
-			// need to have some item associated with the command
-			var item = pageItem || handler || {};
-			commandService.renderCommands(globalTools, "global", item, handler, "tool");
-		}
+		renderGlobalCommands(commandService, handler, pageItem);
 		
 		// provide free "open with" object level unless already done
 		var index = dojo.indexOf(exclusions, "eclipse.openWith");
@@ -878,10 +574,10 @@
 		
 		// generate the footer. 
 		// TODO The footer div id should not be assumed here
-		if (bottomHTMLFragment) {
+		if (commonHTML.bottomHTMLFragment) {
 			var footer = dojo.byId("footer");
 			if (footer) {
-				dojo.place(bottomHTMLFragment, footer, "only");
+				dojo.place(commonHTML.bottomHTMLFragment, footer, "only");
 			}
 		}
 		// now that footer containing progress pane is added
@@ -903,7 +599,6 @@
 		generateBanner: generateBanner,
 		notifyAuthenticationSite: notifyAuthenticationSite,
 		setPendingAuthentication: setPendingAuthentication,
-		CommandParameterCollector: CommandParameterCollector,
 		getAuthenticationIds: getAuthenticationIds,
 		setPageTarget: setPageTarget,
 		setPageCommandExclusions: setPageCommandExclusions
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/parameterCollectors.js b/bundles/org.eclipse.orion.client.core/web/orion/parameterCollectors.js
new file mode 100644
index 0000000..4c4b5f3
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.core/web/orion/parameterCollectors.js
@@ -0,0 +1,275 @@
+/*******************************************************************************
+ * @license
+ * Copyright (c) 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials are made 
+ * available under the terms of the Eclipse Public License v1.0 
+ * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 
+ * License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html). 
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*global window document define login logout localStorage orion */
+/*browser:true*/
+
+define(['require', 'dojo', 'dijit', 'orion/commands', 'orion/util', 'dijit/Menu', 'dijit/MenuItem', 'dijit/form/DropDownButton'], 
+        function(require, dojo, dijit, mCommands, mUtil){
+
+	
+	/**
+	 * Constructs a new command parameter collector
+	 * @param {DOMElement} the toolbar containing the parameter collector
+	 * @class CommandParameterCollector can collect parameters in a way that is integrated with the 
+	 * common header elements.  It is used for "tool" commands to define a custom parameter gathering
+	 * technique that is appropriate for the page.  Note that "menu" commands render their own parameter
+	 * collector since it is integrated with the menu itself generated by the command framework.
+	 * @name orion.parameterCollectors.CommandParameterCollector
+	 */	
+	function CommandParameterCollector (toolbar) {
+		// get node's parent.  If it is managed by dijit, we will need to layout
+		if (toolbar) {
+			this.layoutWidgetId = toolbar.parentNode.id;
+		}
+	}
+	CommandParameterCollector.prototype =  {
+	
+		/**
+		 * Closes any active parameter collectors
+		 *
+		 * @param {DOMElement} commandNode the node representing the command
+		 */
+		close: function (commandNode) {
+			if (this.parameterArea) {
+				dojo.empty(this.parameterArea);
+			}
+			if (this.parameterContainer) {
+				dojo.removeClass(this.parameterContainer, this.activeClass);
+				dojo.removeClass(this.parameterContainer.parentNode, "slideContainerActive");
+			}
+			if (this.dismissArea) {
+				 dojo.empty(this.dismissArea);
+			}
+			if (commandNode) {
+				dojo.removeClass(commandNode, "activeCommand");
+			}
+			mUtil.forceLayout(this.parameterContainer);
+			if (this._oldFocusNode) {
+				this._oldFocusNode.focus();
+				this._oldFocusNode = null;
+			}
+			this.parameterContainer = null;
+			this.activeClass = null;
+			this.parameterArea = null;
+			this.dismissArea = null;
+		},
+		
+		/**
+		 * Open a parameter collector and return the dom node where parameter 
+		 * information should be inserted
+		 *
+		 * @param {DOMElement} commandNode the node containing the triggering command
+		 * @param {String} id the id of parent node containing the triggering command
+		 * @param {Function} fillFunction a function that will fill the parameter area
+		 */
+		open: function(commandNode, id, fillFunction) {
+			this.close(commandNode);
+			this.parameterContainer = null;
+			this.activeClass = null;
+			this.parameterArea = null;
+			this.dismissArea = null;
+			if (id === "pageActions") {
+				this.parameterArea = dojo.byId("pageCommandParameters");
+				this.parameterContainer = dojo.byId("pageParameterArea");
+				this.activeClass = "leftSlideActive";
+				this.dismissArea = dojo.byId("pageCommandDismiss");
+			} else if (id === "pageNavigationActions") {
+				this.parameterArea = dojo.byId("pageNavigationCommandParameters");
+				this.parameterContainer = dojo.byId("pageNavigationParameterArea");
+				this.activeClass = "rightSlideActive";
+				this.dismissArea = dojo.byId("pageNavigationDismiss");
+			}
+			if (commandNode) {
+				dojo.addClass(commandNode, "activeCommand");
+			}
+			if (this.parameterArea) {
+				var focusNode = fillFunction(this.parameterArea);
+				if (!dojo.byId("parameterClose") && this.dismissArea) {
+				// add the close button if the fill function did not.
+					var spacer = dojo.create("span", null, this.dismissArea, "last");
+					dojo.addClass(spacer, "dismiss");
+					var close = dojo.create("span", {id: "parameterClose", role: "button", tabindex: "0"}, this.dismissArea, "last");
+					dojo.addClass(close, "imageSprite");
+					dojo.addClass(close, "core-sprite-delete");
+					dojo.addClass(close, "dismiss");
+					close.title = "Close";
+					dojo.connect(close, "onclick", dojo.hitch(this, function(event) {
+						this.close(commandNode);
+					}));
+					// onClick events do not register for spans when using the keyboard without a screen reader
+					dojo.connect(close, "onkeypress", dojo.hitch(this, function (e) {
+						if(e.keyCode === dojo.keys.ENTER) {
+							this.close(commandNode);
+						}
+					}));
+				}
+
+
+				// all parameters have been generated.  Activate the area.
+				dojo.addClass(this.parameterContainer.parentNode, "slideContainerActive");
+				dojo.addClass(this.parameterContainer, this.activeClass);
+				mUtil.forceLayout(this.parameterContainer);
+				if (focusNode) {
+					this._oldFocusNode = window.document.activeElement;
+					window.setTimeout(function() {
+						focusNode.focus();
+						focusNode.select();
+					}, 0);
+				}
+				return true;
+			}
+			return false;
+		},
+		
+		_collectAndCall: function(commandInvocation, parent) {
+			dojo.query("input", parent).forEach(function(field) {
+				if (field.type !== "button") {
+					commandInvocation.parameters.setValue(field.parameterName, field.value);
+				}
+			});
+			if (commandInvocation.command.callback) {
+				commandInvocation.command.callback.call(commandInvocation.handler, commandInvocation);
+			}
+
+		},
+		
+		/**
+		 * Collect parameters for the given command.
+		 * 
+		 * @param {orion.commands.CommandInvocation} the command invocation
+		 * @returns {Boolean} whether or not required parameters were collected.
+		 */
+		collectParameters: function(commandInvocation) {
+			if (commandInvocation.parameters) {
+				return this.open(commandInvocation.domNode, commandInvocation.domParent.id, this.getFillFunction(commandInvocation));
+			}
+			return false;
+		},
+		
+		/**
+		 * Returns a function that can be used to fill a specified parent node with parameter information.
+		 *
+		 * @param {orion.commands.CommandInvocation} the command invocation used when gathering parameters
+		 * @param {Function} an optional function called when the area must be closed. 
+		 * @returns {Function} a function that can fill the specified dom node with parameter collection behavior
+		 */
+		 getFillFunction: function(commandInvocation, closeFunction) {
+			return dojo.hitch(this, function(parameterArea) {
+				var first = null;
+				var localClose = dojo.hitch(this, function() {
+					if (closeFunction) {
+						closeFunction();
+					} else {
+						this.close(commandInvocation.domNode);
+					}
+				});
+				var keyHandler = dojo.hitch(this, function(event) {
+					if (event.keyCode === dojo.keys.ENTER) {
+						this._collectAndCall(commandInvocation, parameterArea);
+					}
+					if (event.keyCode === dojo.keys.ESCAPE || event.keyCode === dojo.keys.ENTER) {
+						localClose();
+						dojo.stopEvent(event);
+					}
+				});
+				commandInvocation.parameters.forEach(function(parm) {
+					if (parm.label) {
+						dojo.place(document.createTextNode(parm.label), parameterArea, "last");
+					} 
+					var field = dojo.create("input", {type: parm.type}, parameterArea, "last");
+					dojo.addClass(field, "parameterInput");
+					// we define special classes for some parameter types
+					dojo.addClass(field, "parameterInput"+parm.type);
+					field.setAttribute("speech", "speech");
+					field.setAttribute("x-webkit-speech", "x-webkit-speech");
+					field.parameterName = parm.name;
+					if (!first) {
+						first = field;
+					}
+					if (parm.value) {
+						field.value = parm.value;
+					}
+					dojo.connect(field, "onkeypress", keyHandler);
+				});
+				var spacer;
+				var parentDismiss = parameterArea;
+				var finish = function (collector) {
+					collector._collectAndCall(commandInvocation, parameterArea);
+					localClose();
+				};
+
+				if (commandInvocation.parameters.options) {
+					commandInvocation.parameters.optionsRequested = false;
+					spacer = dojo.create("span", null, parentDismiss, "last");
+					dojo.addClass(spacer, "dismiss");
+					
+					var options = dojo.create("span", {role: "button", tabindex: "0"}, parentDismiss, "last");
+					dojo.addClass(options, "core-sprite-options");
+					dojo.addClass(options, "dismiss");
+					options.title = "More options...";
+					dojo.connect(options, "onclick", dojo.hitch(this, function() {
+						commandInvocation.parameters.optionsRequested = true;
+						finish(this);
+					}));
+					// onClick events do not register for spans when using the keyboard without a screen reader
+					dojo.connect(options, "onkeypress", dojo.hitch(this, function (e) {
+						if(e.keyCode === dojo.keys.ENTER) {			
+							commandInvocation.parameters.optionsRequested = true;
+							finish(this);
+						}
+					}));
+				}
+				// OK and cancel buttons
+				spacer = dojo.create("span", null, parentDismiss, "last");
+				dojo.addClass(spacer, "dismiss");
+
+				var ok = dojo.create("span", {role: "button", tabindex: "0"}, parentDismiss, "last");
+				ok.title = "Submit";
+				dojo.addClass(ok, "core-sprite-ok");
+				dojo.addClass(ok, "dismiss");
+				dojo.connect(ok, "onclick", dojo.hitch(this, function() {
+					finish(this);
+				}));
+				// onClick events do not register for spans when using the keyboard without a screen reader
+				dojo.connect(ok, "onkeypress", dojo.hitch(this, function (e) {
+					if(e.keyCode === dojo.keys.ENTER) {
+						finish(this);
+					}
+				}));
+				
+				spacer = dojo.create("span", null, parentDismiss, "last");
+				dojo.addClass(spacer, "dismiss");
+				var close = dojo.create("span", {id: "parameterClose", role: "button", tabindex: "0"}, parentDismiss, "last");
+				dojo.addClass(close, "imageSprite");
+				dojo.addClass(close, "core-sprite-delete");
+				dojo.addClass(close, "dismiss");
+				close.title = "Close";
+				dojo.connect(close, "onclick", dojo.hitch(this, function(event) {
+					localClose();
+				}));
+				// onClick events do not register for spans when using the keyboard without a screen reader
+				dojo.connect(close, "onkeypress", dojo.hitch(this, function (e) {
+					if(e.keyCode === dojo.keys.ENTER) {
+						localClose();
+					}
+				}));
+				return first;
+			});
+		 }
+	};
+	CommandParameterCollector.prototype.constructor = CommandParameterCollector;
+	
+	//return the module exports
+	return {
+		CommandParameterCollector: CommandParameterCollector
+	};
+});
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/pluginregistry.js b/bundles/org.eclipse.orion.client.core/web/orion/pluginregistry.js
index 5ea6d11..ced882b 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/pluginregistry.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/pluginregistry.js
@@ -10,7 +10,7 @@
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 
-/*global define window document console localStorage */
+/*global define setTimeout addEventListener document console localStorage */
 
 define(["dojo", "orion/serviceregistry", "dojo/DeferredList"], function(dojo, mServiceregistry){
 var eclipse = eclipse || {};
@@ -25,6 +25,7 @@
 	
 	var _channel = null;
 	var _deferredLoad = new dojo.Deferred();
+	var _deferredUpdate = null;
 	var _loaded = false;
 	
 	var _currentMessageId = 0;
@@ -101,6 +102,11 @@
 						_loaded = true;
 						_deferredLoad.resolve(_self);
 					}
+					
+					if (_deferredUpdate) {
+						_deferredUpdate.resolve(_self);
+						_deferredUpdate = null;
+					}
 				} else if ("dispatchEvent" === message.method){
 					var serviceRegistration = _serviceRegistrations[message.serviceId];
 					serviceRegistration.dispatchEvent.apply(serviceRegistration, message.params);		
@@ -181,10 +187,30 @@
 		return result;
 	};
 	
+	this.update = function() {
+		if (!_loaded) {
+			return this._load();
+		}
+		
+		var updatePromise;
+		if (_deferredUpdate === null) {
+			_deferredUpdate = new dojo.Deferred();
+			updatePromise = _deferredUpdate;
+			internalRegistry.disconnect(_channel);
+			_channel = internalRegistry.connect(url, _responseHandler);
+			setTimeout(function() {
+				if (_deferredUpdate === updatePromise) {
+					_deferredUpdate.reject(new Error("Load timeout for plugin: " + url));
+				}
+			}, 15000);
+		}
+		return _deferredUpdate;
+	};
+	
 	this._load = function(isInstall) {
 		if (!_channel) {
 			_channel = internalRegistry.connect(url, _responseHandler);
-			window.setTimeout(function() {
+			setTimeout(function() {
 				if (!_loaded) {
 					if (!isInstall) {
 						data = {};
@@ -218,7 +244,7 @@
 	var _channels = [];
 	var _pluginEventTarget = new mServiceregistry.EventTarget();
 
-	window.addEventListener("message", function(event) {
+	addEventListener("message", function(event) {
 		for (var i = 0, source = event.source; i < _channels.length; i++) {
 			if (source === _channels[i].target) {
 				if (typeof _channels[i].useStructuredClone === "undefined") {
diff --git a/bundles/org.eclipse.orion.client.core/web/plugin/list.js b/bundles/org.eclipse.orion.client.core/web/plugin/list.js
index 4f122b6..378ba8a 100644
--- a/bundles/org.eclipse.orion.client.core/web/plugin/list.js
+++ b/bundles/org.eclipse.orion.client.core/web/plugin/list.js
@@ -166,7 +166,7 @@
 			var count = 0;
 			var d = new dojo.Deferred();
 			for (var i = 0; i < plugins.length; i++) {
-				plugins[i]._load().then(function() {
+				plugins[i].update().then(function() {
 					count++;
 					if (count === plugins.length) {
 						d.resolve();
diff --git a/bundles/org.eclipse.orion.client.core/web/settings/settings.js b/bundles/org.eclipse.orion.client.core/web/settings/settings.js
index e00b833..69b6f52 100644
--- a/bundles/org.eclipse.orion.client.core/web/settings/settings.js
+++ b/bundles/org.eclipse.orion.client.core/web/settings/settings.js
@@ -380,8 +380,7 @@
 	var d = new dojo.Deferred();

 

 	for( var i = 0; i < settingsPluginList.length; i++) {

-	

-		settingsPluginList[i]._load().then( function(){

+		settingsPluginList[i].update().then( function(){

 			count++;

 			if( count === settingsPluginList.length ){

 				d.resolve();

diff --git a/bundles/org.eclipse.orion.client.editor/web/js-tests/editor/test-editor.html b/bundles/org.eclipse.orion.client.editor/web/js-tests/editor/test.html
similarity index 94%
rename from bundles/org.eclipse.orion.client.editor/web/js-tests/editor/test-editor.html
rename to bundles/org.eclipse.orion.client.editor/web/js-tests/editor/test.html
index 920b883..e75b94a 100644
--- a/bundles/org.eclipse.orion.client.editor/web/js-tests/editor/test-editor.html
+++ b/bundles/org.eclipse.orion.client.editor/web/js-tests/editor/test.html
@@ -26,14 +26,14 @@
 		      location: 'org.dojotoolkit/dojox',
 		      main: 'lib/main',
 		      lib: '.'
-		    }		    
+		    }
 		  ],
 		  paths: {
 			  text: 'requirejs/text',
-			  i18n: 'requirejs/i18n'	    
+			  i18n: 'requirejs/i18n'
 		  }
 		});
-	
+
 	window.onload = function() {
 		require(["orion/test", "./testcase-editor", "./testcase-codemirror"], function(test, editor, codeMirror) {
 			test.run(editor);
@@ -45,7 +45,7 @@
 </head>
 <body>
 	<div style="padding-bottom:1em;">Editor tests</div>
-	
+
 	<div id="editorDiv"></div>
 </body>
 </html>
diff --git a/bundles/org.eclipse.orion.client.editor/web/js-tests/editor/testcase-editor.js b/bundles/org.eclipse.orion.client.editor/web/js-tests/editor/testcase-editor.js
index aedf9ea..42d3875 100644
--- a/bundles/org.eclipse.orion.client.editor/web/js-tests/editor/testcase-editor.js
+++ b/bundles/org.eclipse.orion.client.editor/web/js-tests/editor/testcase-editor.js
@@ -15,53 +15,74 @@
 define(["orion/assert", "orion/editor/editor"],
 		function(assert, mEditor) {
 	var tests = {};
-	
+
 	// ************************************************************************************************
 	// Test supporting util methods
-	
+	var bind = mEditor.util.bind;
+
 	// Test our implementation of "bind"
-	tests["test Editor - bind"] = function() {
-		var binder = mEditor.util.bind;
-		
-		// Test: bound function gets proper context
-		var context1 = {},
-		    bound1 = binder.call(
+	tests["test bind - 'this'"] = function() {
+		var outerThis = {},
+		    innerThis,
+		    func = bind.call(
 				function () {
-					assert.strictEqual(this, context1);
-				}, context1);
-		bound1();
-		
-		// Test: argument is passed to bound function
-		var context2 = {},
-		    bound2 = binder.call(
-				function(arg1) {
-					assert.strictEqual(this, context2);
-					assert.strictEqual(arg1, "foo");
-				}, context2);
-		bound2("foo");
-		
-		// Test: fixed arguments are passed to bound function
-		var context3 = {},
-		    bound3 = binder.call(
-				function(arg1, arg2) {
-					assert.strictEqual(context3, this);
-					assert.strictEqual(arg1, "a");
-					assert.strictEqual(arg2, "b");
-				}, context3, "a", "b");
-		bound3();
-		
-		// Test: fixed arguments prepend arguments passed to bound function
-		var context4 = {},
-		    bound4 = binder.call(
-				function(arg1, arg2, arg3, arg4) {
-					assert.strictEqual(context4, this);
-					assert.strictEqual(arg1, "a");
-					assert.strictEqual(arg2, "b");
-					assert.strictEqual(arg3, "c");
-					assert.strictEqual(arg4, "d");
-				}, context4, "a", "b");
-		bound4("c", "d");
+					innerThis = this;
+				}, outerThis);
+		func();
+		assert.strictEqual(outerThis, innerThis);
 	};
-	
+
+	tests["test bind - param"] = function() {
+		var outerThis = {},
+		    innerThis,
+		    param,
+		    func = bind.call(
+				function(p1) {
+					innerThis = this;
+					param = p1;
+				}, outerThis);
+		func("foo");
+		assert.strictEqual(outerThis, innerThis);
+		assert.strictEqual(param, "foo");
+	};
+
+	// Test our implementation of "bind"
+	tests["test bind - multiple params"] = function() {
+		var outerThis = {},
+		    innerThis,
+		    param1,
+		    param2,
+		    func = bind.call(
+				function(p1, p2) {
+					innerThis = this;
+					param1 = p1;
+					param2 = p2;
+				}, outerThis, "a", "b");
+		func();
+		assert.strictEqual(outerThis, innerThis);
+		assert.strictEqual(param1, "a");
+		assert.strictEqual(param2, "b");
+	};
+
+	tests["test bind - fixed params precede call site params"] = function() {
+		var outerThis = {},
+		    innerThis,
+		    param1, param2, param3, param4,
+		    func = bind.call(
+				function(p1, p2, p3, p4) {
+					innerThis = this;
+					param1 = p1;
+					param2 = p2;
+					param3 = p3;
+					param4 = p4;
+				}, outerThis, "a", "b");
+		func("c", "d");
+		assert.strictEqual(outerThis, innerThis);
+		assert.strictEqual(param1, "a");
+		assert.strictEqual(param2, "b");
+		assert.strictEqual(param3, "c");
+		assert.strictEqual(param4, "d");
+	};
+
 	return tests;
 });
\ No newline at end of file