Merge branch 'add_license_tags'
diff --git a/bundles/org.eclipse.orion.client.core/jsTestDriver.conf b/bundles/org.eclipse.orion.client.core/jsTestDriver.conf
index cf5ce46..1ac27fa 100644
--- a/bundles/org.eclipse.orion.client.core/jsTestDriver.conf
+++ b/bundles/org.eclipse.orion.client.core/jsTestDriver.conf
@@ -7,4 +7,4 @@
 proxy:
   - {matcher: "/*", server: "http://localhost:8080/"}
     
-timeout: 2000
\ No newline at end of file
+timeout: 3000
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.core/web/compare/compare.js b/bundles/org.eclipse.orion.client.core/web/compare/compare.js
index c6b08f7..3df348f 100644
--- a/bundles/org.eclipse.orion.client.core/web/compare/compare.js
+++ b/bundles/org.eclipse.orion.client.core/web/compare/compare.js
@@ -27,11 +27,11 @@
 				var commandService = new mCommands.CommandService({
 					serviceRegistry: serviceRegistry
 				});
-				var searcher = new mSearchClient.Searcher({
-					serviceRegistry: serviceRegistry, commandService: commandService
-				});
 				// File operations
 				var fileClient = new mFileClient.FileClient(serviceRegistry);
+				var searcher = new mSearchClient.Searcher({
+					serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient
+				});
 				var diffProvider = new mDiffProvider.DiffProvider(serviceRegistry);
 
 				mGlobalCommands.generateBanner("toolbar", serviceRegistry, commandService, preferences, searcher);
diff --git a/bundles/org.eclipse.orion.client.core/web/defaults.pref b/bundles/org.eclipse.orion.client.core/web/defaults.pref
index fe60e48..f7d1556 100644
--- a/bundles/org.eclipse.orion.client.core/web/defaults.pref
+++ b/bundles/org.eclipse.orion.client.core/web/defaults.pref
@@ -3,7 +3,6 @@
 		"authenticationPlugin.html": true,
 		"plugins/fileClientPlugin.html":true,
 		"plugins/jslintPlugin.html":true,
-		"plugins/unittestPlugin.html":true,
 		"git/plugins/gitPlugin.html":true,
 		"profile/userservicePlugin.html":true,
 		"plugins/user/userProfilePlugin.html":true,
diff --git a/bundles/org.eclipse.orion.client.core/web/edit/setup.js b/bundles/org.eclipse.orion.client.core/web/edit/setup.js
index 6587511..513874f 100644
--- a/bundles/org.eclipse.orion.client.core/web/edit/setup.js
+++ b/bundles/org.eclipse.orion.client.core/web/edit/setup.js
@@ -165,19 +165,19 @@
 
 	var fileClient = new mFileClient.FileClient(serviceRegistry);
 
-		var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
-		
-		var textViewFactory = function() {
-			return new mTextView.TextView({
-				parent: editorDomNode,
-				model: new mProjectionTextModel.ProjectionTextModel(new mTextModel.TextModel()),
-				stylesheet: [require.toUrl("orion/textview/textview.css"), require.toUrl("orion/textview/rulers.css"),
-				             require.toUrl("examples/textview/textstyler.css"), require.toUrl("css/default-theme.css"),
-				             require.toUrl("orion/textview/annotations.css")],
-				tabSize: 4,
-				readonly: isReadOnly
-			});
-		};
+	var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
+	
+	var textViewFactory = function() {
+		return new mTextView.TextView({
+			parent: editorDomNode,
+			model: new mProjectionTextModel.ProjectionTextModel(new mTextModel.TextModel()),
+			stylesheet: [require.toUrl("orion/textview/textview.css"), require.toUrl("orion/textview/rulers.css"),
+			             require.toUrl("examples/textview/textstyler.css"), require.toUrl("css/default-theme.css"),
+			             require.toUrl("orion/textview/annotations.css")],
+			tabSize: 4,
+			readonly: isReadOnly
+		});
+	};
 	
 	var inputManager = {
 		lastFilePath: "",
@@ -398,7 +398,7 @@
 				var b = dojo.create("b", null, searchFloat, "last");
 				dojo.place(document.createTextNode("\"" + searchPattern + "\"..."), b, "only");
 				searchFloat.style.display = "block";
-				var query = inputManager.getFileMetadata().SearchLocation + searchPattern;
+				var query = searcher.createSearchQuery(searchPattern);
 				searcher.search(searchFloat, query, inputManager.getInput(),false,null,false,true);
 			}, 0);
 			return true;
diff --git a/bundles/org.eclipse.orion.client.core/web/index.js b/bundles/org.eclipse.orion.client.core/web/index.js
index d0cac3a..600dbea 100644
--- a/bundles/org.eclipse.orion.client.core/web/index.js
+++ b/bundles/org.eclipse.orion.client.core/web/index.js
@@ -12,16 +12,17 @@
 /*jslint browser:true devel:true*/
 /*global define*/
 
