Add Project view to editor sidebar
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 6ccd12d..6d911b4 100644
--- a/bundles/org.eclipse.orion.client.core/web/orion/fileClient.js
+++ b/bundles/org.eclipse.orion.client.core/web/orion/fileClient.js
@@ -441,7 +441,12 @@
 		 */
 		search: function(searchParams) {
 			return _doServiceCall(this._getService(searchParams.resource), "search", arguments); //$NON-NLS-0$
+		},
+		
+		readProject: function(location){
+			return _doServiceCall(this._getService(location), "readProject", arguments); //$NON-NLS-0$
 		}
+		
 	};//end FileClient prototype
 	FileClient.prototype.constructor = FileClient;
 
diff --git a/bundles/org.eclipse.orion.client.ui/web/css/images.css b/bundles/org.eclipse.orion.client.ui/web/css/images.css
index fefbe84..84f2203 100644
--- a/bundles/org.eclipse.orion.client.ui/web/css/images.css
+++ b/bundles/org.eclipse.orion.client.ui/web/css/images.css
@@ -61,3 +61,4 @@
 .core-sprite-thumbnail{ background-position: 0 -716px; width: 16px; height: 16px; } 
 .core-sprite-warning{ background-position: 0 -734px; width: 16px; height: 16px; } 
 .core-sprite-wrench{ background-position: 0 -752px; width: 16px; height: 16px; } 
