Merge commit '5f3d07ac96ed87ec03c7b5f7b57c0e3356fcc6c3'
diff --git a/bundles/org.eclipse.orion.client.core/web/css/ide.css b/bundles/org.eclipse.orion.client.core/web/css/ide.css
index 3e1ae21..5079092 100644
--- a/bundles/org.eclipse.orion.client.core/web/css/ide.css
+++ b/bundles/org.eclipse.orion.client.core/web/css/ide.css
@@ -258,17 +258,6 @@
     padding-bottom: 8px;
 }
 
-.claro .dijitBorderContainer {
-	border: 0;
-	padding: 0;
-}
-
-.claro .dijitContentPane {
-	padding: 0;
-	margin: 0;
-	outline: 0;
-}
-
 .claro .dijitDialogTitleBar {
     background: white;
     color: black;
@@ -276,35 +265,6 @@
     outline: 0 none;
     padding: 5px 6px 3px;
 }
-
-/* splitters */
-
-.claro .dijitSplitterV, .claro .dijitGutterV {
-  background: #e3e3e3;
-  width: 3px;
-  border: 0;
-  padding: 0;
-  margin: 0;
-}
-
-.claro .dijitSplitterVActive {
-  font-size: 1px;
-  background-color: #cccccc;
-}
-
-.claro .dijitSplitterV .dijitSplitterThumb {	
-  background-color: #bbbbbb;
-  height: 16px;
-  left: 0px;
-  width: 3px;
-  margin: 0;
-  padding: 0;
-  cursor: pointer;
-}
-
-.claro .dijitSplitterVHover .dijitSplitterThumb {
-  background: #a0a0a0;
-}
  
 .help {
 	font-weight: bold;
@@ -393,42 +353,11 @@
 	background: inherit;
 }
 
-.toolbar {
-	vertical-align: middle;
-	min-height: 32px;
-	width: 100%;
-	color: #222;
-	border-bottom: 1px solid whitesmoke;
-}
-
-.auxToolbar {
-    background: #f8f8f8;
- 	min-height: 32px;
-	width: 100%;
-	color: #222222;
-	border-bottom: 1px solid #e4e4e4;
-}
-
-.mainToolbar {
- 	height: 31px;
- 	background: #ffffff;
-	border-bottom: 1px solid #ebebeb;
-}
-
-.pageTitle {
-	font-size: 13px;
-	vertical-align: top;
-	margin-top:4px;
-	font-weight:bold;
-	color: #666666;
-}
-
 .footer {
 	text-align: left;
 	width: 100%;
 	border: 0;
 	padding: 0;
-	min-height: 2.5em; 
 	border-top: 1px solid #dbdbdb
 }
 
@@ -494,23 +423,12 @@
 	border: 1px solid #808080;
 }
 
-
-
 .toolbarButton {
 	border: 0;
 	padding: 0;
 	height: 20px;
 }
 
-.toolbarTest {
-/*	background: #fff url("../images/titleBarTest.png")  repeat-x top left; */
-	border:1px solid #bfbfbf;
-	cursor: default;
-	font-size: 0.9em;
-	font-weight: bold;
-	color: #6d6d6d;
-}
-
 .searchFloat {
 	display: none;
 	background: #ffffe0;
@@ -712,22 +630,6 @@
 	white-space: nowrap; /*wrapping makes indented list hard to read*/
 }
 
