Merge branch 'master' of ssh://git.eclipse.org/gitroot/orion/org.eclipse.orion.client
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/fileUtils.js b/bundles/org.eclipse.orion.client.core/web/orion/fileUtils.js
index bbcd107..d7e4019 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/fileUtils.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/fileUtils.js
@@ -8,9 +8,9 @@
  *
  * Contributors: IBM Corporation - initial API and implementation
  *******************************************************************************/
-/*global define window document navigator*/
+/*global define window document navigator URL*/
 
-define(['i18n!orion/nls/messages'], function(messages) {
+define(['require', 'i18n!orion/nls/messages', 'orion/URL-shim'], function(require, messages) {
                 
 	/**
 	 * This class contains static utility methods. It is not intended to be instantiated.
@@ -35,11 +35,15 @@
 	 * @function
 	 */
 	function isAtRoot(path) {
-		var relative = this.makeRelative(path);
-		// TODO better way?
-		// I thought it should be the line below but is actually the root of all workspaces
-		//  return relative == '/file/';
-		return relative.indexOf('/workspace') === 0; //$NON-NLS-0$
+		if (!path) {
+			return false;
+		}
+		if (path === "/workspace") {
+			return true; // sad but true
+		}
+		var workspaceUrl = new URL(require.toUrl("workspace"), window.location.href);
+		var pathUrl = new URL(path, window.location.href);
+		return pathUrl.href.indexOf(workspaceUrl.href) === 0; //$NON-NLS-0$
 	}
 	
 	//return module exports
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/preferences.js b/bundles/org.eclipse.orion.client.core/web/orion/preferences.js
index 2374f39..d36b1b0 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/preferences.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/preferences.js
@@ -388,9 +388,21 @@
 	
 	PreferencesService.prototype = /** @lends orion.preferences.PreferencesService.prototype */ {
 	
-		listenForChangedSettings: function( callback ){
+		listenForChangedSettings: function(key, optScope, callback ){
+			if (!optScope || typeof(optScope) !== "number" || optScope > 7 || optScope < 1) { //$NON-NLS-0$
+				callback = optScope;
+				optScope = PreferencesService.DEFAULT_SCOPE | PreferencesService.LOCAL_SCOPE | PreferencesService.USER_SCOPE;
+			}
+			
+			//TODO: only have one window listener that dispatches callbacks
 			window.addEventListener("storage", callback, false); //$NON-NLS-0$
-			return "/orion/preferences/local/themes"; //$NON-NLS-0$
+			if ((PreferencesService.USER_SCOPE & optScope) !== 0 ) {
+				return "/orion/preferences/user" + key; //$NON-NLS-0$
+			} else if ((PreferencesService.LOCAL_SCOPE & optScope) !== 0) {
+				return "/orion/preferences/local" + key; //$NON-NLS-0$
+			}
+			
+			return "/orion/preferences/default" + key; //$NON-NLS-0$
 		},
 		
 		/**
diff --git a/bundles/org.eclipse.orion.client.editor/web/orion/editor/editor.js b/bundles/org.eclipse.orion.client.editor/web/orion/editor/editor.js
index 7c888bb..36cbe1a 100644
--- a/bundles/org.eclipse.orion.client.editor/web/orion/editor/editor.js
+++ b/bundles/org.eclipse.orion.client.editor/web/orion/editor/editor.js
@@ -13,9 +13,47 @@
  /*jslint maxerr:150 browser:true devel:true laxbreak:true regexp:false*/
 
 define("orion/editor/editor", ['i18n!orion/editor/nls/messages', 'orion/keyBinding', 'orion/editor/eventTarget', 'orion/editor/tooltip', 'orion/editor/annotations', 'orion/util'], function(messages, mKeyBinding, mEventTarget, mTooltip, mAnnotations, util) { //$NON-NLS-6$ //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$
-	
+		
 	var HIGHLIGHT_ERROR_ANNOTATION = "orion.annotation.highlightError"; //$NON-NLS-0$
 
+	function Idle(options){
+		this._document = options.document || document;
+		this._timeout = options.timeout;
+		//TODO: remove listeners if there are no clients
+		//TODO: add support for multiple clients with different timeouts
+		var events = ["keypress","keydown","keyup","mousemove","mousedown","mousemove"]; //$NON-NLS-0$ //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$ //$NON-NLS-5$
+		var reset = function (e) { this._resetTimer(); }.bind(this);
+		for (var i=0; i<events.length; i++) {
+			var event = events[i];
+			this._document.addEventListener(event, reset, true);	
+		}
+	}
+	
+	Idle.prototype = {
+		_resetTimer: function() {
+			var window = document.defaultView || document.parentWindow;
+			if (this._timer) {
+				window.clearTimeout(this._timer);
+				this._timer = null;
+			}
+			if (this._timeout !== -1) {
+				this._timer = window.setTimeout(function() {
+					this.onIdle({type:"Idle"});	//$NON-NLS-0$ 
+					this._timer = null;
+					this._resetTimer();
+				}.bind(this), this._timeout);
+			}
+		},
+		onIdle: function (idleEvent) {
+			return this.dispatchEvent(idleEvent);
+		},
+		setTimeout: function(timeout) {
+			this._timeout = timeout;
+			this._resetTimer();
+		}
+	};
+	mEventTarget.EventTarget.addMixin(Idle.prototype);
+	
 	/**
 	 * @name orion.editor.Editor
 	 * @class An <code>Editor</code> is a user interface for editing text that provides additional features over the basic {@link orion.editor.TextView}.
@@ -826,7 +864,27 @@
 				contentsSaved: contentsSaved
 			});
 		},
-		
+		/**
+		 * Set the autosave timeout. If the timeout is <code>-1</code>, autosave is
+		 * disabled.
+		 * @param {Number} timeout - the autosave timeout in milliseconds
+		 */
+		setAutoSaveTimeout: function(timeout){
+			if (!this._idle) {
+				var document = this._textView.getOptions("parent").ownerDocument; //$NON-NLS-0$
+				var options = {
+					document: document,
+					timeout: timeout
+				};
+				this._idle = new Idle(options);
+				this._idle.addEventListener("Idle", function () { //$NON-NLS-0$
+					if (this.isDirty()) {
+						this._textView.invokeAction("save"); //$NON-NLS-0$
+					}
+				}.bind(this));
+			}
+			this._idle.setTimeout(timeout);
+		},
 		/**
 		 * Called when the editor's contents have changed.
 		 * @param {Event} inputChangedEvent
diff --git a/bundles/org.eclipse.orion.client.git/web/orion/git/gitCommands.js b/bundles/org.eclipse.orion.client.git/web/orion/git/gitCommands.js
index 4ba341a..04f5e6a 100644
--- a/bundles/org.eclipse.orion.client.git/web/orion/git/gitCommands.js
+++ b/bundles/org.eclipse.orion.client.git/web/orion/git/gitCommands.js
@@ -389,7 +389,7 @@
 					}, displayErrorOnStatus);
 				};
 				
-				var repositoryLocation = (item.Repository !== null) ? item.Repository.Location : item.CloneLocation;
+				var repositoryLocation = item.Repository ? item.Repository.Location : item.CloneLocation;
 				if (data.parameters.valueFor("name") && !data.parameters.optionsRequested) { //$NON-NLS-0$
 					checkoutTagFunction(repositoryLocation, item.Name, data.parameters.valueFor("name")); //$NON-NLS-0$
 				}
@@ -427,7 +427,7 @@
 					);
 				} else {
 					var branchLocation;
-					if (item.Repository !== null) {
+					if (item.Repository) {
 						branchLocation = item.Repository.BranchLocation;
 					} else {
 						branchLocation = item.parent.parent.BranchLocation;
@@ -1654,7 +1654,7 @@
 				return require.toUrl("git/git-log.html") + "#" + data.items.PreviousLocation; //$NON-NLS-1$ //$NON-NLS-0$
 			},
 			visibleWhen : function(item) {
-				if(item.Type === "RemoteTrackingBranch" || (item.toRef !== null && item.toRef.Type === "Branch") || item.RepositoryPath !== null){ //$NON-NLS-1$ //$NON-NLS-0$
+				if(item.Type === "RemoteTrackingBranch" || (item.toRef && item.toRef.Type === "Branch") || item.RepositoryPath !== null){ //$NON-NLS-1$ //$NON-NLS-0$
 					return item.PreviousLocation !== undefined;
 				}
 				return false;
@@ -1670,7 +1670,7 @@
 				return require.toUrl("git/git-log.html") + "#" + data.items.NextLocation; //$NON-NLS-1$ //$NON-NLS-0$
 			},
 			visibleWhen : function(item) {
-				if(item.Type === "RemoteTrackingBranch" ||(item.toRef !== null && item.toRef.Type === "Branch") || item.RepositoryPath !== null){ //$NON-NLS-1$ //$NON-NLS-0$
+				if(item.Type === "RemoteTrackingBranch" ||(item.toRef && item.toRef.Type === "Branch") || item.RepositoryPath !== null){ //$NON-NLS-1$ //$NON-NLS-0$
 					return item.NextLocation !== undefined;
 				}
 				return false;
@@ -2415,7 +2415,7 @@
 						serviceRegistry.getService("orion.page.message").setProgressMessage(messages['Looking for the commit']); //$NON-NLS-0$
 						findCommitLocation(repositories, data.parameters.valueFor("commitName")).then( //$NON-NLS-0$
 							function(commitLocation){
-								if(commitLocation !== null){
+								if(commitLocation){
 									var commitPageURL = require.toUrl("git/git-commit.html#") + commitLocation + "?page=1&pageSize=1"; //$NON-NLS-1$ //$NON-NLS-0$
 									window.open(commitPageURL);
 								}
diff --git a/bundles/org.eclipse.orion.client.ui/web/css/ide.css b/bundles/org.eclipse.orion.client.ui/web/css/ide.css
index 21beaee..8730e56 100644
--- a/bundles/org.eclipse.orion.client.ui/web/css/ide.css
+++ b/bundles/org.eclipse.orion.client.ui/web/css/ide.css
@@ -654,7 +654,6 @@
 
 .treetable {
 	border-spacing: 0;
-	min-width: 600px;
 	width:100%;
 }
 
@@ -873,3 +872,45 @@
 	z-index: 150;
 	border: 1px inset;
 }
+
+/* FOR NAVIGATION DROP DOWN */
+
+.centralNavigation {
+	width:'10px';
+	height:'10px';		
+	padding:'2px';
+}
+
+.dropDownContainer{
+	border-radius:3px;
+	background:#fefefe;
+	border: 1px solid #CCC;
+	padding:5px;
+	margin-top:5px;
+	position:absolute;
+	z-index:100;
+}
+
+
+.dropDownContainer ul {
+	list-style: none;
+	padding:0;
+}
+
+.dropDownContainer ul li a {
+	display: block;
+	padding: 5px 15px;
+	color:#3087B3;
+	line-height: 1;
+}
+
+.dropDownContainer ul li a:focus,
+.dropDownContainer ul li a:hover {
+	color:#F58B0F;
+}
+
+.dropDownContainer ul li a:active {
+	background: #ddd;
+}	
+
+
diff --git a/bundles/org.eclipse.orion.client.ui/web/css/images.css b/bundles/org.eclipse.orion.client.ui/web/css/images.css
index ba16eeb..3bfb638 100644
--- a/bundles/org.eclipse.orion.client.ui/web/css/images.css
+++ b/bundles/org.eclipse.orion.client.ui/web/css/images.css
@@ -82,9 +82,7 @@
 .core-sprite-stop{ background-position: 0 -685px; width: 16px; height: 16px; } 
 .core-sprite-stylesheet{ background-position: 0 -703px; width: 16px; height: 16px; } 
 .core-sprite-warning{ background-position: 0 -721px; width: 16px; height: 16px; } 
- 
- 
-
+.core-sprite-hamburger-inverse{  background: url(../images/hamburger.png) no-repeat top left; width: 16px; height: 16px;} 
    
 .core-sprite-settings {
    background: url(../images/gear.png) no-repeat top left;
diff --git a/bundles/org.eclipse.orion.client.ui/web/css/theme.css b/bundles/org.eclipse.orion.client.ui/web/css/theme.css
index e30ea96..74614b4 100644
--- a/bundles/org.eclipse.orion.client.ui/web/css/theme.css
+++ b/bundles/org.eclipse.orion.client.ui/web/css/theme.css
@@ -135,11 +135,20 @@
 	background: white;

 }

 

+/* Set a min-width on a treetable if it's the main attraction */

+.mainpane .treetable {

+	min-width: 600px;

+}

+

 .mainToolbar {

  	background: #ffffff;

 	border-bottom: 1px solid #ebebeb;

 }

 

+.sidebarToolbar {

+	padding-right: 4px;

+}

+

 /* Searchbox in the top navigation area seems a difficult thing to 

    get right. I've worked with a range of colors. What I notice is that

    if the edges are curved, then it seems to need a lighter shade. That

@@ -309,7 +318,6 @@
 	background-color: #fbfbfb;

 	visibility: hidden;

 	z-index: 150;

-	min-width: 120px;

 	position: absolute;

 	list-style-type: none;

 	border-radius: 3px;

@@ -317,6 +325,10 @@
 	padding: 0;

 }

 

+.dropdownMenuOpen {

+	min-width: 120px;

+}

+

 .dropdownSubMenu {

 	position: relative

 }

diff --git a/bundles/org.eclipse.orion.client.ui/web/edit/edit.html b/bundles/org.eclipse.orion.client.ui/web/edit/edit.html
index d1fbb9b..60e1be6 100644
--- a/bundles/org.eclipse.orion.client.ui/web/edit/edit.html
+++ b/bundles/org.eclipse.orion.client.ui/web/edit/edit.html
@@ -24,11 +24,14 @@
 
 	<body id="orion-editor" spellcheck="false" class="orionPage">
 		<div class="content-fixedHeight">
-			<div id="innerPanels" style="height:100%;width:100%;">
-				<div id="outlineContainer" class="auxpane sidePanelLayout hasSplit">
-					<div id="outline" class="sidePanelMargins"></div>
+			<div id="innerPanels"> <!--  style="height:100%;width:100%;" -->
+				<div class="auxpane sidePanelLayout hasSplit">
+					<div class="fixedToolbarHolder">
+						<div id="sidebarToolbar" class="mainToolbar sidebarToolbar toolComposite toolbarLayout"></div>
+						<div id="sidebar" class="toolbarTarget"></div>
+					</div>
 				</div>
-				<div class="split splitLayout"></div>
+				<div class="split splitLayout" style="left: 25%;"></div> <!-- 1:3 -->
 				<div id="rightPane" class="mainpane mainPanelLayout hasSplit">
 					<div class="fixedToolbarHolder">
 						<div class="mainToolbar toolComposite" id="pageToolbar"></div>
diff --git a/bundles/org.eclipse.orion.client.ui/web/edit/editorPreferences.js b/bundles/org.eclipse.orion.client.ui/web/edit/editorPreferences.js
new file mode 100644
index 0000000..5be01c2
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/edit/editorPreferences.js
@@ -0,0 +1,67 @@
+/*******************************************************************************

+ * @license

+ * Copyright (c) 2013 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 define*/

+

+define([], function() {

+

+	var SETTINGS_SECTION = "/editor/settings"; //$NON-NLS-0$

+	var SETTINGS_KEY = "editorSettings"; //$NON-NLS-0$

+

+	function EditorPreferences(preferences, callback) {

+		this._preferences = preferences;

+		this._callback = callback;

+		if (callback) {

+			var storageKey = preferences.listenForChangedSettings(SETTINGS_SECTION, function (e) {

+				if (e.key === storageKey) {

+					callback();	

+				}

+			}.bind(this));

+		}

+	}

+	

+	EditorPreferences.prototype = /** @lends edit.EditorPreferences.prototype */ {

+		_initialize: function(prefs) {

+			var settings = prefs.get(SETTINGS_KEY);

+			if (!settings) {

+				prefs.put(SETTINGS_KEY,

+				{	

+					autoSaveEnabled:false, 

+					autoSaveTimeout:520, 

+					autoLoadEnabled:false

+				});

+			}

+		},

+		getPrefs: function(callback) {

+			this._preferences.getPreferences(SETTINGS_SECTION).then(function(prefs) {

+				this._initialize(prefs);

+				prefs = prefs.get(SETTINGS_KEY);

+				if (typeof prefs === "string") { //$NON-NLS-0$

+					prefs = JSON.parse(prefs);

+				}

+				callback(prefs);

+			}.bind(this));

+		},

+		setPrefs: function(object, callback) {

+			this._preferences.getPreferences(SETTINGS_SECTION).then(function(prefs) {

+				prefs.put(SETTINGS_KEY, object);

+				if (callback) {

+					callback(object);

+				}

+				if (this._callback) {

+					this._callback(object);

+				}

+			}.bind(this));

+		}

+	};

+	

+	return  {EditorPreferences : EditorPreferences};

+});	

+	
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/edit/setup.js b/bundles/org.eclipse.orion.client.ui/web/edit/setup.js
index ebc841f..58f3c1a 100644
--- a/bundles/org.eclipse.orion.client.ui/web/edit/setup.js
+++ b/bundles/org.eclipse.orion.client.ui/web/edit/setup.js
@@ -1,6 +1,6 @@
 /*******************************************************************************
  * @license
- * Copyright (c) 2010, 2012 IBM Corporation and others.
+ * Copyright (c) 2010, 2013 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 
@@ -12,17 +12,17 @@
 /*jslint browser:true devel:true*/
 /*global define eclipse:true orion:true window*/
 
-define(['i18n!orion/edit/nls/messages', 'require', 'orion/Deferred', 'orion/webui/littlelib', 'orion/selection', 'orion/status', 'orion/progress', 'orion/dialogs',
+define(['i18n!orion/edit/nls/messages', 'require', 'orion/Deferred', 'orion/EventTarget', 'orion/webui/littlelib', 'orion/selection', 'orion/status', 'orion/progress', 'orion/dialogs',
         'orion/commandRegistry', 'orion/favorites', 'orion/extensionCommands', 'orion/fileClient', 'orion/operationsClient', 'orion/searchClient', 'orion/globalCommands', 'orion/outliner',
         'orion/problems', 'orion/editor/contentAssist', 'orion/editorCommands', 'orion/editor/editorFeatures', 'orion/editor/editor', 'orion/syntaxchecker',
-        'orion/editor/textView', 'orion/editor/textModel', 
+        'orion/editor/textView', 'orion/editor/textModel',
         'orion/editor/projectionTextModel', 'orion/keyBinding','orion/searchAndReplace/textSearcher',
-        'orion/edit/dispatcher', 'orion/contentTypes', 'orion/PageUtil', 'orion/highlight', 'orion/i18nUtil', 'orion/edit/syntaxmodel',
-        'orion/widgets/themes/ThemePreferences', 'orion/widgets/themes/editor/ThemeData', 'orion/widgets/themes/editor/MiniThemeChooser'],
-		function(messages, require, Deferred, lib, mSelection, mStatus, mProgress, mDialogs, mCommandRegistry, mFavorites, mExtensionCommands, 
+        'orion/edit/dispatcher', 'orion/contentTypes', 'orion/PageUtil', 'orion/highlight', 'orion/i18nUtil', 'orion/edit/syntaxmodel', 'orion/objects',
+        'orion/widgets/themes/ThemePreferences', 'orion/widgets/themes/editor/ThemeData', 'orion/widgets/themes/editor/MiniThemeChooser', 'edit/editorPreferences', 'orion/sidebar'],
+		function(messages, require, Deferred, EventTarget, lib, mSelection, mStatus, mProgress, mDialogs, mCommandRegistry, mFavorites, mExtensionCommands, 
 				mFileClient, mOperationsClient, mSearchClient, mGlobalCommands, mOutliner, mProblems, mContentAssist, mEditorCommands, mEditorFeatures, mEditor,
 				mSyntaxchecker, mTextView, mTextModel, mProjectionTextModel, mKeyBinding, mSearcher,
-				mDispatcher, mContentTypes, PageUtil, Highlight, i18nUtil, SyntaxModelWirer,  mThemePreferences, mThemeData, mThemeChooser) {
+				mDispatcher, mContentTypes, PageUtil, Highlight, i18nUtil, SyntaxModelWirer, objects, mThemePreferences, mThemeData, mThemeChooser, mEditorPreferences, Sidebar) {
 	
 var exports = exports || {};
 	
@@ -51,8 +51,9 @@
 		new mFavorites.FavoritesService({serviceRegistry: serviceRegistry});
 		contentTypeService = new mContentTypes.ContentTypeService(serviceRegistry);
 	}());
-	
-	var outlineDomNode = lib.node("outline"), //$NON-NLS-0$
+
+	var sidebarDomNode = lib.node("sidebar"), //$NON-NLS-0$
+	    sidebarToolbar = lib.node("sidebarToolbar"), //$NON-NLS-0$
 		editorDomNode = lib.node("editor"), //$NON-NLS-0$
 		searchFloat = lib.node("searchFloat"); //$NON-NLS-0$
 
@@ -60,6 +61,19 @@
 	var syntaxModelWirer = new SyntaxModelWirer(serviceRegistry);
 	var fileClient = new mFileClient.FileClient(serviceRegistry);
 	var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandRegistry, fileService: fileClient});
+	var editor;
+	var editorPreferences;
+	var updateSettings = function(prefs) {
+		editor.setAutoSaveTimeout(prefs.autoSaveEnabled ? prefs.autoSaveTimeout : -1);
+	};
+	var updateEditorSettings = function (prefs) {
+		if (!prefs) {
+			editorPreferences.getPrefs(updateSettings);
+		} else {
+			updateSettings(prefs);
+		}
+	};
+	editorPreferences = new mEditorPreferences.EditorPreferences (preferences, updateEditorSettings);
 	
 	var textViewFactory = function() {
 		var textView = new mTextView.TextView({
@@ -71,191 +85,208 @@
 		});
 		return textView;
 	};
-	
-	var dispatcher;
-	
-	var inputManager = {
-		lastFilePath: "",
-		
-		setInput: function(location, editor) {
-			function errorMessage(error) {
-				try {
-					error = JSON.parse(error.responseText);
-					return error.Message;
-				} catch(e) {}
-				return error.responseText;
-			}
-			function parseNumericParams(input, params) {
-				for (var i=0; i < params.length; i++) {
-					var param = params[i];
-					if (input[param]) {
-						input[param] = parseInt(input[param], 10);
-					}
-				}
-			}
-			if (location && location[0] !== "#") { //$NON-NLS-0$
-				location = "#" + location; //$NON-NLS-0$
-			}
-			var input = PageUtil.matchResourceParameters(location);
-			var fileURI = input.resource;
-			parseNumericParams(input, ["start", "end", "line", "offset", "length"]); //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$
-			// populate editor
-			if (fileURI) {
-				if (fileURI === this.lastFilePath) {
-					editor.showSelection(input.start, input.end, input.line, input.offset, input.length);
-				} else {
-					if (!editor.getTextView()) {
-						editor.installTextView();
-					}
-					var fullPathName = fileURI;
-					var progressTimeout = setTimeout(function() {
-						editor.setInput(fullPathName, messages["Fetching "] + fullPathName, null);
-					}, 800); // wait 800ms before displaying
-					var self = this;
-					var setInput = function(contents, metadata) {
-						var altPageTarget, name;
-						if (metadata) {
-							self._fileMetadata = metadata;
-							var toolbar = lib.node("pageActions"); //$NON-NLS-0$
-							if (toolbar) {	
-								commandRegistry.destroy(toolbar);
-								// now add any "orion.navigate.command" commands that should be shown in non-nav pages.
-								mExtensionCommands.createAndPlaceFileCommandsExtension(serviceRegistry, commandRegistry, "pageActions", 500).then(function() { //$NON-NLS-1$ //$NON-NLS-0$
-									commandRegistry.renderCommands("pageActions", toolbar, metadata, editor, "button"); //$NON-NLS-1$ //$NON-NLS-0$
-								});							}
-							var rightToolbar = lib.node("pageNavigationActions"); //$NON-NLS-0$
-							if (rightToolbar) {	
-								commandRegistry.destroy(rightToolbar);
-								commandRegistry.renderCommands(rightToolbar.id, rightToolbar, editor, editor, "button");  // use true when we want to force toolbar items to text //$NON-NLS-0$
-							}
-							self.setTitle(metadata.Location);
-							self._contentType = contentTypeService.getFileContentType(metadata);
-							// page target is the file, but if any interesting links fail, try the parent folder metadata.
-							altPageTarget = function() {
-								if (metadata.Parents && metadata.Parents.length > 0) {
-									return progressService.progress(fileClient.read(metadata.Parents[0].Location, true), "Getting metadata of " + metadata.Parents[0].Location);
-								}
-							};
-							name = metadata.Name;
-						} else {
-							// No metadata
-							self._fileMetadata = null;
-							self.setTitle(fileURI);
-							self._contentType = contentTypeService.getFilenameContentType(self.getTitle());
-							name = self.getTitle();
-						}
-		
-						var themePreferences = new mThemePreferences.ThemePreferences(preferences, new mThemeData.ThemeData());
-						themePreferences.apply();
-						var chooser = new mThemeChooser.MiniThemeChooser( themePreferences );
-						mGlobalCommands.addSettings( chooser );
-						
-						mGlobalCommands.setPageTarget({task: "Coding", name: name, target: metadata,  //$NON-NLS-0$
-							makeAlternate: function() {
-								if (metadata.Parents && metadata.Parents.length > 0) {
-									return progressService.progress(fileClient.read(metadata.Parents[0].Location, true), "Getting metadata of " + metadata.Parents[0].Location);
-								}
-							},
-							serviceRegistry: serviceRegistry, commandService: commandRegistry,
-							searchService: searcher, fileService: fileClient});
-						mGlobalCommands.setDirtyIndicator(false);
-						syntaxHighlighter.setup(self._contentType, editor.getTextView(), editor.getAnnotationModel(), fileURI, true)
-							.then(function() {
-								// TODO folding should be a preference.
-								var styler = syntaxHighlighter.getStyler();
-								editor.setFoldingEnabled(styler && styler.foldingEnabled);
-								setOutlineProviders(self._contentType, location);
-								if (!dispatcher) {
-									dispatcher = new mDispatcher.Dispatcher(serviceRegistry, editor, self._contentType);
-								}
-								// Contents
-								editor.setInput(fileURI, null, contents);
-								editor.showSelection(input.start, input.end, input.line, input.offset, input.length);
-								commandRegistry.processURL(window.location.href);
-							});
-						clearTimeout(progressTimeout);
-					};
-					var load = function(results) {
-						var contentOrError = results[0];
-						var metadataOrError = results[1];
-						clearTimeout(progressTimeout);
-						if (contentOrError._error) {
-							console.error("HTTP status code: ", contentOrError._error.status); //$NON-NLS-0$
-							contentOrError = messages["An error occurred: "] + errorMessage(contentOrError._error);
-						}
-						if (metadataOrError._error) {
-							console.error("Error loading file metadata: " + errorMessage(metadataOrError._error)); //$NON-NLS-0$
-						}
-						setInput(contentOrError, metadataOrError);
-					};
-					new Deferred.all([progressService.progress(fileClient.read(fileURI), "Reading " + fileURI), progressService.progress(fileClient.read(fileURI, true), "Reading metedata of " + fileURI)], function(error) { return {_error: error}; }).then(load);
-				}
-				this.lastFilePath = fileURI;
-			} else {
-				editor.setInput(messages["No File Selected"], "", null);
-			}
-		},
-		
-		getInput: function() {
-			return this.lastFilePath;
-		},
-			
-		setTitle : function(title) {
-			var indexOfSlash = title.lastIndexOf("/"); //$NON-NLS-0$
-			var shortTitle = title;
-			if (indexOfSlash !== -1) {
-				shortTitle = shortTitle.substring(indexOfSlash + 1);
-			}
-			this._lastTitle = shortTitle;
-		},
-		
-		getTitle: function() {
-			return this._lastTitle;
-		},
-		
-		getFileMetadata: function() {
-			return this._fileMetadata;
-		},
 
-		getContentType: function() {
-			return this._contentType;
-		},
-
-		setDirty: function(dirty) {
-			mGlobalCommands.setDirtyIndicator(dirty);
-		},
-		
-		hashChanged: function(editor) {
-			var oldInput = this.getInput();
-			selection.setSelections(window.location.hash); // may prompt, change input, or both //$NON-NLS-0$
-			var newHash = window.location.hash;
-			var newInput = this.getInput();
-			var inputChanged = PageUtil.matchResourceParameters(oldInput).resource !== PageUtil.matchResourceParameters(newInput).resource; //$NON-NLS-1$ //$NON-NLS-0$
-			var hashMatchesInput = PageUtil.matchResourceParameters(newInput).resource === PageUtil.matchResourceParameters(newHash).resource; //$NON-NLS-1$ //$NON-NLS-0$
-			if (!inputChanged && !hashMatchesInput) {
-				this._lastHash = newHash;
-				window.location.hash = this._lastHash[0] === "#" ? this._lastHash.substring(1): this._lastHash; //$NON-NLS-0$
-			} else if (inputChanged) {
-				this.setInput(newHash, editor);
-				this._lastHash = newHash;
-			} else {
-				// Input didn't change and input matches hash, just remember the current hash
-				this._lastHash = newHash;
-			}
-		},
-		
-		shouldGoToURI: function(editor, fileURI) {
-			if (editor.isDirty()) {
-				var oldStripped = PageUtil.matchResourceParameters("#" + this.lastFilePath).resource; //$NON-NLS-0$
-				var newStripped = PageUtil.matchResourceParameters(fileURI).resource;
-				if (oldStripped !== newStripped) {
-					return window.confirm(messages["There are unsaved changes.  Do you still want to navigate away?"]);
-				}
-			}
-			return true;
+	var inputManager;
+	var InputManager = (function() {
+		/**
+		 * @name orion.editor.InputManager
+		 * @class
+		 */
+		function InputManager(editor) {
+			this.editor = editor;
+			this.lastFilePath = "";
+			this.dispatcher = null;
+			EventTarget.attach(this);
 		}
-	};	
-	
+		objects.mixin(InputManager.prototype, /** @lends orion.editor.InputManager.prototype */ {
+			setInput: function(location) {
+				function errorMessage(error) {
+					try {
+						error = JSON.parse(error.responseText);
+						return error.Message;
+					} catch(e) {}
+					return error.responseText;
+				}
+				function parseNumericParams(input, params) {
+					for (var i=0; i < params.length; i++) {
+						var param = params[i];
+						if (input[param]) {
+							input[param] = parseInt(input[param], 10);
+						}
+					}
+				}
+				var editor = this.editor;
+				if (location && location[0] !== "#") { //$NON-NLS-0$
+					location = "#" + location; //$NON-NLS-0$
+				}
+				var input = PageUtil.matchResourceParameters(location);
+				var fileURI = input.resource;
+				parseNumericParams(input, ["start", "end", "line", "offset", "length"]); //$NON-NLS-4$ //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$
+				// populate editor
+				if (fileURI) {
+					if (fileURI === this.lastFilePath) {
+						editor.showSelection(input.start, input.end, input.line, input.offset, input.length);
+					} else {
+						if (!editor.getTextView()) {
+							editor.installTextView();
+						}
+						var fullPathName = fileURI;
+						var progressTimeout = setTimeout(function() {
+							editor.setInput(fullPathName, messages["Fetching "] + fullPathName, null);
+						}, 800); // wait 800ms before displaying
+						var self = this;
+						var load = function(results) {
+							var contentOrError = results[0];
+							var metadataOrError = results[1];
+							clearTimeout(progressTimeout);
+							if (contentOrError._error) {
+								console.error("HTTP status code: ", contentOrError._error.status); //$NON-NLS-0$
+								contentOrError = messages["An error occurred: "] + errorMessage(contentOrError._error);
+							}
+							if (metadataOrError._error) {
+								console.error("Error loading file metadata: " + errorMessage(metadataOrError._error)); //$NON-NLS-0$
+							}
+							self.setInputContents(input, fileURI, contentOrError, metadataOrError);
+							clearTimeout(progressTimeout);
+						};
+						new Deferred.all([progressService.progress(fileClient.read(fileURI), "Reading " + fileURI), progressService.progress(fileClient.read(fileURI, true), "Reading metedata of " + fileURI)], function(error) { return {_error: error}; }).then(load);
+					}
+					this.lastFilePath = fileURI;
+				} else {
+					editor.setInput(messages["No File Selected"], "", null);
+				}
+			},
+			setInputContents: function(input, title, contents, metadata) {
+				// TODO could potentially dispatch separate events for metadata and contents changing
+				this.dispatchEvent({ type: "InputChanged", metadata: metadata, contents: contents });
+				var editor = this.editor;
+				var altPageTarget, name;
+				if (metadata) {
+					this._fileMetadata = metadata;
+					var toolbar = lib.node("pageActions"); //$NON-NLS-0$
+					if (toolbar) {	
+						commandRegistry.destroy(toolbar);
+						// now add any "orion.navigate.command" commands that should be shown in non-nav pages.
+						mExtensionCommands.createAndPlaceFileCommandsExtension(serviceRegistry, commandRegistry, "pageActions", 500).then(function() { //$NON-NLS-1$ //$NON-NLS-0$
+							commandRegistry.renderCommands("pageActions", toolbar, metadata, editor, "button"); //$NON-NLS-1$ //$NON-NLS-0$
+						});							}
+					var rightToolbar = lib.node("pageNavigationActions"); //$NON-NLS-0$
+					if (rightToolbar) {	
+						commandRegistry.destroy(rightToolbar);
+						commandRegistry.renderCommands(rightToolbar.id, rightToolbar, editor, editor, "button");  // use true when we want to force toolbar items to text //$NON-NLS-0$
+					}
+					this.setTitle(metadata.Location || String(metadata));
+					this._contentType = contentTypeService.getFileContentType(metadata);
+					// page target is the file, but if any interesting links fail, try the parent folder metadata.
+					altPageTarget = function() {
+						if (metadata.Parents && metadata.Parents.length > 0) {
+							return progressService.progress(fileClient.read(metadata.Parents[0].Location, true), "Getting metadata of " + metadata.Parents[0].Location);
+						}
+					};
+					name = metadata.Name;
+				} else {
+					// No metadata
+					this._fileMetadata = null;
+					this.setTitle(title);
+					this._contentType = contentTypeService.getFilenameContentType(this.getTitle());
+					name = this.getTitle();
+				}
+
+				var themePreferences = new mThemePreferences.ThemePreferences(preferences, new mThemeData.ThemeData());
+				themePreferences.apply();
+				var chooser = new mThemeChooser.MiniThemeChooser( themePreferences );
+				mGlobalCommands.addSettings( chooser );
+
+				mGlobalCommands.setPageTarget({task: "Coding", name: name, target: metadata,  //$NON-NLS-0$
+					makeAlternate: function() {
+						if (metadata.Parents && metadata.Parents.length > 0) {
+							// The mini-nav in sidebar wants to do the same work, can we share it?
+							return progressService.progress(fileClient.read(metadata.Parents[0].Location, true), "Getting metadata of " + metadata.Parents[0].Location);
+						}
+					},
+					serviceRegistry: serviceRegistry, commandService: commandRegistry,
+					searchService: searcher, fileService: fileClient});
+				mGlobalCommands.setDirtyIndicator(false);
+				var _self = this;
+				syntaxHighlighter.setup(this._contentType, editor.getTextView(), editor.getAnnotationModel(), title, true)
+					.then(function() {
+						// TODO folding should be a preference.
+						var styler = syntaxHighlighter.getStyler();
+						editor.setFoldingEnabled(styler && styler.foldingEnabled);
+						_self.dispatchEvent({ type: "ContentTypeChanged", contentType: _self._contentType, location: location });
+						if (!this.dispatcher) {
+							this.dispatcher = new mDispatcher.Dispatcher(serviceRegistry, editor, _self._contentType);
+						}
+						// Contents
+						editor.setInput(title, null, contents);
+						editor.showSelection(input.start, input.end, input.line, input.offset, input.length);
+						commandRegistry.processURL(window.location.href);
+					});
+			},
+			getInput: function() {
+				return this.lastFilePath;
+			},
+			setTitle : function(title) {
+				var indexOfSlash = title.lastIndexOf("/"); //$NON-NLS-0$
+				var shortTitle = title;
+				if (indexOfSlash !== -1) {
+					shortTitle = shortTitle.substring(indexOfSlash + 1);
+				}
+				this._lastTitle = shortTitle;
+			},
+			
+			getTitle: function() {
+				return this._lastTitle;
+			},
+			getFileMetadata: function() {
+				return this._fileMetadata;
+			},
+			getContentType: function() {
+				return this._contentType;
+			},
+			setDirty: function(dirty) {
+				mGlobalCommands.setDirtyIndicator(dirty);
+			},
+			hashChanged: function() {
+				var editor = this.editor;
+				var oldInput = this.getInput();
+				selection.setSelections(window.location.hash); // may prompt, change input, or both //$NON-NLS-0$
+				var newHash = window.location.hash;
+				var newInput = this.getInput();
+				var inputChanged = PageUtil.matchResourceParameters(oldInput).resource !== PageUtil.matchResourceParameters(newInput).resource; //$NON-NLS-1$ //$NON-NLS-0$
+				var hashMatchesInput = PageUtil.matchResourceParameters(newInput).resource === PageUtil.matchResourceParameters(newHash).resource; //$NON-NLS-1$ //$NON-NLS-0$
+				if (!inputChanged && !hashMatchesInput) {
+					this._lastHash = newHash;
+					window.location.hash = this._lastHash[0] === "#" ? this._lastHash.substring(1): this._lastHash; //$NON-NLS-0$
+				} else if (inputChanged) {
+					this.setInput(newHash, editor);
+					this._lastHash = newHash;
+				} else {
+					// Input didn't change and input matches hash, just remember the current hash
+					this._lastHash = newHash;
+				}
+			},
+			shouldGoToURI: function(fileURI) {
+				if (typeof fileURI !== "string") {
+					return false;
+				}
+				if (this.editor.isDirty()) {
+					var oldStripped = PageUtil.matchResourceParameters("#" + this.lastFilePath).resource; //$NON-NLS-0$
+					var newStripped = PageUtil.matchResourceParameters(fileURI).resource;
+					if (oldStripped !== newStripped) {
+						return window.confirm(messages["There are unsaved changes.  Do you still want to navigate away?"]);
+					}
+				}
+				return true;
+			},
+			getEditor: function() {
+				return this.editor;
+			}
+		});
+		return InputManager;
+	}());
+
+
 	var tabHandler = {
 		handlers: [],
 		
@@ -294,7 +325,7 @@
 			}
 		}
 	};
-	
+
 	var escHandler = {
 		handlers: [],
 		
@@ -471,7 +502,7 @@
 	};
 	var annotationFactory = new mEditorFeatures.AnnotationFactory();
 	
-	var editor = new mEditor.Editor({
+	editor = new mEditor.Editor({
 		textViewFactory: textViewFactory,
 		undoStackFactory: new mEditorCommands.UndoCommandFactory(serviceRegistry, commandRegistry, "pageActions"), //$NON-NLS-0$
 		textDNDFactory: new mEditorFeatures.TextDNDFactory(),
@@ -484,6 +515,26 @@
 		domNode: editorDomNode
 	});
 	
+	// Editor Settings
+	updateEditorSettings();
+	
+	inputManager = new InputManager(editor);
+
+	var sidebar = new Sidebar({
+		commandRegistry: commandRegistry,
+		contentTypeRegistry: contentTypeService,
+		inputManager: inputManager,
+		editor: editor,
+		fileClient: fileClient,
+		outlineService: outlineService,
+		parent: sidebarDomNode,
+		progressService: progressService,
+		selection: selection,
+		serviceRegistry: serviceRegistry,
+		toolbar: sidebarToolbar
+	});
+	sidebar.show();
+
 	// Establishing dependencies on registered services
 	serviceRegistry.getService("orion.core.marker").addEventListener("problemsChanged", function(event) { //$NON-NLS-1$ //$NON-NLS-0$
 		editor.showProblems(event.problems);
@@ -496,93 +547,23 @@
 	// Generically speaking, we respond to changes in selection.  New selections change the editor's input.
 	selection.addEventListener("selectionChanged", function(event) { //$NON-NLS-1$ //$NON-NLS-0$
 		var fileURI = event.selection;
-		if (inputManager.shouldGoToURI(editor, fileURI)) {
-			inputManager.setInput(fileURI, editor);
+		if (inputManager.shouldGoToURI(fileURI)) {
+			inputManager.setInput(fileURI);
 		} 
 	});
 	
-	window.addEventListener("hashchange", function() {inputManager.hashChanged(editor);}, false); //$NON-NLS-0$
-	inputManager.setInput(window.location.hash, editor);
+	window.addEventListener("hashchange", function() {inputManager.hashChanged();}, false); //$NON-NLS-0$
+	inputManager.setInput(window.location.hash);
 	
 	mGlobalCommands.generateBanner("orion-editor", serviceRegistry, commandRegistry, preferences, searcher, editor, editor, escHandler); //$NON-NLS-0$
 	// Put the make favorite command in our toolbar."
 	commandRegistry.registerCommandContribution("pageActions", "orion.makeFavorite", 2); //$NON-NLS-1$ //$NON-NLS-0$
 
-		
 	var syntaxChecker = new mSyntaxchecker.SyntaxChecker(serviceRegistry, editor);
 	editor.addEventListener("InputChanged", function(evt) { //$NON-NLS-0$
 		syntaxChecker.checkSyntax(inputManager.getContentType(), evt.title, evt.message, evt.contents);
 	});
-	
-	var filteredProviders;
-	
-	// Create outliner "gadget"
-	var outliner = new mOutliner.Outliner({parent: outlineDomNode,
-		serviceRegistry: serviceRegistry,
-		outlineService: serviceRegistry.getService("orion.edit.outline"), //$NON-NLS-0$
-		commandService: commandRegistry,
-		selectionService: selection,
-		onSelectedProvider: function(/**ServiceReference*/ outlineProvider) { //$NON-NLS-0$
-			outlineService.setProvider(outlineProvider);
-			outlineService.emitOutline(editor.getText(), editor.getTitle());
-		}
-	});
-	if (filteredProviders) {
-		outliner.setOutlineProviders(filteredProviders);
-	}
-		
-	function setOutlineProviders(fileContentType, title) {
-		var outlineProviders = serviceRegistry.getServiceReferences("orion.edit.outliner"); //$NON-NLS-0$
-		filteredProviders = [];
-		var i;
-		for (i=0; i < outlineProviders.length; i++) {
-			var serviceReference = outlineProviders[i],
-			    contentTypeIds = serviceReference.getProperty("contentType"), //$NON-NLS-0$
-			    pattern = serviceReference.getProperty("pattern"); // for backwards compatibility //$NON-NLS-0$
-			var isSupported = false;
-			if (contentTypeIds) {
-				isSupported = contentTypeIds.some(function(contentTypeId) {
-						return contentTypeService.isExtensionOf(fileContentType, contentTypeId);
-					});
-			} else if (pattern && new RegExp(pattern).test(title)) {
-				isSupported = true;
-			}
-			if (isSupported) {
-				filteredProviders.push(serviceReference);
-			}
-		}
-		var deferreds = []; 
-		for(i=0; i<filteredProviders.length; i++){
-			if(filteredProviders[i].getProperty("nameKey") && filteredProviders[i].getProperty("nls")){ //$NON-NLS-1$ //$NON-NLS-0$
-				var deferred = new Deferred();
-				deferreds.push(deferred);
-				var provider = filteredProviders[i];
-				var getDisplayName = function(commandMessages) { //$NON-NLS-0$
-					this.provider.displayName = commandMessages[provider.getProperty("nameKey")]; //$NON-NLS-0$
-					this.deferred.resolve();
-				};
-				i18nUtil.getMessageBundle(provider.getProperty("nls")).then(getDisplayName.bind({provider: provider, deferred: deferred}), deferred.reject); //$NON-NLS-0$
-			} else {
-				filteredProviders[i].displayName = filteredProviders[i].getProperty("name"); //$NON-NLS-0$
-			}
-		}
-		if(deferreds.length===0){
-			outlineService.setOutlineProviders(filteredProviders);
-			if (outliner) {
-				outliner.setOutlineProviders(filteredProviders);
-			}
-		}else{
-			Deferred.all(deferreds, function(error) { return error; }).then(function(){
-				outlineService.setOutlineProviders(filteredProviders);
-				if (outliner) {
-					outliner.setOutlineProviders(filteredProviders);
-				}
-			});
-		}
-	}
-	editor.addEventListener("InputChanged", function(evt) { //$NON-NLS-0$
-		outlineService.emitOutline(editor.getText(), editor.getTitle());
-	});
+
 	window.onbeforeunload = function() {
 		if (editor.isDirty()) {
 			 return messages["There are unsaved changes."];
@@ -590,4 +571,4 @@
 	};
 };
 return exports;
-});
\ No newline at end of file
+});
diff --git a/bundles/org.eclipse.orion.client.ui/web/images/hamburger.png b/bundles/org.eclipse.orion.client.ui/web/images/hamburger.png
new file mode 100644
index 0000000..6908474
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/images/hamburger.png
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.ui/web/navigate/table.js b/bundles/org.eclipse.orion.client.ui/web/navigate/table.js
index 71c1bb0..9516555 100644
--- a/bundles/org.eclipse.orion.client.ui/web/navigate/table.js
+++ b/bundles/org.eclipse.orion.client.ui/web/navigate/table.js
@@ -54,7 +54,17 @@
 					return new mNavigatorRenderer.NavigatorRenderer({
 						checkbox: false, 
 						cachePrefix: "Navigator"}, explorer, commandRegistry, contentTypeService);  //$NON-NLS-0$
-				}}); 
+				}});
+		// On scope up, change the href of the window.location to navigate to the parent page.
+		explorer.scopeUp = function() {
+			if(this.treeRoot && this.treeRoot.Parents){
+				if(this.treeRoot.Parents.length === 0){
+					window.location.href = "#"; //$NON-NLS-0$
+				} else if(this.treeRoot.Parents[0].ChildrenLocation){
+					window.location.href = "#" + this.treeRoot.Parents[0].ChildrenLocation; //$NON-NLS-0$
+				}
+			}
+		}.bind(explorer);
 
 		function refresh() {
 			var pageParams = PageUtil.matchResourceParameters();
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/banner/banner.html b/bundles/org.eclipse.orion.client.ui/web/orion/banner/banner.html
index 5eff31e..136a378 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/banner/banner.html
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/banner/banner.html
@@ -3,7 +3,10 @@
 	<!-- Top row:  Logo + discovery links + search + user -->
 	<div id="staticBanner" class="primaryNav layoutBlock topRowBanner">
 		<a id="home" class="layoutLeft logo"></a>
-		<nav id="primaryNav" class="layoutLeft" role="navigation"></nav>
+		
+		<nav id="primaryNav" class="layoutLeft" role="navigation">
+			<div class="centralNavigation" id="centralNavigation" style="margin-top:0;"></div>
+		</nav>
 		<div class="layoutRight">
 			<div id="globalActions" class="spacingLeft layoutLeft"></div>
 			<div id="relatedLinks" class="spacingLeft layoutLeft" style="padding-top:1px;">
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/edit/nls/root/messages.js b/bundles/org.eclipse.orion.client.ui/web/orion/edit/nls/root/messages.js
index 334c128..b3f8370 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/edit/nls/root/messages.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/edit/nls/root/messages.js
@@ -31,5 +31,7 @@
 	"Find": "Find",
 	"No response from server.  Check your internet connection and try again.": "No response from server.  Check your internet connection and try again.",
 	"Saving file {0}": "Saving file ${0}",
-	"Running {0}": "Running ${0}"
-});
\ No newline at end of file
+	"Running {0}": "Running ${0}",
+	"Saving..." : "Saving...",
+	"Actions": "Actions"
+});
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/editorCommands.js b/bundles/org.eclipse.orion.client.ui/web/orion/editorCommands.js
index fa02bcd..33f5896 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/editorCommands.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/editorCommands.js
@@ -94,15 +94,18 @@
 				var self = this;
 				if (this.inputManager.onSave) {
 					editor.getTextView().setAction("save", function () { //$NON-NLS-0$
+						editor.reportStatus(messages['Saving...']);
 						var contents = editor.getText();
 						self.inputManager.onSave(self.inputManager.getInput(), contents,
 							function(result) {
 								editor.setInput(self.inputManager.getInput(), null, contents, true);
+								editor.reportStatus("");
 								if(self.inputManager.afterSave){
 									self.inputManager.afterSave();
 								}
 							},
 							function(error) {
+								editor.reportStatus("");
 								error.log = true;
 							}
 						);
@@ -110,6 +113,7 @@
 					}, {name: messages['Save']});
 				} else {
 					editor.getTextView().setAction("save", function () { //$NON-NLS-0$
+						editor.reportStatus(messages['Saving...']);
 						var contents = editor.getText();
 						var etag = self.inputManager.getFileMetadata().ETag;
 						var args = { "ETag" : etag }; //$NON-NLS-0$
@@ -122,6 +126,7 @@
 							function(result) {
 								self.inputManager.getFileMetadata().ETag = result.ETag;
 								editor.setInput(self.inputManager.getInput(), null, contents, true);
+								editor.reportStatus("");
 								if(self.inputManager.afterSave){
 									self.inputManager.afterSave();
 								}
@@ -141,6 +146,7 @@
 											function(result) {
 												self.inputManager.getFileMetadata().ETag = result.ETag;
 												editor.setInput(self.inputManager.getInput(), null, contents, true);
+												editor.reportStatus("");
 												if(self.inputManager.afterSave){
 													self.inputManager.afterSave();
 												}
@@ -148,6 +154,7 @@
 									}
 								} else {
 									// unknown error
+									editor.reportStatus("");
 									handleError(error);
 								}
 							}
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/explorers/explorer-table.js b/bundles/org.eclipse.orion.client.ui/web/orion/explorers/explorer-table.js
index 8a89b97..4aafc06 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/explorers/explorer-table.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/explorers/explorer-table.js
@@ -95,8 +95,10 @@
 
 	/**
 	 * Creates a new file explorer.
-	 * @name orion.explorers.explorer-table.FileExplorer
+	 * @name orion.explorers.FileExplorer
 	 * @class A user interface component that displays a table-oriented file explorer
+	 * @extends orion.explorer.Explorer
+	 *
 	 * @param {Object} options.treeRoot an Object representing the root of the tree.
 	 * @param {orion.selection.Selection} options.selection the selection service used to track selections.
 	 * @param {orion.fileClient.FileClient} options.fileClient the file service used to retrieve file information
@@ -107,6 +109,12 @@
 	 * @param {orion.serviceregistry.ServiceRegistry} options.serviceRegistry  the service registry to use for retrieving other
 	 *	Orion services.  Optional.  If not specified, then some features of the explorer will not be enabled, such as status reporting,
 	 *  honoring preference settings, etc.
+	 * @param {Boolean} [options.setFocus=true] Whether the explorer should steal keyboard focus when rendered. The default is to steal focus.
+	 */
+	/**
+	 * Root model item of the tree.
+	 * @name orion.explorers.FileExplorer#treeRoot
+	 * @type {Object}
 	 */
 	function FileExplorer(options) {
 		this.registry = options.serviceRegistry;
@@ -118,6 +126,7 @@
 		this.parentId = options.parentId;
 		this.renderer = options.rendererFactory(this);
 		this.dragAndDrop = options.dragAndDrop;
+		this.setFocus = options.setFocus;
 		this.model = null;
 		this.myTree = null;
 		this.checkbox = false;
@@ -146,7 +155,7 @@
 			path = path || "";
 			if (entry.isFile) {
 				// can't drop files directly into workspace.
-				if (target.Location.indexOf('/workspace') === 0){ //$NON-NLS-0$
+				if (mFileUtils.isAtRoot(target.Location)){ //$NON-NLS-0$
 					explorer.registry.getService("orion.page.message").setProgressResult({ //$NON-NLS-0$
 						Severity: "Error", Message: messages["You cannot copy files directly into the workspace.  Create a folder first."]});	 //$NON-NLS-1$ //$NON-NLS-0$ 
 				} else {
@@ -164,7 +173,7 @@
 					});
 				};
 				var progress = explorer.registry.getService("orion.page.progress");
-				if (target.Location.indexOf('/workspace') === 0){ //$NON-NLS-0$
+				if (mFileUtils.isAtRoot(target.Location)){ //$NON-NLS-0$
 					progress.progress(fileClient.createProject(target.ChildrenLocation, entry.name), "Initializing project " + entry.name).then(function(project) {
 					explorer.loadResourceList(explorer.treeRoot.Path, true);					
 					progress.progress(fileClient.read(project.ContentLocation, true), "Loading project info " + project.name).then(function(folder) {
@@ -259,7 +268,7 @@
 						if (!file.length && (!file.type || file.type === "")) {
 							explorer.registry.getService("orion.page.message").setProgressResult( //$NON-NLS-0$
 								{Severity: "Error", Message: i18nUtil.formatMessage(messages["Did not drop ${0}.  Folder drop is not supported in this browser."], file.name)}); //$NON-NLS-1$ //$NON-NLS-0$ 
-						} else if (item.Location.indexOf('/workspace') === 0){ //$NON-NLS-0$
+						} else if (mFileUtils.isAtRoot(item.Location)){ //$NON-NLS-0$
 							explorer.registry.getService("orion.page.message").setProgressResult({ //$NON-NLS-0$
 								Severity: "Error", Message: messages["You cannot copy files directly into the workspace.  Create a folder first."]});	 //$NON-NLS-1$ //$NON-NLS-0$ 
 						} else {
@@ -278,8 +287,12 @@
 			node.addEventListener("drop", drop, false); //$NON-NLS-0$
 		}
 	};
-	
-	// we have changed an item on the server at the specified parent node
+
+	/**
+	 * @name FileExplorer#changedItem
+	 * @function
+	 * we have changed an item on the server at the specified parent node
+	 */
 	FileExplorer.prototype.changedItem = function(parent, forceExpand) {
 		var that = this;
 		var progress = this.registry.getService("orion.page.progress");
@@ -306,20 +319,19 @@
 		}
 	};
 		
-	//This is an optional function for explorerNavHandler. It changes the href of the window.location to navigate to the parent page.
-	//The explorerNavHandler hooked up by the explorer will check if this optional function exist and call it when left arrow key hits on a top level item that is aleady collapsed.
-	FileExplorer.prototype.scopeUp = function(){
-		if(this.treeRoot && this.treeRoot.Parents){
-			if(this.treeRoot.Parents.length === 0){
-				window.location.href = "#"; //$NON-NLS-0$
-			} else if(this.treeRoot.Parents[0].ChildrenLocation){
-				window.location.href = "#" + this.treeRoot.Parents[0].ChildrenLocation; //$NON-NLS-0$
-			}
-		}
+	/**
+	 * The explorerNavHandler hooked up by the explorer will call this function when left arrow key is pressed on a 
+	 * top level item that is aleady collapsed. The default implementation does nothing.
+	 * @name orion.explorers.FileExplorer#scopeUp
+	 * @function
+	 */
+	FileExplorer.prototype.scopeUp = function() {
 	};
 	
 	/**
 	 * Load the resource at the given path.
+	 * @name orion.explorers.FileExplorer#loadResourceList
+	 * @function
 	 * @param path The path of the resource to load
 	 * @param {Boolean} [force] If true, force reload even if the path is unchanged. Useful
 	 * when the client knows the resource underlying the current path has changed.
@@ -344,6 +356,8 @@
 	
 	/**
 	 * Load the explorer with the given root
+	 * @name orion.explorers.FileExplorer#load
+	 * @function
 	 * @param {Object} root a root object or a deferred that will return the root of the FileModel
 	 * @param {String} progress a string progress message describing the fetch of the root
 	 */
@@ -397,7 +411,14 @@
 					}
 				}
 
-				self.createTree(self.parentId, self.model, {setFocus: true, selectionPolicy: self.renderer.selectionPolicy, onCollapse: function(model){if(self.getNavHandler()){self.getNavHandler().onCollapse(model);}}});
+				self.createTree(self.parentId, self.model, {
+					setFocus: (typeof self.setFocus === "undefined" ? true : self.setFocus), 
+					selectionPolicy: self.renderer.selectionPolicy, 
+					onCollapse: function(model){
+						if(self.getNavHandler()){
+							self.getNavHandler().onCollapse(model);
+						}
+					}});
 				if (typeof postLoad === "function") { //$NON-NLS-0$
 					try {
 						postLoad();
@@ -428,7 +449,9 @@
 		);
 	};
 	/**
-	 * Clients can connect to this function to receive notification when the root item changes.
+	 * Called when the root item changes. This can be overridden.
+	 * @name orion.explorers.FileExplorer#onchange
+	 * @function
 	 * @param {Object} item
 	 */
 	FileExplorer.prototype.onchange = function(item) {
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/explorers/explorer.js b/bundles/org.eclipse.orion.client.ui/web/orion/explorers/explorer.js
index 6384902..bc00621 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/explorers/explorer.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/explorers/explorer.js
@@ -140,11 +140,12 @@
 		/**
 		 * Displays tree table containing filled with data provided by given model
 		 * 
-		 * @param parentId id of parent dom element
-		 * @param model providing data to display
-		 * @param options optional parameters of the tree(custom indent, onCollapse callback)
+		 * @param {String|Element} parentId id of parent dom element, or the element itself
+		 * @param {Object} model providing data to display
+		 * @param {Object} options optional parameters of the tree(custom indent, onCollapse callback)
 		 */
 		createTree: function (parentId, model, options){
+			parentId = typeof parentId === "string" ? parentId : (parentId.id || parentId);
 			if(this.selection) {
 				this.selection.setSelections([]);
 			}
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/explorers/navigatorRenderer.js b/bundles/org.eclipse.orion.client.ui/web/orion/explorers/navigatorRenderer.js
index 06d092a..1bbfec8 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/explorers/navigatorRenderer.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/explorers/navigatorRenderer.js
@@ -180,9 +180,15 @@
 	};

 

 	/**

+	 * @name orion.explorer.NavigatorRenderer#showFolderLinks

+	 * @type {Boolean}

+	 * @description Whether folders should be links (<code>true</code>), or just plain text (<code>false</code>). Default is to show folders as links.

+	 */

+	NavigatorRenderer.prototype.showFolderLinks = true;

+	/**

 	 * @name orion.explorer.NavigatorRenderer#folderLink

 	 * @type {String}

-	 * @description Base link URL to use on folder text. TODO see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=400121">Bug 400121</a>

+	 * @description Base link URL to use on folder text. Only applies if {@link #showFolderLinks} is true. TODO see <a href="https://bugs.eclipse.org/bugs/show_bug.cgi?id=400121">Bug 400121</a>

 	 */

 	/**

 	 * @name orion.explorer.NavigatorRenderer#getCellElement

@@ -202,12 +208,16 @@
 			if (item.Directory) {

 				// defined in ExplorerRenderer.  Sets up the expand/collapse behavior

 				var image = this.getExpandImage(tableRow, span);

-				

-				// TODO see https://bugs.eclipse.org/bugs/show_bug.cgi?id=400121

-				link = createLink(this.folderLink || "", item, tableRow.id, this.commandService, this.contentTypeService);

-				span.appendChild(link); //$NON-NLS-0$

+

+				if (this.showFolderLinks) { //$NON-NLS-0$

+					// TODO see https://bugs.eclipse.org/bugs/show_bug.cgi?id=400121

+					link = createLink(this.folderLink || "", item, tableRow.id, this.commandService, this.contentTypeService);

+					span.appendChild(link); //$NON-NLS-0$

+					this.explorer._makeDropTarget(item, link);

+				} else {

+					span.appendChild(document.createTextNode(item.Name));

+				}

 				this.explorer._makeDropTarget(item, tableRow);

-				this.explorer._makeDropTarget(item, link);

 			} else {

 				var i;			

 				// Images: always generate link to file. Non-images: use the "open with" href if one matches,

@@ -223,7 +233,9 @@
 				link = createLink("", item, tableRow.id, this.commandService, this.contentTypeService, this.openWithCommands, this.defaultEditor, { target: this.target });

 				span.appendChild(link); //$NON-NLS-0$

 			}

-			mNavUtils.addNavGrid(this.explorer.getNavDict(), item, link);

+			if (link) {

+				mNavUtils.addNavGrid(this.explorer.getNavDict(), item, link);

+			}

 			// render any inline commands that are present.

 			if (this.actionScopeId) {

 				this.commandService.renderCommands(this.actionScopeId, span, item, this.explorer, "tool", null, true); //$NON-NLS-0$

diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/globalCommands.js b/bundles/org.eclipse.orion.client.ui/web/orion/globalCommands.js
index 543eb31..b50effb 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/globalCommands.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/globalCommands.js
@@ -16,10 +16,10 @@
 	'orion/extensionCommands', 'orion/uiUtils', 'orion/keyBinding', 'orion/breadcrumbs', 'orion/webui/littlelib', 'orion/webui/splitter', 
 	'orion/webui/dropdown', 'orion/webui/tooltip', 'orion/favorites', 'orion/contentTypes', 'orion/URITemplate', 'orion/PageUtil', 'orion/widgets/themes/ThemePreferences', 'orion/widgets/themes/container/ThemeData', 
 	'orion/searchUtils', 'orion/inputCompletion/inputCompletion', 'orion/globalSearch/advSearchOptContainer', 'orion/Deferred',
-	'orion/widgets/UserMenu', 'orion/PageLinks', 'orion/webui/dialogs/OpenResourceDialog', 'text!orion/banner/banner.html', 'text!orion/banner/footer.html', 'text!orion/banner/toolbar.html'], 
+	'orion/widgets/UserMenu', 'orion/PageLinks', 'orion/webui/dialogs/OpenResourceDialog', 'text!orion/banner/banner.html', 'text!orion/banner/footer.html', 'text!orion/banner/toolbar.html', 'orion/widgets/input/DropDownMenu', 'orion/widgets/input/GroupedContent'], 
         function(messages, require, commonHTML, KeyBinding, mCommandRegistry, mCommands, mParameterCollectors, mExtensionCommands, mUIUtils, mKeyBinding, mBreadcrumbs, lib, mSplitter, 
         mDropdown, mTooltip, mFavorites, mContentTypes, URITemplate, PageUtil, mThemePreferences, mThemeData, mSearchUtils, mInputCompletion, 
-        mAdvSearchOptContainer, Deferred, mUserMenu, PageLinks, openResource, BannerTemplate, FooterTemplate, ToolbarTemplate){
+        mAdvSearchOptContainer, Deferred, mUserMenu, PageLinks, openResource, BannerTemplate, FooterTemplate, ToolbarTemplate, DropDownMenu, GroupedContent){
 
 	/**
 	 * This class contains static utility methods. It is not intended to be instantiated.
@@ -201,12 +201,25 @@
 	
 	function _addRelatedLinkCommand(command, invocation) {
 		var dropdownNode = lib.node("relatedDropdown"); //$NON-NLS-0$
+		
+		/* Evolving to a compound list of navigation and related links
+		   Some of this code was dedicated to the older dropdown. Will
+		   clean this up as a next step. 
+		
 		if (!linksDropdown) {
 			linksDropdown = new mDropdown.Dropdown({
 				dropdown: dropdownNode
 			});
-		}
+		} */
+		
 		mCommands.createCommandMenuItem(dropdownNode, command, invocation);
+		
+		var relatedlinks = lib.node('relatedlinks');
+		var link = mCommands.createCommandMenuItem(dropdownNode, command, invocation);
+		link.className = '';
+		var li = document.createElement( 'li' );
+		li.appendChild(link);
+		relatedlinks.appendChild(li);
 	}	
 	/**
 	 * Adds the related links to the banner
@@ -522,7 +535,7 @@
 				CLICKED = true;
 		
 				var TAB_HEIGHT = 24;
-				var PANEL_HEIGHT = 150;
+				var PANEL_HEIGHT = 200;
 				var PANEL_WIDTH = 150;
 				var BORDER_RADIUS = '3px'; //$NON-NLS-0$
 				var COLOR = '#555'; //$NON-NLS-0$
@@ -647,12 +660,18 @@
 			keyAssistDiv.style.display = "none"; //$NON-NLS-0$
 		});
 		
+		var navDropDown = new DropDownMenu( 'centralNavigation', { label:'Develop', icon:'core-sprite-hamburger-inverse' } );
+		var groupedContent = new GroupedContent();
+		navDropDown.addContent( groupedContent.getContentPane() );
+		
 		// generate primary nav links. 
-		var primaryNav = lib.node("primaryNav"); //$NON-NLS-0$
+		var primaryNav = lib.node("navigationlinks"); //$NON-NLS-0$
 		if (primaryNav) {
 			PageLinks.createPageLinks(serviceRegistry, "orion.page.link").then(function(links) { //$NON-NLS-0$
-				links.forEach(function(link) {
-					primaryNav.appendChild(link);
+				links.forEach(function(link) {		
+					var li = document.createElement( 'li' );	
+					li.appendChild(link);
+					navigationlinks.appendChild(li);
 				});
 			});
 		}
@@ -775,11 +794,11 @@
 							editor.getTextView().resize();
 						}
 					});
-					editor.getTextView().setKeyBinding(new mKeyBinding.KeyBinding("o", true), "toggleOutliner"); //$NON-NLS-1$ //$NON-NLS-0$
-					editor.getTextView().setAction("toggleOutliner", function(){ //$NON-NLS-0$
+					editor.getTextView().setKeyBinding(new mKeyBinding.KeyBinding("o", true), "toggleSidebar"); //$NON-NLS-1$ //$NON-NLS-0$
+					editor.getTextView().setAction("toggleSidebar", function(){ //$NON-NLS-0$
 						mainSplitter.splitter.toggleSidePanel();
 						return true;
-					}, {name: messages["Toggle Outliner"]});
+					}, {name: messages["Toggle Sidebar"]});
 				}
 			}
 		}
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/nls/root/messages.js b/bundles/org.eclipse.orion.client.ui/web/orion/nls/root/messages.js
index 689e7af..4049d7f 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/nls/root/messages.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/nls/root/messages.js
@@ -51,9 +51,7 @@
 	"Orion is in Beta. Please try it out but BEWARE your data may be lost.": "Orion build @buildLabel@. See the FAQ for terms of service",
 	"Add this page to the favorites list": "Add this page to the favorites list",
 	"LOG: ": "LOG: ",
-	"Switch": "Switch",
-	"Switch the type of outliner used": "Switch the type of outliner used",
-	"Outliner": "Outliner",
+	"View": "View",
 	"no parent": "no parent",
 	"no tree model": "no tree model",
 	"no renderer": "no renderer",
@@ -90,7 +88,7 @@
 	"Toggle side panel" : "Toggle side panel",
 	"Open or close the side panel": "Open or close the side panel",
 	"Projects" : "Projects",
-	"Toggle Outliner" : "Toggle Outliner",
+	"Toggle Sidebar" : "Toggle Sidebar",
 	"Sample HTML5 Site": "Sample HTML5 Site",
 	"Generate an HTML5 'Hello World' website, including JavaScript, HTML, and CSS files.": "Generate an HTML5 'Hello World' website, including JavaScript, HTML, and CSS files.",
 	"Sample Orion Plugin": "Sample Orion Plugin",
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/outliner.js b/bundles/org.eclipse.orion.client.ui/web/orion/outliner.js
index 64c1398..ff9f5a1 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/outliner.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/outliner.js
@@ -1,6 +1,6 @@
 /*******************************************************************************
  * @license
- * Copyright (c) 2010, 2012 IBM Corporation and others.
+ * Copyright (c) 2010, 2013 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 
@@ -8,9 +8,11 @@
  * 
  * Contributors: IBM Corporation - initial API and implementation
  ******************************************************************************/
- /*global define document window*/
-
-define(['i18n!orion/nls/messages', 'orion/Deferred', 'orion/webui/littlelib', 'orion/uiUtils', 'orion/section', 'orion/explorers/explorer', 'orion/commands', 'orion/URITemplate', 'orion/EventTarget'], function(messages, Deferred, lib, mUIUtils, mSection, mExplorer, mCommands, URITemplate, EventTarget) {
+/*global define document window*/
+/*jslint sub:true*/
+define(['i18n!orion/nls/messages', 'orion/Deferred', 'orion/webui/littlelib', 'orion/uiUtils', 'orion/section', 'orion/explorers/explorer',
+		'orion/commands', 'orion/URITemplate', 'orion/EventTarget', 'orion/i18nUtil'],
+		function(messages, Deferred, lib, mUIUtils, mSection, mExplorer, mCommands, URITemplate, EventTarget, i18nUtil) {
 
 	function OutlineRenderer (options, explorer, title, selectionService) {
 		this.explorer = explorer;
@@ -151,47 +153,49 @@
 	 * @class An Outliner is a visual component that renders an itemized overview of a resource and acts as 
 	 * a selection provider on that resource. The itemized overview is obtained from the {@link orion.outliner.OutlineService}.
 	 * @param {Object} options The options object
-	 * @param {Object} options.parent The parent DOM element to put this outliner inside
+	 * @param {Element} options.parent The parent DOM element to put this outliner inside.
+	 * @param {Element} options.toolbar The DOM element to render toolbar commands in.
 	 * @param {orion.serviceRegistry.ServiceRegistry} options.serviceRegistry The service registry.
 	 * @param {orion.commands.CommandService} options.commandService
 	 * @param {Service of type orion.outliner.OutlineService} options.outlineService The outline service to use.
 	 * @param {orion.selection.Selection} [options.selectionService] If provided, the 
 	 * selection service will be notified on outline selection rather than using anchor tag hrefs.
+	 * @param {orion.sidebar.Sidebar} Parent sidebar
 	 */
 	function Outliner(options) {
 		this._init(options);
 	}
 	Outliner.prototype = /** @lends orion.outliner.Outliner.prototype */ {
 		_init: function(options) {
-			var parent = options.parent;
-			parent = lib.node(parent);
-			if (!parent) { throw "no parent"; } //$NON-NLS-0$
-			if (!options.outlineService) {throw "no outline service"; } //$NON-NLS-0$
+			var parent = lib.node(options.parent), toolbar = lib.node(options.toolbar);
+			if (!parent) { throw new Error("no parent"); } //$NON-NLS-0$
+			if (!options.outlineService) {throw new Error("no outline service"); } //$NON-NLS-0$
 			this._parent = parent;
+			this._toolbar = toolbar;
 			this._serviceRegistry = options.serviceRegistry;
+			this._contentTypeRegistry = options.contentTypeRegistry;
 			this._outlineService = options.outlineService;
 			this._commandService = options.commandService;
 			this._selectionService = options.selectionService;
-			this._onSelectedProvider = options.onSelectedProvider;
-			var self = this;
-			Deferred.when(self._outlineService, function(service) {
+			this._inputManager = options.inputManager;
+			this._sidebar = options.sidebar;
+			var _self = this;
+
+			this._inputManager.addEventListener("ContentTypeChanged", function(event) { //$NON-NLS-0$
+				_self.setContentType(event.contentType, event.location);
+			});
+
+			var editor = this._inputManager.getEditor();
+			editor.addEventListener("InputChanged", this.generateOutline.bind(this));
+
+			Deferred.when(_self._outlineService, function(service) {
 				service.addEventListener("outline", function(event) { //$NON-NLS-0$
-					self.providerId = event.providerId;
-					self._renderHeadingAndMenu(self.outlineProviders);
-					self._renderOutline(event.outline, event.title);
+					_self.providerId = event.providerId;
+//					_self._updateViewModes(self.outlineProviders);
+					_self._renderOutline(event.outline, event.title);
 				});
 			});
-			
-			var switchOutlineCommand = new mCommands.Command({
-				name: messages["Switch"],
-				tooltip: messages["Switch the type of outliner used"],
-				id: "eclipse.edit.outline.switch", //$NON-NLS-0$
-				visibleWhen: function(item) {
-					return true;
-				},
-				choiceCallback: this._menuCallback.bind(this)
-			});
-			this._commandService.addCommand(switchOutlineCommand);
+
 		},
 		outlineChanged: function(outlinerService, title, contents) {
 			var self = this;
@@ -200,58 +204,110 @@
 				self._renderOutline(outlineModel, title);
 			});
 		},
-		setSelectedProvider: function(/**ServiceReference*/ provider) {
+		/** Invokes the outline service to produce an outline */
+		generateOutline: function() {
+			if (!this.active) {
+				console.log("not generating outline - outline view not active");
+				return;
+			}
+			var editor = this._inputManager.getEditor();
+			this._outlineService.emitOutline(editor.getText(), editor.getTitle());
+		},
+		setSelectedProvider: function(/** orion.serviceregistry.ServiceReference */ provider) {
 			this.providerId = provider.getProperty("id"); //$NON-NLS-0$
 			this.providerName = provider.getProperty("name"); //$NON-NLS-0$
-			if (this._onSelectedProvider) {
-				this._onSelectedProvider(provider);
-			}
+			this._outlineService.setProvider(provider);
 		},
 		setOutlineProviders: function(providers) {
+			var oldProviders = this.outlineProviders;
 			this.outlineProviders = providers;
-			this._renderHeadingAndMenu(this.outlineProviders);
+			this._updateViewModes(oldProviders, this.outlineProviders);
 		},
 		_renderOutline: function(outlineModel, title) {
-			var contentParent = lib.node("outlinerHeading"); //$NON-NLS-0$
-			if (!contentParent) {
-				this._renderHeadingAndMenu();
-			}
-			var contentNode = lib.node("outlineSectionContent"); //$NON-NLS-0$
+			var contentNode = this._parent;
 			lib.empty(contentNode);
 			outlineModel = outlineModel instanceof Array ? outlineModel : [outlineModel];
 			if (outlineModel) {
 				var treeModel = new OutlineModel(outlineModel);
 				this.explorer = new OutlineExplorer(this._serviceRegistry, this._selectionService, title);
-				this.explorer.createTree("outlineSectionContent", treeModel, {selectionPolicy: "cursorOnly", setFocus: false}); //$NON-NLS-1$ //$NON-NLS-0$
+				this.explorer.createTree(contentNode, treeModel, {selectionPolicy: "cursorOnly", setFocus: false}); //$NON-NLS-1$ //$NON-NLS-0$
 				treeModel.doExpansions(this.explorer.myTree);
 			}
 		},
-		_menuCallback: function() {
-			var choices = [];
-			for (var i=0; i < this.outlineProviders.length; i++) {
-				var provider = this.outlineProviders[i],
-				    name = provider.displayName || provider.getProperty("name") || (provider.name + provider.serviceId) || "undefined", //$NON-NLS-1$ //$NON-NLS-0$
-				    prefix = (provider.getProperty("id") === this.providerId) ? "* " : ""; //$NON-NLS-1$ //$NON-NLS-0$
-				choices.push({
-					name: prefix + name,
-					callback: this.setSelectedProvider.bind(this, provider)});
-			}
-			return choices;
-		},
-		_renderHeadingAndMenu: function(/**ServiceReference*/ outlineProviders) {
-			if (!this.outlineSection) {
-				this.outlineSection = new mSection.Section(this._parent, {
-					id: "outlinerHeading", //$NON-NLS-0$
-					title: messages["Outliner"],
-					content: '<div id="outlineSectionContent"></div>', //$NON-NLS-0$
-					useAuxStyle: true
+		/**
+		 * @param {orion.serviceregistry.ServiceReference[]} oldProviders
+		 * @param {orion.serviceregistry.ServiceReference[]} newProviders
+		 */
+		_updateViewModes: function(oldProviders, newProviders) {
+			var _self = this;
+			if (oldProviders) {
+				oldProviders.forEach(function(provider) {
+					_self._sidebar.removeViewMode("outline." + provider.getProperty("id")); //$NON-NLS-0$
 				});
-				this._commandService.registerCommandContribution(this.outlineSection.selectionNode.id, "eclipse.edit.outline.switch", 1); //$NON-NLS-0$
 			}
-			this._commandService.destroy(this.outlineSection.selectionNode.id);
-			if (outlineProviders.length > 1) {
-				this._commandService.renderCommands(this.outlineSection.selectionNode.id, this.outlineSection.selectionNode.id, {}, this, "button"); //$NON-NLS-0$
-			}
+			newProviders.forEach(function(provider) {
+				var providerId = provider.getProperty("id");
+				_self._sidebar.addViewMode("outline." + providerId, {//$NON-NLS-0$
+					label: provider.displayName || provider.getProperty("name") || (provider.name + provider.serviceId) || "undefined", //$NON-NLS-1$ //$NON-NLS-0$
+					create: _self.createViewMode.bind(_self, provider),
+					destroy: _self.destroyViewMode.bind(_self, provider)
+				});
+//				var name = provider.displayName || provider.getProperty("name") || (provider.name + provider.serviceId) || "undefined", //$NON-NLS-1$ //$NON-NLS-0$
+//				    prefix = (provider.getProperty("id") === this.providerId) ? "* " : ""; //$NON-NLS-1$ //$NON-NLS-0$
+//				choices.push({
+//					name: prefix + name,
+//					callback: this.setSelectedProvider.bind(this, provider)});
+			});
+			_self._sidebar.renderViewModeMenu();
+		},
+		createViewMode: function(provider) {
+			this.setSelectedProvider(provider);
+			this.active = true;
+			this.generateOutline();
+		},
+		destroyViewMode: function(provider) {
+			this.active = false;
+		},
+		/**
+		 * Called when the inputManager's contentType has changed, so we need to look up the capable outline providers.
+		 * @param {String} fileContentType
+		 * @param {String} title TODO this is deprecated, should be removed along with "pattern" property of outliners.
+		 */
+		setContentType: function(fileContentType, title) {
+			var allOutlineProviders = this._serviceRegistry.getServiceReferences("orion.edit.outliner"); //$NON-NLS-0$
+			var _self = this;
+			// Filter to capable providers
+			var filteredProviders = this.filteredProviders = allOutlineProviders.filter(function(serviceReference) {
+				var contentTypeIds = serviceReference.getProperty("contentType"), //$NON-NLS-0$
+				    pattern = serviceReference.getProperty("pattern"); // for backwards compatibility //$NON-NLS-0$
+				if (contentTypeIds) {
+					return contentTypeIds.some(function(contentTypeId) {
+						return _self._contentTypeRegistry.isExtensionOf(fileContentType, contentTypeId);
+					});
+				} else if (pattern && new RegExp(pattern).test(title)) {
+					return true;
+				}
+				return false;
+			});
+			// Load resource bundles
+			var deferreds = filteredProviders.map(function(provider) {
+				if(provider.getProperty("nameKey") && provider.getProperty("nls")){ //$NON-NLS-1$ //$NON-NLS-0$
+					var deferred = new Deferred();
+					var getDisplayName = function(provider, deferred, commandMessages) { //$NON-NLS-0$
+						provider.displayName = commandMessages[provider.getProperty("nameKey")]; //$NON-NLS-0$
+						deferred.resolve();
+					};
+					i18nUtil.getMessageBundle(provider.getProperty("nls")).then(getDisplayName.bind(null, provider, deferred), deferred.reject); //$NON-NLS-0$
+					return deferred;
+				} else {
+					provider.displayName = provider.getProperty("name"); //$NON-NLS-0$
+					return new Deferred().resolve();
+				}
+			});
+			Deferred.all(deferreds, function(error) { return error; }).then(function(){
+				_self._outlineService.setOutlineProviders(filteredProviders);
+				_self.setOutlineProviders(filteredProviders);
+			});
 		}
 	};
 	Outliner.prototype.constructor = Outliner;
@@ -275,9 +331,12 @@
 		this._outlinePref = this._preferences.getPreferences("/edit/outline"); //$NON-NLS-0$
 		this._provider = new Deferred();
 		this._providerResolved = false;
+
+		this.filteredProviders = [];
+		//this.setOutlineProviders(this.filteredProviders);
 	}
 	OutlineService.prototype = /** @lends orion.outliner.OutlineService.prototype */ {
-		setOutlineProviders: function(/**ServiceReference[]*/ providers) {
+		setOutlineProviders: function(/** orion.serviceregistry.ServiceReference[] */ providers) {
 			this.providers = providers;
 			// Check pref to see if user has chosen a preferred outline provider
 			var self = this;
@@ -294,7 +353,7 @@
 				}
 			});
 		},
-		setProvider: function(/**ServiceReference*/ provider) {
+		setProvider: function(/** orion.serviceregistry.ServiceReference */ provider) {
 			if (this._providerResolved) {
 				this._provider = new Deferred();
 			}
@@ -313,7 +372,6 @@
 		},
 		emitOutline: function(contents, title, providerId) {
 			var self = this;
-			
 			Deferred.when(this.getProvider(), function(provider) {
 				var progress = self._serviceRegistry.getService("orion.page.progress");
 				progress.progress(self._serviceRegistry.getService(provider).getOutline(contents, title), "Getting outline for " + title + " from " + provider.displayName).then(function(outline) {
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/settings/nls/root/messages.js b/bundles/org.eclipse.orion.client.ui/web/orion/settings/nls/root/messages.js
index 3943208..8e6b356 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/settings/nls/root/messages.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/settings/nls/root/messages.js
@@ -117,5 +117,11 @@
 	"Do you wish to enable the Key Storage?" : "Do you wish to enable the Key Storage?",

 	"general": "General",

 	"validation": "Validation",

-	"Deleted git credentials for ${0}" : "Deleted git credentials for ${0}"
+	"Deleted git credentials for ${0}" : "Deleted git credentials for ${0}",

+	"File Management" : "File Management",

+	"Autosave" : "Save",

+	"Autosave Enabled" : "Autosave Enabled",

+	"Save interval" : "Save interval (ms)",

+	"Autoload" : "Load",

+	"Autoload Enabled" : "Autoload Enabled"
 });
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/sidebar.js b/bundles/org.eclipse.orion.client.ui/web/orion/sidebar.js
new file mode 100644
index 0000000..def171b
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/sidebar.js
@@ -0,0 +1,179 @@
+/*global console define*/
+/*jslint browser:true sub:true*/
+define(['orion/Deferred', 'orion/objects', 'orion/commands', 'orion/outliner', 'orion/webui/littlelib',
+		'orion/widgets/nav/mini-nav',
+		'i18n!orion/nls/messages'],
+		function(Deferred, objects, mCommands, mOutliner, lib, MiniNavViewMode, messages) {
+	/**
+	 * @name orion.sidebar.Sidebar
+	 * @class Sidebar that appears alongside an {@link orion.editor.Editor} in the Orion IDE.
+	 * @param {Object} params
+	 * @param {orion.commandRegistry.CommandRegistry} params.commandRegistry
+	 * @param {orion.core.ContentTypeService} params.contentTypeRegistry
+	 * @param {orion.fileClient.FileClient} params.fileClient
+	 * @param {orion.editor.InputManager} params.inputManager
+	 * @param {orion.outliner.OutlineService} params.outlineService
+	 * @param {orion.progress.ProgressService} params.progressService
+	 * @param {orion.selection.Selection} params.selection
+	 * @param {orion.serviceregistry.ServiceRegistry} params.serviceRegistry
+	 * @param {Element|String} params.parent
+	 * @param {Element|String} params.toolbar
+	 */
+	function Sidebar(params) {
+		this.params = params;
+		this.commandRegistry = params.commandRegistry;
+		this.contentTypeRegistry = params.contentTypeRegistry;
+		this.editor = params.editor;
+		this.fileClient = params.fileClient;
+		this.inputManager = params.inputManager;
+		this.outlineService = params.outlineService;
+		this.parentNode = lib.node(params.parent);
+		this.toolbarNode = lib.node(params.toolbar);
+		this.selection = params.selection;
+		this.serviceRegistry = params.serviceRegistry;
+		this.viewModes = {};
+		this.activeViewMode = null;
+		this.modeContributionToolbar = null;
+		this.switcherNode = null;
+	}
+	objects.mixin(Sidebar.prototype, /** @lends orion.sidebar.Sidebar.prototype */ {
+		defaultViewMode: "nav",
+		show: function() {
+			if (this.created) {
+				return;
+			}
+			this.created = true;
+			var commandRegistry = this.commandRegistry;
+			var contentTypeRegistry = this.contentTypeRegistry;
+			var fileClient = this.fileClient;
+			var inputManager = this.inputManager;
+			var outlineService = this.outlineService;
+			var parentNode = this.parentNode;
+			var progressService = this.progressService;
+			var selection = this.selection;
+			var serviceRegistry = this.serviceRegistry;
+			var toolbarNode = this.toolbarNode;
+
+			// Create toolbar contribution area for use by viewmodes
+			var modeContributionToolbar = this.modeContributionToolbar = document.createElement("div"); //$NON-NLS-0$
+			modeContributionToolbar.id = toolbarNode.id + "childModes"; //$NON-NLS-0$
+			modeContributionToolbar.classList.add("layoutLeft"); //$NON-NLS-0$
+			modeContributionToolbar.classList.add("pageActions"); //$NON-NLS-0$
+			toolbarNode.appendChild(modeContributionToolbar);
+			var switcherNode = this.switcherNode = document.createElement("div"); //$NON-NLS-0$
+			switcherNode.classList.add("layoutRight"); //$NON-NLS-0$
+			switcherNode.classList.add("pageActions"); //$NON-NLS-0$
+			switcherNode.id = toolbarNode.id + "viewmodeSwitch"; //$NON-NLS-0$
+			toolbarNode.appendChild(switcherNode);
+
+			var changeViewModeCommand = new mCommands.Command({
+				name: messages["View"],
+				tooltip: messages["ViewTooltip"],
+				id: "orion.sidebar.viewmode", //$NON-NLS-0$
+				visibleWhen: function(item) {
+					return true;
+				},
+				choiceCallback: this.viewModeMenuCallback.bind(this)
+			});
+			commandRegistry.addCommand(changeViewModeCommand);
+			commandRegistry.registerCommandContribution(switcherNode.id, "orion.sidebar.viewmode", 1); //$NON-NLS-0$
+
+			this.addViewMode("nav", new MiniNavViewMode({ //$NON-NLS-0$
+				commandRegistry: commandRegistry,
+				contentTypeRegistry: contentTypeRegistry,
+				fileClient: fileClient,
+				inputManager: inputManager,
+				parentNode: parentNode,
+				selection: selection,
+				serviceRegistry: serviceRegistry,
+				toolbarNode: modeContributionToolbar
+			}));
+
+			// Outliner is responsible for adding its view mode(s) to this sidebar
+			this.outliner = new mOutliner.Outliner({
+				parent: parentNode,
+				toolbar: modeContributionToolbar,
+				serviceRegistry: serviceRegistry,
+				contentTypeRegistry: contentTypeRegistry,
+				outlineService: outlineService,
+				commandService: commandRegistry,
+				selectionService: selection,
+				inputManager: inputManager,
+				progressService: progressService,
+				sidebar: this
+			});
+			this.setViewMode(this.defaultViewMode);
+		},
+		/** @private */
+		viewModeMenuCallback: function() {
+			var _self = this;
+			return Object.keys(this.viewModes).map(function(modeId) {
+				var mode = _self.getViewMode(modeId);
+				return {
+					name: mode.label || modeId,
+					callback: _self.setViewMode.bind(_self, modeId)
+				};
+			});
+		},
+		addViewMode: function(id, mode) {
+			if (!id) {
+				throw new Error("Invalid id: " + id);
+			}
+			if (!mode || typeof mode !== "object") {
+				throw new Error("Invalid mode: "  + mode);
+			}
+			if (!Object.hasOwnProperty.call(this.viewModes, id)) {
+				this.viewModes[id] = mode;
+			}
+		},
+		removeViewMode: function(id) {
+			var mode = this.getViewMode(id);
+			if (mode && typeof mode.destroy === "function") {
+				mode.destroy();
+			}
+			delete this.viewModes[id];
+		},
+		getViewMode: function(id) {
+			if (Object.hasOwnProperty.call(this.viewModes, id)) {
+				return this.viewModes[id];
+			}
+			return null;
+		},
+		setViewMode: function(id) {
+			var mode = this.activeViewMode;
+			if (mode && typeof mode.destroy === "function") {
+				mode.destroy();
+			}
+			mode = this.activeViewMode = this.getViewMode(id);
+			if (mode && typeof mode.create === "function") {
+				mode.create();
+			}
+		},
+		renderViewModeMenu: function() {
+			var switcher = this.switcherNode;
+			this.commandRegistry.destroy(switcher);
+			var modes = Object.keys(this.viewModes);
+			if (modes.length > 1) {
+				this.commandRegistry.renderCommands(switcher.id, switcher, {}, this, "button"); //$NON-NLS-0$
+			}
+		}
+	});
+
+	/**
+	 * @name orion.sidebar.ViewMode
+	 * @class Interface for a view mode that can provide content to a {@link orion.sidebar.Sidebar}.
+	 */
+	/**
+	 * @name orion.sidebar.ViewMode#create
+	 * @function
+	 */
+	/**
+	 * @name orion.sidebar.ViewMode#destroy
+	 * @function
+	 */
+	/**
+	 * @name orion.sidebar.ViewMode#label
+	 * @type String
+	 */
+	return Sidebar;
+});
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/status.js b/bundles/org.eclipse.orion.client.ui/web/orion/status.js
index d6a992e..c0f7bcc 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/status.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/status.js
@@ -224,6 +224,10 @@
 				if (chunks) {

 					msgNode = document.createDocumentFragment();

 					URLUtil.processURLSegments(msgNode, chunks);

+					// All status links open in new window

+					Array.prototype.forEach.call(lib.$$("a", msgNode), function(link) { //$NON-NLS-0$

+						link.target = "_blank"; //$NON-NLS-0$

+					});

 				} else {

 					msgNode = document.createTextNode(msg);

 				}

diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/Checkbox.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/Checkbox.js
new file mode 100644
index 0000000..db3b417
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/Checkbox.js
@@ -0,0 +1,66 @@
+/*******************************************************************************

+ * @license

+ * Copyright (c) 2012 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: Anton McConville - IBM Corporation - initial API and implementation

+ ******************************************************************************/

+/*global window console define*/

+/*jslint browser:true*/

+

+define(['orion/objects', 'orion/webui/littlelib'], function(objects, lib) {

+

+	function Checkbox(options, node) {

+		objects.mixin(this, options);

+		this.node = node || document.createElement('div');

+		this.node.innerHTML = this.templateString;

+		this.myfield = lib.$('.setting-control', this.node); //$NON-NLS-0$

+	}

+	objects.mixin(Checkbox.prototype, {

+		templateString: '' +  //$NON-NLS-0$

+				'<label>' + //$NON-NLS-0$

+					'<input class="setting-control settingsCheckbox" type="checkbox"/>' + //$NON-NLS-0$

+				'</label>',  //$NON-NLS-0$

+						

+		show: function(){

+			this.myfield.addEventListener('change', this.change.bind(this)); //$NON-NLS-0$

+			this.postCreate();

+        },

+

+		destroy: function() {

+			if (this.node) {

+				lib.empty(this.node);

+				this.node = null;

+				this.myfield = null;

+			}

+		},

+

+		setStorageItem: function(){

+						

+		},

+		

+		isChecked : function(){

+			return this.myfield.checked;

+		},

+		

+		setChecked : function(value){

+			this.myfield.checked = value;

+		},

+        

+        change: function(){

+            var value = this.myfield.value;

+        },

+        

+        postCreate: function(){

+            this.myfield.style.width = '20px';

+            

+            if( this.editmode && this.editmode === 'readonly' ){ //$NON-NLS-0$

+				this.myfield.setAttribute("disabled", "disabled"); //$NON-NLS-1$ //$NON-NLS-0$

+            }

+        }

+    });

+    return Checkbox;

+});
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/DropDownMenu.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/DropDownMenu.js
new file mode 100644
index 0000000..1040514
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/DropDownMenu.js
@@ -0,0 +1,95 @@
+/*******************************************************************************

+ * @license

+ * Copyright (c) 2012 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: Anton McConville - IBM Corporation - initial API and implementation

+ ******************************************************************************/

+/*global window console define localStorage*/

+/*jslint browser:true*/

+

+define(['orion/objects', 'orion/webui/littlelib'], function(objects, lib) {

+

+	/**

+	 * @param {Object[]} param.options Array of {value:Object, label:String, selected:Boolean(optional)}

+	 */

+	 

+	function DropDownMenu( node, body ){

+

+		if( node.nodeType ){

+			this.node = node;

+		}else{

+		

+			var nodeById = document.getElementById( node );

+	

+			if( nodeById.nodeType ){

+				this.node = nodeById;

+			}else{

+				this.node = document.createElement("span");

+			}

+		}

+		

+		this.node.innerHTML = this.templateString;

+		

+		if( body.icon ){

+			this.node.className = this.node.className + ' ' + body.icon;

+			var centralNavigation = document.getElementById( 'navdropdown' );

+			centralNavigation.style.marginTop = '16px';

+		}else{

+		

+			if( body.label ){

+				var navlabel = document.getElementById( 'navigationlabel' );

+				navlabel.innerHTML = body.label;

+			}

+		}

+		

+		this.node.onclick = this.click.bind(this);	

+	}

+	

+	objects.mixin(DropDownMenu.prototype, {

+	

+		templateString: '<label id="navigationlabel" ></label><div class="dropDownContainer" id="navdropdown" style="display:none;"></div>',

+

+		click: function() {

+		

+			var centralNavigation = document.getElementById( 'navdropdown' );

+			centralNavigation.style.display = '';

+		

+			lib.addAutoDismiss([centralNavigation], function() {

+				centralNavigation.style.display = 'none'; //$NON-NLS-0$

+			});			

+		},

+		

+		addContent: function( content ){

+			this.node.children[1].innerHTML= content;

+		},

+

+		destroy: function() {

+			if (this.node) {

+				lib.empty(this.node);

+				this.node = this.select = null;

+			}

+		},

+		

+		coordinates: function(elem) {

+		   

+		   if (!elem) {

+		      return {"x":0,"y":0};

+		   }

+		   

+		   var xy={"x":elem.offsetLeft,"y":elem.offsetTop};

+		   var par=getXYpos(elem.offsetParent);

+		   

+		   for( var key in par ){

+		      xy[key]+=par[key];

+		   }

+		   

+		   return xy;

+		}

+		

+	});

+	return DropDownMenu;

+});

diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/GroupedContent.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/GroupedContent.js
new file mode 100644
index 0000000..3c30820
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/GroupedContent.js
@@ -0,0 +1,50 @@
+/*******************************************************************************
+ * @license
+ * Copyright (c) 2012 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: Anton McConville - IBM Corporation - initial API and implementation
+ ******************************************************************************/
+/*global window console define localStorage*/
+/*jslint browser:true*/
+
+define(['orion/objects', 'orion/webui/littlelib'], function(objects, lib) {
+
+	/**
+	 * @param {Object[]} param.options Array of {value:Object, label:String, selected:Boolean(optional)}
+	 */
+
+	 
+	function GroupedContent( node, body ){
+	}
+	
+	objects.mixin(GroupedContent.prototype, {
+	
+		templateString: '<div style="float:left;">' +
+							'<section>' +
+							'<span style="color:#333;padding:20px;">Navigation</span>' +
+							'<nav>' +
+								'<ul id="navigationlinks"></ul>' +
+							'</nav>' +
+							'</section>' +
+						'</div>' +
+						'<div style="float:left;border-left:1px solid #eee;">' +
+							'<section>' +
+								'<span style="color:#333;padding:20px;">Related Links</span>' +
+								'<nav>' +
+									'<ul id="relatedlinks">' +
+									'</ul>' +
+								'</nav>' +
+							'</section>' +
+						'</div>',
+		
+		getContentPane: function(){
+			return this.templateString;
+		}
+		
+	});
+	return GroupedContent;
+});
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/LabeledCheckbox.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/LabeledCheckbox.js
index b13ff9b..1b75345 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/LabeledCheckbox.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/input/LabeledCheckbox.js
@@ -1,70 +1,44 @@
 /*******************************************************************************
  * @license
- * Copyright (c) 2012 IBM Corporation and others.
+ * Copyright (c) 2013 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: Anton McConville - IBM Corporation - initial API and implementation
+ * Contributors: IBM Corporation - initial API and implementation
  ******************************************************************************/
-/*global window console define*/
+/*global orion window console define localStorage*/
 /*jslint browser:true*/
 
-define(['orion/objects', 'orion/webui/littlelib'], function(objects, lib) {
+define(['orion/objects', 'orion/webui/littlelib', 'orion/widgets/input/Checkbox'],  function(objects, lib, Checkbox) {
 
-	function LabeledCheckbox(options, node) {
-		objects.mixin(this, options);
-		this.node = node || document.createElement('div');
+	/**
+	 * This is just an orion/widgets/input/Select with a label.
+	 */
+	function LabeledCheckbox( params, node ){
+		Checkbox.apply(this, arguments);
+		this.mylabel = lib.$(".setting-label", this.node); //$NON-NLS-0$
 	}
-	objects.mixin(LabeledCheckbox.prototype, {
+	objects.mixin(LabeledCheckbox.prototype, Checkbox.prototype, {
 		templateString: '' +  //$NON-NLS-0$
-				'<label>' + //$NON-NLS-0$
-					'<span class="setting-label"></span>' + //$NON-NLS-2$ //$NON-NLS-0$
-					'<input class="setting-control settingsCheckbox" type="checkbox"/>' + //$NON-NLS-0$
-				'</label>',  //$NON-NLS-0$
-						
-		show: function(){
-			this.node.innerHTML = this.templateString;
-			this.mylabel = lib.$('.setting-label', this.node); //$NON-NLS-0$
-			this.myfield = lib.$('.setting-control', this.node); //$NON-NLS-0$
-			this.myfield.addEventListener('change', this.change.bind(this)); //$NON-NLS-0$
-			this.postCreate();
-        },
+			'<label>' + //$NON-NLS-0$
+				'<span class="setting-label"></span>' + //$NON-NLS-2$ //$NON-NLS-0$
+				'<input class="setting-control settingsCheckbox" type="checkbox"/>' + //$NON-NLS-0$
+			'</label>',  //$NON-NLS-0$
+
+		postCreate: function() {
+			Checkbox.prototype.postCreate.call(this);
+			this.mylabel.textContent = this.fieldlabel + ':'; //$NON-NLS-0$
+		},
 
 		destroy: function() {
-			if (this.node) {
-				lib.empty(this.node);
-				this.node = null;
+			Checkbox.prototype.destroy.call(this);
+			if (this.mylabel) {
 				this.mylabel = null;
-				this.myfield = null;
 			}
-		},
+		}
+	});
 
-		setStorageItem: function(){
-						
-		},
-		
-		isChecked : function(){
-			return this.myfield.checked;
-		},
-		
-		setChecked : function(value){
-			this.myfield.checked = value;
-		},
-        
-        change: function(){
-            var value = this.myfield.value;
-        },
-        
-        postCreate: function(){
-            this.mylabel.textContent = this.fieldlabel + ':'; //$NON-NLS-0$
-            this.myfield.style.width = '20px';
-            
-            if( this.editmode && this.editmode === 'readonly' ){ //$NON-NLS-0$
-				this.myfield.setAttribute("disabled", "disabled"); //$NON-NLS-1$ //$NON-NLS-0$
-            }
-        }
-    });
-    return LabeledCheckbox;
+	return LabeledCheckbox;
 });
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/nav/mini-nav.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/nav/mini-nav.js
new file mode 100644
index 0000000..577868a
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/nav/mini-nav.js
@@ -0,0 +1,193 @@
+/*******************************************************************************
+ * @license
+ * Copyright (c) 2013 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 define*/
+/*jslint sub:true*/
+define(['require', 'i18n!orion/nls/messages', 'orion/objects', 'orion/webui/littlelib', 'orion/explorers/explorer-table',
+	'orion/explorers/navigatorRenderer', 'orion/i18nUtil', 'orion/keyBinding', 'orion/fileCommands', 'orion/extensionCommands', 'orion/selection'
+	],
+	function(require, messages, objects, lib, mExplorer, mNavigatorRenderer, i18nUtil, mKeyBinding, FileCommands, ExtensionCommands, Selection) {
+	var FileExplorer = mExplorer.FileExplorer;
+	var KeyBinding = mKeyBinding.KeyBinding;
+	var NavigatorRenderer = mNavigatorRenderer.NavigatorRenderer;
+
+	function MiniNavExplorer(params) {
+		params.setFocus = false;
+		FileExplorer.apply(this, arguments);
+		this.commandRegistry = params.commandRegistry;
+		this.inputManager = params.inputManager;
+		this.progressService = params.progressService;
+		this.toolbarNode = params.toolbarNode;
+		this.actions = null;
+		this.selectionActions = null;
+		var _self = this;
+		this.inputManager.addEventListener("InputChanged", function(event) { //$NON-NLS-0$
+			_self.load(event.metadata);
+		});
+		this.selection = new Selection.Selection(this.registry, "miniNavFileSelection"); //$NON-NLS-0$
+		this.selection.addEventListener("selectionChanged", function(event) { //$NON-NLS-0$
+			_self.updateCommands(event.selections);
+		});
+		this.createToolbars();
+		this.commandsRegistered = this.registerCommands();
+	}
+	MiniNavExplorer.prototype = Object.create(FileExplorer.prototype);
+	objects.mixin(MiniNavExplorer.prototype, {
+		createToolbars: function() {
+			if (!this.actions) {
+				var actions = this.actions = document.createElement("div"); //$NON-NLS-0$
+				actions.id = this.toolbarNode.id + "Actions"; //$NON-NLS-0$
+				this.toolbarNode.appendChild(actions);
+			}
+			if (!this.selectionActions) {
+				var selectionActions = this.selectionActions = document.createElement("div"); //$NON-NLS-0$
+				selectionActions.id = this.toolbarNode.id + "SelectionActions"; //$NON-NLS-0$
+				this.toolbarNode.appendChild(selectionActions);
+			}
+		},
+		/**
+		 * Override {@link orion.explorers.FileExplorer#load} to load the parent directory of the given file
+		 */
+		load: function(fileMetadata) {
+			this.createToolbars();
+			var parent = fileMetadata && fileMetadata.Parents && fileMetadata.Parents[0];
+			var rootPromise;
+			if (parent) {
+				rootPromise = this.fileClient.read(parent.ChildrenLocation, true);
+				var _self = this;
+				this.commandsRegistered.then(function() {
+					FileExplorer.prototype.load.call(_self, rootPromise);
+				});
+//				rootPromise.then(function() {
+//					_self.updateCommands();
+//				});
+			} else {
+				console.log("Could not get parent directory");
+				console.log(fileMetadata);
+			}
+		},
+		scopeUp: function() {
+			var root = this.treeRoot, parents = root && root.Parents;
+			if (parents){
+				if (parents.length === 0) {
+					// TODO goto top
+				} else if (parents[0].ChildrenLocation) {
+					// TODO load it
+				}
+			}
+		},
+		// Returns a deferred that completes once file command extensions have been processed
+		registerCommands: function() {
+			// Selection based command contributions in sidebar mini-nav
+			var commandRegistry = this.commandRegistry, fileClient = this.fileClient, serviceRegistry = this.registry;
+			var selectionActionsId = this.selectionActions.id;
+			commandRegistry.addCommandGroup(selectionActionsId, "orion.miniNavSelectionGroup", 100, messages["Actions"]);
+
+			var renameBinding = new KeyBinding(113);
+			renameBinding.domScope = "sidebar"; //$NON-NLS-0$
+			renameBinding.scopeName = "Navigator"; //$NON-NLS-0$
+			var delBinding = new KeyBinding(46);
+			delBinding.domScope = "sidebar"; //$NON-NLS-0$
+			delBinding.scopeName = "Navigator"; //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "orion.makeFavorite", 1, "orion.miniNavSelectionGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "eclipse.renameResource", 2, "orion.miniNavSelectionGroup", false, renameBinding); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "eclipse.copyFile", 3, "orion.miniNavSelectionGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "eclipse.moveFile", 4, "orion.miniNavSelectionGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "eclipse.deleteFile", 5, "orion.miniNavSelectionGroup", false, delBinding); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "eclipse.compareWithEachOther", 6, "orion.miniNavSelectionGroup");  //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "eclipse.compareWith", 7, "orion.miniNavSelectionGroup");  //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "orion.importZipURL", 1, "orion.miniNavSelectionGroup/orion.importExportGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "orion.import", 2, "orion.miniNavSelectionGroup/orion.importExportGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "eclipse.downloadFile", 3, "orion.miniNavSelectionGroup/orion.importExportGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "orion.importSFTP", 4, "orion.miniNavSelectionGroup/orion.importExportGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsId, "eclipse.exportSFTPCommand", 5, "orion.miniNavSelectionGroup/orion.importExportGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+//			ExtensionCommands.createAndPlaceFileCommandsExtension(serviceRegistry, commandRegistry, this, actions.id, selectionActions.id, "orion.miniNavSelectionGroup"); //$NON-NLS-0$
+			return ExtensionCommands.createAndPlaceFileCommandsExtension(serviceRegistry, commandRegistry, selectionActionsId, 0, "orion.miniNavSelectionGroup", true);
+		},
+		updateCommands: function(selections) {
+			var toolbar = this.toolbarNode, actions = this.actions, selectionActions = this.selectionActions;
+			var commandRegistry = this.commandRegistry, fileClient = this.fileClient, serviceRegistry = this.registry;
+			if (actions) {
+				commandRegistry.destroy(actions);
+			} else {
+				actions = this.actions = document.createElement("div"); //$NON-NLS-0$
+				actions.id = toolbar.id + "actions"; //$NON-NLS-0$
+				toolbar.appendChild(actions);
+			}
+			if (selectionActions) {
+				commandRegistry.destroy(selectionActions);
+			} else {
+				selectionActions = this.selectionActions = document.createElement("div"); //$NON-NLS-0$
+				selectionActions.id = toolbar.id + "selectionActions"; //$NON-NLS-0$
+				toolbar.appendChild(selectionActions);
+			}
+//			var explorer = this;
+//			FileCommands.createFileCommands(serviceRegistry, commandRegistry, explorer, fileClient);
+//			ExtensionCommands.createAndPlaceFileCommandsExtension(serviceRegistry, commandRegistry, selectionActions.id, 0, "orion.miniNavSelectionGroup");  //$NON-NLS-0$
+//			commandRegistry.renderCommands(selectionActions.id, selectionActions, selections, this, "button"); //$NON-NLS-0$
+			commandRegistry.renderCommands(actions.id /*scope*/, this.toolbarNode /*parent*/, this.treeRoot /*items*/, this /*handler??*/, "button"); //$NON-NLS-0$
+		}
+	});
+
+	function MiniNavRenderer() {
+		NavigatorRenderer.apply(this, arguments);
+	}
+	MiniNavRenderer.prototype = Object.create(NavigatorRenderer.prototype);
+	MiniNavRenderer.prototype.showFolderLinks = true;
+//	MiniNavRenderer.prototype.folderLink = require.toUrl("navigate/table.html"); //$NON-NLS-0$
+	MiniNavRenderer.prototype.oneColumn = true;
+
+	/**
+	 * @name orion.sidebar.MiniNavViewMode
+	 * @class
+	 */
+	function MiniNavViewMode(params) {
+		this.commandRegistry = params.commandRegistry;
+		this.contentTypeRegistry = params.contentTypeRegistry;
+		this.fileClient = params.fileClient;
+		this.inputManager = params.inputManager;
+		this.parentNode = params.parentNode;
+		this.toolbarNode = params.toolbarNode;
+//		this.selection = params.selection;
+		this.serviceRegistry = params.serviceRegistry;
+		this.explorer = null;
+	}
+	objects.mixin(MiniNavViewMode.prototype, {
+		label: messages["Navigator"],
+		create: function() {
+			if (this.explorer) {
+				this.explorer.load(this.inputManager.getFileMetadata());
+				return;
+			}
+			var _self = this;
+			this.explorer = new MiniNavExplorer({
+				commandRegistry: this.commandRegistry,
+				fileClient: this.fileClient,
+				inputManager: this.inputManager,
+				parentId: this.parentNode,
+				rendererFactory: function(explorer) {
+					var renderer = new MiniNavRenderer({
+						checkbox: false,
+						cachePrefix: "MiniNav"}, explorer, _self.commandRegistry, _self.contentTypeRegistry); //$NON-NLS-0$
+					return renderer;
+				},
+//				selection: this.selection,
+				serviceRegistry: this.serviceRegistry,
+				toolbarNode: this.toolbarNode
+			});
+			// on initial creation we wait for an InputChanged event from inputManager -- possible race condition between rendering of Explorer and the InputChanged
+		},
+		destroy: function() {
+			lib.empty(this.parentNode);
+		}
+	});
+
+	return MiniNavViewMode;
+});
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/settings/EditorSettings.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/settings/EditorSettings.js
new file mode 100644
index 0000000..d3b8ffc
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/settings/EditorSettings.js
@@ -0,0 +1,120 @@
+/*globals define*/

+

+define("orion/widgets/settings/EditorSettings", //$NON-NLS-0$

+[

+	'require', //$NON-NLS-0$

+	'orion/util', //$NON-NLS-0$

+	'orion/objects', //$NON-NLS-0$

+	'orion/webui/littlelib', //$NON-NLS-0$

+	'i18n!orion/settings/nls/messages', //$NON-NLS-0$ 

+	'orion/widgets/input/LabeledTextfield', 'orion/widgets/input/LabeledCheckbox',  //$NON-NLS-0$  //$NON-NLS-1$ 

+	'orion/widgets/settings/Subsection', //$NON-NLS-0$ 

+	'orion/commands'//$NON-NLS-0$ 

+], function(require, util, objects, lib, messages,LabeledTextfield, LabeledCheckbox, Subsection, commands)  {

+

+	function EditorSettings(options, node) {

+		objects.mixin(this, options);

+		this.node = node;

+		this._editorPref = options.preferences; //$NON-NLS-0$

+	}

+	objects.mixin( EditorSettings.prototype, {

+		// TODO these should be real Orion sections, not fake DIVs

+		templateString: '' +  //$NON-NLS-0$

+				'<div>' +  //$NON-NLS-0$

+					'<div class="sectionWrapper toolComposite">' + //$NON-NLS-0$

+						'<div class="sectionAnchor sectionTitle layoutLeft">${File Management}</div>' +  //$NON-NLS-0$

+						'<div id="editorCommands" class="layoutRight sectionActions"></div>' + //$NON-NLS-0$

+					'</div>' + //$NON-NLS-0$

+					'<div class="sections">' + //$NON-NLS-0$

+					

+					'</div>' + //$NON-NLS-0$

+					'<div></div>' + //$NON-NLS-0$ 

+					

+				'</div>', //$NON-NLS-0$

+		createElements: function() {

+			this.node.innerHTML = this.templateString;

+			lib.processTextNodes(this.node, messages);

+			this.sections = lib.$('.sections', this.node); //$NON-NLS-0$

+			this.createSections();

+		},

+		createSections: function(){

+			/* - autossave ----------------------------------------------------- */

+			this.autoSaveFields = [

+				new LabeledCheckbox( {fieldlabel:messages['Autosave Enabled']}),

+				new LabeledTextfield( {fieldlabel:messages['Save interval']})

+			];

+			var autoSaveSubsection = new Subsection( {sectionName: messages['Autosave'], parentNode: this.sections, children: this.autoSaveFields} );

+			autoSaveSubsection.show();

+		

+		

+			/* - autoload ---------------------------------------------------- */

+			this.autoLoadFields = [

+				new LabeledCheckbox( {fieldlabel:messages['Autoload Enabled']}) //$NON-NLS-0$

+			];

+			var autoLoadSubsection = new Subsection( {sectionName:messages['Autoload'], parentNode: this.sections, children: this.autoLoadFields } );

+			autoLoadSubsection.show();

+			

+			var updateCommand = new commands.Command({

+				name: messages["Update"],

+				tooltip: messages["Update Editor Settings"],

+				id: "orion.updateeditorsettings", //$NON-NLS-0$

+				callback: function(data){

+					this.update(data.items);

+				}.bind(this)

+			});

+			

+			

+			this.commandService.addCommand(updateCommand);

+			this.commandService.registerCommandContribution('editorSettingCommand', "orion.updateeditorsettings", 1); //$NON-NLS-1$ //$NON-NLS-0$

+			this.commandService.renderCommands('editorSettingCommand', lib.node( 'editorCommands' ), this, this, "button"); //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$		

+					

+		},

+		valueChanged: function() {

+			var currentPrefs = {

+				autoLoadEnabled: this.autoLoadFields[0].isChecked(),

+				autoSaveEnabled: this.autoSaveFields[0].isChecked(),

+				autoSaveTimeout: this.autoSaveFields[1].getValue()

+			};

+			for (var prop in currentPrefs) {

+				if (currentPrefs.hasOwnProperty(prop)) {

+					if (currentPrefs[prop] !== this.oldPrefs[prop]) {

+						return currentPrefs;

+					}

+				}

+			}

+			return undefined;

+		},

+		update: function() {

+			var messageService = this.registry.getService("orion.page.message"); //$NON-NLS-0$

+			

+			var currentPrefs = this.valueChanged();

+			if (currentPrefs) {

+				var timeOut = this.autoSaveFields[1].getValue();

+				if (!isNaN(parseFloat(timeOut)) && isFinite(timeOut)) {

+					this._editorPref.setPrefs(currentPrefs, function (){ 

+						messageService.setProgressResult( {Message:"Editor preferences updated",Severity:"Normal"} ); 

+					});

+				} else {

+					messageService.setProgressResult( {Message:"Invalid save interval.",Severity:"Error"} );

+					this.autoSaveFields[1].setValue(this.oldAutoInterval);

+				}

+			}

+		},

+		show: function() {

+			this.createElements();

+			this._editorPref.getPrefs(function (editorPrefs) {

+				this.oldPrefs = editorPrefs;

+				this.autoLoadFields[0].setChecked(editorPrefs.autoLoadEnabled);

+				this.autoSaveFields[0].setChecked(editorPrefs.autoSaveEnabled);

+				this.autoSaveFields[1].setValue(editorPrefs.autoSaveTimeout);

+			}.bind(this));

+		},

+		destroy: function() {

+			if (this.node) {

+				this.node = null;

+			}

+		}

+	});

+	

+	return EditorSettings;

+});
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/settings/SettingsContainer.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/settings/SettingsContainer.js
index 75eefcb..ee1a6b2 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/settings/SettingsContainer.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/settings/SettingsContainer.js
@@ -23,9 +23,12 @@
 		'orion/widgets/themes/container/ThemeData', 

 		'orion/widgets/settings/SplitSelectionLayout',

 		'orion/widgets/plugin/PluginList',

-		'orion/widgets/settings/UserSettings'

+		'orion/widgets/settings/UserSettings',

+		'orion/widgets/settings/EditorSettings',

+		'edit/editorPreferences'

 		], function(messages, require, mGlobalCommands, PageUtil, lib, objects, URITemplate, 

-			ThemeBuilder, SettingsList, mThemePreferences, editorThemeData, containerThemeData, SplitSelectionLayout, PluginList, UserSettings) {

+			ThemeBuilder, SettingsList, mThemePreferences, editorThemeData, containerThemeData, SplitSelectionLayout, PluginList, UserSettings, 

+			EditorSettings, mEditorPreferences) {

 

 	/**

 	 * @param {Object} options

@@ -52,6 +55,11 @@
 				show: this.showEditorThemeBuilder

 			},

 			{

+				id: "editorSettings", //$NON-NLS-0$

+				textContent: 'Editor Settings', // messages["Themes"],

+				show: this.showEditorSettings

+			},

+			{

 				id: "plugins", //$NON-NLS-0$

 				textContent: messages["Plugins"],

 				show: this.showPlugins

@@ -162,6 +170,35 @@
 			this.editorThemeWidget.renderData( themeNode, 'INITIALIZE' );

 		},

 		

+		showEditorSettings: function(id){

+		

+			this.selectCategory(id);

+

+			lib.empty(this.table);

+

+			if (this.editorSettingWidget) {

+				this.editorSettingWidget.destroy();

+			}

+

+			this.updateToolbar(id);

+			

+			var editorSettingsNode = document.createElement('div'); //$NON-NLS-0$

+			this.table.appendChild(editorSettingsNode);

+			

+			var editorPreferences = new mEditorPreferences.EditorPreferences (this.preferences);

+			

+			this.editorSettings = new EditorSettings({

+				registry: this.registry,

+				preferences: editorPreferences,

+				statusService: this.preferencesStatusService,

+				dialogService: this.preferenceDialogService,

+				commandService: this.commandService,

+				userClient: this.userClient

+			}, editorSettingsNode);

+			

+			this.editorSettings.show();

+		},

+		

 		showUserSettings: function(id){

 		

 			this.selectCategory(id);

diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/ThemePreferences.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/ThemePreferences.js
index 02785e4..889cd6a 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/ThemePreferences.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/ThemePreferences.js
@@ -15,7 +15,8 @@
 	function ThemePreferences(preferences, themeData) {
 		this._preferences = preferences;
 		this._themeData = themeData;
-		var storageKey = preferences.listenForChangedSettings(function(e) {
+		var themeInfo = themeData.getThemeStorageInfo();
+		var storageKey = preferences.listenForChangedSettings(themeInfo.storage, 2, function(e) {
 			if (e.key === storageKey) {
 				this.apply();
 			}
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/container/ThemeSheetWriter.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/container/ThemeSheetWriter.js
index 7581906..e277e32 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/container/ThemeSheetWriter.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/container/ThemeSheetWriter.js
@@ -321,7 +321,7 @@
 			auxpane.style.background ='-moz-linear-gradient(top, ' + this.sidepanel + ' 0%, ' + this.sidepanel + ' 100%)';

 			auxpane.style.overflowX = 'auto';

 			auxpane.style.minWidth = '200px';

-			auxpane.style.paddingTop = '16px';

+			/*auxpane.style.paddingTop = '16px';*/

 			

 			styles.push( auxpane );

 			

diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/editor/MiniThemeChooser.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/editor/MiniThemeChooser.js
index 8f6bb4c11..11fe56d 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/editor/MiniThemeChooser.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/themes/editor/MiniThemeChooser.js
@@ -11,11 +11,12 @@
 /*global orion window console define localStorage*/

 /*jslint browser:true*/

 

-define(['i18n!orion/settings/nls/messages', 'orion/widgets/input/Select'], 

-	function(messages, Select ) {

+define(['i18n!orion/settings/nls/messages', 'orion/widgets/input/Select', 'orion/widgets/input/Checkbox'], 

+	function(messages, Select, Checkbox) {

 

-		function MiniThemeChooser(preferences){			

+		function MiniThemeChooser(preferences, editorPrefs){			

 			this.preferences = preferences;

+			this.editorPreferences = editorPrefs;

 		}

 		

 		MiniThemeChooser.prototype.template =	'<div id="themeContainer">' +

@@ -27,6 +28,10 @@
 														'<span class="settingsPanelLabel">Font Size:</span>' + 

 														'<div id="fontsizepicker"></div>' +

 													'</div>' +

+													'<div id="autoSavecontainer">' +

+														'<span class="settingsPanelLabel">AutoSave:</span>' + 

+														'<div id="autosavecheck"></div>' +

+													'</div>' +

 												'</div>';

 												

 		function isDescendant(parent, child) {

@@ -71,8 +76,9 @@
 			node.innerHTML = this.template;

 			this.preferences.getTheme(function(themeStyles) {

 				this.addFontSizePicker(themeStyles);

-				this.addThemePicker(themeStyles);		

+				this.addThemePicker(themeStyles);	

 			}.bind(this));

+			this.addAutoSave();

 		}

 		

 		MiniThemeChooser.prototype.appendTo = appendTo;	

@@ -140,6 +146,25 @@
 		

 		MiniThemeChooser.prototype.addThemePicker = addThemePicker;

 		

+		function addAutoSave(){

+			var check = document.getElementById( 'autosavecheck' ); //$NON-NLS-0$

+			this.autoSaveCheck = new Checkbox({}, check); //$NON-NLS-0$

+			

+			this.editorPreferences.getPrefs(function (editorPrefs) {

+				this.editorPrefs = editorPrefs;

+				this.autoSaveCheck.setChecked(editorPrefs.autoSaveEnabled);

+			}.bind(this));

+

+

+			this.autoSaveCheck.myfield.addEventListener('change', function () { //$NON-NLS-0$

+				this.editorPrefs.autoSaveEnabled = this.autoSaveCheck.myfield.checked;

+				this.editorPreferences.setPrefs(this.editorPrefs);

+			}.bind(this));

+			this.autoSaveCheck.show();

+		}

+		

+		MiniThemeChooser.prototype.addAutoSave = addAutoSave;

+		

 		function destroy(){}

 		

 		MiniThemeChooser.prototype.destroy = destroy;

diff --git a/bundles/org.eclipse.orion.client.ui/web/plugins/filePlugin/fileImpl.js b/bundles/org.eclipse.orion.client.ui/web/plugins/filePlugin/fileImpl.js
index fd457a4..23fd285 100644
--- a/bundles/org.eclipse.orion.client.ui/web/plugins/filePlugin/fileImpl.js
+++ b/bundles/org.eclipse.orion.client.ui/web/plugins/filePlugin/fileImpl.js
@@ -84,12 +84,7 @@
 				newKeyword = encodeURIComponent(newKeyword);
 			}
 		}
-		var searchLocation = searchParams.resource;
-		var relativePath = searchLocation.indexOf("/file");
-		if( relativePath > 0){//If the search location does not start with /file, then we need to make the relative path starting with /file
-			searchLocation = searchLocation.substring(relativePath);
-		}
-		return "?" + "sort=" + newSort + "&rows=" + searchParams.rows + "&start=" + searchParams.start + "&q=" + newKeyword + "+Location:" + searchLocation + "*";
+		return "?" + "sort=" + newSort + "&rows=" + searchParams.rows + "&start=" + searchParams.start + "&q=" + newKeyword + "+Location:" + searchParams.resource + "*";
 	}
 	
 	/**