+.core-sprite-initproject{ background:url(../images/initproject.ico); width: 16px; height: 16px; } 
diff --git a/bundles/org.eclipse.orion.client.ui/web/images/initproject.ico b/bundles/org.eclipse.orion.client.ui/web/images/initproject.ico
new file mode 100644
index 0000000..e55f5b7
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/images/initproject.ico
Binary files differ
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/edit/nls/root/messages.js b/bundles/org.eclipse.orion.client.ui/web/orion/edit/nls/root/messages.js
index a75539e..2ec3ff8 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/edit/nls/root/messages.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/edit/nls/root/messages.js
@@ -1,6 +1,6 @@
 /*******************************************************************************
  * @license
- * Copyright (c) 2012 IBM Corporation and others.
+ * Copyright (c) 2012, 2013 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials are made 
  * available under the terms of the Eclipse Public License v1.0 
  * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 
@@ -41,7 +41,10 @@
 	"ViewTooltip": "View", //$NON-NLS-1$ //$NON-NLS-0$
 	"Actions": "Actions", //$NON-NLS-1$ //$NON-NLS-0$
 	"Navigator": "Navigator", //$NON-NLS-1$ //$NON-NLS-0$
+	"Project": "Project", //$NON-NLS-1$ //$NON-NLS-0$
 	"New": "New", //$NON-NLS-1$ //$NON-NLS-0$
+	"Add": "Add", //$NON-NLS-1$ //$NON-NLS-0$
 	"NoFile": "Use the ${0} to create new files and folders. Click a file to start coding.", //$NON-NLS-1$ //$NON-NLS-0$
-	"LocalEditorSettings": "Local Editor Settings"
+	"LocalEditorSettings": "Local Editor Settings",
+	"NoProject": "${0} is not a project. To convert it to project use ${1}"
 });
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/projectCommands.js b/bundles/org.eclipse.orion.client.ui/web/orion/projectCommands.js
new file mode 100644
index 0000000..c82410b
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/projectCommands.js
@@ -0,0 +1,152 @@
+/*******************************************************************************
+ * @license
+ * Copyright (c) 2013 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials are made 
+ * available under the terms of the Eclipse Public License v1.0 
+ * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 
+ * License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html). 
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+/*global window define orion XMLHttpRequest confirm*/
+/*jslint sub:true*/
+define(['i18n!orion/navigate/nls/messages', 'orion/webui/littlelib', 'orion/commands', 'orion/Deferred'],
+	function(messages, lib, mCommands, Deferred){
+		var projectCommandUtils = {};
+		
+		var selectionListenerAdded = false;
+		
+		var lastItemLoaded = {Location: null};
+		
+		var progressService;
+		
+			
+	function forceSingleItem(item) {
+		if (!item) {
+			return {};
+		}
+		if (Array.isArray(item)) {
+			if (item.length === 1) {
+				item = item[0];
+			} else {
+				item = {};
+			}
+		}
+		return item;
+	}
+		
+	/**
+	 * Updates the explorer toolbar.
+	 * @name orion.fileCommands#updateNavTools
+	 * @function
+	 * @param {orion.serviceregistry.ServiceRegistry} serviceRegistry
+	 * @param {orion.commandregistry.CommandRegistry} commandRegistry
+	 * @param {orion.explorer.Explorer} explorer
+	 * @param {String} toolbarId Gives the scope for toolbar commands. Commands in this scope are rendered with the <code>item</code>
+	 * parameter as their target.
+	 * @param {String} [selectionToolbarId] Gives the scope for selection-based commands. Commands in this scope are rendered
+	 * with current selection as their target.
+	 * @param {Object} item The model item to render toolbar commands against.
+	 * @param {Boolean} [rootSelection=false] If <code>true</code>, any selection-based commands will be rendered with the <code>explorer</code>'s 
+	 * treeRoot as their target, when no selection has been made. If <code>false</code>, any selection-based commands will be inactive when no 
+	 * selection has been made.
+	 */
+	projectCommandUtils.updateNavTools = function(registry, commandRegistry, explorer, toolbarId, selectionToolbarId, toolbarItem, rootSelection) {
+		function updateSelectionTools(selectionService, item) {
+			var selectionTools = lib.node(selectionToolbarId);
+			if (selectionTools) {
+				// Hacky: check for a local selection service of the selectionToolbarId, or the one associated with the commandRegistry
+				var contributions = commandRegistry._contributionsByScopeId[selectionToolbarId];
+				selectionService = selectionService || (contributions && contributions.localSelectionService) || commandRegistry.getSelectionService(); //$NON-NLS-0$
+				if (contributions && selectionService) {
+					Deferred.when(selectionService.getSelections(), function(selections) {
+						commandRegistry.destroy(selectionTools);
+						var isNoSelection = !selections || (Array.isArray(selections) && !selections.length);
+						if (rootSelection && isNoSelection) {
+							commandRegistry.renderCommands(selectionTools.id, selectionTools, item, explorer, "button");  //$NON-NLS-0$
+						} else {
+							commandRegistry.renderCommands(selectionTools.id, selectionTools, null, explorer, "button"); //$NON-NLS-1$ //$NON-NLS-0$
+						}
+					});
+				}
+			}
+		}
+
+		var toolbar = lib.node(toolbarId);
+		if (toolbar) {
+			commandRegistry.destroy(toolbar);
+		} else {
+			throw new Error("could not find toolbar " + toolbarId); //$NON-NLS-0$
+		}
+		// close any open slideouts because if we are retargeting the command
+		if (toolbarItem.Location !== lastItemLoaded.Location) {
+			commandRegistry.closeParameterCollector();
+			lastItemLoaded.Location = toolbarItem.Location;
+		}
+
+		commandRegistry.renderCommands(toolbar.id, toolbar, toolbarItem, explorer, "button"); //$NON-NLS-0$
+		if (lastItemLoaded.Location) {
+			commandRegistry.processURL(window.location.href);
+		} 
+		if (selectionToolbarId) {
+			updateSelectionTools(null, explorer.treeRoot);
+		}
+
+		// Attach selection listener once, keep forever
+		if (!selectionListenerAdded) {
+			selectionListenerAdded = true;
+			var selectionService = registry.getService("orion.page.selection"); //$NON-NLS-0$
+			selectionService.addEventListener("selectionChanged", function(event) { //$NON-NLS-0$
+				updateSelectionTools(selectionService, explorer.treeRoot);
+			});
+		}
+	};
+		
+	/**
+	 * Creates the commands related to file management.
+	 * @param {orion.serviceregistry.ServiceRegistry} serviceRegistry The service registry to use when creating commands
+	 * @param {orion.commandregistry.CommandRegistry} commandRegistry The command registry to get commands from
+	 * @param {orion.explorer.FileExplorer} explorer The explorer view to add commands to, and to update when model items change.
+	 * To broadcast model change nodifications, this explorer must have a <code>modelEventDispatcher</code> field.
+	 * @param {orion.EventTarget} [explorer.modelEventDispatcher] If supplied, this dispatcher will be invoked to dispatch events
+	 * describing model changes that are performed by file commands.
+	 * @param {orion.fileClient.FileClient} fileClient The file system client that the commands should use
+	 * @name orion.fileCommands#createFileCommands
+	 * @function
+	 */
+	projectCommandUtils.createProjectCommands = function(serviceRegistry, commandService, explorer, fileClient) {
+		progressService = serviceRegistry.getService("orion.page.progress"); //$NON-NLS-0$
+		
+		var addFolderCommand = new mCommands.Command({
+			name: "Add folder",
+			tooltip: "Add an external folder",
+			id: "orion.project.addFolder", //$NON-NLS-0$
+			callback: function(data) {
+				var item = forceSingleItem(data.items);
+				
+			},
+			visibleWhen: function(item) {
+				return item.type==="Project";
+			}
+		});
+		commandService.addCommand(addFolderCommand);
+		
+		var initProjectCommand = new mCommands.Command({
+			name: "Init Basic Project",
+			tooltip: "Convert this folder into a project",
+			id: "orion.project.initProject", //$NON-NLS-0$
+			callback: function(data) {
+				var item = forceSingleItem(data.items);
+				
+			},
+			visibleWhen: function(item) {
+				return item.type==="Folder";
+			}
+		});
+		commandService.addCommand(initProjectCommand);
+		
+		};
+	
+		return projectCommandUtils;
+});
\ No newline at end of file
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/sidebar.js b/bundles/org.eclipse.orion.client.ui/web/orion/sidebar.js
index 3ceda9e..7ea9507 100644
--- a/bundles/org.eclipse.orion.client.ui/web/orion/sidebar.js
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/sidebar.js
@@ -2,8 +2,9 @@
 /*jslint browser:true sub:true*/
 define(['orion/Deferred', 'orion/objects', 'orion/commands', 'orion/outliner', 'orion/webui/littlelib',
 		'orion/widgets/nav/mini-nav',
+		'orion/widgets/nav/project-nav',
 		'i18n!orion/edit/nls/messages'],
-		function(Deferred, objects, mCommands, mOutliner, lib, MiniNavViewMode, messages) {
+		function(Deferred, objects, mCommands, mOutliner, lib, MiniNavViewMode, ProjectNavViewMode, messages) {
 	/**
 	 * @name orion.sidebar.Sidebar
 	 * @class Sidebar that appears alongside an {@link orion.editor.Editor} in the Orion IDE.
@@ -93,6 +94,21 @@
 				serviceRegistry: serviceRegistry,
 				toolbarNode: modeContributionToolbar
 			}));
+			
+			//TODO remove check for the orion.projects when projects are delivered
+			if(this.serviceRegistry.getServiceReferences("orion.projects").length>0){
+				this.addViewMode("project", new ProjectNavViewMode({ //$NON-NLS-0$
+					commandRegistry: commandRegistry,
+					contentTypeRegistry: contentTypeRegistry,
+					fileClient: fileClient,
+					editorInputManager: editorInputManager,
+					parentNode: parentNode,
+					sidebarNavInputManager: this.sidebarNavInputManager,
+					serviceRegistry: serviceRegistry,
+					toolbarNode: modeContributionToolbar
+				}));
+				this.renderViewModeMenu();
+			}
 
 			// Outliner is responsible for adding its view mode(s) to this sidebar
 			this.outliner = new mOutliner.Outliner({
diff --git a/bundles/org.eclipse.orion.client.ui/web/orion/widgets/nav/project-nav.js b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/nav/project-nav.js
new file mode 100644
index 0000000..c1a94c0
--- /dev/null
+++ b/bundles/org.eclipse.orion.client.ui/web/orion/widgets/nav/project-nav.js
@@ -0,0 +1,400 @@
+/*******************************************************************************
+ * @license
+ * Copyright (c) 2013 IBM Corporation and others. 
+ * All rights reserved. This program and the accompanying materials are made 
+ * available under the terms of the Eclipse Public License v1.0 
+ * (http://www.eclipse.org/legal/epl-v10.html), and the Eclipse Distribution 
+ * License v1.0 (http://www.eclipse.org/org/documents/edl-v10.html). 
+ * 
+ * Contributors: IBM Corporation - initial API and implementation
+ ******************************************************************************/
+/*global define*/
+/*jslint browser:true devel:true sub:true*/
+define(['require', 'i18n!orion/edit/nls/messages', 'orion/objects', 'orion/webui/littlelib', 'orion/explorers/explorer-table',
+	'orion/explorers/navigatorRenderer', 'orion/explorers/explorerNavHandler', 'orion/i18nUtil', 'orion/keyBinding', 'orion/fileCommands', 'orion/projectCommands',
+	'orion/extensionCommands', 'orion/selection', 'orion/EventTarget', 'orion/URITemplate', 'orion/PageUtil', 'orion/section'
+	],
+	function(require, messages, objects, lib, mExplorer, mNavigatorRenderer, mExplorerNavHandler, i18nUtil, mKeyBinding, FileCommands, ProjectCommands,
+		ExtensionCommands, Selection, EventTarget, URITemplate, PageUtil, mSection) {
+	var FileExplorer = mExplorer.FileExplorer;
+	var KeyBinding = mKeyBinding.KeyBinding;
+	var NavigatorRenderer = mNavigatorRenderer.NavigatorRenderer;
+
+	/**
+	 * @class orion.sidebar.ProjectNavExplorer
+	 * @extends orion.explorers.FileExplorer
+	 */
+	function FilesNavExplorer(params) {
+		params.setFocus = false;   // do not steal focus on load
+		params.cachePrefix = null; // do not persist table state
+		FileExplorer.apply(this, arguments);
+		this.commandRegistry = params.commandRegistry;
+		this.editorInputManager = params.editorInputManager;
+		this.progressService = params.progressService;
+		var sidebarNavInputManager = this.sidebarNavInputManager = params.sidebarNavInputManager;
+		this.toolbarNode = params.toolbarNode;
+
+		this.newActionsScope = params.newActionsScope; //$NON-NLS-0$
+		this.selectionActionsScope = params.selectionActionsScope; //$NON-NLS-0$
+
+		this.followEditor = true;
+		var initialRoot = { };
+		this.treeRoot = initialRoot; // Needed by FileExplorer.prototype.loadResourceList
+		var _self = this;
+
+		// Listen to model changes from fileCommands
+		var dispatcher = this.modelEventDispatcher;
+		var onChange = this.onFileModelChange.bind(this);
+		["move", "delete"].forEach(function(type) { //$NON-NLS-1$ //$NON-NLS-0$
+			dispatcher.addEventListener(type, onChange);
+		});
+		this.selection = new Selection.Selection(this.registry, "projectNavFileSelection"); //$NON-NLS-0$
+		this.selection.addEventListener("selectionChanged", function(event) { //$NON-NLS-0$
+			_self.updateCommands(event.selections);
+		});
+		this.commandsRegistered = this.registerCommands();
+	}
+	FilesNavExplorer.prototype = Object.create(FileExplorer.prototype);
+	objects.mixin(FilesNavExplorer.prototype, /** @lends orion.sidebar.FilesNavExplorer.prototype */ {
+		onFileModelChange: function(event) {
+			var oldValue = event.oldValue, newValue = event.newValue;
+			// Detect if we moved/renamed/deleted the current file being edited, or an ancestor thereof.
+			var editorFile = this.editorInputManager.getFileMetadata();
+			if (!editorFile) {
+				return;
+			}
+			var affectedAncestor;
+			[editorFile].concat(editorFile.Parents || []).some(function(ancestor) {
+				if (oldValue.Location === ancestor.Location) {
+					affectedAncestor = oldValue;
+					return true;
+				}
+				return false;
+			});
+			if (affectedAncestor) {
+				var newInput;
+				if (affectedAncestor.Location === editorFile.Location) {
+					// Current file was the target, see if we know its new name
+					newInput = (newValue && newValue.Location) || null;
+				} else {
+					newInput = null;
+				}
+			}
+		},
+		destroy: function() {
+		},
+		/**
+		 * Loads the parent directory of the given file as the root, then reveals the file.
+		 * @param {Object} fileMetadata The file whose parent directory we want to load.
+		 */
+		loadParentOf: function(fileMetadata) {
+			if (fileMetadata) {
+				var parent = fileMetadata.Parents && fileMetadata.Parents[0];
+				if (parent) {
+					if (this.treeRoot && this.treeRoot.ChildrenLocation === parent.ChildrenLocation) {
+						// Do we still need to handle this case?
+						this.reveal(fileMetadata);
+						return;
+					}
+				} else {
+					parent = this.fileClient.fileServiceRootURL(fileMetadata.Location); //$NON-NLS-0$
+				}
+				return this.loadRoot(parent).then(this.reveal.bind(this, fileMetadata));
+			}
+		},
+		/**
+		 * Loads the given children location as the root.
+		 * @param {String|Object} The childrenLocation or an object with a ChildrenLocation field.
+		 */
+		loadRoot: function(childrenLocation) {
+			childrenLocation = (childrenLocation && childrenLocation.ChildrenLocation) || childrenLocation || ""; //$NON-NLS-0$
+			var _self = this;
+			return this.commandsRegistered.then(function() {
+				return _self.loadResourceList.call(_self, childrenLocation);
+			});
+		},
+		reveal: function(fileMetadata) {
+			if (!fileMetadata) {
+				return;
+			}
+			var navHandler = this.getNavHandler();
+			if (navHandler) {
+				navHandler.cursorOn(fileMetadata, true, false, false);
+				navHandler.setSelection(fileMetadata);
+			}
+		},
+		// Returns a deferred that completes once file command extensions have been processed
+		registerCommands: function() {
+			// Selection based command contributions in sidebar project-nav
+			var commandRegistry = this.commandRegistry, fileClient = this.fileClient, serviceRegistry = this.registry;
+			var newActionsScope = this.newActionsScope;
+			var selectionActionsScope = this.selectionActionsScope;
+
+			commandRegistry.addCommandGroup(newActionsScope, "orion.miniExplorerNavNewGroup", 1000, messages["New"], null, null, "core-sprite-addcontent"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.addCommandGroup(selectionActionsScope, "orion.miniNavSelectionGroup", 100, messages["Actions"], null, null, "core-sprite-gear"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerSelectionService(selectionActionsScope, this.selection);
+
+			// commands that don't appear but have keybindings
+			commandRegistry.registerCommandContribution(newActionsScope, "eclipse.copySelections", 1, null, true, new KeyBinding('c', true) /* Ctrl+C */); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(newActionsScope, "eclipse.pasteSelections", 1, null, true, new KeyBinding('v', true) /* Ctrl+V */);//$NON-NLS-1$ //$NON-NLS-0$
+
+			// New file and new folder (in a group)
+			commandRegistry.registerCommandContribution(newActionsScope, "eclipse.newFile", 1, "orion.miniExplorerNavNewGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(newActionsScope, "eclipse.newFolder", 2, "orion.miniExplorerNavNewGroup", false, null/*, new mCommandRegistry.URLBinding("newFolder", "name")*/); //$NON-NLS-3$ //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$
+			// New project creation in the toolbar (in a group)
+			commandRegistry.registerCommandContribution(newActionsScope, "orion.new.project", 1, "orion.miniExplorerNavNewGroup"); //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(newActionsScope, "orion.new.linkProject", 2, "orion.miniExplorerNavNewGroup"); //$NON-NLS-2$ //$NON-NLS-1$ //$NON-NLS-0$
+
+			var renameBinding = new KeyBinding(113); // F2
+			renameBinding.domScope = "sidebar"; //$NON-NLS-0$
+			renameBinding.scopeName = messages["Navigator"]; //$NON-NLS-0$
+			var delBinding = new KeyBinding(46); // Delete
+			delBinding.domScope = "sidebar"; //$NON-NLS-0$
+			delBinding.scopeName = messages["Navigator"];
+			commandRegistry.registerCommandContribution(selectionActionsScope, "eclipse.renameResource", 2, "orion.miniNavSelectionGroup", false, renameBinding); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsScope, "eclipse.copyFile", 3, "orion.miniNavSelectionGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsScope, "eclipse.moveFile", 4, "orion.miniNavSelectionGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsScope, "eclipse.deleteFile", 5, "orion.miniNavSelectionGroup", false, delBinding); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsScope, "eclipse.compareWithEachOther", 6, "orion.miniNavSelectionGroup");  //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsScope, "eclipse.compareWith", 7, "orion.miniNavSelectionGroup");  //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsScope, "orion.importZipURL", 1, "orion.miniNavSelectionGroup/orion.importExportGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsScope, "orion.import", 2, "orion.miniNavSelectionGroup/orion.importExportGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsScope, "eclipse.downloadFile", 3, "orion.miniNavSelectionGroup/orion.importExportGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsScope, "orion.importSFTP", 4, "orion.miniNavSelectionGroup/orion.importExportGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(selectionActionsScope, "eclipse.exportSFTPCommand", 5, "orion.miniNavSelectionGroup/orion.importExportGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			FileCommands.createFileCommands(serviceRegistry, commandRegistry, this, fileClient);
+			return ExtensionCommands.createAndPlaceFileCommandsExtension(serviceRegistry, commandRegistry, selectionActionsScope, 0, "orion.miniNavSelectionGroup", true);
+		},
+		updateCommands: function(selections) {
+			var selectionTools = this.selectionActionsScope;
+			var treeRoot = this.treeRoot, commandRegistry = this.commandRegistry;
+			FileCommands.updateNavTools(this.registry, commandRegistry, this, this.newActionsScope, selectionTools, treeRoot, true);
+		}
+	});
+
+	function FilesNavRenderer() {
+		NavigatorRenderer.apply(this, arguments);
+	}
+	FilesNavRenderer.prototype = Object.create(NavigatorRenderer.prototype);
+	objects.mixin(FilesNavRenderer.prototype, {
+		showFolderLinks: true,
+		oneColumn: true,
+		createFolderNode: function(folder) {
+			var folderNode = NavigatorRenderer.prototype.createFolderNode.call(this, folder);
+			if (folderNode.tagName === "A") { //$NON-NLS-0$
+				folderNode.classList.add("projectNavFolder"); //$NON-NLS-0$
+				var editorFile = this.explorer.editorInput && this.explorer.editorInput.Location;
+				this.setFolderHref(folderNode, editorFile || "", folder.ChildrenLocation);
+			}
+			return folderNode;
+		},
+		setFolderHref: function(linkElement, resource, navigate) {
+			linkElement.href = new URITemplate("#{,resource,params*}").expand({ //$NON-NLS-0$
+				resource: resource,
+				params: {
+					navigate: navigate
+				}
+			});
+		},
+		// Called when the editor file has changed
+		updateFolderLinks: function(rootNode) {
+			var editorFile = this.explorer.editorInput && this.explorer.editorInput.Location;
+			var _self = this;
+			Array.prototype.slice.call(lib.$$("a.projectNavFolder", rootNode)).forEach(function(folderLink) { //$NON-NLS-0$
+				var folderLocation = PageUtil.matchResourceParameters(folderLink.href).navigate;
+				_self.setFolderHref(folderLink, editorFile || "", folderLocation); //$NON-NLS-0$
+			});
+		}
+	});
+	
+		
+	function ProjectNavRenderer(options){
+		this.parentNode = options.parentNode;
+		this.serviceRegistry = options.serviceRegistry;
+	}
+	
+	ProjectNavRenderer.prototype = {
+		render: function(projectData){
+		
+		var titleWrapper = new mSection.Section(this.parentNode, { id : "projectSection", //$NON-NLS-0$
+					title : "Project",
+					content : '<div id="projectInfoNode"></div>', //$NON-NLS-0$
+					canHide : true,
+					preferenceService : this.serviceRegistry.getService("orion.core.preference") //$NON-NLS-0$
+					});
+		var projectInfoNode = lib.node("projectInfoNode");
+		var span = document.createElement("span"); 
+		span.appendChild(document.createTextNode("Name: " + projectData.Name));
+		projectInfoNode.appendChild(span);
+		
+		
+		titleWrapper = new mSection.Section(this.parentNode, { id : "filesSection", //$NON-NLS-0$
+					title : "Files",
+					content : '<div id="filesNode"></div>', //$NON-NLS-0$
+					canHide : true,
+					preferenceService : this.serviceRegistry.getService("orion.core.preference") //$NON-NLS-0$
+					});
+		},
+		constructor: ProjectNavRenderer
+	};
+	
+	function ProjectNavExplorer(params){
+		this.commandRegistry = params.commandRegistry;
+		this.contentTypeRegistry = params.contentTypeRegistry;
+		this.fileClient = params.fileClient;
+		this.parentId = params.parentId;
+		this.parentNode = params.parentNode;
+		this.toolbarNode = params.toolbarNode;
+		this.serviceRegistry = params.serviceRegistry;
+		this.renderer = new ProjectNavRenderer({
+												parentNode:this.parentNode,
+												serviceRegistry: this.serviceRegistry
+											});
+		params.parentId = "filesNode";
+		params.newActionsScope = "filesSectionActionArea";
+		params.selectionActionsScope = "filesSectionSelectionArea";
+		this.fileExplorer = new FilesNavExplorer(params);
+		this.explorer = null;
+		this.addActionsScope = this.toolbarNode.id + "Add"; //$NON-NLS-0$
+		this.createToolbar();
+		this.registerCommands();
+	}
+	
+	ProjectNavExplorer.prototype = {
+		display: function(fileMetadata){
+		var that = this;
+			if(fileMetadata.ProjectInfo){
+				if(this.projectLocation && this.projectLocation === fileMetadata.ProjectInfo.Location){
+					return;
+				}
+				this.projectLocation = fileMetadata.ProjectInfo.Location;
+				this.fileClient.readProject(fileMetadata.ProjectInfo.Location).then(
+					function(projectData){
+						projectData.type = "Project";
+						that.renderer.render(projectData);
+						that.fileExplorer.loadRoot(projectData.ContentLocation).then(that.fileExplorer.reveal.bind(that.fileExplorer, fileMetadata));
+						that.updateCommands(projectData);
+					},
+					function(error){
+						console.error(error);//TODO
+					}
+				);
+			} else {
+				this.projectLocation = null;
+				lib.empty(this.parentNode);
+				var parentProject;
+				if (fileMetadata.Parents && fileMetadata.Parents.length===0){
+					parentProject = fileMetadata;
+				} else if(fileMetadata.Parents){
+					parentProject = fileMetadata.Parents[fileMetadata.Parents.length-1];
+				}
+				if(parentProject){
+					var noProject = document.createElement("div"); //$NON-NLS-0$
+					noProject.classList.add("noFile"); //$NON-NLS-0$
+					noProject.textContent = messages["NoProject"];
+					var plusIcon = document.createElement("span"); //$NON-NLS-0$
+					plusIcon.classList.add("core-sprite-initproject"); //$NON-NLS-0$
+					plusIcon.classList.add("icon-inline"); //$NON-NLS-0$
+					plusIcon.classList.add("imageSprite"); //$NON-NLS-0$
+					var projectName = document.createElement("b");
+					projectName.appendChild(document.createTextNode(parentProject.Name));
+					lib.processDOMNodes(noProject, [projectName, plusIcon]);
+					this.parentNode.appendChild(noProject);
+					parentProject.type = "Folder";
+					that.updateCommands(parentProject);
+					
+				}
+			}
+		},
+		createToolbar : function(){
+			var elem = document.createElement("ul"); //$NON-NLS-0$
+			elem.id = this.addActionsScope;
+			elem.classList.add("commandList"); //$NON-NLS-0$
+			elem.classList.add("layoutLeft"); //$NON-NLS-0$
+			elem.classList.add("pageActions"); //$NON-NLS-0$
+			this.toolbarNode.appendChild(elem);
+		},
+		registerCommands : function(){
+			var commandRegistry = this.commandRegistry, fileClient = this.fileClient, serviceRegistry = this.serviceRegistry;
+			commandRegistry.addCommandGroup(this.addActionsScope, "orion.projectNavNewGroup", 1000, messages["Add"], null, null, "core-sprite-addcontent"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.addCommandGroup(this.addActionsScope, "orion.projectNavInitGroup", 1001, "Init Project", null, null, "core-sprite-initproject"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(this.addActionsScope, "orion.project.addFolder", 1, "orion.projectNavNewGroup"); //$NON-NLS-1$ //$NON-NLS-0$
+			commandRegistry.registerCommandContribution(this.addActionsScope, "orion.project.initProject", 1, "orion.projectNavInitGroup");
+			
+			ProjectCommands.createProjectCommands(serviceRegistry, commandRegistry, this, fileClient);
+		},
+		updateCommands: function(treeRoot) {
+			ProjectCommands.updateNavTools(this.serviceRegistry, this.commandRegistry, this, this.addActionsScope, this.selectionActionsScope, treeRoot, true);
+		},
+		destroy : function(){
+		},
+		constructor: ProjectNavExplorer
+	};
+
+	
+
+	/**
+	 * @name orion.sidebar.ProjectNavViewMode
+	 * @class
+	 */
+	function ProjectNavViewMode(params) {
+		this.commandRegistry = params.commandRegistry;
+		this.contentTypeRegistry = params.contentTypeRegistry;
+		this.fileClient = params.fileClient;
+		this.editorInputManager = params.editorInputManager;
+		this.parentNode = params.parentNode;
+		this.sidebarNavInputManager = params.sidebarNavInputManager;
+		this.toolbarNode = params.toolbarNode;
+		this.serviceRegistry = params.serviceRegistry;
+		this.explorer = null;
+		var _self = this;
+		if(this.sidebarNavInputManager){
+			this.navInputListener = function(event) {
+				_self.navigatorInput = event.input;
+			};
+			this.sidebarNavInputManager.addEventListener("InputChanged", this.navInputListener); //$NON-NLS-0$
+		}
+	}
+	objects.mixin(ProjectNavViewMode.prototype, {
+		label: messages["Project"],
+		create: function() {
+			var _self = this;
+			this.explorer = new ProjectNavExplorer({
+				commandRegistry: this.commandRegistry,
+				dragAndDrop: FileCommands.uploadFile,
+				fileClient: this.fileClient,
+				editorInputManager: this.editorInputManager,
+				sidebarNavInputManager: this.sidebarNavInputManager,
+				parentId: this.parentNode.id,
+				parentNode: this.parentNode,
+				rendererFactory: function(explorer) {
+					var renderer = new FilesNavRenderer({
+						checkbox: false,
+						cachePrefix: "ProjectNav"}, explorer, _self.commandRegistry, _self.contentTypeRegistry); //$NON-NLS-0$
+					return renderer;
+				},
+				serviceRegistry: this.serviceRegistry,
+				toolbarNode: this.toolbarNode
+			});
+			// If there is a target in the navigator, open this target
+			if(this.navigatorInput){
+				var _self = this;
+				this.fileClient.read(this.navigatorInput, true).then(function(fileMetadata){
+					_self.explorer.display(fileMetadata);
+				}, function(error){
+					console.error(error); //TODO
+				});
+			} else {
+				this.explorer.display(this.editorInputManager.getFileMetadata());
+			}
+		},
+		destroy: function() {
+			if (this.explorer) {
+				this.explorer.destroy();
+			}
+			this.explorer = null;
+		}
+	});
+
+	return ProjectNavViewMode;
+});
diff --git a/bundles/org.eclipse.orion.client.ui/web/plugins/filePlugin/fileImpl.js b/bundles/org.eclipse.orion.client.ui/web/plugins/filePlugin/fileImpl.js
index b3c145e..59085a3 100644
--- a/bundles/org.eclipse.orion.client.ui/web/plugins/filePlugin/fileImpl.js
+++ b/bundles/org.eclipse.orion.client.ui/web/plugins/filePlugin/fileImpl.js
@@ -227,6 +227,21 @@
 				return result;
 			}.bind(this));
 		},
+		readProject: function(location) {
+			var url = new URL(location, window.location);
+			return xhr("GET", url.href, {
+				timeout: 15000,
+				headers: { "Orion-Version": "1" },
+				log: false
+			}).then(function(result) {
+					return result.response ? JSON.parse(result.response) : null;
+			}).then(function(result) {
+				if (this.makeAbsolute) {
+					_normalizeLocations(result);
+				}
+				return result;
+			}.bind(this));
+		},
 		/**
 		 * Adds a project to a workspace.
 		 * @param {String} url The workspace location
diff --git a/bundles/org.eclipse.orion.client.ui/web/plugins/projectsPlugin.html b/bundles/org.eclipse.orion.client.ui/web/plugins/projectsPlugin.html
index 2bfa17f..35ca761 100644
--- a/bundles/org.eclipse.orion.client.ui/web/plugins/projectsPlugin.html
+++ b/bundles/org.eclipse.orion.client.ui/web/plugins/projectsPlugin.html
@@ -19,17 +19,26 @@
 	require(['require', 'orion/plugin'], function(require, PluginProvider) {
 		var headers = {
 			name: "Orion Projects",
-			version: "1.0",
+			version: "2.0",
 			description: "This plugin provides the entry point for Orion project support."
 		};
 	
+	
 		var provider = new PluginProvider(headers);
-		provider.registerService("orion.page.link", {}, {
+		
+		provider.registerService("orion.projects", {}, {
 			nameKey: "Projects",
 			id: "orion.projects",
+			nls: "orion/nls/messages"
+		});
+		
+		//TODO time will come to add a "Projects" link
+/*		provider.registerService("orion.page.link", {}, {
+			nameKey: "Projects",
+			id: "orion.projects.pagelink",
 			nls: "orion/nls/messages",
 			uriTemplate: "{OrionHome}/projects/project.html"
-		});
+		});*/
 		provider.connect();
 	});
 	</script>
diff --git a/bundles/org.eclipse.orion.client.ui/web/projects/projectPage.html b/bundles/org.eclipse.orion.client.ui/web/projects/projectPage.html
index bedf4d2..6a35809 100644
--- a/bundles/org.eclipse.orion.client.ui/web/projects/projectPage.html
+++ b/bundles/org.eclipse.orion.client.ui/web/projects/projectPage.html
@@ -1,33 +1,33 @@
-<!doctype html>

-<html>

-    <head>

-		<meta name="copyright" content="Copyright (c) IBM Corporation and others 2010." >

-		<meta http-equiv="Content-Language" content="en-us">

-		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

-		<title id="projectTitle">Project</title>

-		<link rel="stylesheet" type="text/css" href="projectPage.css" />

-		<link rel="shortcut icon" href="/projectpage.ico" />

-		<script src="../../requirejs/require.js"></script>

-		<script type="text/javascript">

-			require({ baseUrl: '..', paths: { text: 'requirejs/text', i18n: 'requirejs/i18n',domReady: 'requirejs/domReady' } });	

-			require(["projectPage.js"]);

-		</script>

-    </head>

-    <body id="orion-projects" spellcheck="false" class="orionPage">

-		<div class="content-fixedHeight"  >

-			<div id="innerPanels" style="height:100%;width:100%;">

-				<div id="leftPane" class="auxpane sidePanelLayout hasSplit">

-					<div class="mainToolbar toolComposite toolbarLayout" id="projectConfiguration" style="padding-top:7px;">

-					</div>

-					<div id="projectNavigation" class="sidePanelMargins"></div>

-				</div>

-				<div class="split splitLayout"></div>

-				<div id="rightPane" class="mainpane mainPanelLayout hasSplit" style="background:#FDFDFD;">

-					<div id="informationPane" class="alert-clear"></div>

-					<div id="SFTPConfiguration" class="sidePanelMargins"></div>

-				</div>

-			</div>

-		</div>

-		<div class="footer-fixed-bottom footer" id="footer"></div>

-	</body>

+<!doctype html>
+<html>
+    <head>
+		<meta name="copyright" content="Copyright (c) IBM Corporation and others 2010." >
+		<meta http-equiv="Content-Language" content="en-us">
+		<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+		<title id="projectTitle">Project</title>
+		<link rel="stylesheet" type="text/css" href="projectPage.css" />
+		<link rel="shortcut icon" href="/projectpage.ico" />
+		<script src="../requirejs/require.js"></script>
+		<script type="text/javascript">
+			require({ baseUrl: '..', paths: { text: 'requirejs/text', i18n: 'requirejs/i18n',domReady: 'requirejs/domReady' } });	
+			require(["projectPage.js"]);
+		</script>
+    </head>
+    <body id="orion-projects" spellcheck="false" class="orionPage">
+		<div class="content-fixedHeight"  >
+			<div id="innerPanels" style="height:100%;width:100%;">
+				<div id="leftPane" class="auxpane sidePanelLayout hasSplit">
+					<div class="mainToolbar toolComposite toolbarLayout" id="projectConfiguration" style="padding-top:7px;">
+					</div>
+					<div id="projectNavigation" class="sidePanelMargins"></div>
+				</div>
+				<div class="split splitLayout"></div>
+				<div id="rightPane" class="mainpane mainPanelLayout hasSplit" style="background:#FDFDFD;">
+					<div id="informationPane" class="alert-clear"></div>
+					<div id="SFTPConfiguration" class="sidePanelMargins"></div>
+				</div>
+			</div>
+		</div>
+		<div class="footer-fixed-bottom footer" id="footer"></div>
+	</body>
 </html>
\ No newline at end of file