-.test-passed {
-	background-color: #11FF11;
-}
-
-.test-failed {
-	background-color: #FF1111;
-}
-
-#test-overview {
-	margin: 8px;
-}
-
-#test-tree {
-	margin: 8px;
-}
-
 .uploadContainer{
 	padding:20px;
 	font-weight:bold;
diff --git a/bundles/org.eclipse.orion.client.core/web/css/layout.css b/bundles/org.eclipse.orion.client.core/web/css/layout.css
index b78cf2c..04d2941 100644
--- a/bundles/org.eclipse.orion.client.core/web/css/layout.css
+++ b/bundles/org.eclipse.orion.client.core/web/css/layout.css
@@ -4,11 +4,6 @@
 of the room.  A page always has a fixed header but may have a fluid footer (at the bottom of content) or

 a fixed footer on the bottom of the page.

 

-There are implied variables here.

-Footer height: 28px

-Toolbar height: 31px

-Header height: 60px

-

 The transition delays used for splitter animation (0.5) have a relationship with the animation delay used

 by the splitter bar.  If these values change, then change the delay in the splitter.

 

@@ -16,15 +11,35 @@
 under 100 are used to achieve layering of the header, footer, and splitters.

 */

 

+/*

+There are implied LESS variables here, for now set up as layout classes that live here and refer to the

+hard-coded numbers elsewhere.

+*/

+

+/* $HeaderHeight */

+.headerLayout {

+	height: 60px;

+}

+

+/* $FooterHeight */

+.footerLayout {

+	height: 28px;

+}

+

+/* $ToolbarHeight */

+.toolbarLayout {

+	height: 31px;

+}

+

 .content-fixedHeight {

 	clear: both;

 	overflow: hidden;

     position: absolute;

-    top: 60px;  /* header height */

+    top: 60px;  /* $HeaderHeight */

     bottom: 0;

     left: 0;

     width: 100%;

-	margin-bottom: 28px;  /* footer height */   

+	margin-bottom: 28px;  /* $FooterHeight */   

 }

 

 .content-fixedHeight-maximized {

@@ -35,14 +50,6 @@
 .content-fluid {

 }

 

-.nav-fixed-top {

-	position: fixed;

-	top: 0;

-	z-index: 50;

-	right: 0;

-	left: 0;

-}

-

 .footer-fixed-bottom {

 	position: fixed;

 	bottom: 0;

@@ -141,7 +148,7 @@
 

 .toolbarTarget {

 	position: absolute;

-	top: 32px;

+	top: 32px;  /* $ToolbarHeight + 1 */

  	width: 100%;

  	bottom: 0;

  	overflow-y: auto;

diff --git a/bundles/org.eclipse.orion.client.core/web/css/theme.css b/bundles/org.eclipse.orion.client.core/web/css/theme.css
index 553cc06..77864a5 100644
--- a/bundles/org.eclipse.orion.client.core/web/css/theme.css
+++ b/bundles/org.eclipse.orion.client.core/web/css/theme.css
@@ -152,9 +152,13 @@
 

 .mainpane {

 	border: 0;

-	background: #ffffff;

+	background: white;

 }

 

+.mainToolbar {

+ 	background: #ffffff;

+	border-bottom: 1px solid #ebebeb;

+}

 

 /* 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

@@ -294,6 +298,7 @@
 /* dijit overrides related to theming */

 /* dijit theme overrides per graphic designer.  Mostly affecting drop down and menu appearance and hovers */

 /* buttons */

+

 .claro .dijitButton .dijitButtonNode,

 .claro .dijitDropDownButton .dijitButtonNode,

 .claro .dijitComboButton .dijitButtonNode,

diff --git a/bundles/org.eclipse.orion.client.core/web/orion/breadcrumbs.js b/bundles/org.eclipse.orion.client.core/web/orion/breadcrumbs.js
index e879af5..b9036bc 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/breadcrumbs.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/breadcrumbs.js
@@ -139,7 +139,7 @@
 			} 
 			// if we had no resource, or had no parents, we need some kind of current location in the breadcrumb
 			if (crumbs.childNodes.length === 0) {
-				seg = document.createElement('a'); //$NON-NLS-0$
+				seg = document.createElement('span'); //$NON-NLS-0$
 				dojo.place(document.createTextNode(firstSegmentName || document.title), seg, "only"); //$NON-NLS-0$
 				dojo.addClass(seg, "breadcrumb"); //$NON-NLS-0$
 				dojo.addClass(seg, "currentLocation"); //$NON-NLS-0$
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/commands.js b/bundles/org.eclipse.orion.client.core/web/orion/commands.js
index 36c7f44..343ed57 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/commands.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/commands.js
@@ -13,6 +13,8 @@
  
 define(['i18n!orion/nls/messages', 'require', 'dojo', 'dijit', 'orion/util', 'orion/PageUtil', 'orion/navigationUtils', 'dijit/Menu', 'dijit/form/DropDownButton', 'dijit/MenuItem', 'dijit/PopupMenuItem', 'dijit/MenuSeparator', 'dijit/Tooltip', 'dijit/TooltipDialog' ], function(messages, require, dojo, dijit, mUtil, PageUtil, mNavUtils){
 
+	var isMac = window.navigator.platform.indexOf("Mac") !== -1; //$NON-NLS-0$
+
 	/*
 	 * stateless helper function
 	 */
@@ -242,35 +244,76 @@
 			this._serviceRegistration = this._registry.registerService("orion.page.command", this); //$NON-NLS-0$
 			this._defaultSelectionService = options.selection;
 			dojo.connect(window.document, "onkeydown", dojo.hitch(this, function (evt){ //$NON-NLS-0$
-				evt = evt || window.event;
-				// bindings are ignored if we are in a text field or editor
-				if (evt.target.contentEditable === "true") { //$NON-NLS-0$
-					return;
-				}
-				var tagType = evt.target.nodeName.toLowerCase();
-				if (tagType === 'input') { //$NON-NLS-0$
-					var inputType = evt.target.type.toLowerCase();
-					// Any HTML5 input type that involves typing text should be ignored
-					switch (inputType) {
-						case "text": //$NON-NLS-0$
-						case "password": //$NON-NLS-0$
-						case "search": //$NON-NLS-0$
-						case "color": //$NON-NLS-0$
-						case "date": //$NON-NLS-0$
-						case "datetime": //$NON-NLS-0$
-						case "datetime-local": //$NON-NLS-0$
-						case "email": //$NON-NLS-0$
-						case "month": //$NON-NLS-0$
-						case "number": //$NON-NLS-0$
-						case "range": //$NON-NLS-0$
-						case "tel": //$NON-NLS-0$
-						case "time": //$NON-NLS-0$
-						case "url": //$NON-NLS-0$
-						case "week": //$NON-NLS-0$
-							return;
+				function isContentKey(e) {
+					// adapted from handleKey in http://git.eclipse.org/c/platform/eclipse.platform.swt.git/plain/bundles/org.eclipse.swt/Eclipse%20SWT%20Custom%20Widgets/common/org/eclipse/swt/custom/StyledText.java
+					if (isMac) {
+						// COMMAND+ALT combinations produce characters on the mac, but COMMAND or COMMAND+SHIFT do not.
+						if (e.metaKey && !e.altKey) {
+							return false;
+						}
+					} else {
+						// CTRL or ALT combinations are not characters, however both of them together (CTRL+ALT)
+						// are the Alt Gr key on some keyboards.  See Eclipse bug 20953. If together, they might
+						// be a character.
+						if (e.ctrlKey && !e.altKey) {
+							return false;
+						}
+						if (e.altKey && !e.ctrlKey) {
+							return false;
+						}
 					}
-				} else if (tagType === 'textarea') { //$NON-NLS-0$
-					return;
+					if (e.char) {
+						return e.char.length > 0;  // empty string for non characters
+					} else if (e.charCode || e.keyCode) {
+						var keyCode= e.charCode || e.keyCode;
+						// anything below SPACE is not a character except for line delimiter keys, tab, and delete.
+						switch (keyCode) {
+							case 8:  // backspace
+							case 9:  // tab
+							case 13: // enter
+							case 46: // delete
+								return true;
+							default:
+								return (keyCode >= 32 && keyCode < 112) || // space key and above until function keys
+									keyCode > 123; // above function keys  
+						}
+					}
+					// If we can't identify as a character, assume it's not
+					return false;
+				}
+				
+				evt = evt || window.event;
+				if (isContentKey(evt)) {
+					// bindings that are text content keys are ignored if we are in a text field or editor
+					// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=375058
+					if (evt.target.contentEditable === "true") { //$NON-NLS-0$
+						return;
+					}
+					var tagType = evt.target.nodeName.toLowerCase();
+					if (tagType === 'input') { //$NON-NLS-0$
+						var inputType = evt.target.type.toLowerCase();
+						// Any HTML5 input type that involves typing text should be ignored
+						switch (inputType) {
+							case "text": //$NON-NLS-0$
+							case "password": //$NON-NLS-0$
+							case "search": //$NON-NLS-0$
+							case "color": //$NON-NLS-0$
+							case "date": //$NON-NLS-0$
+							case "datetime": //$NON-NLS-0$
+							case "datetime-local": //$NON-NLS-0$
+							case "email": //$NON-NLS-0$
+							case "month": //$NON-NLS-0$
+							case "number": //$NON-NLS-0$
+							case "range": //$NON-NLS-0$
+							case "tel": //$NON-NLS-0$
+							case "time": //$NON-NLS-0$
+							case "url": //$NON-NLS-0$
+							case "week": //$NON-NLS-0$
+								return;
+						}
+					} else if (tagType === 'textarea') { //$NON-NLS-0$
+						return;
+					}
 				}
 				this._processKey(evt);
 			}));
@@ -1408,8 +1451,7 @@
 		}
 	};  // end Command prototype
 	Command.prototype.constructor = Command;
-
-	var isMac = window.navigator.platform.indexOf("Mac") !== -1; //$NON-NLS-0$
+	
 	/**
 	 * Temporary copy of editor key binding.  Will be removed in the next released.
 	 * @param {String|Number} keyCode the key code.
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/commonHTMLFragments.js b/bundles/org.eclipse.orion.client.core/web/orion/commonHTMLFragments.js
index 0bd3dcc..5cdf24c 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/commonHTMLFragments.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/commonHTMLFragments.js
@@ -24,7 +24,7 @@
 	// BEGIN TOP BANNER FRAGMENT
 	var topHTMLFragment =
 	
-	'<header id="banner" role="banner">' + //$NON-NLS-0$
+	'<header id="banner" role="banner" class="headerLayout">' + //$NON-NLS-0$
 		//Top row:  Logo + discovery links + user
 		'<div id="staticBanner" class="layoutBlock topRowBanner">' + //$NON-NLS-0$
 			'<a id="home" class="layoutLeft logo" href="' + require.toUrl("navigate/table.html") + '" aria-label="'+messages['Orion Home']+'"></a>' + //$NON-NLS-8$ //$NON-NLS-6$ //$NON-NLS-5$ //$NON-NLS-4$ //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$
@@ -39,7 +39,6 @@
 		'</div>' + //$NON-NLS-0$
 		//Title area
 		'<div id="titleArea" class="layoutBlock titleArea">' + //$NON-NLS-0$
-			'<div class="layoutLeft pageTitle"></div>' + //$NON-NLS-0$
 			'<div class="clear" style="padding-bottom:5px;display:inline;"><span id="location" class="currentLocation"></span><span id="dirty" class="currentLocation"></span></div>' + //$NON-NLS-0$
 			'<div class="layoutRight pageNav">' + //$NON-NLS-0$
 				'<span id="pageFavorite" tabindex="0" role="button" aria-label="'+messages['Add this page to the favorites list']+'" class="spacingLeft layoutLeft imageSprite core-sprite-favorite_sml"></span>' + //$NON-NLS-2$ //$NON-NLS-0$
@@ -51,7 +50,7 @@
 	// BEGIN BOTTOM BANNER FRAGMENT
 	// styling of the surrounding div (text-align, etc) is in ide.css "footer"
 	var bottomHTMLFragment = 
-		'<footer id="footerContent" class="layoutBlock" role="contentinfo">' + //$NON-NLS-0$
+		'<footer id="footerContent" class="layoutBlock footerLayout" role="contentinfo">' + //$NON-NLS-0$
 			'<div class="footerBlock">' + //$NON-NLS-0$
 				messages['Orion is in Beta. Please try it out but BEWARE your data may be lost.'] +
 			'</div>' + //$NON-NLS-0$
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/compare/compare-container.css b/bundles/org.eclipse.orion.client.core/web/orion/compare/compare-container.css
index 63514ab..58ec724 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/compare/compare-container.css
+++ b/bundles/org.eclipse.orion.client.core/web/orion/compare/compare-container.css
@@ -95,12 +95,12 @@
 
 /* The added block in the new file/left side, lightest green */
 .annotationLine.addedBlockDiff {
-	background-color: #D2FFD2; /*#EFFFEF;*/
+	background-color: #B3E8B3;
 }
 
 /* The current added block in the new file/left side, 2nd lightest green */
 .annotationLine.currentAddedBlockDiff {
-	background-color: #B0FFB0;
+	background-color: #8EDD8E;
 }
 
 /* The deleted block in the old file/right side, lightest red */
@@ -145,12 +145,12 @@
 
 /* The added word in the new file/left side, 3rd lightest green */
 .annotationRange.addedWordDiff {
-	background-color: #99EE99;
+	background-color: #63CF63;
 }
 
 /* The current added word in the new file/left side, darkest green */
 .annotationRange.currentAddedWordDiff {
-	background-color: #33DD33;
+	background-color: #31A231;
 }
 
 /* The deleted word in the old file/right side, 3rd lightest red */
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/globalCommands.js b/bundles/org.eclipse.orion.client.core/web/orion/globalCommands.js
index 471b6b5..9f74a9d 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/globalCommands.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/globalCommands.js
@@ -652,6 +652,7 @@
 		
 		var toolbar = dojo.byId("pageToolbar"); //$NON-NLS-0$
 		if (toolbar) {
+			dojo.addClass(toolbar, "toolbarLayout"); //$NON-NLS-0$
 			dojo.place(commonHTML.toolbarHTMLFragment, toolbar, "only"); //$NON-NLS-0$
 		}
 		
@@ -739,7 +740,7 @@
 			var side = dojo.query(".sidePanelLayout")[0]; //$NON-NLS-0$
 			var main = dojo.query(".mainPanelLayout")[0]; //$NON-NLS-0$
 			if (side && main) {
-				splitter = new mSplitter.Splitter({node: splitNode, sidePanel: side, mainPanel: main, noMainPanelAnimate: !!editor});
+				splitter = new mSplitter.Splitter({node: splitNode, sidePanel: side, mainPanel: main});
 				var toggleSidePanelCommand = new mCommands.Command({
 					name: "Toggle side panel",
 					tooltip:"Open or close the side panel",
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/searchAndReplace/textSearcher.js b/bundles/org.eclipse.orion.client.core/web/orion/searchAndReplace/textSearcher.js
index a7e55b7..58ff790 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/searchAndReplace/textSearcher.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/searchAndReplace/textSearcher.js
@@ -176,8 +176,8 @@
 		},
 		
 		_handleKeyDown: function(evt, fromSearch){
-			var ctrlKey = this.isMac ? evt.metaKey : evt.ctrlKey;
-			if(ctrlKey &&  evt.keyCode === 70/*"f"*/ ) {
+			var ctrlKeyOnly = (this.isMac ? evt.metaKey : evt.ctrlKey) && !evt.altKey && !evt.shiftKey;
+			if(ctrlKeyOnly && evt.keyCode === 70/*"f"*/ ) {
 				this._keyUpHandled = fromSearch;
 				if( evt.stopPropagation ) { 
 					evt.stopPropagation(); 
@@ -185,7 +185,7 @@
 				evt.cancelBubble = true;
 				return false;
 			}
-			if((ctrlKey &&  evt.keyCode === 75/*"k"*/ ) || evt.keyCode === 13/*enter*/ ){
+			if((ctrlKeyOnly && evt.keyCode === 75/*"k"*/ ) || evt.keyCode === 13/*enter*/ ){
 				if( evt.stopPropagation ) { 
 					evt.stopPropagation(); 
 				}
@@ -194,7 +194,7 @@
 				this._keyUpHandled = fromSearch;
 				return false;
 			}
-			if( ctrlKey &&  evt.keyCode === 82 /*"r"*/){
+			if( ctrlKeyOnly &&  evt.keyCode === 82 /*"r"*/){
 				if( evt.stopPropagation ) { 
 					evt.stopPropagation(); 
 				}
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/splitter.js b/bundles/org.eclipse.orion.client.core/web/orion/splitter.js
index 248a3ca..54bead9 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/splitter.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/splitter.js
@@ -28,8 +28,6 @@
 	 * @param options.node The node for the splitter presentation.  Required.
 	 * @param options.sidePanel The node for the side (toggling) panel.  Required.
 	 * @param options.mainPanel The node for the main panel.  Required.
-	 * @param options.noMainPanelAnimate Set to true if the main panel should not animate.
-	 * See https://bugs.eclipse.org/bugs/show_bug.cgi?id=387223
 	 * @name orion.splitter.Splitter
 	 */
 	function Splitter(options) {
@@ -40,7 +38,6 @@
 		_init: function(options) {
 			this._tracking = null;
 			this._resizeListeners = [];
-			this._animateMainPane = !options.noMainPanelAnimate;
 			this._animationDelay = 501;  // longer than CSS transitions in layout.css
 			this._prefix = "/orion/splitter/" + document.body.id;  //$NON-NLS-0$
 			function nodeFromOption(value) {
@@ -124,12 +121,11 @@
 		
 		_resize: function(animationDelay) {
 			animationDelay = animationDelay || 0;
-			var delayMain = this._animateMainPane ? animationDelay : 0;
 			var pos = dojo.position(this._node.parentNode);
 			this._totalWidth = pos.w;
 			pos = dojo.position(this._node);
 			dojo.style(this._mainNode, {width: (this._totalWidth - pos.x - pos.w) +"px"}); //$NON-NLS-0$ 
-			window.setTimeout(dojo.hitch(this, function() { this._notifyResizeListeners(this._mainNode); }), delayMain);
+			window.setTimeout(dojo.hitch(this, function() { this._notifyResizeListeners(this._mainNode); }), animationDelay);
 			window.setTimeout(dojo.hitch(this, function() { this._notifyResizeListeners(this._sideNode); }), animationDelay);
 		},
 		
@@ -163,9 +159,7 @@
 			// in a timeout to ensure the animations are complete.
 			window.setTimeout(dojo.hitch(this, function() {
 				dojo.removeClass(this._sideNode, "sidePanelLayoutAnimation"); //$NON-NLS-0$ 
-				if (this._animateMainPane) {
-					dojo.removeClass(this._mainNode, "mainPanelLayoutAnimation"); //$NON-NLS-0$ 
-				}
+				dojo.removeClass(this._mainNode, "mainPanelLayoutAnimation"); //$NON-NLS-0$ 
 				dojo.removeClass(this._node, "splitLayoutAnimation"); //$NON-NLS-0$ 
 				dojo.removeClass(this._thumb, "splitLayoutAnimation"); //$NON-NLS-0$ 
 			}), this._animationDelay);
@@ -173,9 +167,7 @@
 		
 		_addAnimation: function() {
 			dojo.addClass(this._sideNode, "sidePanelLayoutAnimation"); //$NON-NLS-0$ 
-			if (this._animateMainPane) {
-				dojo.addClass(this._mainNode, "mainPanelLayoutAnimation"); //$NON-NLS-0$ 
-			}
+			dojo.addClass(this._mainNode, "mainPanelLayoutAnimation"); //$NON-NLS-0$ 
 			dojo.addClass(this._node, "splitLayoutAnimation"); //$NON-NLS-0$ 
 			dojo.addClass(this._thumb, "splitLayoutAnimation"); //$NON-NLS-0$ 
 		},
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/SettingsContainer.js b/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/SettingsContainer.js
index 1a60765..5666775 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/SettingsContainer.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/SettingsContainer.js
@@ -42,16 +42,19 @@
 		

 		processHash: function() {

 			var pageParams = PageUtil.matchResourceParameters();

-			var category = pageParams.category || "userSettings"; //$NON-NLS-0$

-			this.showById(category);

 			

-			// The widgets might render commands, and this happens asynchronously.  Process the URL in a timeout.

+			var container = this;

+			

+			this.preferences.getPreferences('/settingsContainer', 2).then(function(prefs){

+

+				var selection = prefs.get( 'selection' );

+				

+				var category = pageParams.category || selection; //$NON-NLS-0$

+				container.showById(category);

+				

+			} );

+			

 			window.setTimeout(dojo.hitch(this, function() {this.commandService.processURL(window.location.href);}), 0);

-			

-			

-//			var pageToolBar = dojo.byId( 'pageToolbar' );

-//			

-//			dojo.removeNode( pageToolBar.parentNode.removeChild(pageToolBar) );

 		},

 		

 		displaySettings: function(id) {

@@ -271,33 +274,61 @@
 

 			this.initPluginSettings(id);

 		},

+		

+		selectCategory: function(id) {

+

+			this.preferences.getPreferences('/settingsContainer', 2).then(function(prefs){

+				prefs.put( 'selection', id );

+			} );

+

+			if (this.selectedCategory) {

+				dojo.removeClass(this.selectedCategory, "navbar-item-selected"); //$NON-NLS-0$

+				dojo.attr(this.selectedCategory, "aria-selected", "false"); //$NON-NLS-1$ //$NON-NLS-0$

+				this.selectedCategory.tabIndex = -1;

+			}

+

+			if (id) {

+				this.selectedCategory = dojo.byId(id);

+			}

+

+			dojo.addClass(this.selectedCategory, "navbar-item-selected"); //$NON-NLS-0$

+			dojo.attr(this.selectedCategory, "aria-selected", "true"); //$NON-NLS-1$ //$NON-NLS-0$

+			dojo.attr(this.mainNode, "aria-labelledby", id); //$NON-NLS-0$

+			this.selectedCategory.tabIndex = 0;

+			this.selectedCategory.focus();

+			

+			window.location = '#,category=' + id;			

+		},

 

 		showById: function(id) {

-			this.updateToolbar(id);

-			

-			switch(id){

-			

-				case "plugins": //$NON-NLS-0$

-					this.showPlugins(id);

-					break;

+		

 				

-				case "userSettings": //$NON-NLS-0$

-					this.showUserSettings(id);

-					break;

-					

-				case "themeBuilder":

-					this.showThemeBuilder(id);

-					break;

-					

-				case "pluginSettings":

-					this.showPluginSettings(id);

-					break;

-

-				default:

-					this.selectCategory(id);

-					break;

 			

-			}

+			this.updateToolbar(id);

+				

+				switch(id){

+				

+					case "plugins": //$NON-NLS-0$

+						this.showPlugins(id);

+						break;

+					

+					case "userSettings": //$NON-NLS-0$

+						this.showUserSettings(id);

+						break;

+						

+					case "themeBuilder":

+						this.showThemeBuilder(id);

+						break;

+						

+					case "pluginSettings":

+						this.showPluginSettings(id);

+						break;

+	

+					default:

+						this.selectCategory(id);

+						break;

+				

+				}	

 		},

 

 		drawUserInterface: function(settings) {

@@ -361,6 +392,15 @@
 						}

 					}

 			} );

+			

+			this.preferences.getPreferences('/settingsContainer', 2).then(function(prefs){

+				

+				var selection = prefs.get( 'selection' );

+				

+				if (!selection) {

+					prefs.put( 'selection', 'userSettings' );

+				}

+			} );

 		},

 

 

diff --git a/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeBuilder.js b/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeBuilder.js
index 7171b78..0ea91d3 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeBuilder.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeBuilder.js
@@ -70,6 +70,7 @@
 			this.settings.location = new Family( 'Location', '#efefef' ); 

 			this.settings.selection = new Family( 'Selection', '#FEC' );

 			this.settings.sidepanel = new Family( 'Side', '#FBFBFB' ); 

+			this.settings.mainpanel = new Family( 'Main', 'white' ); 

 			this.settings.navtext = new Family( 'Navtext', '#bfbfbf' );

 			this.settings.content = new Family( 'ContentText', '#3087B3' );

 			this.settings.search = new Family( 'Search', '#444' );

@@ -100,9 +101,22 @@
 			

 			});

 			

+			var guideCommand = new mCommands.Command({

+				name: 'Guide',

+				tooltip: 'Check Guide',

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

+				callback: dojo.hitch(this, function(data){

+					this.guide(data.items);

+				})

+			

+			});

+			

 //			this.commandService.addCommand(revertCommand);

 //			this.commandService.registerCommandContribution('themeCommands', "orion.reverttheme", 1); //$NON-NLS-1$ //$NON-NLS-0$

 			

+			this.commandService.addCommand(guideCommand);

+			this.commandService.registerCommandContribution('themeCommands', "orion.checkGuide", 2); //$NON-NLS-1$ //$NON-NLS-0$

+			

 			this.commandService.addCommand(updateCommand);

 			this.commandService.registerCommandContribution('themeCommands', "orion.applytheme", 2); //$NON-NLS-1$ //$NON-NLS-0$

 		}

@@ -294,19 +308,21 @@
 

 			OVERVIEW = false;

 		

-			this.refresh();

+//			this.refresh();

 		

 			var coordinates = getCoordinates( e );

 			    

 			var x = coordinates.x;

 			var y = coordinates.y;

 			

-			over = [];

+//			over = [];

 		

 			for( var z = 0; z < zones.length; z++ ){	

 		

 				if( zones[z].mouseOver( x, y ) ){	

 					 zones[z].id = z;

+					 over = [];

+					 this.refresh();

 					 over.push(zones[z]);

 				}

 			}

@@ -347,7 +363,8 @@
 						break;

 						

 					default:

-						this.refresh();

+					

+						// this.refresh();

 						break;

 				

 				}

@@ -386,23 +403,61 @@
 			

 				var component = components[c];

 				

-				if( familyShown( families, component.family ) === false ){

-				

+				if( familyShown( families, component.family ) === false && component.description ){

+					

 					var labely = TOP + 10 + ( count * 28 );

 					

 					var originx = component.x-padding + ( component.width + (2*padding) ) * 0.5;

 					var originy = ( component.y-padding + ( component.height + (2*padding) )/2 );

 					

 					ctx.beginPath();

-					ctx.moveTo( originx, originy );

-					ctx.lineTo( originx, labely -4 );

-					ctx.lineTo( UI_SIZE + 50, labely -4 );

-					ctx.strokeStyle = '#cc0000';

-					ctx.lineWidth = 1;

-					ctx.stroke();

 					

-					Component.drawArc( ctx, originx, originy, 3, 0, 2 * Math.PI, false, null, '#cc0000' );

+					switch( component.family ){

 					

+						case 'Main':

+						

+							/* This is a hack to stop lines overlapping - ideally this software needs a layout

+								routine. Not pleased to do this. */

+

+							ctx.beginPath();

+							ctx.moveTo( originx + 70 , labely -4 );

+							ctx.lineTo( UI_SIZE + 50, labely -4 );

+							ctx.strokeStyle = '#cc0000';

+							ctx.lineWidth = 1;

+							ctx.stroke();

+							

+							Component.drawArc( ctx, originx + 70 , labely -4, 3, 0, 2 * Math.PI, false, null, '#cc0000' );

+

+							break;

+							

+							

+						case 'Side':

+						

+							ctx.beginPath();

+							ctx.moveTo( originx + 30 , labely -4 );

+							ctx.lineTo( UI_SIZE + 50, labely -4 );

+							ctx.strokeStyle = '#cc0000';

+							ctx.lineWidth = 1;

+							ctx.stroke();

+							

+							Component.drawArc( ctx, originx + 30 , labely -4, 3, 0, 2 * Math.PI, false, null, '#cc0000' );

+

+							break;

+							

+						default: 

+						

+							ctx.moveTo( originx, originy );

+							ctx.lineTo( originx, labely -4 );

+							ctx.lineTo( UI_SIZE + 50, labely -4 );

+							ctx.strokeStyle = '#cc0000';

+							ctx.lineWidth = 1;

+							ctx.stroke();

+							

+							Component.drawArc( ctx, originx, originy, 3, 0, 2 * Math.PI, false, null, '#cc0000' );

+							

+							break;

+					}

+

 					ctx.closePath();

 					ctx.globalAlpha = 1; 

 					

@@ -431,7 +486,7 @@
 			position = dojo.position( 'themeContainer' );	

 	

 			if( !canvas ){

-				canvas = document.getElementById('orionui');

+				canvas = document.getElementById( 'orionui' );

 				ctx = canvas.getContext( '2d' );

 				canvas.addEventListener( "mousedown", dojo.hitch( this, 'mouseDown' ), false );	

 				canvas.addEventListener( "mousemove", mouseMove, false );

@@ -498,13 +553,20 @@
 				breadcrumb.description = 'Content Text';

 				breadcrumb.family = settings.content.name;

 				

+				var rightpanel = Component.drawRectangle( ctx, LEFT + UI_SIZE * 0.4, CONTENT_TOP + 30, UI_SIZE * 0.6 -1, UI_SIZE - CONTENT_TOP + TOP -31, settings.mainpanel.value );

+				rightpanel.description = 'Main Panel';

+				rightpanel.family = settings.mainpanel.name;

+				

 				zones.push( navbar );

+				zones.push( username );

 				zones.push( search );

 				zones.push( crumbbar );

 				zones.push( button );

+

+				zones.push( rightpanel );

+				

 				zones.push( selection );

-				zones.push( navigator );

-				zones.push( username );

+				

 				zones.push( breadcrumb );

 				

 				for( var count=0; count < 3; count++ ){

@@ -517,6 +579,8 @@
 					zones.push( content );

 				}

 				

+				

+				zones.push( navigator );

 				zones.push( sidepanel );

 				

 				for( count=0; count < 3; count++ ){

@@ -539,9 +603,11 @@
 					}

 				}

 			}

+			

 			/* Toolbar */

 				

-			var horizontalLine = Component.drawLine( ctx, LEFT + UI_SIZE * 0.4, CONTENT_TOP + 30, LEFT + UI_SIZE, CONTENT_TOP + 30, 2, '#DEDEDE' );   

+			var horizontalLine = Component.drawLine( ctx, LEFT + UI_SIZE * 0.4, CONTENT_TOP + 30, LEFT + UI_SIZE, CONTENT_TOP + 30, 2, '#DEDEDE' );

+			

 			var verticalLine = Component.drawLine( ctx, LEFT + UI_SIZE * 0.4, CONTENT_TOP, LEFT + UI_SIZE * 0.4, TOP + UI_SIZE, 2, '#DEDEDE' );   

 		    

 		    /* Section */

@@ -550,8 +616,8 @@
 		

 			var section = Component.drawText( ctx, 'Section', LEFT + 20, CONTENT_TOP + 23, '8pt Lucida', '#333' );        

 		

-			var sectionline = Component.drawLine( ctx, LEFT + 10, CONTENT_TOP + 29, LEFT + UI_SIZE * 0.4 - 10, CONTENT_TOP + 29, 2, '#DEDEDE' );

-		  

+		

+			var sectionline = Component.drawLine( ctx, LEFT + 10, CONTENT_TOP + 29, LEFT + UI_SIZE * 0.4 - 10, CONTENT_TOP + 29, 2, '#DEDEDE' );		  

 		        

 			var buttonText = Component.drawText( ctx, 'Button', LEFT + UI_SIZE * 0.4 + 8, CONTENT_TOP + 19, '8pt Lucida', '#333' );        

 			

@@ -595,6 +661,7 @@
 				newtheme.location = this.settings.location.value;

 				newtheme.selection = this.settings.selection.value;

 				newtheme.sidepanel = this.settings.sidepanel.value; 

+				newtheme.mainpanel = this.settings.mainpanel.value;

 				newtheme.navtext = this.settings.navtext.value;

 				newtheme.content = this.settings.content.value;

 				newtheme.search = this.settings.search.value;

@@ -631,6 +698,18 @@
 		

 		ThemeBuilder.prototype.revert = revert;

 		

+		function guide(data){	

+		

+			this.refresh();

+			OVERVIEW = true;

+			this.drawOutline();

+		

+//			dojo.byId( 'pickercontainer' ).style.display = '';

+//			dojo.byId( 'savecontainer' ).style.display = 'none';

+		}

+		

+		ThemeBuilder.prototype.guide = guide;

+		

 		function select( name ){

 		

 			previous = this.settings;

@@ -645,6 +724,7 @@
 					this.settings.location.value = this.styles[s].location;

 					this.settings.selection.value = this.styles[s].selection;

 					this.settings.sidepanel.value = this.styles[s].sidepanel;

+					this.settings.mainpanel.value = this.styles[s].mainpanel;

 					this.settings.navtext.value = this.styles[s].navtext;

 					this.settings.content.value = this.styles[s].content;

 					this.settings.search.value = this.styles[s].search;

diff --git a/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeData.js b/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeData.js
index 4a74cc3..3a05b71 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeData.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeData.js
@@ -24,6 +24,7 @@
 		StyleSet.prototype.location = '#efefef';

 		StyleSet.prototype.selection = 'FEC';

 		StyleSet.prototype.sidepanel = '#FBFBFB';

+		StyleSet.prototype.mainpanel = 'white';

 		StyleSet.prototype.navtext = '#bfbfbf';

 		StyleSet.prototype.content = '#3087B3';

 		StyleSet.prototype.search = '#444';

@@ -37,6 +38,7 @@
 			orion.location = '#efefef';

 			orion.selection = 'FEC';

 			orion.sidepanel = '#FBFBFB';

+			orion.mainpanel = 'white';

 			orion.navtext = '#bfbfbf';

 			orion.content = '#3087B3';

 			orion.search = '#444';

@@ -51,6 +53,7 @@
 			eire.location = 'darkseagreen';

 			eire.selection = 'moccasin';

 			eire.sidepanel = 'aliceblue';

+			eire.mainpanel = 'white';

 			eire.navtext = '#FBFBFB';

 			eire.content = 'darkgreen';

 			eire.search = 'darkgreen';

@@ -65,6 +68,7 @@
 			avril.location = 'pink';

 			avril.selection = 'lavender';

 			avril.sidepanel = 'seashell';

+			avril.mainpanel = 'white';

 			avril.navtext = '#FBFBFB';

 			avril.content = 'mediumorchid';

 			avril.search = 'violet';

@@ -79,6 +83,7 @@
 			blue.location = 'skyblue';

 			blue.selection = 'lavender';

 			blue.sidepanel = 'aliceblue';

+			blue.mainpanel = 'white';

 			blue.navtext = '#FBFBFB';

 			blue.content = 'royalblue';

 			blue.search = 'royalblue';

@@ -93,6 +98,7 @@
 			vanilla.location = 'cornsilk';

 			vanilla.selection = 'lemonchiffon';

 			vanilla.sidepanel = 'white';

+			vanilla.mainpanel = 'white';

 			vanilla.navtext = 'lemonchiffon';

 			vanilla.content = 'chocolate';

 			vanilla.search = 'moccasin';

@@ -107,6 +113,7 @@
 			beetlejuice.location = 'darkslateblue';

 			beetlejuice.selection = 'silver';

 			beetlejuice.sidepanel = 'lavender';

+			beetlejuice.mainpanel = 'white';

 			beetlejuice.navtext = '#FBFBFB';

 			beetlejuice.content = 'mediumslateblue';

 			beetlejuice.search = '#444';

@@ -117,6 +124,7 @@
 		function getStyles(){

 			return this.styles;

 		}

+		

 		ThemeData.prototype.styles = [];

 		ThemeData.prototype.getStyles = getStyles;

 

@@ -124,6 +132,5 @@
 			ThemeData:ThemeData,

 			getStyles:getStyles

 		};

-

 	}

 );
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeSheetWriter.js b/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeSheetWriter.js
index ddb523d..0886354 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeSheetWriter.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/widgets/settings/ThemeSheetWriter.js
@@ -19,21 +19,24 @@
 		var location = '#EFEFEF';

 		var selection = 'FEC';

 		var sidepanel = '#FBFBFB';

+		var mainpanel = 'white';

 		var navtext = '#bfbfbf';

 		var content = '#3087B3';

 		var search = '#444';

+		var mainToolbar = 'green';

 		

-		function ThemeSheetWriter(){

-		}

+		function ThemeSheetWriter(){}

 		

 		ThemeSheetWriter.prototype.navbar = navbar;

 		ThemeSheetWriter.prototype.button = button;

 		ThemeSheetWriter.prototype.location = location;

 		ThemeSheetWriter.prototype.selection = selection;

 		ThemeSheetWriter.prototype.sidepanel = sidepanel;

+		ThemeSheetWriter.prototype.mainpanel = mainpanel;

 		ThemeSheetWriter.prototype.navtext = navtext;

 		ThemeSheetWriter.prototype.content = content;

 		ThemeSheetWriter.prototype.search = search;

+		ThemeSheetWriter.prototype.mainToolbar = mainToolbar;

 		

 		function writeNavigationStyle(){

 		

@@ -309,6 +312,20 @@
 			auxpane.style.paddingTop = '16px';

 			

 			styles.push( auxpane );

+			

+			var mainpane = new ThemeClass.ThemeClass( 'mainpane' );

+			mainpane.style.background = this.mainpanel;

+			mainpane.style.border = 0;

+			

+			styles.push( mainpane );

+			

+			var mainToolbar = new ThemeClass.ThemeClass( 'mainToolbar' );

+			mainToolbar.style.background = this.mainToolbar;

+			mainToolbar.style.height = '31px';

+			mainToolbar.style.borderBottom = '1px solid #ebebeb';

+			

+			styles.push( mainToolbar );

+		

 

 			for( var s in styles ){

 				styleBlock = styleBlock + styles[s].toString();

@@ -336,18 +353,22 @@
 				this.location = settings.location.value;

 				this.selection = settings.selection.value;

 				this.sidepanel = settings.sidepanel.value;

+				this.mainpanel = settings.mainpanel.value;

 				this.navtext = settings.navtext.value;

 				this.search = settings.search.value;

 				this.content = settings.content.value;

+				this.mainToolbar = settings.content.mainToolbar;

 			}else{

 				this.navbar = settings.navbar;

 				this.button = settings.button;

 				this.location = settings.location;

 				this.selection = settings.selection;

 				this.sidepanel = settings.sidepanel;

+				this.mainpanel = settings.mainpanel;

 				this.navtext = settings.navtext;

 				this.search = settings.search;

 				this.content = settings.content;

+				this.mainToolbar = settings.mainToolbar;

 			}

 			

 			var sheet = this.writeNavigationStyle() + this.writeLocationStyle() + this.writeMainStyle() + this.writeButtonStyle();

diff --git a/bundles/org.eclipse.orion.client.core/web/test/unittest.css b/bundles/org.eclipse.orion.client.core/web/test/unittest.css
index 11c928b..3688e59 100644
--- a/bundles/org.eclipse.orion.client.core/web/test/unittest.css
+++ b/bundles/org.eclipse.orion.client.core/web/test/unittest.css
@@ -16,4 +16,20 @@
 	line-height: 20px;	
 	font-weight: bold;
 	color: #FF0000;
+}
+
+.test-passed {
+	background-color: #11FF11;
+}
+
+.test-failed {
+	background-color: #FF1111;
+}
+
+#test-overview {
+	margin: 8px;
+}
+
+#test-tree {
+	margin: 8px;
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.editor/web/orion/textview/textView.js b/bundles/org.eclipse.orion.client.editor/web/orion/textview/textView.js
index 7c9bf36..11ffb8a 100644
--- a/bundles/org.eclipse.orion.client.editor/web/orion/textview/textView.js
+++ b/bundles/org.eclipse.orion.client.editor/web/orion/textview/textView.js
@@ -3493,6 +3493,7 @@
 			viewDiv.style.overflow = "auto"; //$NON-NLS-0$
 			viewDiv.style.position = "absolute"; //$NON-NLS-0$
 			viewDiv.style.top = "0px"; //$NON-NLS-0$
+			viewDiv.style.bottom = "0px"; //$NON-NLS-0$
 			viewDiv.style.borderWidth = "0px"; //$NON-NLS-0$
 			viewDiv.style.margin = "0px"; //$NON-NLS-0$
 			viewDiv.style.outline = "none"; //$NON-NLS-0$
@@ -3508,6 +3509,7 @@
 			rightDiv.style.WebkitUserSelect = "none"; //$NON-NLS-0$
 			rightDiv.style.position = "absolute"; //$NON-NLS-0$
 			rightDiv.style.cursor = "default"; //$NON-NLS-0$
+			rightDiv.style.right = "0px"; //$NON-NLS-0$
 			rightDiv.setAttribute("aria-hidden", "true"); //$NON-NLS-1$ //$NON-NLS-0$
 			table = document.createElement("TABLE"); //$NON-NLS-0$
 			rightDiv.appendChild(table);
@@ -5383,6 +5385,9 @@
 			var partialY = this._partialY = Math.round((firstLine - topIndex) * lineHeight);
 			var scrollWidth, scrollHeight = lineCount * lineHeight;
 			var leftWidth, leftRect, clientWidth, clientHeight;
+			var parent = this._parent;
+			var parentWidth = parent.clientWidth;
+			var parentHeight = parent.clientHeight;
 			if (hScrollOnly) {
 				clientWidth = this._getClientWidth();
 				clientHeight = this._getClientHeight();
@@ -5393,13 +5398,8 @@
 				}
 				scrollWidth = Math.max(this._maxLineWidth, clientWidth);
 			} else {
-				var parent = this._parent;
-				var parentWidth = parent.clientWidth;
-				var parentHeight = parent.clientHeight;
 
-				/* Update view height in order to have client height computed */
 				var viewDiv = this._viewDiv;
-				viewDiv.style.height = Math.max(0, (parentHeight - viewPad.top - viewPad.bottom)) + "px"; //$NON-NLS-0$
 				clientHeight = this._getClientHeight();
 				var linesPerPage = Math.floor((clientHeight + partialY) / lineHeight);
 				var bottomIndex = Math.min(topIndex + linesPerPage, lineCount - 1);
@@ -5499,10 +5499,8 @@
 					rightWidth = rightRect.right - rightRect.left;
 				}
 				viewDiv.style.left = leftWidth + "px"; //$NON-NLS-0$
-				viewDiv.style.width = Math.max(0, parentWidth - leftWidth - rightWidth - viewPad.left - viewPad.right) + "px"; //$NON-NLS-0$
-				if (this._rightDiv) {
-					this._rightDiv.style.left = (parentWidth - rightWidth) + "px"; //$NON-NLS-0$
-				}
+				viewDiv.style.right = rightWidth + "px"; //$NON-NLS-0$
+
 				/* Need to set the height first in order for the width to consider the vertical scrollbar */
 				var scrollDiv = this._scrollDiv;
 				scrollDiv.style.height = scrollHeight + "px"; //$NON-NLS-0$
@@ -5572,8 +5570,8 @@
 				}
 				clipDiv.style.left = clipLeft + "px"; //$NON-NLS-0$
 				clipDiv.style.top = clipTop + "px"; //$NON-NLS-0$
-				clipDiv.style.width = clipWidth + "px"; //$NON-NLS-0$
-				clipDiv.style.height = clipHeight + "px"; //$NON-NLS-0$
+				clipDiv.style.right = (parentWidth - clipWidth - clipLeft) + "px"; //$NON-NLS-0$
+				clipDiv.style.bottom = (parentHeight - clipHeight - clipTop) + "px"; //$NON-NLS-0$
 				clientDiv.style.left = clientLeft + "px"; //$NON-NLS-0$
 				clientDiv.style.top = clientTop + "px"; //$NON-NLS-0$
 				clientDiv.style.width = scrollWidth + "px"; //$NON-NLS-0$
diff --git a/bundles/org.eclipse.orion.client.git/web/git/css/git.css b/bundles/org.eclipse.orion.client.git/web/git/css/git.css
index 3304ed7..f115bba 100644
--- a/bundles/org.eclipse.orion.client.git/web/git/css/git.css
+++ b/bundles/org.eclipse.orion.client.git/web/git/css/git.css
@@ -93,6 +93,7 @@
 .git-sprite-file{ background-position: 0 -144px; width: 16px; height: 16px; } 
 .git-sprite-incoming_commit{ background-position: 0 -162px; width: 16px; height: 16px; } 
 .git-sprite-merge{ background-position: 0 -180px; width: 16px; height: 16px; } 
+.git-sprite-merge_squash{ background: url( ../images/mergesquash.png ) no-repeat top left; width: 16px; height: 16px; }
 .git-sprite-notsure{ background-position: 0 -198px; width: 16px; height: 16px; } 
 .git-sprite-outgoing_commit{ background-position: 0 -216px; width: 16px; height: 16px; } 
 .git-sprite-pull{ background-position: 0 -234px; width: 16px; height: 16px; } 
diff --git a/bundles/org.eclipse.orion.client.git/web/git/images/mergesquash.png b/bundles/org.eclipse.orion.client.git/web/git/images/mergesquash.png
new file mode 100644
index 0000000..62c9631
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.git/web/git/images/mergesquash.png
Binary files differ
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 29e9749..b12de47 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
@@ -1053,7 +1053,7 @@
 		var mergeSquashCommand = new mCommands.Command({
 			name : messages["Merge Squash"],
 			tooltip: messages["Squash the content of the branch to the index"],
-			imageClass: "git-sprite-merge", //$NON-NLS-0$
+			imageClass: "git-sprite-merge_squash", //$NON-NLS-0$
 			spriteClass: "gitCommandSprite", //$NON-NLS-0$
 			id : "eclipse.orion.git.mergeSquash", //$NON-NLS-0$
 			callback: function(data) {
diff --git a/bundles/org.eclipse.orion.client.git/web/orion/git/gitRepositoryExplorer.js b/bundles/org.eclipse.orion.client.git/web/orion/git/gitRepositoryExplorer.js
index 5181995..65e3166 100644
--- a/bundles/org.eclipse.orion.client.git/web/orion/git/gitRepositoryExplorer.js
+++ b/bundles/org.eclipse.orion.client.git/web/orion/git/gitRepositoryExplorer.js
@@ -248,79 +248,91 @@
 		
 		this.registry.getService("orion.core.file").loadWorkspace(repository.ContentLocation + "?parts=meta").then( //$NON-NLS-1$ //$NON-NLS-0$
 				function(resp){
-					repository.Content = {};
-					
-					var path = "root / "; //$NON-NLS-0$
-					if (resp.Parents !== null)
-						for (var i=resp.Parents.length; i>0; i--){
-							path += resp.Parents[i-1].Name + " / "; //$NON-NLS-0$
+					try{
+						repository.Content = {};
+						
+						var path = "root / "; //$NON-NLS-0$
+						if (resp.Parents !== null)
+							for (var i=resp.Parents.length; i>0; i--){
+								path += resp.Parents[i-1].Name + " / "; //$NON-NLS-0$
+							}
+							
+						path += resp.Name;
+						repository.Content.Path = path;
+						
+						if (mode !== "full"){ //$NON-NLS-0$
+							deferred.callback();
+							return;
 						}
 						
-					path += resp.Name;
-					repository.Content.Path = path;
-					
-					if (mode !== "full"){ //$NON-NLS-0$
-						deferred.callback();
-						return;
-					}
-					
-					that.registry.getService("orion.git.provider").getGitStatus(repository.StatusLocation).then( //$NON-NLS-0$
-						function(resp){
-							repository.Status = resp;
-
-							that.registry.getService("orion.git.provider").getGitBranch(repository.BranchLocation).then( //$NON-NLS-0$
-								function(resp){
-									var branches = resp.Children;
-									var currentBranch;
-									for (var i=0; i<branches.length; i++){
-										if (branches[i].Current){
-											currentBranch = branches[i];
-											break;
+						that.registry.getService("orion.git.provider").getGitStatus(repository.StatusLocation).then( //$NON-NLS-0$
+							function(resp){
+								try{
+									repository.Status = resp;
+		
+									that.registry.getService("orion.git.provider").getGitBranch(repository.BranchLocation).then( //$NON-NLS-0$
+										function(resp){
+											try{
+												var branches = resp.Children || [];
+												var currentBranch;
+												for (var i=0; i<branches.length; i++){
+													if (branches[i].Current){
+														currentBranch = branches[i];
+														break;
+													}
+												}
+												
+												if (!currentBranch || currentBranch.RemoteLocation[0] === null){
+													deferred.callback();
+													return;
+												}
+												
+												var tracksRemoteBranch = (currentBranch.RemoteLocation.length === 1 && currentBranch.RemoteLocation[0].Children.length === 1);
+												
+												if (tracksRemoteBranch && currentBranch.RemoteLocation[0].Children[0].CommitLocation){
+													that.registry.getService("orion.git.provider").getLog(currentBranch.RemoteLocation[0].Children[0].CommitLocation + "?page=1&pageSize=20", "HEAD").then( //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$
+														function(resp){
+															if(resp.Children === undefined) { repository.CommitsToPush = 0; }
+															else { repository.CommitsToPush = resp.Children.length; }
+															deferred.callback();
+															return;
+														}, function(resp){
+															deferred.errback();
+															return;
+														}
+													);
+												} else {
+													that.registry.getService("orion.git.provider").doGitLog(currentBranch.CommitLocation + "?page=1&pageSize=20").then(  //$NON-NLS-1$ //$NON-NLS-0$
+														function(resp){	
+															if(resp.Children === undefined) { repository.CommitsToPush = 0; }
+															else { repository.CommitsToPush = resp.Children.length; }
+															deferred.callback();
+															return;
+														}, function(resp){
+															deferred.errback();
+															return;
+														}
+													);	
+												}
+											}catch(e){
+												deferred.errback();
+											}
+										}, function(resp){
+											deferred.errback();
+											return;
 										}
-									}
-									
-									if (!currentBranch || currentBranch.RemoteLocation[0] === null){
-										deferred.callback();
-										return;
-									};
-									
-									var tracksRemoteBranch = (currentBranch.RemoteLocation.length === 1 && currentBranch.RemoteLocation[0].Children.length === 1);
-									
-									if (tracksRemoteBranch && currentBranch.RemoteLocation[0].Children[0].CommitLocation){
-										that.registry.getService("orion.git.provider").getLog(currentBranch.RemoteLocation[0].Children[0].CommitLocation + "?page=1&pageSize=20", "HEAD").then( //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$
-											function(resp){
-												if(resp.Children === undefined) { repository.CommitsToPush = 0; }
-												else { repository.CommitsToPush = resp.Children.length; }
-												deferred.callback();
-												return;
-											}, function(resp){
-												deferred.errback();
-												return;
-											}
-										);
-									} else {
-										that.registry.getService("orion.git.provider").doGitLog(currentBranch.CommitLocation + "?page=1&pageSize=20").then(  //$NON-NLS-1$ //$NON-NLS-0$
-											function(resp){	
-												if(resp.Children === undefined) { repository.CommitsToPush = 0; }
-												else { repository.CommitsToPush = resp.Children.length; }
-												deferred.callback();
-												return;
-											}, function(resp){
-												deferred.errback();
-												return;
-											}
-										);	
-									}
-								}, function(resp){
+									);
+								}catch(e){
 									deferred.errback();
-									return;
 								}
-							);
-						}, function(resp){
-							deferred.errback();
-							return;
-						}	
-					);
+							}, function(resp){
+								deferred.errback();
+								return;
+							}	
+						);
+					}catch(e){
+						deferred.errback(e);
+					}
 				}, function(resp){
 					deferred.errback();
 					return;