-define(['require', 'dojo', 'orion/bootstrap', 'orion/commands', 'orion/searchClient', 'orion/status', 'orion/globalCommands',
+define(['require', 'dojo', 'orion/bootstrap', 'orion/commands', 'orion/fileClient', 'orion/searchClient', 'orion/status', 'orion/globalCommands',
         'dojo/parser', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane'/*, 'dojox/widget/Portlet', 'dojox/widget/FeedPortlet'*/], 
-		function(require, dojo, mBootstrap, mCommands, mSearchClient, mStatus, mGlobalCommands) {
+		function(require, dojo, mBootstrap, mCommands, mFileClient, mSearchClient, mStatus, mGlobalCommands) {
 
 	dojo.addOnLoad(function() {
 		mBootstrap.startup().then(function(core) {
 			var serviceRegistry = core.serviceRegistry;
 			var preferences = core.preferences;
 			var commandService = new mCommands.CommandService({serviceRegistry: serviceRegistry});
-			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
+			var fileClient = new mFileClient.FileClient(serviceRegistry);
+			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
 			var statusService = new mStatus.StatusReportingService(serviceRegistry, "statusPane", "notifications");
 				
 			// global commands
diff --git a/bundles/org.eclipse.orion.client.core/web/navigate/table.js b/bundles/org.eclipse.orion.client.core/web/navigate/table.js
index ec27ad9..454593e 100644
--- a/bundles/org.eclipse.orion.client.core/web/navigate/table.js
+++ b/bundles/org.eclipse.orion.client.core/web/navigate/table.js
@@ -40,11 +40,11 @@
 		var treeRoot = {
 			children:[]
 		};
-		var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
+		var fileClient = new mFileClient.FileClient(serviceRegistry);
+		var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
 					
 //		var fileServices = serviceRegistry.getServiceReferences("orion.core.file");
 
-		var fileClient = new mFileClient.FileClient(serviceRegistry);
 		
 		var explorer = new mExplorerTable.FileExplorer(serviceRegistry, treeRoot, selection, searcher, fileClient, commandService, "explorer-tree", "location", "pageActions", "selectionTools");
 		
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 b8bad2f..cc611d9 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/commands.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/commands.js
@@ -573,6 +573,7 @@
 		_asImage: function(name, items, handler, userData, cssClass, forceText, cssClassCmdOver, cssClassCmdLink) {
 			handler = handler || this;
 			var link = dojo.create("a");
+			link.id = this.name+"link";
 			var image = null;
 			if (this.tooltip) {
 				link.title = this.tooltip;
@@ -582,7 +583,6 @@
 				dojo.place(text, link, "last");
 			} else {
 				image = new Image();
-				link.id = this.name+"link";
 				image.alt = this.name;
 				image.title = this.tooltip || this.name;
 				image.name = name;
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/compare/compare-features.js b/bundles/org.eclipse.orion.client.core/web/orion/compare/compare-features.js
index f4a62cf..434dbbf 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/compare/compare-features.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/compare/compare-features.js
@@ -80,7 +80,7 @@
 		},
 		
 		_createStatusDiv: function(statusDivId) {
-			var table = this._createNoWrapTextDiv(statusDivId , "Line Status" , "center");
+			var table = this._createNoWrapTextDiv(statusDivId , "Line 0 : Col 0" , "center");
 			var statusContainer = new dijit.layout.ContentPane({region: "bottom"});
 			dojo.addClass(statusContainer.domNode, 'statusContainer');
 			statusContainer.attr('content', table);
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/compare/compare.css b/bundles/org.eclipse.orion.client.core/web/orion/compare/compare.css
index 9413b22..33b14da 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/compare/compare.css
+++ b/bundles/org.eclipse.orion.client.core/web/orion/compare/compare.css
@@ -36,7 +36,7 @@
 
 .statusContainer {
 	width:100%;
-	height:60px;
+	height:30px;
 	overflow: hidden;
 }
 
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/compare/rulers.js b/bundles/org.eclipse.orion.client.core/web/orion/compare/rulers.js
index 13d2d1b..ae8ade7 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/compare/rulers.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/compare/rulers.js
@@ -57,7 +57,9 @@
 		getAnnotations: function(startLine, endLine) {
 			var result = [];
 			for (var i=startLine; i<endLine; i++) {
-				result[i] = {html: this.getHTML(i), style: this.getStyle(i)};
+				var style = this.getStyle(i);
+				if(style)
+					result[i] = {html: this.getHTML(i), style: style};
 			}
 			return result;
 		},
@@ -278,7 +280,7 @@
 			var model = this._editor.getModel();
 			if(lineIndex >= 0 && model.getAnnotationH){
 				var annotationIndex = mCompareUtils.getAnnotationIndex(model.getAnnotations(), lineIndex);
-				if (annotationIndex === -1) return {};
+				if (annotationIndex === -1) return null;
 				var mapperIndex = mCompareUtils.getAnnotationMapperIndex(model.getAnnotations(), annotationIndex);
 				var conflict = mCompareUtils.isMapperConflict(model.getMapper(), mapperIndex);
 				if(conflict)
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/fileClient.js b/bundles/org.eclipse.orion.client.core/web/orion/fileClient.js
index d6622aa..442fd35 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/fileClient.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/fileClient.js
@@ -30,7 +30,7 @@
 			},
 			//on failure we might need to retry
 			function(error) {
-				if (error.status === 401 || error.status === 403) {
+				if (error.status === 401) {
 					mAuth.handleAuthenticationError(error, function(message) {
 						//try again
 						fileService[funcName].apply(fileService, funcArgs).then(
@@ -157,6 +157,7 @@
 				});
 				return d;
 			},
+			search: _noMatch,
 			createProject: _noMatch,
 			createFolder: _noMatch,
 			createFile: _noMatch,
@@ -396,6 +397,14 @@
 		 */		
 		remoteExport: function(sourceLocation, options) {
 			return _doServiceCall(this._getService(sourceLocation), "remoteExport", arguments);
+		},
+		
+		/**
+		 * Performs a search with the given query.
+		 * @param {String} query The search query
+		 */
+		search: function(query) {
+			return _doServiceCall(this._getService(), "search", arguments);
 		}
 	};//end FileClient prototype
 	FileClient.prototype.constructor = FileClient;
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/fileCommands.js b/bundles/org.eclipse.orion.client.core/web/orion/fileCommands.js
index 1cbce3d..2018c4a 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/fileCommands.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/fileCommands.js
@@ -109,6 +109,13 @@
 	 * @function
 	 */
 	fileCommandUtils.createFileCommands = function(serviceRegistry, commandService, explorer, fileClient, toolbarId) {
+		var errorHandler = function(error) {
+			serviceRegistry.getService("orion.page.message").then(
+				function(statusService) {
+					statusService.setProgressResult(error);
+				});
+		};
+		var progress = serviceRegistry.getService("orion.page.message");
 		
 		function forceSingleItem(item) {
 			if (dojo.isArray(item)) {
@@ -153,7 +160,8 @@
 					var item = selectedItems[i];
 					var func = isCopy ? fileClient.copyFile : fileClient.moveFile;
 					func.apply(fileClient, [item.Location, this.path]).then(
-						dojo.hitch(explorer, refreshFunc)//refresh the root
+						dojo.hitch(explorer, refreshFunc), //refresh the root
+						errorHandler
 					);
 				}
 			};
@@ -180,11 +188,7 @@
 								if (location) {
 									func.apply(fileClient, [item.Location, targetFolder.Location, newName]).then(
 										dojo.hitch(explorer, refreshFunc), //refresh the root
-										function(error) {
-											serviceRegistry.getService("orion.page.message").then(function(statusService) {
-												statusService.setErrorMessage(error);
-											});
-										}
+										errorHandler
 									);
 								}
 							}
@@ -316,7 +320,8 @@
 					mUtil.getUserText(domId+"EditBox", refNode, true, item.Name, 
 						dojo.hitch(this, function(newText) {
 							fileClient.moveFile(item.Location, item.parent.Location, newText).then(
-								dojo.hitch(explorer, function() {this.changedItem(this.treeRoot);})//refresh the root
+								dojo.hitch(explorer, function() {this.changedItem(this.treeRoot);}), //refresh the root
+								errorHandler
 							);
 						}), 
 						null, null, "."
@@ -340,6 +345,13 @@
 						if (!doit) {
 							return;
 						}
+						var count = 0;
+						var refresher = function(item) {
+							count++;
+							if (count === items.length) {
+								explorer.changedItem(item);
+							}
+						};
 						for (var i=0; i < items.length; i++) {
 							var item = items[i];
 							var deleteLocation = item.Location;
@@ -359,7 +371,10 @@
 							}
 							if (deleteLocation) {
 								fileClient.deleteFile(deleteLocation).then(function() {
-									explorer.changedItem(refreshItem);
+									refresher(refreshItem);
+								}, function(error) {
+									errorHandler(error);
+									refresher(refreshItem);
 								});
 							}
 						}
@@ -424,12 +439,7 @@
 					if (name) {
 						fileClient.createFile(item.Location, name).then(
 							dojo.hitch(explorer, function() {this.changedItem(item);}),
-								function(error) {
-									serviceRegistry.getService("orion.page.message").then(function(statusService) {
-										statusService.setErrorMessage(error);
-									});
-								}
-							);
+							errorHandler);
 					}
 				});
 			},
@@ -449,12 +459,8 @@
 				getNewItemName(item, domId, "New Folder", function(name) {
 					if (name) {
 						fileClient.createFolder(item.Location, name).then(
-							dojo.hitch(explorer, function() {this.changedItem(item);}),
-								function(error) {
-									serviceRegistry.getService("orion.page.message").then(function(statusService) {
-										statusService.setErrorMessage(error);
-									});
-								});
+							dojo.hitch(explorer, function() {this.changedItem(item);}), 
+							errorHandler);
 					}
 				});
 			},
@@ -474,7 +480,8 @@
 				getNewItemName(item, domId, "New Folder", function(name) {
 					if (name) {
 						fileClient.createProject(explorer.treeRoot.ChildrenLocation, name).then(
-							dojo.hitch(explorer, function() {this.loadResourceList(this.treeRoot.Path, true);})); // refresh the root
+							dojo.hitch(explorer, function() {this.loadResourceList(this.treeRoot.Path, true);}), // refresh the root
+							errorHandler);
 					}
 				});
 			},
@@ -495,7 +502,8 @@
 					label: "Folder name:",
 					func:  function(name, url, create){
 						fileClient.createProject(explorer.treeRoot.ChildrenLocation, name, url, create).then(
-							dojo.hitch(explorer, function() {this.loadResourceList(this.treeRoot.Path, true);}));//refresh the root
+							dojo.hitch(explorer, function() {this.loadResourceList(this.treeRoot.Path, true);}), //refresh the root
+							errorHandler);
 					},
 					advanced: true
 				});
@@ -536,12 +544,13 @@
 				item = forceSingleItem(item);
 				var dialog = new orion.widgets.SFTPConnectionDialog({
 					func:  function(host,path,user,password, overwriteOptions){
-						serviceRegistry.getService("orion.page.message").then(function(progressService) {
-							var optionHeader = overwriteOptions ? "sftp,"+overwriteOptions : "sftp";
-							var importOptions = {"OptionHeader":optionHeader,"Host":host,"Path":path,"UserName":user,"Passphrase":password};
-							var deferred = fileClient.remoteImport(item.ImportLocation, importOptions);
+						var optionHeader = overwriteOptions ? "sftp,"+overwriteOptions : "sftp";
+						var importOptions = {"OptionHeader":optionHeader,"Host":host,"Path":path,"UserName":user,"Passphrase":password};
+						var deferred = fileClient.remoteImport(item.ImportLocation, importOptions);
+						progress.then(function(progressService) {
 							progressService.showWhile(deferred, "Importing from " + host).then(
-								dojo.hitch(explorer, function() {this.changedItem(this.treeRoot);}));//refresh the root
+								dojo.hitch(explorer, function() {this.changedItem(this.treeRoot);}),
+								errorHandler);//refresh the root
 						});
 					}
 				});
@@ -563,12 +572,13 @@
 				item = forceSingleItem(item);
 				var dialog = new orion.widgets.SFTPConnectionDialog({
 					func:  function(host,path,user,password, overwriteOptions){
-						serviceRegistry.getService("orion.page.message").then(function(progressService) {
-							var optionHeader = overwriteOptions ? "sftp,"+overwriteOptions : "sftp";
-							var exportOptions = {"OptionHeader":optionHeader,"Host":host,"Path":path,"UserName":user,"Passphrase":password};
-							var deferred = fileClient.remoteExport(item.ExportLocation, exportOptions);
+						var optionHeader = overwriteOptions ? "sftp,"+overwriteOptions : "sftp";
+						var exportOptions = {"OptionHeader":optionHeader,"Host":host,"Path":path,"UserName":user,"Passphrase":password};
+						var deferred = fileClient.remoteExport(item.ExportLocation, exportOptions);
+						progress.then(function(progressService) {
 							progressService.showWhile(deferred, "Exporting from " + host).then(
-								dojo.hitch(explorer, function() {this.changedItem(this.treeRoot);}));//refresh the root
+								dojo.hitch(explorer, function() {this.changedItem(this.treeRoot);}),
+								errorHandler);//refresh the root
 						});
 					}
 				});
@@ -640,7 +650,7 @@
 								if (location) {
 									fileClient.copyFile(location, explorer.treeRoot.Location, name).then(dojo.hitch(explorer, function() {
 										this.changedItem(this.treeRoot);
-									}));
+									}), errorHandler);
 								}
 							}
 						}
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 3293bf5..7cc8adc 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/globalCommands.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/globalCommands.js
@@ -78,7 +78,7 @@
 		'This is a Beta build of Orion.  You can use it, play with it and explore the ' +
 		'capabilities but BEWARE your data may be lost. &nbsp;| '+ 
 		'<a href="http://wiki.eclipse.org/Orion/FAQ">FAQ</a> | ' + 
