initial import
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/.classpath b/org.eclipse.emf.emfstore.client.ui.esbrowser/.classpath
new file mode 100644
index 0000000..64c5e31
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/.project b/org.eclipse.emf.emfstore.client.ui.esbrowser/.project
new file mode 100644
index 0000000..738f0b9
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.emf.emfstore.client.ui.esbrowser</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.emf.emfstore.client.ui.esbrowser/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..af0f20f
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/META-INF/MANIFEST.MF b/org.eclipse.emf.emfstore.client.ui.esbrowser/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8dcdd0d
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: EMFStore Repository Browser
+Bundle-SymbolicName: org.eclipse.emf.emfstore.client.ui.esbrowser
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.eclipse.emf.emfstore.client.ui.esbrowser.Activator
+Bundle-Vendor: Eclipse Modeling Project
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.emf.edit.ui;bundle-version="2.9.0",
+ org.eclipse.emf.emfstore.client.ui;bundle-version="1.1.0",
+ org.eclipse.emf.emfstore.client;bundle-version="1.1.0"
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/build.properties b/org.eclipse.emf.emfstore.client.ui.esbrowser/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/Activator.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/Activator.java
new file mode 100644
index 0000000..00949fe
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/Activator.java
@@ -0,0 +1,90 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser;
+
+import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle.
+ */
+public class Activator extends AbstractUIPlugin {
+
+	/**
+	 * The plug-in ID.
+	 */
+	public static final String PLUGIN_ID = "org.eclipse.emf.emfstore.client.ui";
+
+	// The shared instance
+	private static Activator plugin;
+
+	private static ComposedAdapterFactory adapterFactory;
+
+	/**
+	 * The constructor.
+	 */
+	public Activator() {
+	}
+
+	// BEGIN SUPRESS CATCH EXCEPTION
+	/**
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+		adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext )
+	 */
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+		getAdapterFactory().dispose();
+	}
+
+	// END SUPRESS CATCH EXCEPTION
+
+	/**
+	 * Returns the shared instance.
+	 * 
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns an image descriptor for the image file at the given plug-in relative path.
+	 * 
+	 * @param path the path
+	 * @return the image descriptor
+	 */
+	public static ImageDescriptor getImageDescriptor(String path) {
+		return imageDescriptorFromPlugin(PLUGIN_ID, path);
+	}
+
+	/**
+	 * Returns a composed adapter factory.
+	 * 
+	 * @return a composed adapter factory
+	 */
+	public static ComposedAdapterFactory getAdapterFactory() {
+		return adapterFactory;
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserContentProvider.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserContentProvider.java
new file mode 100644
index 0000000..b709822
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserContentProvider.java
@@ -0,0 +1,73 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.provider;
+
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.Activator;
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.emf.emfstore.internal.client.model.Workspace;
+
+/**
+ * Content provider for the EMFStore Browser View.
+ * 
+ * @author emueller
+ * @author ovonwesend
+ */
+public class ESBrowserContentProvider extends AdapterFactoryContentProvider {
+
+	/**
+	 * Default constructor.
+	 */
+	public ESBrowserContentProvider() {
+		super(Activator.getAdapterFactory());
+	}
+
+	@Override
+	public Object[] getElements(Object object) {
+		if (object instanceof Workspace) {
+			return ((Workspace) object).getServerInfos().toArray();
+		}
+
+		return super.getElements(object);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public Object[] getChildren(Object object) {
+		Object value = object;
+		Object[] children;
+
+		if (value instanceof Workspace) {
+			children = ((Workspace) value).getServerInfos().toArray();
+		} else if (value instanceof ServerInfo) {
+			ServerInfo serverInfo = (ServerInfo) value;
+			return serverInfo.getProjectInfos().toArray();
+		} else {
+			children = super.getChildren(object);
+		}
+
+		return children;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean hasChildren(Object parent) {
+		if (parent instanceof ServerInfo) {
+			return true;
+		}
+		return false;
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelDecorator.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelDecorator.java
new file mode 100644
index 0000000..83e3aef
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelDecorator.java
@@ -0,0 +1,115 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.provider;
+
+import org.eclipse.emf.emfstore.client.ESUsersession;
+import org.eclipse.emf.emfstore.client.observer.ESLoginObserver;
+import org.eclipse.emf.emfstore.client.observer.ESLogoutObserver;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.Activator;
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.LabelProviderChangedEvent;
+import org.eclipse.swt.widgets.Display;
+
+/**
+ * @see ILightweightLabelDecorator
+ */
+public class ESBrowserLabelDecorator extends LabelProvider implements ILightweightLabelDecorator, ESLoginObserver,
+	ESLogoutObserver {
+
+	/**
+	 * {@inheritDoc} Decorates the label of a {@link ServerInfo} object
+	 * according to its login state.
+	 */
+	public void decorate(Object element, IDecoration decoration) {
+
+		if (element instanceof ServerInfo) {
+			ServerInfo server = (ServerInfo) element;
+
+			if (server.getLastUsersession() != null && server.getLastUsersession().isLoggedIn()) {
+				decoration.addOverlay(Activator.getImageDescriptor("icons/bullet_green.png"), IDecoration.BOTTOM_RIGHT);
+			} else {
+				decoration
+					.addOverlay(Activator.getImageDescriptor("icons/bullet_delete.png"), IDecoration.BOTTOM_RIGHT);
+			}
+		}
+	}
+
+	/**
+	 * 
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.BaseLabelProvider#addListener(org.eclipse.jface.viewers.ILabelProviderListener)
+	 */
+	@Override
+	public void addListener(ILabelProviderListener listener) {
+	}
+
+	/**
+	 * 
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.BaseLabelProvider#dispose()
+	 */
+	@Override
+	public void dispose() {
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean isLabelProperty(Object element, String property) {
+		return false;
+	}
+
+	/**
+	 * 
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.jface.viewers.BaseLabelProvider#removeListener(org.eclipse.jface.viewers.ILabelProviderListener)
+	 */
+	@Override
+	public void removeListener(ILabelProviderListener listener) {
+	}
+
+	/**
+	 * 
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.emfstore.client.observer.ESLoginObserver#loginCompleted(org.eclipse.emf.emfstore.internal.client.model.Usersession)
+	 */
+	public void loginCompleted(ESUsersession session) {
+		update(session);
+	}
+
+	/**
+	 * 
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.emfstore.client.observer.ESLogoutObserver#logoutCompleted(org.eclipse.emf.emfstore.internal.client.model.Usersession)
+	 */
+	public void logoutCompleted(ESUsersession session) {
+		update(session);
+	}
+
+	private void update(final ESUsersession usersession) {
+		Display.getDefault().asyncExec(new Runnable() {
+			public void run() {
+				fireLabelProviderChanged(new LabelProviderChangedEvent(ESBrowserLabelDecorator.this, usersession
+					.getServer()));
+			}
+		});
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelProvider.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelProvider.java
new file mode 100644
index 0000000..00a7d68
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserLabelProvider.java
@@ -0,0 +1,77 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.provider;
+
+import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.Activator;
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.emf.emfstore.internal.server.model.ProjectInfo;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * Label provider for the EMFStore Browser View.
+ * 
+ * @author emueller
+ * @author ovonwesend
+ */
+public class ESBrowserLabelProvider extends AdapterFactoryLabelProvider {
+
+	/**
+	 * Default constructor.
+	 */
+	public ESBrowserLabelProvider() {
+		super(Activator.getAdapterFactory());
+	}
+
+	/**
+	 * 
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getText(java.lang.Object)
+	 */
+	@Override
+	public String getText(Object obj) {
+		Object element = obj;
+		if (element instanceof ServerInfo) {
+			ServerInfo serverInfo = (ServerInfo) element;
+			StringBuilder builder = new StringBuilder();
+			builder.append(serverInfo.getUrl());
+			builder.append(" [");
+			builder.append(serverInfo.getName());
+			builder.append("]");
+			return builder.toString();
+		} else if (element instanceof ProjectInfo) {
+			ProjectInfo projectInfo = (ProjectInfo) element;
+			return projectInfo.getName();
+		}
+
+		return super.getText(obj);
+	}
+
+	/**
+	 * 
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider#getImage(java.lang.Object)
+	 */
+	@Override
+	public Image getImage(Object obj) {
+
+		Object element = obj;
+		if (element instanceof ServerInfo) {
+			return Activator.getImageDescriptor("icons/ServerInfo.gif").createImage();
+		} else if (element instanceof ProjectInfo) {
+			return Activator.getImageDescriptor("icons/prj_obj.gif").createImage();
+		}
+
+		return super.getImage(obj);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserViewerSorter.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserViewerSorter.java
new file mode 100644
index 0000000..a8e4ca0
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/provider/ESBrowserViewerSorter.java
@@ -0,0 +1,39 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.provider;
+
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.emf.emfstore.internal.server.model.ProjectInfo;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerSorter;
+
+/**
+ * Sort alphabetically the repository browser viewer.
+ * 
+ * @author shterev
+ */
+public class ESBrowserViewerSorter extends ViewerSorter {
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public int compare(Viewer viewer, Object o1, Object o2) {
+
+		if (o1 instanceof ServerInfo && o2 instanceof ServerInfo) {
+			return ((ServerInfo) o1).getName().toLowerCase().compareTo(((ServerInfo) o2).getName().toLowerCase());
+		} else if (o1 instanceof ProjectInfo && o2 instanceof ProjectInfo) {
+			return ((ProjectInfo) o1).getName().toLowerCase().compareTo(((ProjectInfo) o2).getName().toLowerCase());
+		}
+
+		return super.compare(viewer, o1, o2);
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateAliasDialog.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateAliasDialog.java
new file mode 100644
index 0000000..46ba30e
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateAliasDialog.java
@@ -0,0 +1,136 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * The CertificateAliasDialog allows the user to choose a designation for the
+ * certificate being imported.
+ * 
+ * @author pfeifferc
+ */
+@Deprecated
+public class CertificateAliasDialog extends Dialog {
+
+	/**
+	 * The message to display, or <code>null</code> if none.
+	 */
+	private String message;
+
+	/**
+	 * The input value; the empty string by default.
+	 */
+	private String value = "";//$NON-NLS-1$
+
+	/**
+	 * Input text widget.
+	 */
+	private Text text;
+
+	private String dialogTitle;
+
+	/**
+	 * Creates an input dialog with OK and Cancel buttons. Note that the dialog
+	 * will have no visual representation (no widgets) until it is told to open.
+	 * <p>
+	 * Note that the <code>open</code> method blocks for input dialogs.
+	 * </p>
+	 * 
+	 * @param parentShell
+	 *            the parent shell, or <code>null</code> to create a top-level
+	 *            shell
+	 * @param dialogTitle
+	 *            the dialog title, or <code>null</code> if none
+	 * @param dialogMessage
+	 *            the dialog message, or <code>null</code> if none
+	 * @param initialValue
+	 *            the initial input value, or <code>null</code> if none
+	 *            (equivalent to the empty string)
+	 */
+	public CertificateAliasDialog(Shell parentShell, String dialogTitle, String dialogMessage, String initialValue) {
+		super(parentShell);
+		this.dialogTitle = dialogTitle;
+		configureShell(parentShell);
+		message = dialogMessage;
+		if (initialValue == null) {
+			value = "";//$NON-NLS-1$
+		} else {
+			value = initialValue;
+		}
+	}
+
+	/**
+	 * @see org.eclipse.jface.dialogs.Dialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 * @param parent
+	 *            Parent Composite
+	 * @return the composite
+	 */
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		// create composite
+		Composite composite = (Composite) super.createDialogArea(parent);
+		// create message
+		if (message != null) {
+			Label label = new Label(composite, SWT.WRAP);
+			label.setText(message);
+			GridData data = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL
+				| GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_CENTER);
+			data.widthHint = convertHorizontalDLUsToPixels(IDialogConstants.MINIMUM_MESSAGE_AREA_WIDTH);
+			label.setLayoutData(data);
+			label.setFont(parent.getFont());
+		}
+		text = new Text(composite, SWT.SINGLE | SWT.BORDER);
+		text.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.HORIZONTAL_ALIGN_FILL));
+		applyDialogFont(composite);
+		return composite;
+	}
+
+	/**
+	 * Returns the text area.
+	 * 
+	 * @return the text area
+	 */
+	protected Text getText() {
+		return text;
+	}
+
+	/**
+	 * Returns the string typed into this input dialog.
+	 * 
+	 * @return the input string
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * Configure the shell.
+	 * 
+	 * @param shell
+	 *            shell
+	 * @see org.eclipse.jface.window.Window#configureShell(org.eclipse.swt.widgets.Shell)
+	 */
+	@Override
+	protected void configureShell(Shell shell) {
+		super.configureShell(shell);
+		shell.setText(dialogTitle);
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateSelectionDialog.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateSelectionDialog.java
new file mode 100644
index 0000000..b37b08f
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CertificateSelectionDialog.java
@@ -0,0 +1,265 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import java.security.cert.X509Certificate;
+
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.emfstore.client.exceptions.ESCertificateException;
+import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.KeyStoreManager;
+import org.eclipse.jface.dialogs.IDialogConstants;
+import org.eclipse.jface.dialogs.InputDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.layout.GridDataFactory;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.FileDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Table;
+import org.eclipse.swt.widgets.TableItem;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.dialogs.ElementListSelectionDialog;
+
+/**
+ * The modified ElementListSelectionDialog. Includes further functionality to
+ * import certificates from files instead of choosing from the list.
+ * 
+ * @author pfeifferc
+ */
+public class CertificateSelectionDialog extends ElementListSelectionDialog {
+
+	private TableItem selectedTableItem;
+	private String alias = "";
+
+	/**
+	 * The constructor.
+	 * 
+	 * @param parent
+	 *            Parent
+	 * @param renderer
+	 *            Renderer
+	 */
+	public CertificateSelectionDialog(Shell parent, ILabelProvider renderer) {
+		super(parent, renderer);
+		setShellStyle(SWT.CLOSE | SWT.TITLE | SWT.MIN | SWT.MAX);
+	}
+
+	/**
+	 * Overridden method to allow adding further elements onto the dialog
+	 * composite.
+	 * 
+	 * @see org.eclipse.ui.dialogs.ElementListSelectionDialog#createDialogArea(org.eclipse.swt.widgets.Composite)
+	 * @return Control
+	 * @param parent
+	 *            Parent
+	 */
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		// standard layout used by dialogue area
+		GridLayout layout = new GridLayout();
+		layout.marginHeight = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_MARGIN);
+		layout.marginWidth = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_MARGIN);
+		layout.verticalSpacing = convertVerticalDLUsToPixels(IDialogConstants.VERTICAL_SPACING);
+		layout.horizontalSpacing = convertHorizontalDLUsToPixels(IDialogConstants.HORIZONTAL_SPACING);
+
+		// two column layout composite
+		Composite grid = new Composite(parent, SWT.NONE);
+		GridLayoutFactory.fillDefaults().numColumns(2).equalWidth(false).applyTo(grid);
+
+		// left column composite
+		Composite left = new Composite(grid, SWT.NONE);
+		GridLayoutFactory.fillDefaults().applyTo(left);
+
+		// right column composite
+		Composite right = new Composite(grid, SWT.NONE);
+		GridLayoutFactory.createFrom(layout).margins(layout.marginWidth, 35).applyTo(right);
+		GridDataFactory.fillDefaults().grab(true, true).hint(300, 200).applyTo(right);
+		applyDialogFont(right);
+
+		// right column: certificate details
+		new Label(right, SWT.NONE).setText("Certificate Alias: ");
+		final Text certAlias = new Text(right, SWT.NONE);
+		GridDataFactory.fillDefaults().grab(true, false).applyTo(certAlias);
+		certAlias.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+		certAlias.setEditable(false);
+		new Label(right, SWT.NONE).setText("Certificate Details: ");
+		final Text certDetails = new Text(right, SWT.MULTI | SWT.WRAP | SWT.V_SCROLL);
+		GridDataFactory.fillDefaults().grab(true, false).hint(300, 230).applyTo(certDetails);
+		certDetails.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+		certDetails.setEditable(false);
+
+		// left column: dialogue area composite (displays certificates and
+		// filter)
+		Composite dialogArea = new Composite(left, SWT.NONE);
+		GridLayoutFactory.fillDefaults().applyTo(dialogArea);
+		Control control = super.createDialogArea(dialogArea);
+		GridDataFactory.fillDefaults().grab(true, true).applyTo(control);
+
+		// left column: import button, composite used to ensure correct
+		// alignment
+		Composite certButtonsComposite = new Composite(grid, SWT.NONE);
+		GridLayoutFactory.createFrom(layout).numColumns(3).equalWidth(true).margins(layout.marginWidth, 0)
+			.applyTo(certButtonsComposite);
+		applyDialogFont(certButtonsComposite);
+		Button browse = new Button(certButtonsComposite, SWT.NONE);
+		browse.setText("Import...");
+		browse.addSelectionListener(new CertificateSelectionListener());
+
+		// Delete certificate
+		Button delete = new Button(certButtonsComposite, SWT.NONE);
+		delete.setText("Delete");
+		delete.addSelectionListener(new SelectionListener() {
+
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// nothing to do
+			}
+
+			public void widgetSelected(SelectionEvent e) {
+				if (selectedTableItem != null && !selectedTableItem.getText().equals("")) {
+					String alias = selectedTableItem.getText();
+					try {
+						KeyStoreManager.getInstance().deleteCertificate(alias);
+						setListElements(KeyStoreManager.getInstance().getCertificates().toArray());
+					} catch (ESCertificateException e1) {
+						setErrorMessage(e1.getMessage());
+					}
+				}
+			}
+		});
+		fFilteredList.addSelectionListener(new SelectionListenerImplementation(certDetails, certAlias));
+		return control;
+	}
+
+	/**
+	 * Returns the alias of the certificate.
+	 * 
+	 * @return the certificate alias
+	 */
+	public String getCertificateAlias() {
+		return alias;
+	}
+
+	/**
+	 * Opens up an information {@link MessageDialog} with the given <code>errorMessage</code>.
+	 * 
+	 * @param errorMessage
+	 *            the error message
+	 */
+	// TODO: rename method
+	public void setErrorMessage(String errorMessage) {
+		MessageDialog.openInformation(Display.getDefault().getActiveShell(), "Attention", errorMessage);
+	}
+
+	/**
+	 * Certificate Selection Listener.
+	 * 
+	 * @author koegel
+	 * 
+	 */
+	private final class SelectionListenerImplementation implements SelectionListener {
+		private final Text certDetails;
+		private final Text certAlias;
+
+		private SelectionListenerImplementation(Text certDetails, Text certAlias) {
+			this.certDetails = certDetails;
+			this.certAlias = certAlias;
+		}
+
+		public void widgetDefaultSelected(SelectionEvent e) {
+			// nothing to do
+		}
+
+		public void widgetSelected(SelectionEvent e) {
+			if (((Table) e.getSource()).getItems().length > 0) {
+				selectedTableItem = ((Table) e.getSource()).getItems()[((Table) e.getSource()).getSelectionIndex()];
+				alias = selectedTableItem.getText();
+				try {
+					X509Certificate selectedCertificate = (X509Certificate) KeyStoreManager.getInstance()
+						.getCertificate(alias);
+					String[] details = selectedCertificate.toString().split("\n");
+					String tmp = "";
+					for (int i = 2; i < 14; i++) {
+						tmp += (i == 7 || i == 8) ? "" : details[i].trim() + "\n";
+					}
+					certAlias.setText(alias);
+					certDetails.setText(tmp);
+				} catch (ESCertificateException e1) {
+					setErrorMessage(e1.getMessage());
+				}
+			}
+		}
+	}
+
+	/**
+	 * Choose certificate from file system and name it.
+	 * 
+	 * @author pfeifferc
+	 */
+	class CertificateSelectionListener implements SelectionListener {
+		/**
+		 * Add a certificate specified by the user.
+		 * 
+		 * @param e
+		 *            selection event
+		 */
+		public void widgetSelected(SelectionEvent e) {
+			FileDialog fileDialog = new FileDialog(Display.getCurrent().getActiveShell());
+			fileDialog.open();
+			if (!fileDialog.getFileName().equals("")) {
+				String location = fileDialog.getFilterPath() + System.getProperty("file.separator")
+					+ fileDialog.getFileName();
+
+				InputDialog inputDialog = new InputDialog(Display.getCurrent().getActiveShell(),
+					"Select certificate designation",
+					"Please choose a designation for the previously selected certificate: ", "", null);
+
+				inputDialog.setBlockOnOpen(true);
+				if (inputDialog.open() != Window.OK) {
+					return;
+				}
+
+				String alias = inputDialog.getValue();
+				if (alias.equals("")) {
+					alias = "unnamed:" + EcoreUtil.generateUUID();
+				}
+				try {
+					KeyStoreManager.getInstance().addCertificate(alias, location);
+				} catch (final ESCertificateException e1) {
+					setErrorMessage("Invalid certificate!");
+				}
+				try {
+					setListElements(KeyStoreManager.getInstance().getCertificates().toArray());
+				} catch (ESCertificateException e1) {
+					setErrorMessage(e1.getMessage());
+				}
+			}
+		}
+
+		/**
+		 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+		 * @param e
+		 *            selection event
+		 */
+		public void widgetDefaultSelected(SelectionEvent e) {
+			// nothing to do
+		}
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CreateProjectDialog.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CreateProjectDialog.java
new file mode 100644
index 0000000..a5ce0b7
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/CreateProjectDialog.java
@@ -0,0 +1,103 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import org.eclipse.jface.dialogs.TitleAreaDialog;
+import org.eclipse.jface.layout.GridLayoutFactory;
+import org.eclipse.jface.layout.LayoutConstants;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * Create project dialog.
+ * 
+ * @author shterev
+ */
+// TODO: remove description
+public class CreateProjectDialog extends TitleAreaDialog {
+
+	private Text txtProjectName;
+	private Text txtProjectDesc;
+
+	private String name;
+	private String description;
+
+	/**
+	 * Default constructor.
+	 * 
+	 * @param parent
+	 *            the parent shell
+	 */
+	public CreateProjectDialog(Shell parent) {
+		super(parent);
+		name = "";
+		description = "";
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	protected Control createDialogArea(Composite parent) {
+		Composite contents = new Composite(parent, SWT.NONE);
+		contents.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, true));
+
+		setTitle("Create new project");
+		setMessage("Enter the name and the description of the project");
+
+		Label name = new Label(contents, SWT.NULL);
+		name.setText("Name:");
+		txtProjectName = new Text(contents, SWT.SINGLE | SWT.BORDER);
+		txtProjectName.setSize(150, 20);
+
+		Label desc = new Label(contents, SWT.NULL);
+		desc.setText("Description:");
+		txtProjectDesc = new Text(contents, SWT.MULTI | SWT.BORDER);
+		txtProjectDesc.setSize(150, 60);
+
+		Point defaultMargins = LayoutConstants.getMargins();
+		GridLayoutFactory.fillDefaults().numColumns(2).margins(defaultMargins.x, defaultMargins.y)
+			.generateLayout(contents);
+
+		return contents;
+	}
+
+	@Override
+	protected void okPressed() {
+		name = txtProjectName.getText();
+		description = txtProjectName.getText();
+		super.okPressed();
+	}
+
+	/**
+	 * Returns the description of the project as entered by the user.
+	 * 
+	 * @return the description of the project that is going to be created
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * Returns the name of the project as entered by the user.
+	 * 
+	 * @return the name of the project that is going to be created
+	 */
+	public String getName() {
+		return name;
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/ESBrowserView.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/ESBrowserView.java
new file mode 100644
index 0000000..e7a1f04
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/ESBrowserView.java
@@ -0,0 +1,240 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.emfstore.client.ESUsersession;
+import org.eclipse.emf.emfstore.client.observer.ESLoginObserver;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.provider.ESBrowserContentProvider;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.provider.ESBrowserLabelProvider;
+import org.eclipse.emf.emfstore.client.ui.esbrowser.provider.ESBrowserViewerSorter;
+import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
+import org.eclipse.emf.emfstore.internal.client.model.ModelPackage;
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.emf.emfstore.internal.client.model.Workspace;
+import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESWorkspaceImpl;
+import org.eclipse.jface.action.MenuManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.DecoratingLabelProvider;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.ui.IDecoratorManager;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.part.ViewPart;
+import org.eclipse.ui.services.IEvaluationService;
+
+/**
+ * View containing the remote repositories.
+ * 
+ * @author shterev
+ */
+public class ESBrowserView extends ViewPart implements ESLoginObserver {
+
+	/**
+	 * Listener for changes in the workspace.
+	 * 
+	 * @author koegel
+	 */
+	private final class WorkspaceAdapter extends AdapterImpl {
+		@Override
+		public void notifyChanged(Notification msg) {
+			if (msg.getNewValue() instanceof ServerInfo) {
+				final ServerInfo serverInfo = (ServerInfo) msg.getNewValue();
+				AdapterImpl serverInfoAdapter = new ServerInfoAdapter(serverInfo);
+				serverInfo.eAdapters().add(serverInfoAdapter);
+				serverInfoAdapterMap.put(serverInfo, serverInfoAdapter);
+				viewer.refresh();
+			} else if (msg.getOldValue() instanceof ServerInfo) {
+				ServerInfo serverInfo = (ServerInfo) msg.getOldValue();
+				serverInfo.eAdapters().remove(serverInfoAdapterMap.get(serverInfo));
+				viewer.refresh();
+			}
+			super.notifyChanged(msg);
+		}
+	}
+
+	/**
+	 * Listener for changes in the server infos.
+	 * 
+	 * @author koegel
+	 */
+	private final class ServerInfoAdapter extends AdapterImpl {
+		private final ServerInfo serverInfo;
+
+		private ServerInfoAdapter(ServerInfo serverInfo) {
+			this.serverInfo = serverInfo;
+		}
+
+		@Override
+		public void notifyChanged(final Notification msg) {
+			if (msg.getFeature() != null
+				&& msg.getFeature().equals(ModelPackage.eINSTANCE.getServerInfo_ProjectInfos())) {
+				Display.getDefault().asyncExec(new Runnable() {
+					public void run() {
+						if (msg.getEventType() == Notification.REMOVE_MANY || msg.getEventType() == Notification.REMOVE) {
+							viewer.collapseToLevel(serverInfo, 0);
+						}
+						viewer.refresh(serverInfo, true);
+						// re-evaluate property tester
+						IEvaluationService service = (IEvaluationService) getSite()
+							.getService(IEvaluationService.class);
+						service.requestEvaluation("org.eclipse.emf.emfstore.client.ui.commands.ServerInfoIsLoggedIn");
+					}
+				});
+			}
+		}
+	}
+
+	private TreeViewer viewer;
+
+	private ESBrowserContentProvider contentProvider;
+	private MenuManager menuMgr;
+	private AdapterImpl workspaceAdapter;
+
+	private Map<ServerInfo, AdapterImpl> serverInfoAdapterMap = new LinkedHashMap<ServerInfo, AdapterImpl>();
+
+	/**
+	 * The constructor.
+	 */
+	public ESBrowserView() {
+		// TODO OTS
+		ESWorkspaceImpl workspace = ESWorkspaceProviderImpl.getInstance().getWorkspace();
+		Workspace currentWorkspace = workspace.toInternalAPI();
+		ESWorkspaceProviderImpl.getObserverBus().register(this);
+		for (final ServerInfo serverInfo : currentWorkspace.getServerInfos()) {
+			AdapterImpl serverInfoAdapter = new ServerInfoAdapter(serverInfo);
+			serverInfo.eAdapters().add(serverInfoAdapter);
+			serverInfoAdapterMap.put(serverInfo, serverInfoAdapter);
+		}
+		workspaceAdapter = new WorkspaceAdapter();
+		currentWorkspace.eAdapters().add(workspaceAdapter);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void createPartControl(Composite parent) {
+		viewer = new TreeViewer(parent, SWT.SINGLE | SWT.H_SCROLL | SWT.V_SCROLL);
+
+		contentProvider = new ESBrowserContentProvider();
+		viewer.setContentProvider(contentProvider);
+		IDecoratorManager decoratorManager = PlatformUI.getWorkbench().getDecoratorManager();
+		viewer.setLabelProvider(new DecoratingLabelProvider(new ESBrowserLabelProvider(), decoratorManager
+			.getLabelDecorator()));
+		viewer.setSorter(new ESBrowserViewerSorter());
+		viewer.setInput(ESWorkspaceProviderImpl.getInstance().getWorkspace());
+		// viewer.addTreeListener(new ITreeViewerListener() {
+		//
+		// /**
+		// * {@inheritDoc}
+		// */
+		// public void treeExpanded(TreeExpansionEvent event) {
+		// if (event.getElement() instanceof ServerInfo) {
+		//
+		// ServerInfo value = (ServerInfo) event.getElement();
+		// // new UIServerLoginController(PlatformUI.getWorkbench().getDisplay().getActiveShell(), value)
+		// // .openLoginDialog();
+		//
+		// // TODO: refresh is always performed
+		// if (!event.getTreeViewer().isBusy()) {
+		// event.getTreeViewer().refresh(value, true);
+		// }
+		// }
+		// }
+		//
+		// public void treeCollapsed(TreeExpansionEvent event) {
+		// }
+		// });
+
+		PlatformUI.getWorkbench().getHelpSystem()
+			.setHelp(viewer.getControl(), "org.eclipse.emf.emfstore.client.ui.views.RepositoryView");
+
+		menuMgr = new MenuManager();
+		menuMgr.add(new Separator("additions"));
+		Control control = viewer.getControl();
+		Menu menu = menuMgr.createContextMenu(control);
+		control.setMenu(menu);
+		getSite().registerContextMenu(menuMgr, viewer);
+
+		getSite().setSelectionProvider(viewer);
+		hookDoubleClickAction();
+
+	}
+
+	private void hookDoubleClickAction() {
+		viewer.addDoubleClickListener(new IDoubleClickListener() {
+			public void doubleClick(DoubleClickEvent event) {
+				Object firstElement = ((IStructuredSelection) viewer.getSelection()).getFirstElement();
+				viewer.refresh(firstElement);
+				viewer.expandToLevel(firstElement, 1);
+			}
+		});
+	}
+
+	/**
+	 * Passing the focus request to the viewer's control.
+	 */
+	@Override
+	public void setFocus() {
+		viewer.getControl().setFocus();
+	}
+
+	/**
+	 * @return the {@link TreeViewer} for this view.
+	 */
+	public TreeViewer getViewer() {
+		return viewer;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void loginCompleted(final ESUsersession session) {
+		getSite().getShell().getDisplay().asyncExec(new Runnable() {
+			public void run() {
+				viewer.refresh(session.getServer(), true);
+			}
+		});
+	}
+
+	/**
+	 * 
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.part.WorkbenchPart#dispose()
+	 */
+	@Override
+	public void dispose() {
+		super.dispose();
+		// TODO OTS
+		ESWorkspaceImpl workspace = ESWorkspaceProviderImpl.getInstance().getWorkspace();
+		Workspace currentWorkspace = workspace.toInternalAPI();
+		currentWorkspace.eAdapters().remove(workspaceAdapter);
+		ESWorkspaceProviderImpl.getObserverBus().unregister(this);
+		for (ServerInfo s : currentWorkspace.getServerInfos()) {
+			s.eAdapters().remove(serverInfoAdapterMap.get(s));
+		}
+
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizard.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizard.java
new file mode 100644
index 0000000..0ce6c62
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizard.java
@@ -0,0 +1,108 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import org.eclipse.emf.emfstore.client.ESServer;
+import org.eclipse.emf.emfstore.client.ESWorkspaceProvider;
+import org.eclipse.emf.emfstore.internal.client.model.ServerInfo;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.INewWizard;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.PlatformUI;
+
+/**
+ * Wizard for adding a new repository.
+ * 
+ * @author shterev
+ */
+public class NewRepositoryWizard extends Wizard implements INewWizard {
+
+	private ESServer server;
+
+	private NewRepositoryWizardPageOne mainPage;
+
+	/**
+	 * Default constructor.
+	 */
+	public NewRepositoryWizard() {
+		super();
+	}
+
+	/**
+	 * Adds all pages in the wizard.
+	 */
+	@Override
+	public void addPages() {
+		mainPage = new NewRepositoryWizardPageOne();
+		setWindowTitle("Server Details");
+		addPage(mainPage);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean canFinish() {
+		return true;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean performFinish() {
+		if (this.getContainer().getCurrentPage().canFlipToNextPage()) {
+			ESWorkspaceProvider.INSTANCE.getWorkspace().addServer(server);
+			dispose();
+		} else {
+			MessageDialog.openError(PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell(), "Error",
+				"Field(s) were left blank!");
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Getter for the server.
+	 * 
+	 * @return the server
+	 */
+	public ESServer getServer() {
+		if (server == null) {
+			// TODO: review or reuse client util
+			server = ESServer.FACTORY.createServer("localhost", 8080, "Generated certificate");
+		}
+		return server;
+	}
+
+	/**
+	 * Sets the ServerInfo.
+	 * 
+	 * @param serverInfo
+	 *            {@link ServerInfo}
+	 */
+	public void setServerInfo(ESServer server) {
+		this.server = server;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.ui.IWorkbenchWizard#init(org.eclipse.ui.IWorkbench,
+	 *      org.eclipse.jface.viewers.IStructuredSelection)
+	 */
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		// nothing to do
+	}
+
+}
\ No newline at end of file
diff --git a/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizardPageOne.java b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizardPageOne.java
new file mode 100644
index 0000000..9e2a110
--- /dev/null
+++ b/org.eclipse.emf.emfstore.client.ui.esbrowser/src/org/eclipse/emf/emfstore/client/ui/esbrowser/views/NewRepositoryWizardPageOne.java
@@ -0,0 +1,264 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
+ * Technische Universitaet Muenchen.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ * 
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.client.ui.esbrowser.views;
+
+import java.util.ArrayList;
+import java.util.concurrent.Callable;
+
+import org.eclipse.emf.emfstore.client.ESServer;
+import org.eclipse.emf.emfstore.client.exceptions.ESCertificateException;
+import org.eclipse.emf.emfstore.client.util.RunESCommand;
+import org.eclipse.emf.emfstore.internal.client.model.connectionmanager.KeyStoreManager;
+import org.eclipse.emf.emfstore.internal.client.model.util.WorkspaceUtil;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.window.Window;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Combo;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Spinner;
+import org.eclipse.swt.widgets.Text;
+
+/**
+ * The main page of the wizard.
+ * 
+ * @author shterev
+ */
+public class NewRepositoryWizardPageOne extends WizardPage {
+
+	private static final int DEFAULT_PORT = 8080;
+	private Text name;
+	private Text url;
+	private Spinner port;
+	private Combo cert;
+
+	/**
+	 * Default constructor.
+	 */
+	public NewRepositoryWizardPageOne() {
+		super("Main");
+		setTitle("Server Details");
+		setDescription("Select the details for the new repository");
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void createControl(Composite parent) {
+		NewRepositoryWizard wizard = (NewRepositoryWizard) getWizard();
+		ESServer server = wizard.getServer();
+
+		GridData gd;
+		Composite composite = new Composite(parent, SWT.NONE);
+
+		GridLayout gl = new GridLayout();
+		int ncol = 3;
+		gl.numColumns = ncol;
+		composite.setLayout(gl);
+
+		// Server Name
+		new Label(composite, SWT.NONE).setText("Name:");
+		name = new Text(composite, SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = ncol - 1;
+		name.setLayoutData(gd);
+
+		// Server URL
+		new Label(composite, SWT.NONE).setText("URL:");
+		url = new Text(composite, SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = ncol - 1;
+		url.setLayoutData(gd);
+
+		// Server Port
+		new Label(composite, SWT.NONE).setText("Port:");
+		port = new Spinner(composite, SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = ncol - 1;
+		port.setLayoutData(gd);
+		port.setValues(DEFAULT_PORT, 1, 999999, 0, 1, 10);
+		setControl(composite);
+
+		// Certificate
+		new Label(composite, SWT.NONE).setText("Certificate:");
+		cert = new Combo(composite, SWT.BORDER);
+		gd = new GridData(GridData.FILL_HORIZONTAL);
+		gd.horizontalSpan = ncol - 2;
+		cert.setLayoutData(gd);
+		cert.setBackground(Display.getCurrent().getSystemColor(SWT.COLOR_WHITE));
+		initCombo();
+
+		// Choose Certificate, Opens Dialogue
+		Button button = new Button(composite, SWT.NONE);
+		button.setText("Edit");
+		button.addSelectionListener(new SelectionDialogListener());
+
+		gd = new GridData(GridData.HORIZONTAL_ALIGN_END);
+		gd.horizontalSpan = 1;
+		button.setLayoutData(gd);
+
+		if (server.getURL() != null) {
+			name.setText(server.getName());
+			url.setText(server.getURL());
+			port.setSelection(server.getPort());
+			if (server.getCertificateAlias() == null) {
+				return;
+			}
+
+			try {
+				if (KeyStoreManager.getInstance().contains(server.getCertificateAlias())) {
+					for (int i = 0; i < cert.getItemCount(); i++) {
+						if (cert.getItem(i).equals(server.getCertificateAlias())) {
+							cert.select(i);
+							break;
+						}
+					}
+				} else {
+					cert.setText("");
+				}
+			} catch (ESCertificateException e1) {
+				cert.setText("");
+			}
+		}
+	}
+
+	private void initCombo() {
+		try {
+			ArrayList<String> certificates = KeyStoreManager.getInstance().getCertificates();
+			String[] aliases = new String[certificates.size()];
+			for (int i = 0; i < certificates.size(); i++) {
+				aliases[i] = certificates.get(i);
+			}
+			cert.setItems(aliases);
+
+			NewRepositoryWizard wizard = (NewRepositoryWizard) getWizard();
+			ESServer server = wizard.getServer();
+			String selectedCertificate = server.getCertificateAlias();
+			cert.select(certificates.indexOf(selectedCertificate));
+		} catch (ESCertificateException e) {
+			WorkspaceUtil.logException(e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * @return if the input on the current page is valid.
+	 */
+	@Override
+	public boolean canFlipToNextPage() {
+		if (getErrorMessage() != null) {
+			return false;
+		}
+		if (isTextNonEmpty(name.getText()) && isTextNonEmpty(url.getText()) && isComboNotEmpty()) {
+			saveDataToModel();
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Saves the uses choices from this page to the model. Called on exit of the
+	 * page
+	 */
+	private void saveDataToModel() {
+		RunESCommand.run(new Callable<Void>() {
+			public Void call() throws Exception {
+				NewRepositoryWizard wizard = (NewRepositoryWizard) getWizard();
+				ESServer serverInfo = wizard.getServer();
+				serverInfo.setName(name.getText());
+				serverInfo.setURL(url.getText());
+				serverInfo.setPort(port.getSelection());
+				serverInfo.setCertificateAlias(cert.getText());
+				return null;
+			}
+		});
+	}
+
+	/**
+	 * Returns true if Text is not empty, i.e. not null/only space characters.
+	 * 
+	 * @param t
+	 * @return boolean
+	 */
+	private static boolean isTextNonEmpty(String s) {
+		if ((s != null) && (s.trim().length() > 0)) {
+			return true;
+		}
+		return false;
+	}
+
+	private boolean isComboNotEmpty() {
+		String s = cert.getItem(cert.getSelectionIndex());
+		return isTextNonEmpty(s);
+	}
+
+	/**
+	 * Listener for the selection dialog.
+	 * 
+	 * @author pfeifferc
+	 */
+	class SelectionDialogListener implements SelectionListener {
+
+		/**
+		 * @param e
+		 *            selection event
+		 * @see org.eclipse.swt.events.SelectionListener#widgetDefaultSelected(org.eclipse.swt.events.SelectionEvent)
+		 */
+		public void widgetDefaultSelected(SelectionEvent e) {
+			// nothing to do
+		}
+
+		/**
+		 * @param e
+		 *            selection event
+		 * @see org.eclipse.swt.events.SelectionListener#widgetSelected(org.eclipse.swt.events.SelectionEvent)
+		 */
+		public void widgetSelected(SelectionEvent e) {
+			CertificateSelectionDialog csd = new CertificateSelectionDialog(Display.getCurrent().getActiveShell(),
+				new LabelProvider() {
+					@Override
+					public String getText(Object element) {
+						if (element instanceof String) {
+							return element.toString();
+						} else {
+							return "";
+						}
+					}
+				});
+			ArrayList<String> certificates;
+			try {
+				certificates = KeyStoreManager.getInstance().getCertificates();
+				csd.setElements(certificates.toArray());
+			} catch (ESCertificateException e1) {
+				csd.setErrorMessage(e1.getMessage());
+			}
+			csd.setBlockOnOpen(true);
+			csd.setTitle("Certificate Selection Dialog");
+			csd.open();
+			if (csd.getReturnCode() == Window.OK) {
+				initCombo();
+				for (int i = 0; i < cert.getItemCount(); i++) {
+					String item = cert.getItem(i);
+					if (item.equals(csd.getCertificateAlias())) {
+						cert.select(i);
+						break;
+					}
+				}
+			}
+		}
+	}
+}
\ No newline at end of file