-		'<a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Orion&version=0.2">Report a Bug</a> | ' +
+		'<a href="https://bugs.eclipse.org/bugs/enter_bug.cgi?product=Orion&version=0.3">Report a Bug</a> | ' +
 		'<a href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a> | ' + 
 		'<a href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a> | '+ 
 		'<a href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a>'; 
@@ -214,10 +214,6 @@
 	function generateBanner(parentId, serviceRegistry, commandService, prefsService, searcher, handler, /* optional */ editor, /* optional */ escapeProvider) {
 		// this needs to come from somewhere but I'm not going to do a separate get for it
 		
-		
-		// NOTE: require.toURL needs special logic here to handle "filesearch"
-		var searchLocation = require.toUrl("filesearch._");
-		searchLocation = searchLocation.substring(0, searchLocation.length - 2) +"?q=";
 		var text;
 		var parent = dojo.byId(parentId);
 		if (!parent) {
@@ -267,14 +263,13 @@
 		}
 		dojo.connect(searchField, "onkeypress", function(e){
 			if (e.charOrCode === dojo.keys.ENTER) {
-				if (searchLocation) {
+				if (searcher) {
 					if (searchField.value.length > 0) {
-						// we create the filesearch location relative to search.html
-						var query = searcher.createSearchQuery("../filesearch?q=", searchField.value);
+						var query = searcher.createSearchQuery(searchField.value);
 						window.location = require.toUrl("search/search.html") + "#"+query;
 					}
 				} else {
-					window.alert("Can't search: SearchLocation not available");
+					window.alert("Can't search: no search service is available");
 				}
 			}
 		});
@@ -286,11 +281,8 @@
 			dojo.place(text, title, "last");
 		}
 	
-		var openResourceDialog = function(searchLocation, searcher, /* optional */ editor) {
-			var dialog = new orion.widgets.OpenResourceDialog({
-				SearchLocation: searchLocation,
-				searcher: searcher
-			});
+		var openResourceDialog = function(searcher, /* optional */ editor) {
+			var dialog = new orion.widgets.OpenResourceDialog({searcher: searcher});
 			if (editor) {
 				dojo.connect(dialog, "onHide", function() {
 					editor.getTextView().focus(); // Focus editor after dialog close, Dojo's doesn't work
@@ -304,14 +296,14 @@
 			tooltip: "Choose a file by name and open an editor on it",
 			id: "eclipse.openResource",
 			callback: function(item) {
-				openResourceDialog(searchLocation, searcher, editor);
+				openResourceDialog(searcher, editor);
 			}});
 			
 		// We need a mod key binding in the editor, for now use the old one (ctrl-shift-r)
 		if (editor) {
 			editor.getTextView().setKeyBinding(new mKeyBinding.KeyBinding("r", true, true, false), "Find File Named...");
 			editor.getTextView().setAction("Find File Named...", function() {
-					openResourceDialog(searchLocation, searcher, editor);
+					openResourceDialog(searcher, editor);
 					return true;
 				});
 		}
@@ -392,12 +384,8 @@
 				dojo.place(bottomHTMLFragment, footer, "only");
 			}
 		}
-	
 	}
 	
-	
-
-	
 	//return the module exports
 	return {
 		generateUserInfo: generateUserInfo,
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/pluginregistry.js b/bundles/org.eclipse.orion.client.core/web/orion/pluginregistry.js
index d976fcf..e511bd3 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/pluginregistry.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/pluginregistry.js
@@ -324,9 +324,12 @@
 					_plugins.push(plugin);
 				}
 			} else {
-				installList.push(_self.installPlugin(pluginURL));
+				_storage[key] ="{}";
+				var plugin = new eclipse.Plugin(pluginURL, {}, internalRegistry); 
+				_plugins.push(plugin);
+				installList.push(plugin._load(false)); // _load(false) because we want to ensure the plugin is updated
 			}
-		}		
+		}
 		return new dojo.DeferredList(installList);
 	};
 	
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 fdfabbe..d43b7bb 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/preferences.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/preferences.js
@@ -371,7 +371,7 @@
 			}
 			return d;
 		},
-		set: function(name, data) {
+		put: function(name, data) {
 			var d = new dojo.Deferred();
 			d.resolve();
 			return d;
@@ -393,7 +393,7 @@
 			}
 			return d;
 		},
-		set: function(name, data) {
+		put: function(name, data) {
 			var d = new dojo.Deferred();
 			this._cache.set(name, data);
 			d.resolve();
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/searchClient.js b/bundles/org.eclipse.orion.client.core/web/orion/searchClient.js
index 75acc1d..b04215c 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/searchClient.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/searchClient.js
@@ -25,6 +25,7 @@
 	function Searcher(options) {
 		this.registry= options.serviceRegistry;
 		this._commandService = options.commandService;
+		this._fileService = options.fileService;
 	}
 	Searcher.prototype = /**@lends orion.searchClient.Searcher.prototype*/ {
 		/**
@@ -39,27 +40,12 @@
 		 * @param {Boolean} [useFlatList] Use flat list to show the result, other wise use a tree structure.
 		 */
 		search: function(resultsNode, query, excludeFile,  generateHeadingAndSaveLink, onResultReady,  hideSummaries, useFlatList) {
-			dojo.xhrGet({
-				url: query,
-				handleAs: "json",
-				headers: {
-					"Accept": "application/json",
-					"Orion-Version": "1"
-				},
-				sync: false,
-				timeout: 15000,
-				// need to use inline errback to get ioArgs
-				error: function(response, ioArgs) {
-					var currentXHR = this;
-					mAuth.handleAuthenticationError(ioArgs.xhr, function(){
-						dojo.xhrGet(currentXHR); // retry GET							
-					});
-				},
-				load: dojo.hitch(this, function(jsonData) {
+			this._fileService.search(query).then(
+				dojo.hitch(this, function(jsonData) {
 					this.showSearchResult(resultsNode, query, excludeFile, generateHeadingAndSaveLink, onResultReady, 
 							hideSummaries, useFlatList, jsonData); 
 				})
-			});
+			);
 		},
 		handleError: function(response, resultsNode) {
 			console.error(response);
@@ -78,13 +64,13 @@
 		 * @param {String} query The text to search for, or null when searching purely on file name
 		 * @param {String} [nameQuery] The name of a file to search for
 		 */
-		createSearchQuery: function(searchLocation, query, nameQuery)  {
+		createSearchQuery: function(query, nameQuery)  {
 			if (nameQuery) {
 				//assume implicit trailing wildcard if there isn't one already
 				var wildcard= (/\*$/.test(nameQuery) ? "" : "*");
-				return searchLocation + "Name:" + this._luceneEscape(nameQuery, true) + wildcard;
+				return "?q=" + "Name:" + this._luceneEscape(nameQuery, true) + wildcard;
 			}
-			return searchLocation + this._luceneEscape(query);
+			return "?q=" + this._luceneEscape(query);
 		},
 		/**
 		 * Escapes all characters in the string that require escaping in Lucene queries.
diff --git a/bundles/org.eclipse.orion.client.core/web/orion/widgets/OpenResourceDialog.js b/bundles/org.eclipse.orion.client.core/web/orion/widgets/OpenResourceDialog.js
index 12b4c5f..e6337e8 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/widgets/OpenResourceDialog.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/widgets/OpenResourceDialog.js
@@ -10,7 +10,7 @@
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
 /*jslint browser:true*/
-/*global define window dojo dijit*/
+/*global define orion window dojo dijit*/
 
 define(['dojo', 'dijit', 'dijit/Dialog', 'dijit/form/TextBox',
 		'orion/widgets/_OrionDialogMixin', 'text!orion/widgets/templates/OpenResourceDialog.html'], function(dojo, dijit) {
@@ -21,7 +21,6 @@
  * @name orion.widgets.OpenResourceDialog
  * @class A dialog that searches for files by name or wildcard.
  * @param {String} [options.title] Text to display in the dialog's titlebar.
- * @param {String} options.SearchLocation The URL to use for searching the workspace.
  * @param {orion.searchClient.Searcher} options.searcher The searcher to use for displaying results.
  */
 var OpenResourceDialog = dojo.declare("orion.widgets.OpenResourceDialog", [dijit.Dialog, orion.widgets._OrionDialogMixin],
@@ -33,7 +32,6 @@
 	timeoutId: null,
 	time: null,
 	options: null,
-	searchLocation: null,
 	searcher: null,
 	
 	/** @private */
@@ -42,11 +40,7 @@
 		this.timeoutId = null;
 		this.time = 0;
 		this.options = arguments[0];
-		this.searchLocation = this.options && this.options.SearchLocation;
 		this.searcher = this.options && this.options.searcher;
-		if (!this.searchLocation) {
-			throw new Error("Missing required argument: SearchLocation");
-		}
 		if (!this.searcher) {
 			throw new Error("Missing required argument: searcher");
 		}
@@ -105,7 +99,7 @@
 		// Gives Webkit a chance to show the "Searching" message
 		var that = this;
 		setTimeout(function() {
-			var query = that.searcher.createSearchQuery(that.searchLocation, null, text);
+			var query = that.searcher.createSearchQuery(null, text);
 			that.searcher.search(that.results, query, false, false, dojo.hitch(that, that.decorateResult), true /*no highlight*/,true/*use flat list*/);
 		}, 0);
 	},
diff --git a/bundles/org.eclipse.orion.client.core/web/plugin/install.js b/bundles/org.eclipse.orion.client.core/web/plugin/install.js
index 30a612c..8649c34 100644
--- a/bundles/org.eclipse.orion.client.core/web/plugin/install.js
+++ b/bundles/org.eclipse.orion.client.core/web/plugin/install.js
@@ -12,10 +12,10 @@
 /*jslint browser:true devel:true*/
 /*global define window dijit dojo eclipse widgets serviceRegistry:true*/
 
-define(['dojo', 'orion/bootstrap', 'orion/status', 'orion/commands', 
+define(['dojo', 'orion/bootstrap', 'orion/status', 'orion/commands', 'orion/fileClient',
 	        'orion/searchClient', 'orion/globalCommands',
 	        'dojo/parser', 'dojo/hash', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane'], 
-			function(dojo, mBootstrap, mStatus, mCommands, mSearchClient, mGlobalCommands) {
+			function(dojo, mBootstrap, mStatus, mCommands, mFileClient, mSearchClient, mGlobalCommands) {
 
 	dojo.addOnLoad(function() {
 		mBootstrap.startup().then(function(core) {
@@ -26,7 +26,8 @@
 			dojo.parser.parse();
 			
 			var commandService = new mCommands.CommandService({serviceRegistry: serviceRegistry});
-			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
+			var fileClient = new mFileClient.FileClient(serviceRegistry);
+			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
 			var statusService = new mStatus.StatusReportingService(serviceRegistry, "statusPane", "notifications");
 				
 			// global commands
diff --git a/bundles/org.eclipse.orion.client.core/web/plugin/list.js b/bundles/org.eclipse.orion.client.core/web/plugin/list.js
index 0a87826..2b98165 100644
--- a/bundles/org.eclipse.orion.client.core/web/plugin/list.js
+++ b/bundles/org.eclipse.orion.client.core/web/plugin/list.js
@@ -12,10 +12,10 @@
 /*jslint browser:true devel:true*/
 /*global define dijit dojo orion widgets serviceRegistry:true window*/
 
-define(['require', 'dojo', 'orion/bootstrap', 'orion/status', 'orion/commands', 
+define(['require', 'dojo', 'orion/bootstrap', 'orion/status', 'orion/commands', 'orion/fileClient',
 	        'orion/searchClient', 'orion/globalCommands', 'orion/dialogs',
 	        'dojo/parser', 'dojo/hash', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'orion/widgets/RegistryTree'], 
-			function(require, dojo, mBootstrap, mStatus, mCommands, mSearchClient, mGlobalCommands, mDialogs) {
+			function(require, dojo, mBootstrap, mStatus, mCommands, mFileClient, mSearchClient, mGlobalCommands, mDialogs) {
 
 dojo.addOnLoad(function() {
 	mBootstrap.startup().then(function(core) {
@@ -26,7 +26,8 @@
 		dojo.parser.parse();
 		var dialogService = new mDialogs.DialogService(serviceRegistry);
 		var commandService = new mCommands.CommandService({serviceRegistry: serviceRegistry});
-		var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
+		var fileClient = new mFileClient.FileClient(serviceRegistry);
+		var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
 		var statusService = new mStatus.StatusReportingService(serviceRegistry, "statusPane", "notifications");
 		var tree;
 		
diff --git a/bundles/org.eclipse.orion.client.core/web/plugins/filePlugin/fileImpl.js b/bundles/org.eclipse.orion.client.core/web/plugins/filePlugin/fileImpl.js
index ca9ce96..d985a19 100644
--- a/bundles/org.eclipse.orion.client.core/web/plugins/filePlugin/fileImpl.js
+++ b/bundles/org.eclipse.orion.client.core/web/plugins/filePlugin/fileImpl.js
@@ -391,8 +391,27 @@
 					return jsonData;
 				}
 			});
-		}
+		},
 		
+		/**
+		 * Performs a search with the given query.
+		 * @param {String} query The search query
+		 */
+		search: function(query) {
+			return dojo.xhrGet({
+				url: "/filesearch" + query,
+				handleAs: "json",
+				headers: {
+					"Accept": "application/json",
+					"Orion-Version": "1"
+				},
+				sync: false,
+				timeout: 15000,
+				load: function(jsonData, ioArgs) {
+					return jsonData;
+				}
+			});
+		}
 	};
 	
 	function _call2(method, url, headers, body) {
diff --git a/bundles/org.eclipse.orion.client.core/web/search/search.js b/bundles/org.eclipse.orion.client.core/web/search/search.js
index a5da1c4..f09b518 100644
--- a/bundles/org.eclipse.orion.client.core/web/search/search.js
+++ b/bundles/org.eclipse.orion.client.core/web/search/search.js
@@ -13,10 +13,10 @@
 /*browser:true*/
 
 define(['dojo', 'orion/bootstrap', 'orion/status','orion/dialogs',
-        'orion/commands', 'orion/favorites', 'orion/searchClient', 'orion/searchResults', 'orion/globalCommands',
+        'orion/commands', 'orion/favorites', 'orion/searchClient', 'orion/fileClient', 'orion/searchResults', 'orion/globalCommands',
         'dojo/parser', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'orion/widgets/eWebBorderContainer'], 
 		function(dojo, mBootstrap, mStatus, mDialogs, mCommands, mFavorites, 
-				mSearchClient, mSearchResults, mGlobalCommands) {
+				mSearchClient, mFileClient, mSearchResults, mGlobalCommands) {
 
 	dojo.addOnLoad(function() {
 		mBootstrap.startup().then(function(core) {
@@ -31,8 +31,9 @@
 	
 			// Favorites
 			new mFavorites.FavoritesService({serviceRegistry: serviceRegistry});
-		
-			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
+
+			var fileClient = new mFileClient.FileClient(serviceRegistry);
+			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
 			var searchResultsGenerator = new mSearchResults.SearchResultsGenerator(serviceRegistry, searcher, "results", commandService, "pageActions");
 			var favorites = new mFavorites.Favorites({parent: "favoriteProgress", serviceRegistry: serviceRegistry});
 			mGlobalCommands.generateBanner("toolbar", serviceRegistry, commandService, preferences, searcher, searcher);
diff --git a/bundles/org.eclipse.orion.client.core/web/sites/site.js b/bundles/org.eclipse.orion.client.core/web/sites/site.js
index e20b6c6..328413c 100644
--- a/bundles/org.eclipse.orion.client.core/web/sites/site.js
+++ b/bundles/org.eclipse.orion.client.core/web/sites/site.js
@@ -37,7 +37,7 @@
 				return pattern && pattern.indexOf("/") === 0;
 			});
 			var siteService = new mSiteService.SiteService(serviceRegistry);
-			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
+			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
 			
 			mGlobalCommands.generateBanner("toolbar", serviceRegistry, commandService, preferences, searcher);
 			
diff --git a/bundles/org.eclipse.orion.client.core/web/sites/sites.js b/bundles/org.eclipse.orion.client.core/web/sites/sites.js
index 96634c1..03b0730 100644
--- a/bundles/org.eclipse.orion.client.core/web/sites/sites.js
+++ b/bundles/org.eclipse.orion.client.core/web/sites/sites.js
@@ -16,10 +16,10 @@
  * Glue code for sites.html
  */
 
-define(['require', 'dojo', 'orion/bootstrap', 'orion/status', 'orion/commands', 
+define(['require', 'dojo', 'orion/bootstrap', 'orion/status', 'orion/commands', 'orion/fileClient',
 	        'orion/searchClient', 'orion/dialogs', 'orion/globalCommands', 'orion/siteService', 'orion/siteUtils', 'orion/siteTree', 'orion/treetable', 
 	        'dojo/parser', 'dojo/hash', 'dojo/date/locale', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'orion/widgets/NewSiteDialog'], 
-			function(require, dojo, mBootstrap, mStatus, mCommands, mSearchClient, mDialogs, mGlobalCommands, mSiteService, mSiteUtils, mSiteTree, mTreeTable) {
+			function(require, dojo, mBootstrap, mStatus, mCommands, mFileClient, mSearchClient, mDialogs, mGlobalCommands, mSiteService, mSiteUtils, mSiteTree, mTreeTable) {
 
 	dojo.addOnLoad(function() {
 		mBootstrap.startup().then(function(core) {
@@ -34,7 +34,8 @@
 			var commandService = new mCommands.CommandService({serviceRegistry: serviceRegistry});
 	
 			var siteService = new mSiteService.SiteService(serviceRegistry);
-			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
+			var fileClient = new mFileClient.FileClient(serviceRegistry);
+			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
 			
 			mGlobalCommands.generateBanner("toolbar", serviceRegistry, commandService, preferences, searcher);
 			
diff --git a/bundles/org.eclipse.orion.client.core/web/test/unittest.js b/bundles/org.eclipse.orion.client.core/web/test/unittest.js
index 69e7720..d082667 100644
--- a/bundles/org.eclipse.orion.client.core/web/test/unittest.js
+++ b/bundles/org.eclipse.orion.client.core/web/test/unittest.js
@@ -12,9 +12,10 @@
  /*global eclipse:true dojo document console*/
 
 
-define(['require', 'dojo', 'orion/serviceregistry', 'orion/pluginregistry', 'orion/bootstrap', 'orion/commands', 'orion/searchClient', 'orion/globalCommands', 'orion/treetable',
+define(['require', 'dojo', 'orion/serviceregistry', 'orion/pluginregistry', 'orion/bootstrap', 'orion/commands', 
+		'orion/fileClient', 'orion/searchClient', 'orion/globalCommands', 'orion/treetable',
         'dojo/hash', 'dojo/parser'],
-        function(require, dojo, mServiceRegistry, mPluginRegistry, mBootstrap, mCommands, mSearchClient, mGlobalCommands, mTreetable) {
+        function(require, dojo, mServiceRegistry, mPluginRegistry, mBootstrap, mCommands, mFileClient, mSearchClient, mGlobalCommands, mTreetable) {
 	
 
 var eclipse = eclipse || {};
@@ -136,7 +137,8 @@
 		document.body.style.visibility = "visible";
 		dojo.parser.parse();
 		var commandService = new mCommands.CommandService({serviceRegistry: serviceRegistry});
-		var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
+		var fileClient = new mFileClient.FileClient(serviceRegistry);
+		var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
 		
 		// global banner
 		mGlobalCommands.generateBanner("toolbar", serviceRegistry, commandService, preferences, searcher);
diff --git a/bundles/org.eclipse.orion.client.editor/jsTestDriver.conf b/bundles/org.eclipse.orion.client.editor/jsTestDriver.conf
index c0748cf..ceeb434 100644
--- a/bundles/org.eclipse.orion.client.editor/jsTestDriver.conf
+++ b/bundles/org.eclipse.orion.client.editor/jsTestDriver.conf
@@ -11,4 +11,6 @@
 proxy:  
 - {matcher: "/orion/*", server: "http://localhost:8080/orion/"}
 - {matcher: "/examples/*", server: "http://localhost:8080/examples/"}
-- {matcher: "*", server: "http://localhost:42442"} 
+- {matcher: "*", server: "http://localhost:42442"}
+
+timeout: 3000
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 b540a28..f6cdcab 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
@@ -390,6 +390,12 @@
 			}
 			
 			var editor = this, textView = this._textView;
+			
+			// Listener for dirty state
+			textView.addEventListener("ModelChanged", this, this.checkDirty);
+			
+			// Selection changed listener
+			textView.addEventListener("Selection", this, this._updateCursorStatus);
 						
 			// Set up keybindings
 			if (this._keyBindingFactory) {
@@ -433,29 +439,6 @@
 				return false;
 			}.bind(this));
 						
-			/** @this {orion.editor.Editor} */
-			function updateCursorStatus() {
-				var model = this.getModel();
-				var caretOffset = this.getCaretOffset();
-				var lineIndex = model.getLineAtOffset(caretOffset);
-				var lineStart = model.getLineStart(lineIndex);
-				var offsetInLine = caretOffset - lineStart;
-				// If we are in a mode and it owns status reporting, we bail out from reporting the cursor position.
-				for (var i=0; i<this._keyModes.length; i++) {
-					var mode = this._keyModes[i];
-					if (mode.isActive() && mode.isStatusActive && mode.isStatusActive()) {
-						return;
-					}
-				}
-				this.reportStatus("Line " + (lineIndex + 1) + " : Col " + (offsetInLine + 1));
-			}
-			
-			// Listener for dirty state
-			textView.addEventListener("ModelChanged", this, this.checkDirty);
-					
-			//Adding selection changed listener
-			textView.addEventListener("Selection", this, updateCursorStatus);
-			
 			// Create rulers
 			if (this._annotationFactory) {
 				var textModel = textView.getModel();
@@ -505,6 +488,22 @@
 			this._updateFoldingRuler();
 		},
 		
+		_updateCursorStatus: function() {
+			var model = this.getModel();
+			var caretOffset = this.getCaretOffset();
+			var lineIndex = model.getLineAtOffset(caretOffset);
+			var lineStart = model.getLineStart(lineIndex);
+			var offsetInLine = caretOffset - lineStart;
+			// If we are in a mode and it owns status reporting, we bail out from reporting the cursor position.
+			for (var i=0; i<this._keyModes.length; i++) {
+				var mode = this._keyModes[i];
+				if (mode.isActive() && mode.isStatusActive && mode.isStatusActive()) {
+					return;
+				}
+			}
+			this.reportStatus("Line " + (lineIndex + 1) + " : Col " + (offsetInLine + 1));
+		},
+		
 		showProblems: function(problems) {
 			var annotationModel = this._annotationModel;
 			if (!annotationModel) {
diff --git a/bundles/org.eclipse.orion.client.editor/web/orion/editor/editorFeatures.js b/bundles/org.eclipse.orion.client.editor/web/orion/editor/editorFeatures.js
index ba75f79..8a053ad 100644
--- a/bundles/org.eclipse.orion.client.editor/web/orion/editor/editorFeatures.js
+++ b/bundles/org.eclipse.orion.client.editor/web/orion/editor/editorFeatures.js
@@ -102,6 +102,7 @@
 		if(this._searcher) {
 			this._searcher.getAdaptor().setEditor(this.editor);
 		}
+		this._lastEditLocation = null;
 		this.init();
 	}
 	TextActions.prototype = {
@@ -136,13 +137,23 @@
 						e.text = null;
 					} else {
 					}
-				}.bind(this),
+				},
 				onSelection: function() {
 					if (!this._incrementalFindIgnoreSelection) {
 						this.toggleIncrementalFind();
 					}
-				}.bind(this)
+				}
 			};
+			
+			this._lastEditListener = {
+				onModelChanged: function(e) {
+					if (this.editor.isDirty()) {
+						this._lastEditLocation = e.start + e.addedCharCount;
+					}
+				}
+			};
+			this.textView.addEventListener("ModelChanged", this, this._lastEditListener.onModelChanged);
+			
 			// Find actions
 			// These variables are used among the various find actions:
 			this.textView.setKeyBinding(new orion.textview.KeyBinding("f", true), "Find...");
@@ -424,6 +435,14 @@
 				return true;
 			}.bind(this));
 			
+			var isMac = navigator.platform.indexOf("Mac") !== -1;
+			this.textView.setKeyBinding(new orion.textview.KeyBinding("q", !isMac, false, false, isMac), "Last Edit Location");
+			this.textView.setAction("Last Edit Location", function() {
+				if (typeof this._lastEditLocation === "number")  {
+					this.editor.showSelection(this._lastEditLocation);
+				}
+				return true;
+			}.bind(this));
 		},
 			
 		toggleIncrementalFind: function() {
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 497a424..6c05705 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
@@ -4441,7 +4441,9 @@
 				var self = this;
 				/** @ignore */
 				var cleanup = function() {
-					self._clientDiv.removeChild(child);
+					if (child && child.parentNode === self._clientDiv) {
+						self._clientDiv.removeChild(child);
+					}
 					self._updateDOMSelection();
 				};
 				var result = false;
diff --git a/bundles/org.eclipse.orion.client.git/web/git/git-clone.js b/bundles/org.eclipse.orion.client.git/web/git/git-clone.js
index e0b2eee..82fbfb6 100644
--- a/bundles/org.eclipse.orion.client.git/web/git/git-clone.js
+++ b/bundles/org.eclipse.orion.client.git/web/git/git-clone.js
@@ -12,11 +12,11 @@
 /*global dojo dijit window eclipse serviceRegistry:true widgets alert*/
 /*browser:true*/
 define(['dojo', 'orion/bootstrap', 'orion/status', 'orion/commands',
-        'orion/dialogs', 'orion/selection', 'orion/fileClient', 'orion/searchClient', 'orion/globalCommands', 'orion/git/gitClient',
+        'orion/dialogs', 'orion/selection', 'orion/fileClient', 'orion/searchClient', 'orion/fileClient', 'orion/globalCommands', 'orion/git/gitClient',
         'orion/ssh/sshTools', 'orion/git/git-clone-details', 'orion/git/git-clones-explorer', 'orion/git/gitCommands',
 	    'dojo/parser', 'dojo/hash', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane', 'orion/widgets/eWebBorderContainer'], 
 		function(dojo, mBootstrap, mStatus, mCommands, mDialogs, mSelection, mFileClient,
-					mSearchClient, mGlobalCommands, mGitClient, mSshTools, mGitCloneDetails, mGitClonesExplorer, mGitCommands) {
+					mSearchClient, mFileClient, mGlobalCommands, mGitClient, mSshTools, mGitCloneDetails, mGitClonesExplorer, mGitCommands) {
 
 	mBootstrap.startup().then(function(core) {
 		var serviceRegistry = core.serviceRegistry;
@@ -33,7 +33,8 @@
 		// Git operations
 		new mGitClient.GitService(serviceRegistry);
 		
-		var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
+		var fileClient = new mFileClient.FileClient(serviceRegistry);
+		var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
 	
 		// define the command contributions - where things appear, first the groups
 		commandService.addCommandGroup("eclipse.gitGroup", 100, null, null, "pageActions");
diff --git a/bundles/org.eclipse.orion.client.git/web/git/git-status.js b/bundles/org.eclipse.orion.client.git/web/git/git-status.js
index 87949de..f251058 100644
--- a/bundles/org.eclipse.orion.client.git/web/git/git-status.js
+++ b/bundles/org.eclipse.orion.client.git/web/git/git-status.js
@@ -10,9 +10,9 @@
  ******************************************************************************/
 
 define(['dojo', 'orion/bootstrap', 'orion/status',  'orion/commands',
-	        'orion/searchClient', 'orion/globalCommands', 'orion/git/gitClient', 'orion/git/git-status-table', 'orion/breadcrumbs','orion/dialogs','orion/ssh/sshTools',
+	        'orion/searchClient', 'orion/fileClient', 'orion/globalCommands', 'orion/git/gitClient', 'orion/git/git-status-table', 'orion/breadcrumbs','orion/dialogs','orion/ssh/sshTools',
 	        'dojo/parser', 'dojo/hash', 'dijit/layout/BorderContainer', 'dijit/layout/ContentPane'], 
-			function(dojo, mBootstrap, mStatus, mCommands, mSearchClient, mGlobalCommands, mGitClient, mGitStatusTable, mBreadcrumbs,mDialogs,mSshTools) {
+			function(dojo, mBootstrap, mStatus, mCommands, mSearchClient, mFileClient, mGlobalCommands, mGitClient, mGitStatusTable, mBreadcrumbs,mDialogs,mSshTools) {
 
 	dojo.addOnLoad(function() {
 		mBootstrap.startup().then(function(core) {
@@ -21,7 +21,8 @@
 			document.body.style.visibility = "visible";
 			dojo.parser.parse();
 			var commandService = new mCommands.CommandService({serviceRegistry: serviceRegistry});
-			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService});
+			var fileClient = new mFileClient.FileClient(serviceRegistry);
+			var searcher = new mSearchClient.Searcher({serviceRegistry: serviceRegistry, commandService: commandService, fileService: fileClient});
 			// Git operations
 			new mGitClient.GitService(serviceRegistry);
 			new mSshTools.SshService(serviceRegistry);