sync with HEAD
diff --git a/bundles/org.eclipse.team.ui/.settings/org.eclipse.pde.prefs b/bundles/org.eclipse.team.ui/.settings/org.eclipse.pde.prefs
new file mode 100644
index 0000000..cc95386
--- /dev/null
+++ b/bundles/org.eclipse.team.ui/.settings/org.eclipse.pde.prefs
@@ -0,0 +1,15 @@
+#Mon Aug 06 13:03:58 CEST 2007
+compilers.incompatible-environment=1
+compilers.p.build=0
+compilers.p.deprecated=1
+compilers.p.missing-packages=0
+compilers.p.no-required-att=0
+compilers.p.not-externalized-att=1
+compilers.p.unknown-attribute=0
+compilers.p.unknown-class=0
+compilers.p.unknown-element=1
+compilers.p.unknown-resource=0
+compilers.p.unresolved-ex-points=0
+compilers.p.unresolved-import=0
+compilers.use-project=true
+eclipse.preferences.version=1
diff --git a/bundles/org.eclipse.team.ui/META-INF/MANIFEST.MF b/bundles/org.eclipse.team.ui/META-INF/MANIFEST.MF
index 5db6557..7406697 100644
--- a/bundles/org.eclipse.team.ui/META-INF/MANIFEST.MF
+++ b/bundles/org.eclipse.team.ui/META-INF/MANIFEST.MF
@@ -2,7 +2,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.team.ui; singleton:=true
-Bundle-Version: 3.3.100.qualifier
+Bundle-Version: 3.4.0.qualifier
 Bundle-Activator: org.eclipse.team.internal.ui.TeamUIPlugin
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
diff --git a/bundles/org.eclipse.team.ui/plugin.properties b/bundles/org.eclipse.team.ui/plugin.properties
index ee665d6..2b6db79 100644
--- a/bundles/org.eclipse.team.ui/plugin.properties
+++ b/bundles/org.eclipse.team.ui/plugin.properties
@@ -80,4 +80,6 @@
 ReplaceLocalHistory.label= &Local History...
 ReplaceLocalHistory.tooltip= Replace the Selected Resource with Local History
 CompareWithEachOtherAction.label= &Each Other
-CompareWithEachOtherAction.tooltip= Compare the Selected Resources
\ No newline at end of file
+CompareWithEachOtherAction.tooltip= Compare the Selected Resources
+
+ignoresTransferName= Team Ignored Resources Transfer
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.ui/plugin.xml b/bundles/org.eclipse.team.ui/plugin.xml
index a2a3a12..f2c154d 100644
--- a/bundles/org.eclipse.team.ui/plugin.xml
+++ b/bundles/org.eclipse.team.ui/plugin.xml
@@ -174,6 +174,7 @@
                class="org.eclipse.team.internal.ui.actions.ApplyPatchAction"
                menubarPath="team.main/group1"
                enablesFor="*"
+               definitionId="org.eclipse.team.ui.applyPatch"
                id="org.eclipse.team.ui.applyPatch">
          </action>
       </objectContribution>
@@ -337,12 +338,34 @@
    <extension
          point="org.eclipse.ui.bindings">
       <key
-            sequence="M3+M2+Q Y"
+            sequence="M2+M3+Q Y"
             contextId="org.eclipse.ui.globalScope"
             commandId="org.eclipse.team.sync.views.SynchronizeView"
             schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
       <key
-            sequence="M3+M2+Q Z"
+            platform="carbon"
+            sequence="M2+M3+Q Y"
+            contextId="org.eclipse.ui.globalScope"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+      <key
+            platform="carbon"
+            sequence="M1+M3+Q Y"
+            contextId="org.eclipse.ui.globalScope"
+            commandId="org.eclipse.team.sync.views.SynchronizeView"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+      <key
+            sequence="M2+M3+Q Z"
+            contextId="org.eclipse.ui.globalScope"
+            commandId="org.eclipse.team.ui.GenericHistoryView"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+      <key
+            platform="carbon"
+            sequence="M2+M3+Q Z"
+            contextId="org.eclipse.ui.globalScope"
+            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
+      <key
+            platform="carbon"
+            sequence="M1+M3+Q Z"
             contextId="org.eclipse.ui.globalScope"
             commandId="org.eclipse.team.ui.GenericHistoryView"
             schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"/>
@@ -522,7 +545,7 @@
       <transfer
             id="org.eclipse.team.transfer.ignores"
             icon="$nl$/icons/full/obj/ignoreprefs.gif"
-            name="Team Ignored Resources Transfer ">
+            name="%ignoresTransferName">
          <mapping
                scope="instance">
             <entry
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/IHelpContextIds.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/IHelpContextIds.java
index d262399..ed2c6d4 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/IHelpContextIds.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/IHelpContextIds.java
@@ -21,6 +21,8 @@
 	public static final String MODEL_PREFERENCE_PAGE = PREFIX + "model_preference_page_context"; //$NON-NLS-1$
 	public static final String FILE_TYPE_PREFERENCE_PAGE = PREFIX + "file_type_preference_page_context"; //$NON-NLS-1$
     public static final String SYNC_PREFERENCE_PAGE = PREFIX + "sync_preference_page_context"; //$NON-NLS-1$
+	public static final String SYNC_STARTUP_PREFERENCE_PAGE = PREFIX + "sync_startup_preference_page_context"; //$NON-NLS-1$
+	public static final String RESOURCE_MODEL_PREFERENCE_PAGE = PREFIX + "resource_model_preference_page_context"; //$NON-NLS-1$
 
 	// Wizard Pages
 	public static final String SHARE_PROJECT_PAGE = PREFIX + "share_project_page_context"; //$NON-NLS-1$
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIMessages.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIMessages.java
index db3782f..ed39608 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIMessages.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/TeamUIMessages.java
@@ -21,6 +21,16 @@
 		NLS.initializeMessages(BUNDLE_NAME, TeamUIMessages.class);
 	}
 	
+	public static String ConfigureMultipleProjectsWizard_0;
+
+	public static String ConfigureMultipleProjectsWizard_1;
+
+	public static String ProjectSelectionPage_0;
+
+	public static String ProjectSelectionPage_1;
+
+	public static String ProjectSelectionPage_2;
+
 	public static String TextPreferencePage_ExtensionNotCompleted;
 	
     public static String CompareInputChangeNotifier_0;
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/Utils.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/Utils.java
index 7c295b5..2563b90 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/Utils.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/Utils.java
@@ -55,11 +55,28 @@
 import org.eclipse.ui.ide.IContributorResourceAdapter2;
 import org.eclipse.ui.ide.IDE;
 import org.eclipse.ui.internal.ErrorEditorPart;
+import org.eclipse.ui.internal.registry.EditorDescriptor;
 import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
+import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
 
 public class Utils {
 
 	/**
+	 * Constant used to indicate that tests are being run. This field
+	 * should be the same as the corresponding field on 
+	 * org.eclipse.compare.internal.Utilities
+	 */
+	public static boolean RUNNING_TESTS = false;
+
+	/**
+	 * Constant used while testing the indicate that changes should be flushed
+	 * when the compare input changes and a viewer is dirty. This field
+	 * should be the same as the corresponding field on 
+	 * org.eclipse.compare.internal.Utilities
+	 */
+	public static boolean TESTING_FLUSH_ON_COMPARE_INPUT_CHANGE = false;	
+	
+	/**
 	 * The SortOperation takes a collection of objects and returns a sorted
 	 * collection of these objects. Concrete instances of this class provide
 	 * the criteria for the sorting of the objects based on the type of the
@@ -963,6 +980,25 @@
 		return traversal.asTraversals();
 	}
 
+	/**
+	 * Return whether the editor associated with a descriptor is a text editor
+	 * (i.e. an instance of AbstractDecoratedTextEditor).
+	 * See bug 99568 for a request to move the createEditor method to IEditorDescriptor.
+	 * @param descriptor
+	 * @return whether the editor associated with a descriptor is a text editor
+	 * @throws CoreException
+	 */
+	public static boolean isTextEditor(IEditorDescriptor descriptor)
+			throws CoreException {
+		if (descriptor instanceof EditorDescriptor) {
+			EditorDescriptor desc = (EditorDescriptor) descriptor;
+			IEditorPart editor= desc.createEditor();
+			editor.dispose();
+			return editor instanceof AbstractDecoratedTextEditor;
+		}
+		return false;
+	}
+	
 	public static IEditorPart openEditor(IWorkbenchPage page, IFileRevision revision, IProgressMonitor monitor) throws CoreException {
 		IStorage file = revision.getStorage(monitor);
 		if (file instanceof IFile) {
@@ -981,6 +1017,7 @@
 		String id = getEditorId(editorInput);
 		try {
 			IEditorPart part = page.openEditor(editorInput, id);
+			// See bug 90582 for the reasons behind this discouraged access
 			if (part instanceof ErrorEditorPart) {
 				page.closeEditor(part, false);
 				part = null;
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/ApplyPatchAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/ApplyPatchAction.java
index 0b78a20..0a7debb 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/ApplyPatchAction.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/ApplyPatchAction.java
@@ -13,7 +13,6 @@
 import java.lang.reflect.InvocationTargetException;
 
 import org.eclipse.compare.CompareConfiguration;
-import org.eclipse.compare.internal.CompareUIPlugin;
 import org.eclipse.compare.patch.ApplyPatchOperation;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
@@ -21,6 +20,7 @@
 import org.eclipse.jface.action.IAction;
 import org.eclipse.swt.custom.BusyIndicator;
 import org.eclipse.swt.widgets.Display;
+import org.eclipse.team.internal.ui.TeamUIPlugin;
 
 public class ApplyPatchAction extends TeamAction {
 
@@ -40,7 +40,7 @@
 			try {
 				isPatch = ApplyPatchOperation.isPatch((IFile)resource);
 			} catch (CoreException e) {
-				CompareUIPlugin.log(e);
+				TeamUIPlugin.log(e);
 			}
 		}
 		
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/CompareRevisionAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/CompareRevisionAction.java
index 139e36b..f78ac5f 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/CompareRevisionAction.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/CompareRevisionAction.java
@@ -35,16 +35,21 @@
 	IStructuredSelection selection;
 	IFileRevision currentFileRevision;
 	
-	public CompareRevisionAction(String text) {
+	public CompareRevisionAction(String text, HistoryPage page) {
 		super(text);
+		this.page = page;
 	}
 	
-	public CompareRevisionAction() {
-		this(TeamUIMessages.LocalHistoryPage_CompareAction);
+	public CompareRevisionAction(HistoryPage page) {
+		this(TeamUIMessages.LocalHistoryPage_CompareAction, page);
 	}
 
 	public void run() {
 		IStructuredSelection structSel = selection;
+		
+		if (structSel == null)
+			return;
+		
 		Object[] objArray = structSel.toArray();
 
 		IFileRevision file1 = null;
@@ -198,9 +203,6 @@
 
 		return false;
 	}
-	public void setPage(HistoryPage page) {
-		this.page = page;
-	}
 
 	private boolean shouldShow() {
 		IStructuredSelection structSel = selection;
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/ConfigureProjectAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/ConfigureProjectAction.java
index 5d36745..3f2d8d9 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/ConfigureProjectAction.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/ConfigureProjectAction.java
@@ -17,28 +17,16 @@
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jface.action.IAction;
 import org.eclipse.jface.operation.IRunnableWithProgress;
-import org.eclipse.jface.wizard.IWizard;
-import org.eclipse.jface.wizard.WizardDialog;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Shell;
 import org.eclipse.team.core.RepositoryProvider;
 import org.eclipse.team.internal.ui.TeamUIMessages;
 import org.eclipse.team.internal.ui.wizards.ConfigureProjectWizard;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.IWorkbenchWindowActionDelegate;
 
 /**
  * Action for configuring a project. Configuring involves associating
  * the project with a Team provider and performing any provider-specific
  * configuration that is necessary.
  */
-public class ConfigureProjectAction extends TeamAction implements IWorkbenchWindowActionDelegate {
-	private static class ResizeWizardDialog extends WizardDialog {
-		public ResizeWizardDialog(Shell parentShell, IWizard newWizard) {
-			super(parentShell, newWizard);
-			setShellStyle(getShellStyle() | SWT.RESIZE);
-		}		
-	}
+public class ConfigureProjectAction extends TeamAction {
 	
 	protected void execute(IAction action) throws InvocationTargetException,
 			InterruptedException {
@@ -47,11 +35,8 @@
 				try {
 					if (!isEnabled()) 
 						return;
-					IProject project = getSelectedProjects()[0];
-					ConfigureProjectWizard wizard = new ConfigureProjectWizard();
-					wizard.init(null, project);
-					WizardDialog dialog = new ResizeWizardDialog(getShell(), wizard);
-					dialog.open();
+					IProject[] projects = getSelectedProjects();
+					ConfigureProjectWizard.shareProjects(getShell(), projects);
 				} catch (Exception e) {
 					throw new InvocationTargetException(e);
 				}
@@ -64,15 +49,11 @@
 	 */
 	public boolean isEnabled() {
 		IProject[] selectedProjects = getSelectedProjects();
-		if (selectedProjects.length != 1) return false;
-		if (!selectedProjects[0].isAccessible()) return false;
-		if (!RepositoryProvider.isShared(selectedProjects[0])) return true;
-		return false;
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.IWorkbenchWindowActionDelegate#init(org.eclipse.ui.IWorkbenchWindow)
-	 */
-	public void init(IWorkbenchWindow window) {
+		for (int i = 0; i < selectedProjects.length; i++) {
+			IProject project = selectedProjects[i];
+			if (!project.isAccessible()) return false;
+			if (RepositoryProvider.isShared(project)) return false;	
+		}		
+		return selectedProjects.length > 0;
 	}
 }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/OpenRevisionAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/OpenRevisionAction.java
index 8eadf25..04d53a5 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/OpenRevisionAction.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/actions/OpenRevisionAction.java
@@ -32,46 +32,50 @@
 	private IStructuredSelection selection;
 	private HistoryPage page;
 	
-	public OpenRevisionAction(String text) {
+	public OpenRevisionAction(String text, HistoryPage page) {
 		super(text);
+		this.page = page;
 	}
 
 	public void run() {
-			IStructuredSelection structSel = selection;
+		IStructuredSelection structSel = selection;
 
-			Object[] objArray = structSel.toArray();
+		if (structSel == null)
+			return;
 
-			for (int i = 0; i < objArray.length; i++) {
-				Object tempRevision = objArray[i];
-				//If not a revision, don't try opening
-				if (tempRevision instanceof AbstractHistoryCategory)
-					continue;
-				
-				final IFileRevision revision = (IFileRevision) tempRevision;
-				if (revision == null || !revision.exists()) {
-					MessageDialog.openError(page.getSite().getShell(), TeamUIMessages.OpenRevisionAction_DeletedRevTitle, TeamUIMessages.OpenRevisionAction_DeletedRevMessage);
-				} else {
-					IRunnableWithProgress runnable = new IRunnableWithProgress() {
-						public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
-							try {
-								Utils.openEditor(page.getSite().getPage(), revision, monitor);
-							} catch (CoreException e) {
-								throw new InvocationTargetException(e);
-							}
-							
+		Object[] objArray = structSel.toArray();
+
+		for (int i = 0; i < objArray.length; i++) {
+			Object tempRevision = objArray[i];
+			//If not a revision, don't try opening
+			if (tempRevision instanceof AbstractHistoryCategory)
+				continue;
+
+			final IFileRevision revision = (IFileRevision) tempRevision;
+			if (revision == null || !revision.exists()) {
+				MessageDialog.openError(page.getSite().getShell(), TeamUIMessages.OpenRevisionAction_DeletedRevTitle, TeamUIMessages.OpenRevisionAction_DeletedRevMessage);
+			} else {
+				IRunnableWithProgress runnable = new IRunnableWithProgress() {
+					public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+						try {
+							Utils.openEditor(page.getSite().getPage(), revision, monitor);
+						} catch (CoreException e) {
+							throw new InvocationTargetException(e);
 						}
-					};
-					
-					IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
-					try {
-						progressService.run(false, false, runnable);
-					} catch (InvocationTargetException e) {
-						Utils.handleError(page.getSite().getShell(), e, TeamUIMessages.OpenRevisionAction_ErrorTitle, TeamUIMessages.OpenRevisionAction_ErrorMessage);
-					} catch (InterruptedException e) {
-					}
-				}
 
+					}
+				};
+
+				IProgressService progressService = PlatformUI.getWorkbench().getProgressService();
+				try {
+					progressService.run(false, false, runnable);
+				} catch (InvocationTargetException e) {
+					Utils.handleError(page.getSite().getShell(), e, TeamUIMessages.OpenRevisionAction_ErrorTitle, TeamUIMessages.OpenRevisionAction_ErrorMessage);
+				} catch (InterruptedException e) {
+				}
 			}
+
+		}
 	}
 	
 	protected boolean updateSelection(IStructuredSelection selection) {
@@ -79,10 +83,6 @@
 		return shouldShow();
 	}
 	
-	public void setPage(HistoryPage page) {
-		this.page = page;
-	}
-	
 	private boolean shouldShow() {
 		IStructuredSelection structSel = selection;
 		Object[] objArray = structSel.toArray();
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/PreferencePageContainerDialog.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/PreferencePageContainerDialog.java
index ca9e3f8..6c215a3 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/PreferencePageContainerDialog.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/dialogs/PreferencePageContainerDialog.java
@@ -15,7 +15,6 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import org.eclipse.compare.internal.TabFolderLayout;
 import org.eclipse.core.runtime.ListenerList;
 import org.eclipse.jface.dialogs.*;
 import org.eclipse.jface.dialogs.Dialog;
@@ -141,7 +140,6 @@
     private void createMultiplePageArea(Composite composite) {
 		// create a tab folder for the page
 		tabFolder = new TabFolder(composite, SWT.NONE);
-		tabFolder.setLayout(new TabFolderLayout());
 		tabFolder.setLayoutData(new GridData(GridData.FILL_BOTH));		
 		
 		for (int i = 0; i < pages.length; i++) {
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/EditionHistoryPage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/EditionHistoryPage.java
index 957f93b..42d3d86 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/EditionHistoryPage.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/EditionHistoryPage.java
@@ -12,9 +12,8 @@
 
 import java.util.*;
 
+import org.eclipse.compare.CompareUI;
 import org.eclipse.compare.ITypedElement;
-import org.eclipse.compare.internal.CompareUIPlugin;
-import org.eclipse.compare.internal.StructureCreatorDescriptor;
 import org.eclipse.compare.structuremergeviewer.*;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
@@ -27,8 +26,7 @@
 import org.eclipse.team.internal.ui.*;
 import org.eclipse.team.internal.ui.actions.CompareRevisionAction;
 import org.eclipse.team.internal.ui.synchronize.LocalResourceTypedElement;
-import org.eclipse.team.ui.history.IHistoryPage;
-import org.eclipse.team.ui.history.IHistoryPageSite;
+import org.eclipse.team.ui.history.*;
 import org.eclipse.ui.IWorkbenchPage;
 
 /**
@@ -51,6 +49,10 @@
 	
 	class CompareEditionAction extends CompareRevisionAction {
 		
+		public CompareEditionAction(HistoryPage page) {
+			super(page);
+		}
+
 		protected ITypedElement getElementFor(IResource resource) {
 			if (resource.equals(file))
 				return localFileElement;
@@ -130,7 +132,7 @@
 	
 	public static ITypedElement getPreviousState(IFile file, Object element) throws TeamException {
 		LocalResourceTypedElement localFileElement= new LocalResourceTypedElement(file);
-		IStructureCreator structureCreator = getStructureCreator(localFileElement);
+		IStructureCreator structureCreator = CompareUI.createStructureCreator(localFileElement);
 		if (structureCreator == null)
 			return null;
 		LocalFileHistory history = new LocalFileHistory(file, false);
@@ -155,14 +157,6 @@
 		}
 		return null;
 	}
-
-	private static IStructureCreator getStructureCreator(ITypedElement element) {
-		StructureCreatorDescriptor scd= CompareUIPlugin.getDefault().getStructureCreator(element.getType());
-		if (scd != null) {
-			return scd.createStructureCreator();
-		}
-		return null;
-	}
 	
 	public EditionHistoryPage(IFile file, Object element) {
 		super(ON | ALWAYS);
@@ -171,7 +165,7 @@
 		this.file = file;
 		this.element = element;
 		this.localFileElement= new LocalResourceTypedElement(getFile());
-		structureCreator = getStructureCreator(localFileElement);
+		structureCreator = CompareUI.createStructureCreator(localFileElement);
 	}
 
 	public void setSite(IHistoryPageSite site) {
@@ -407,7 +401,7 @@
 	 * @see org.eclipse.team.internal.ui.history.LocalHistoryPage#createCompareAction()
 	 */
 	protected CompareRevisionAction createCompareAction() {
-		return new CompareEditionAction();
+		return new CompareEditionAction(this);
 	}
 
 }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/FileRevisionEditorInput.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/FileRevisionEditorInput.java
index 663d562..6df698b 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/FileRevisionEditorInput.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/FileRevisionEditorInput.java
@@ -11,6 +11,7 @@
 package org.eclipse.team.internal.ui.history;
 
 import java.io.InputStream;
+import java.net.URI;
 import java.util.Date;
 
 import org.eclipse.core.resources.*;
@@ -20,8 +21,7 @@
 import org.eclipse.team.core.history.IFileRevision;
 import org.eclipse.team.internal.ui.TeamUIMessages;
 import org.eclipse.team.internal.ui.Utils;
-import org.eclipse.ui.IPersistableElement;
-import org.eclipse.ui.IStorageEditorInput;
+import org.eclipse.ui.*;
 import org.eclipse.ui.model.IWorkbenchAdapter;
 
 import com.ibm.icu.text.DateFormat;
@@ -169,4 +169,12 @@
 		return null;
 	}
 
+	public URI getURI() {
+		if (fileRevision instanceof IFileRevision) {
+			IFileRevision fr = (IFileRevision) fileRevision;
+			return fr.getURI();
+		}
+		return null;
+	}
+
 }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/LocalHistoryPage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/LocalHistoryPage.java
index 1c49e9e..272c62a 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/LocalHistoryPage.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/history/LocalHistoryPage.java
@@ -367,23 +367,23 @@
 	
 			// Click Compare action
 			compareAction = createCompareAction();
+			compareAction.setEnabled(!treeViewer.getSelection().isEmpty());
 			treeViewer.getTree().addSelectionListener(new SelectionAdapter(){
 				public void widgetSelected(SelectionEvent e) {
 					compareAction.setCurrentFileRevision(getCurrentFileRevision());
 					compareAction.selectionChanged((IStructuredSelection) treeViewer.getSelection());
 				}
 			});
-			compareAction.setPage(this);
 			
 			// Only add the open action if compare mode is not always on
 			if (!((compareMode & (ALWAYS | ON)) == (ALWAYS | ON))) {
-				openAction = new OpenRevisionAction(TeamUIMessages.LocalHistoryPage_OpenAction);
+				openAction = new OpenRevisionAction(TeamUIMessages.LocalHistoryPage_OpenAction, this);
+				openAction.setEnabled(!treeViewer.getSelection().isEmpty());
 				treeViewer.getTree().addSelectionListener(new SelectionAdapter(){
 					public void widgetSelected(SelectionEvent e) {
 						openAction.selectionChanged((IStructuredSelection) treeViewer.getSelection());
 					}
 				});
-				openAction.setPage(this);
 			}
 			
 			OpenStrategy handler = new OpenStrategy(treeViewer.getTree());
@@ -453,7 +453,7 @@
 	}
 
 	protected CompareRevisionAction createCompareAction() {
-		return new CompareRevisionAction();
+		return new CompareRevisionAction(this);
 	}
 
 	private String getFileNameQualifier() {
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java
index 8db6c10..df9131b 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/CommonViewerAdvisor.java
@@ -309,6 +309,10 @@
 			});
 			dlp.setDecorationContext(decorationContext);
 		}
+	}
+	
+	public void setInitialInput() {
+		CommonViewer viewer = (CommonViewer)getViewer();
         viewer.setInput(getInitialInput());
         viewer.expandToLevel(2);
 	}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelContentProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelContentProvider.java
index 7897eea..859675e 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelContentProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelContentProvider.java
@@ -112,7 +112,8 @@
 	 * @see org.eclipse.team.internal.ui.mapping.AbstractTeamAwareContentProvider#dispose()
 	 */
 	public void dispose() {
-		provider.dispose();
+		if (provider != null)
+			provider.dispose();
 		super.dispose();
 		TeamUIPlugin.getPlugin().getPreferenceStore().removePropertyChangeListener(this);
 	}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelLabelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelLabelProvider.java
index c6b6300..c137ea8 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelLabelProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/ResourceModelLabelProvider.java
@@ -223,7 +223,7 @@
 	protected ImageManager getImageManager() {
 		ISynchronizationContext context = getContext();
 		if (context != null) {
-			return ImageManager.getImageManager(context);
+			return ImageManager.getImageManager(context, getConfiguration());
 		}
 		if (localImageManager == null) {
 			localImageManager = new ImageManager();
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/StreamMergerDelegate.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/StreamMergerDelegate.java
index 054f752..b1ad40e 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/StreamMergerDelegate.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/mapping/StreamMergerDelegate.java
@@ -15,15 +15,16 @@
 import org.eclipse.core.resources.IStorage;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.content.IContentType;
+import org.eclipse.team.core.mapping.DelegatingStorageMerger;
 import org.eclipse.team.core.mapping.IStorageMerger;
-import org.eclipse.team.internal.core.mapping.DelegatingStorageMerger;
+import org.eclipse.team.internal.core.TeamPlugin;
 import org.eclipse.team.internal.core.mapping.IStreamMergerDelegate;
 import org.eclipse.team.internal.ui.TeamUIPlugin;
 
 public class StreamMergerDelegate implements IStreamMergerDelegate {
 
 	public static void start() {
-		DelegatingStorageMerger.setMergerDelegate(new StreamMergerDelegate());
+		TeamPlugin.getPlugin().setMergerDelegate(new StreamMergerDelegate());
 	}
 	
 	public IStorageMerger findMerger(IStorage target) {
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/messages.properties b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/messages.properties
index 541309b..cde2980 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/messages.properties
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/messages.properties
@@ -25,8 +25,8 @@
 
 IgnorePreferencePage_description=Use this page to specify a list of resource name patterns to exclude from version control.
 IgnorePreferencePage_add=Add &Pattern...
-IgnorePreferencePage_enterPatternLong=Please enter a pattern:
-IgnorePreferencePage_enterPatternShort=Enter Ignore Pattern
+IgnorePreferencePage_enterPatternLong=Enter a name or path pattern (* = any string, ? = any character):
+IgnorePreferencePage_enterPatternShort=Add Ignore Pattern
 IgnorePreferencePage_ignorePatterns=&Ignore Patterns:
 IgnorePreferencePage_patternExistsLong=The entered pattern already exists.
 IgnorePreferencePage_patternExistsShort=Pattern Already Exists
@@ -98,7 +98,7 @@
 ImportProjectSetMainPage_createWorkingSetLabel=&Create a working set containing the imported projects
 ImportProjectSetMainPage_workingSetLabel=&Working Set Name:
 ImportProjectSetMainPage_AddToWorkingSet=&Add the imported team project set to a working set
-ImportProjectSetMainPage_runInBackground=Run Project Set import in the &background
+ImportProjectSetMainPage_runInBackground=Run the import in the bac&kground
 ImportProjectSetMainPage_jobName=Importing project set...
 ImportProjectSetDialog_duplicatedWorkingSet_title=Working Set Exists
 ImportProjectSetDialog_duplicatedWorkingSet_message=Working Set ''{0}'' already exists. What would you like to do?
@@ -122,6 +122,9 @@
 ProjectSetImportWizard_2=An error occurred while parsing the project set file: {0}
 ProjectSetImportWizard_1=The following errors occurred while importing projects. Some projects may not be loaded.
 ProjectSetImportWizard_3=An error occurred while performing the project set import: {0}
+ProjectSelectionPage_0={0} does not directly support multiple project sharing. Select a project and click Share Project to share each project individually
+ProjectSelectionPage_1={0} Project Selection Page
+ProjectSelectionPage_2=&Share Project...
 ProjectSetImportWizard_Import_a_Project_Set_3=Import a Team Project Set
 ProjectSetImportWizard_workingSetExistsTitle=Working Set Exists
 ProjectSetImportWizard_workingSetExistsMessage=Working set ''{0}'' already exists. Overwrite?
@@ -224,6 +227,8 @@
 ConfigureRefreshScheduleDialog_0=Configure Synchronize Schedule - {0}
 ConfigureRefreshScheduleDialog_1=You can allow ''{0}'' to periodically synchronize in the background.
 ConfigureRefreshScheduleDialog_1a=The last synchronize occurred at: {0}
+ConfigureMultipleProjectsWizard_0=Unshared Projects
+ConfigureMultipleProjectsWizard_1=There are still projects that have not been shared. Finishing the wizard now will leave them in that state.
 ConfigureRefreshScheduleDialog_2=Do not schedule the synchronize operation to run periodically.
 ConfigureRefreshScheduleDialog_3=Using the following schedule:
 ConfigureRefreshScheduleDialog_4=Every:
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/IgnorePreferencePage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/IgnorePreferencePage.java
index c4f67df..305a6c6 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/IgnorePreferencePage.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/IgnorePreferencePage.java
@@ -141,7 +141,15 @@
 	}
 
 	private void addIgnore() {
-		InputDialog dialog = new InputDialog(getShell(), TeamUIMessages.IgnorePreferencePage_enterPatternShort, TeamUIMessages.IgnorePreferencePage_enterPatternLong, null, null); // 
+		
+		InputDialog dialog = new InputDialog(getShell(), TeamUIMessages.IgnorePreferencePage_enterPatternShort, TeamUIMessages.IgnorePreferencePage_enterPatternLong, null, null) {
+			protected Control createDialogArea(Composite parent) {
+				Control control = super.createDialogArea(parent);
+				PlatformUI.getWorkbench().getHelpSystem().setHelp(control, IHelpContextIds.IGNORE_PREFERENCE_PAGE);
+				return control;
+			}
+		};
+
 		dialog.open();
 		if (dialog.getReturnCode() != Window.OK) return;
 		String pattern = dialog.getValue();
@@ -150,7 +158,7 @@
 		TableItem[] items = ignoreTable.getItems();
 		for (int i = 0; i < items.length; i++) {
 			if (items[i].getText().equals(pattern)) {
-				MessageDialog.openWarning(getShell(), TeamUIMessages.IgnorePreferencePage_patternExistsShort, TeamUIMessages.IgnorePreferencePage_patternExistsLong); // 
+				MessageDialog.openWarning(getShell(), TeamUIMessages.IgnorePreferencePage_patternExistsShort, TeamUIMessages.IgnorePreferencePage_patternExistsLong);
 				return;
 			}
 		}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/ResourceModelPreferencePage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/ResourceModelPreferencePage.java
index b13d4fd..c770bd4 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/ResourceModelPreferencePage.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/preferences/ResourceModelPreferencePage.java
@@ -12,9 +12,9 @@
 
 import org.eclipse.jface.preference.FieldEditorPreferencePage;
 import org.eclipse.jface.preference.RadioGroupFieldEditor;
+import org.eclipse.swt.widgets.Composite;
 import org.eclipse.team.internal.ui.*;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.*;
 
 public class ResourceModelPreferencePage extends FieldEditorPreferencePage implements IWorkbenchPreferencePage, IPreferenceIds {
 
@@ -28,6 +28,15 @@
 	}
 
 	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createControl(Composite parent) {
+		super.createControl(parent);
+        // set F1 help
+        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IHelpContextIds.RESOURCE_MODEL_PREFERENCE_PAGE);
+	}
+	
+	/* (non-Javadoc)
 	 * @see org.eclipse.jface.preference.FieldEditorPreferencePage#createFieldEditors()
 	 */
 	protected void createFieldEditors() {
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizePage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizePage.java
index f04f1c3..1000160 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizePage.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizePage.java
@@ -110,7 +110,7 @@
 		
 		// Create the changes section which, in turn, creates the changes viewer and its configuration
 		this.changesSection = createChangesSection(composite);
-		this.changesViewer = createChangesViewer(changesSection.getContainer());
+		createChangesViewer(changesSection.getContainer());
 		changesSection.setViewer(changesViewer);
 	}
 
@@ -125,11 +125,11 @@
 	 * with the page.
 	 * 
 	 * @param parent the parent of the viewer
-	 * @return the changes viewer control
 	 */
-	protected Viewer createChangesViewer(Composite parent) {
+	private void createChangesViewer(Composite parent) {
 		viewerAdvisor = createViewerAdvisor(parent);
-		return viewerAdvisor.getViewer();
+		changesViewer = viewerAdvisor.getViewer();
+		viewerAdvisor.setInitialInput();
 	}
 
 	protected abstract AbstractViewerAdvisor createViewerAdvisor(Composite parent);
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractTreeViewerAdvisor.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractTreeViewerAdvisor.java
index 837ffeb..9e2f7e3 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractTreeViewerAdvisor.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractTreeViewerAdvisor.java
@@ -24,7 +24,7 @@
 /**
  * Abstract superclass for tree viewer advisors
  */
-public class AbstractTreeViewerAdvisor extends StructuredViewerAdvisor implements IAdaptable {
+public abstract class AbstractTreeViewerAdvisor extends StructuredViewerAdvisor implements IAdaptable {
 
 	private ICompareNavigator nav;
 	private INavigatable navigatable;
@@ -308,9 +308,6 @@
 			children = tree.getItems();
 			if (children != null && children.length > 0) {
 				item = children[0];
-				if (item != null && item.getItemCount() <= 0) {
-					return item;
-				}
 			}
 		}
 		return item;
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractViewerAdvisor.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractViewerAdvisor.java
index b137ebe..3a0b944 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractViewerAdvisor.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractViewerAdvisor.java
@@ -65,4 +65,6 @@
 	}
 
 	public abstract void setActionBars(IActionBars actionBars);
+
+	public abstract void setInitialInput();
 }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ImageManager.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ImageManager.java
index ab24e67..70423ad 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ImageManager.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ImageManager.java
@@ -10,63 +10,81 @@
  *******************************************************************************/
 package org.eclipse.team.internal.ui.synchronize;
 
-import java.util.*;
-
 import org.eclipse.compare.CompareConfiguration;
-import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.*;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.team.core.ICache;
 import org.eclipse.team.core.ICacheListener;
 import org.eclipse.team.core.mapping.ISynchronizationContext;
 import org.eclipse.team.internal.ui.TeamUIPlugin;
+import org.eclipse.team.ui.synchronize.ISynchronizePageConfiguration;
 
 public class ImageManager {
 	
 	private static final String PROP_IMAGE_MANAGER = TeamUIPlugin.ID + ".imageManager"; //$NON-NLS-1$
 	
-	// Cache for images that have been overlayed
-	private Map fgImageCache = new HashMap(10);
-	
+	private LocalResourceManager imageManager;
 	// Contains direction images
 	private CompareConfiguration compareConfig = new CompareConfiguration();
-	
 	private boolean disposed = false;
 	
-	public synchronized static ImageManager getImageManager(ISynchronizationContext context) {
+	public synchronized static ImageManager getImageManager(ISynchronizationContext context, ISynchronizePageConfiguration configuration) {
 		ImageManager manager = (ImageManager)context.getCache().get(PROP_IMAGE_MANAGER);
 		if (manager == null) {
 			final ImageManager newRegistry = new ImageManager();
 			context.getCache().put(PROP_IMAGE_MANAGER, newRegistry);
-			context.getCache().addCacheListener(new ICacheListener() {
-				public void cacheDisposed(ICache cache) {
-					newRegistry.dispose();
-				}
-			});
+			Viewer v = getViewer(configuration);
+			if (v != null) {
+				// It is best to dispose the images when the view is disposed (see bug 198383)
+				v.getControl().addDisposeListener(new DisposeListener() {
+					public void widgetDisposed(DisposeEvent e) {
+						newRegistry.dispose();
+					}
+				});
+			} else {
+				// The viewer wasn't available so we'll dispose when the context is disposed
+				context.getCache().addCacheListener(new ICacheListener() {
+					public void cacheDisposed(ICache cache) {
+						newRegistry.dispose();
+					}
+				});
+			}
 			manager = newRegistry;
 		}
 		return manager;
 	}
+
+	private static Viewer getViewer(ISynchronizePageConfiguration configuration) {
+		if (configuration == null)
+			return null;
+		if (configuration.getPage() == null)
+			return null;
+		return configuration.getPage().getViewer();
+	}
 	
 	public Image getImage(ImageDescriptor descriptor) {
 		if (descriptor == null || disposed)
 			return null;
-		Image image = (Image)fgImageCache.get(descriptor);
-		if (image == null) {
-			image = descriptor.createImage();
-			fgImageCache.put(descriptor, image);
-		}
+		ResourceManager manager = getResourceManager();
+		Image image = manager.createImage(descriptor);
 		return image;
 	}
 	
+	private synchronized ResourceManager getResourceManager() {
+		if (imageManager == null) {
+			imageManager = new LocalResourceManager(JFaceResources.getResources());
+		}
+		return imageManager;
+	}
+
 	public void dispose() {
 		disposed = true;
 		compareConfig.dispose();
-		if (fgImageCache != null) {
-			Iterator it = fgImageCache.values().iterator();
-			while (it.hasNext()) {
-				Image element = (Image) it.next();
-				element.dispose();
-			}
+		if (imageManager != null) {
+			imageManager.dispose();
 		}
 	}
 
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/LocalResourceSaveableComparison.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/LocalResourceSaveableComparison.java
index dad8686..1ccc1c7 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/LocalResourceSaveableComparison.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/LocalResourceSaveableComparison.java
@@ -11,7 +11,6 @@
 package org.eclipse.team.internal.ui.synchronize;
 
 import org.eclipse.compare.*;
-import org.eclipse.compare.internal.Utilities;
 import org.eclipse.compare.structuremergeviewer.ICompareInput;
 import org.eclipse.core.resources.IFile;
 import org.eclipse.core.resources.IResource;
@@ -167,8 +166,8 @@
 	 */
 	private boolean checkForUpdateConflicts() {
 		if(hasSaveConflict()) {
-			if (Utilities.RUNNING_TESTS)
-				return !Utilities.TESTING_FLUSH_ON_COMPARE_INPUT_CHANGE;
+			if (Utils.RUNNING_TESTS)
+				return !Utils.TESTING_FLUSH_ON_COMPARE_INPUT_CHANGE;
 			final MessageDialog dialog = 
 				new MessageDialog(TeamUIPlugin.getStandardDisplay().getActiveShell(), 
 						TeamUIMessages.SyncInfoCompareInput_0,  
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/StartupPreferencePage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/StartupPreferencePage.java
index e6cf3e2..2059351 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/StartupPreferencePage.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/StartupPreferencePage.java
@@ -11,9 +11,10 @@
 package org.eclipse.team.internal.ui.synchronize;
 
 import org.eclipse.jface.preference.*;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.team.internal.ui.IHelpContextIds;
 import org.eclipse.team.internal.ui.TeamUIMessages;
-import org.eclipse.ui.IWorkbench;
-import org.eclipse.ui.IWorkbenchPreferencePage;
+import org.eclipse.ui.*;
 
 public class StartupPreferencePage extends FieldEditorPreferencePage implements
 		IWorkbenchPreferencePage {
@@ -36,6 +37,15 @@
 	public void init(IWorkbench workbench) {
 		// Nothing to do
 	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets.Composite)
+	 */
+	public void createControl(Composite parent) {
+		super.createControl(parent);
+        // set F1 help
+        PlatformUI.getWorkbench().getHelpSystem().setHelp(getControl(), IHelpContextIds.SYNC_STARTUP_PREFERENCE_PAGE);
+	}
 
 	protected void createFieldEditors() {
 	    addField(new RadioGroupFieldEditor(PROP_STARTUP_ACTION, 
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/TreeViewerAdvisor.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/TreeViewerAdvisor.java
index cdf53f1..37947ec 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/TreeViewerAdvisor.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/TreeViewerAdvisor.java
@@ -137,6 +137,10 @@
 		viewer.getControl().setLayoutData(data);
 		initializeViewer(viewer);		
 	}
+	
+	public void setInitialInput() {
+		// The input will be set later
+	}
 
 	/**
 	 * Create the model manager to be used by this advisor
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/actions/ChangeSetActionGroup.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/actions/ChangeSetActionGroup.java
index 2874744..5c93a28 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/actions/ChangeSetActionGroup.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/actions/ChangeSetActionGroup.java
@@ -11,8 +11,8 @@
 package org.eclipse.team.internal.ui.synchronize.actions;
 
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
+import java.text.Collator;
+import java.util.*;
 
 import org.eclipse.compare.structuremergeviewer.IDiffElement;
 import org.eclipse.core.resources.IResource;
@@ -352,7 +352,13 @@
     }
     
     protected void addChangeSets(IMenuManager manager) {
-        ChangeSet[] sets = getActiveChangeSetManager().getSortedSets();
+        ChangeSet[] sets = getActiveChangeSetManager().getSets();
+        Arrays.sort(sets, new Comparator() {
+        	private Collator collator = Collator.getInstance();
+        	public int compare(Object o1, Object o2) {
+        		return collator.compare(((ChangeSet) o1).getName(), ((ChangeSet) o2).getName());
+        	}
+        });
         ISelection selection = getContext().getSelection();
         createChangeSet.selectionChanged(selection);
 		addToChangeSet.add(createChangeSet);
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/actions/GlobalRefreshAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/actions/GlobalRefreshAction.java
index 3fdb6f8..b4ada85 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/actions/GlobalRefreshAction.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/actions/GlobalRefreshAction.java
@@ -10,6 +10,7 @@
  *******************************************************************************/
 package org.eclipse.team.internal.ui.synchronize.actions;
 
+import org.eclipse.core.commands.*;
 import org.eclipse.jface.action.*;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.wizard.IWizard;
@@ -23,8 +24,10 @@
 import org.eclipse.team.ui.TeamImages;
 import org.eclipse.team.ui.TeamUI;
 import org.eclipse.team.ui.synchronize.*;
-import org.eclipse.ui.*;
-import org.eclipse.ui.commands.*;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.IWorkbenchWindowPulldownDelegate;
+import org.eclipse.ui.handlers.IHandlerActivation;
+import org.eclipse.ui.handlers.IHandlerService;
 
 /**
  * A global refresh action that allows the user to select the participant to refresh 
@@ -44,8 +47,8 @@
 	private Action synchronizeAction;
 	private IWorkbenchWindow window;
 	private IAction actionProxy;
-	private HandlerSubmission syncAll;
-	private HandlerSubmission syncLatest;
+	private IHandlerActivation syncAll;
+	private IHandlerActivation syncLatest;
 
 	class RefreshParticipantAction extends Action {
 		private ISynchronizeParticipantReference participant;
@@ -64,29 +67,7 @@
 	}
 
 	public GlobalRefreshAction() {
-		synchronizeAction = new Action(TeamUIMessages.GlobalRefreshAction_4) { 
-			public void run() {
-				IWizard wizard = new GlobalSynchronizeWizard();
-				WizardDialog dialog = new WizardDialog(window.getShell(), wizard);
-				dialog.open();
-			}
-		};
-		synchronizeAction.setImageDescriptor(TeamImages.getImageDescriptor(ITeamUIImages.IMG_SYNC_VIEW));
-		synchronizeAction.setActionDefinitionId("org.eclipse.team.ui.synchronizeAll"); //$NON-NLS-1$
-		
-		// hook up actions to the commands
-		IHandler handler = new ActionHandler(synchronizeAction);
-        syncAll = new HandlerSubmission(null,
-                null, null, "org.eclipse.team.ui.synchronizeAll", handler, Priority.LOW);	 //$NON-NLS-1$
-		PlatformUI.getWorkbench().getCommandSupport().addHandlerSubmission(syncAll);
-				
-		handler = new ActionHandler(this);
-        syncLatest = new HandlerSubmission(null,
-                null, null, "org.eclipse.team.ui.synchronizeLast", handler, Priority.MEDIUM);	 //$NON-NLS-1$
-		PlatformUI.getWorkbench().getCommandSupport().addHandlerSubmission(syncLatest);
-		
-		setMenuCreator(this);
-		TeamUI.getSynchronizeManager().addSynchronizeParticipantListener(this);
+		// Nothing to do
 	}
 
 	/*
@@ -102,10 +83,15 @@
 		TeamUI.getSynchronizeManager().removeSynchronizeParticipantListener(this);
 		
 		// handlers
-		PlatformUI.getWorkbench().getCommandSupport().removeHandlerSubmission(syncAll);
-		syncAll.getHandler().dispose();
-		PlatformUI.getWorkbench().getCommandSupport().removeHandlerSubmission(syncLatest);
-		syncLatest.getHandler().dispose();
+		if (window != null) {
+			IHandlerService hs = (IHandlerService)window.getService(IHandlerService.class);
+			if (hs != null) {
+				if (syncAll != null)
+					hs.deactivateHandler(syncAll);
+				if (syncLatest != null)
+					hs.deactivateHandler(syncLatest);
+			}
+		}
 	}
 
 	/*
@@ -147,6 +133,40 @@
 	 */
 	public void init(IWorkbenchWindow window) {
 		this.window = window;
+
+		synchronizeAction = new Action(TeamUIMessages.GlobalRefreshAction_4) { 
+			public void run() {
+				IWizard wizard = new GlobalSynchronizeWizard();
+				WizardDialog dialog = new WizardDialog(GlobalRefreshAction.this.window.getShell(), wizard);
+				dialog.open();
+			}
+		};
+		synchronizeAction.setImageDescriptor(TeamImages.getImageDescriptor(ITeamUIImages.IMG_SYNC_VIEW));
+		synchronizeAction.setActionDefinitionId("org.eclipse.team.ui.synchronizeAll"); //$NON-NLS-1$
+		
+		IHandlerService hs = (IHandlerService)window.getService(IHandlerService.class);
+		if (hs != null) {
+			// hook up actions to the commands
+			IHandler handler = new AbstractHandler() {
+				public Object execute(ExecutionEvent event)
+						throws ExecutionException {
+					synchronizeAction.run();
+					return null;
+				}
+			};
+			syncAll = hs.activateHandler("org.eclipse.team.ui.synchronizeAll", handler); //$NON-NLS-1$
+					
+			handler = new AbstractHandler() {
+				public Object execute(ExecutionEvent event)
+						throws ExecutionException {
+					run();
+					return null;
+				}
+			};
+	        syncLatest = hs.activateHandler("org.eclipse.team.ui.synchronizeLast", handler);	 //$NON-NLS-1$
+		}
+		setMenuCreator(this);
+		TeamUI.getSynchronizeManager().addSynchronizeParticipantListener(this);
 	}
 
 	public void run() {
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigurationWizardElement.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigurationWizardElement.java
index 7fcd9f9..d2d089e 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigurationWizardElement.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigurationWizardElement.java
@@ -11,10 +11,15 @@
 package org.eclipse.team.internal.ui.wizards;
 
 
+import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.*;
 import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.wizard.IWizard;
 import org.eclipse.team.internal.ui.TeamUIPlugin;
-import org.eclipse.ui.IPluginContribution;
+import org.eclipse.team.internal.ui.Utils;
+import org.eclipse.team.ui.IConfigurationWizard;
+import org.eclipse.team.ui.IConfigurationWizardExtension;
+import org.eclipse.ui.*;
 import org.eclipse.ui.model.IWorkbenchAdapter;
 import org.eclipse.ui.model.WorkbenchAdapter;
 
@@ -40,12 +45,44 @@
 	 * Create an the instance of the object described by the configuration
 	 * element. That is, create the instance of the class the isv supplied in
 	 * the extension point.
+	 * @return the instance of the configuration wizard of type {@link IConfigurationWizard}
 	 * 
 	 * @throws CoreException if an error occurs creating the extension
 	 */
 	public Object createExecutableExtension() throws CoreException {
 		return TeamUIPlugin.createExtension(configurationElement, ConfigureProjectWizard.ATT_CLASS);
 	}
+	
+	/**
+	 * Creates the instance of the wizard and initializes with the given input.
+	 * @param projects the projects being shared by this wizard
+	 * @return the wizard instance of type {@link IConfigurationWizard}
+	 * @throws CoreException if an error occurs creating the extension 
+	 */
+	public IWizard createExecutableExtension(IProject[] projects) throws CoreException {
+		IWorkbench workbench = PlatformUI.getWorkbench();
+		IConfigurationWizard wizard = (IConfigurationWizard)createExecutableExtension();
+		IConfigurationWizardExtension extension = (IConfigurationWizardExtension)Utils.getAdapter(wizard, IConfigurationWizardExtension.class);
+		if (extension == null) {
+			if (projects.length == 1) {
+				wizard.init(workbench, projects[0]);
+			} else {
+				// Dispose of the created wizard, just in case
+				try {
+					wizard.dispose();
+				} catch (RuntimeException e) {
+					// If a general exception occurred here, log it and continue
+					TeamUIPlugin.log(IStatus.ERROR, "An internal error occurred", e); //$NON-NLS-1$
+				}
+				IWizard multiWizard = new ConfigureMultipleProjectsWizard(projects, this);
+				return multiWizard;
+			}
+		} else {
+			extension.init(workbench, projects);
+		}
+		return wizard;
+	}
+	
 	/*
 	 * Method declared on IAdaptable.
 	 */
@@ -108,7 +145,7 @@
 	/**
 	 * Set the description parameter of this element
 	 *
-	 * @param value  the new desrciption
+	 * @param value  the new description
 	 */
 	public void setDescription(String value) {
 		// Not used
@@ -141,6 +178,30 @@
 	 * @see org.eclipse.ui.IPluginContribution#getPluginId()
 	 */
 	public String getPluginId() {
-		return configurationElement.getNamespace();
+		return configurationElement.getNamespaceIdentifier();
+	}
+	
+	/**
+	 * Return whether the wizard created for this element has pages.
+	 * Unfortunately, the only way to find this out is to create the wizard.
+	 * @param projects the projects being shared
+	 * @return whether the resulting wizard has pages
+	 */
+	public boolean wizardHasPages(IProject[] projects) {
+		try {
+			IWizard wizard = (IWizard)createExecutableExtension(projects);
+			try {
+				wizard.addPages();
+				return (wizard.getPageCount() > 0);
+			} finally {
+				wizard.dispose();
+			}
+		} catch (CoreException e) {
+			TeamUIPlugin.log(e);
+		} catch (RuntimeException e) {
+			// If a general exception occurred here, log it and continue
+			TeamUIPlugin.log(IStatus.ERROR, "An internal error occurred", e); //$NON-NLS-1$
+		}
+		return false;
 	}
 }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureMultipleProjectsWizard.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureMultipleProjectsWizard.java
new file mode 100644
index 0000000..107cc42
--- /dev/null
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureMultipleProjectsWizard.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.internal.ui.wizards;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.team.internal.ui.TeamUIMessages;
+import org.eclipse.team.ui.IConfigurationWizard;
+import org.eclipse.team.ui.IConfigurationWizardExtension;
+
+/**
+ * Wizard that supports the sharing of multiple projects for those repository providers
+ * that have not adapted their {@link IConfigurationWizard} to {@link IConfigurationWizardExtension}.
+ */
+public class ConfigureMultipleProjectsWizard extends Wizard {
+
+	private final IProject[] projects;
+	private final ConfigurationWizardElement element;
+	private ProjectSelectionPage projectSelectionPage;
+
+	public ConfigureMultipleProjectsWizard(IProject[] projects, ConfigurationWizardElement element) {
+		this.projects = projects;
+		this.element = element;
+	}
+
+	
+	public void addPages() {
+		projectSelectionPage = new ProjectSelectionPage(projects, element);
+		addPage(projectSelectionPage);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
+	 */
+	public boolean performFinish() {
+		// Prompt if there are still unshared projects
+		if (projectSelectionPage.hasUnsharedProjects()) {
+			return MessageDialog.openConfirm(getShell(), TeamUIMessages.ConfigureMultipleProjectsWizard_0, TeamUIMessages.ConfigureMultipleProjectsWizard_1);
+		}
+		return true;
+	}
+
+}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureProjectWizard.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureProjectWizard.java
index a78431d..ce4b337 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureProjectWizard.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureProjectWizard.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2006 IBM Corporation and others.
+ * Copyright (c) 2000, 2007 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
  * which accompanies this distribution, and is available at
@@ -10,14 +10,12 @@
  *******************************************************************************/
 package org.eclipse.team.internal.ui.wizards;
 
-
 import org.eclipse.core.resources.IProject;
 import org.eclipse.core.runtime.*;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.jface.wizard.*;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Shell;
 import org.eclipse.team.internal.ui.*;
-import org.eclipse.team.ui.IConfigurationWizard;
-import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.activities.IActivityManager;
 import org.eclipse.ui.activities.IIdentifier;
@@ -26,13 +24,9 @@
 /**
  * The wizard for associating projects with team providers
  */
-public class ConfigureProjectWizard extends Wizard implements IConfigurationWizard {
-	protected IWorkbench workbench;
-	protected IProject project;
-	protected IConfigurationWizard wizard;
-	
+public class ConfigureProjectWizard extends Wizard {
+	protected IProject[] projects;
 	protected ConfigureProjectWizardMainPage mainPage;
-	private String pluginId = TeamUIPlugin.PLUGIN_ID;
 	
 	protected final static String PT_CONFIGURATION ="configurationWizards"; //$NON-NLS-1$
 	protected final static String TAG_WIZARD = "wizard"; //$NON-NLS-1$
@@ -42,66 +36,27 @@
 	protected final static String ATT_ICON = "icon"; //$NON-NLS-1$
 	protected final static String ATT_ID = "id"; //$NON-NLS-1$
 	
-	public ConfigureProjectWizard() {
+	private ConfigureProjectWizard(IProject[] projects) {
+		this.projects = projects;
 		setNeedsProgressMonitor(true);
-		setWindowTitle(getWizardWindowTitle()); 
+		setWindowTitle(TeamUIMessages.ConfigureProjectWizard_title); 
 	}
 	
-	protected String getExtensionPoint() {
-		return PT_CONFIGURATION;
-	}
-	
-	protected String getWizardWindowTitle() {
-		return TeamUIMessages.ConfigureProjectWizard_title; 
-	}
-	
-	protected String getWizardLabel() {
-		return TeamUIMessages.ConfigureProjectWizard_configureProject; 
-	}
-	
-	protected String getWizardDescription() {
-		return TeamUIMessages.ConfigureProjectWizard_description; 
-	}
-	
-	/*
-	 * @see Wizard#addPages
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.Wizard#addPages()
 	 */
 	public void addPages() {
 		AdaptableList disabledWizards = new AdaptableList();
-		AdaptableList wizards = getAvailableWizards(disabledWizards);	
-		if (wizards.size() == 1 && disabledWizards.size() == 0) {
-			// If there is only one wizard, skip the first page.
-			// Only skip the first page if the one wizard has at least one page.
-			ConfigurationWizardElement element = (ConfigurationWizardElement)wizards.getChildren()[0];
-			try {
-				this.wizard = (IConfigurationWizard)element.createExecutableExtension();
-				wizard.init(workbench, project);
-				wizard.addPages();
-				if (wizard.getPageCount() > 0) {
-					wizard.setContainer(getContainer());
-					IWizardPage[] pages = wizard.getPages();
-					for (int i = 0; i < pages.length; i++) {
-						addPage(pages[i]);
-					}
-					return;
-				}
-			} catch (CoreException e) {
-				TeamUIPlugin.log(e);
-				return;
-			}
-		}
-		mainPage = new ConfigureProjectWizardMainPage("configurePage1", getWizardLabel(), TeamUIPlugin.getImageDescriptor(ITeamUIImages.IMG_WIZBAN_SHARE), wizards, disabledWizards); //$NON-NLS-1$
-		mainPage.setDescription(getWizardDescription());
-		mainPage.setProject(project);
-		mainPage.setWorkbench(workbench);
+		AdaptableList wizards = getAvailableWizards(disabledWizards);
+		mainPage = new ConfigureProjectWizardMainPage("configurePage1", TeamUIMessages.ConfigureProjectWizard_configureProject, TeamUIPlugin.getImageDescriptor(ITeamUIImages.IMG_WIZBAN_SHARE), wizards, disabledWizards); //$NON-NLS-1$
+		mainPage.setDescription(TeamUIMessages.ConfigureProjectWizard_description);
+		mainPage.setProjects(projects);
 		addPage(mainPage);
 	}
-	public IWizardPage getNextPage(IWizardPage page) {
-		if (wizard != null) {
-			return wizard.getNextPage(page);
-		}
-		return super.getNextPage(page);
-	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.Wizard#canFinish()
+	 */
 	public boolean canFinish() {
 		// If we are on the first page, never allow finish unless the selected wizard has no pages.
 		if (getContainer().getCurrentPage() == mainPage) {
@@ -110,44 +65,59 @@
 			}
 			return false;
 		}
-		if (wizard != null) {
-			return wizard.canFinish();
-		}
 		return super.canFinish();
 	}
-	/*
-	 * @see Wizard#performFinish
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jface.wizard.Wizard#performFinish()
 	 */
 	public boolean performFinish() {
-		// There is only one wizard with at least one page
-		if (wizard != null) {
-			return wizard.performFinish();
-		}
 		// If we are on the first page and the selected wizard has no pages then
 		// allow it to finish.
 		if (getContainer().getCurrentPage() == mainPage) {
-			IConfigurationWizard noPageWizard = mainPage.getSelectedWizard();
+			IWizard noPageWizard = mainPage.getSelectedWizard();
 			if (noPageWizard != null) {
 				if (noPageWizard.canFinish()) 
 				{
 					return noPageWizard.performFinish();
 				}
 			}
-		}
+		}		
 		// If the wizard has pages and there are several
 		// wizards registered then the registered wizard
 		// will call it's own performFinish().		
 		return true;
 	}
 	
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.wizard.IWizard#performCancel()
-	 */
-	public boolean performCancel() {
-		if (wizard != null) {
-			return wizard.performCancel();
+	private static class ResizeWizardDialog extends WizardDialog {
+		public ResizeWizardDialog(Shell parentShell, IWizard newWizard) {
+			super(parentShell, newWizard);
+			setShellStyle(getShellStyle() | SWT.RESIZE);
+		}		
+	}
+	
+	public static void shareProjects(Shell shell, IProject[] projects) {
+		IWizard wizard = null;
+		// If we only have one wizard registered, we'll just use that wizard
+		// unless it doesn't have any pages
+		AdaptableList disabledWizards = new AdaptableList();
+		AdaptableList wizards = getAvailableWizards(disabledWizards);	
+		if (wizards.size() == 1 && disabledWizards.size() == 0) {
+			ConfigurationWizardElement element = (ConfigurationWizardElement)wizards.getChildren()[0];
+			if (element.wizardHasPages(projects)) {
+				try {
+					wizard = (IWizard)element.createExecutableExtension(projects);
+				} catch (CoreException e) {
+					// Log the exception and fall through to show the wizard
+					TeamUIPlugin.log(e);
+				}
+			}
 		}
-		return super.performCancel();
+		if (wizard == null) {
+			wizard = new ConfigureProjectWizard(projects);
+			((ConfigureProjectWizard)wizard).setForcePreviousAndNextButtons(true);
+		}
+		openWizard(shell, wizard);
 	}
 	
 	/**
@@ -155,10 +125,10 @@
 	 * 
 	 * @return the available wizards
 	 */
-	protected AdaptableList getAvailableWizards(AdaptableList disabledWizards) {
+	private static AdaptableList getAvailableWizards(AdaptableList disabledWizards) {
 		AdaptableList result = new AdaptableList();
 		IExtensionRegistry registry = Platform.getExtensionRegistry();
-		IExtensionPoint point = registry.getExtensionPoint(pluginId, getExtensionPoint());
+		IExtensionPoint point = registry.getExtensionPoint(TeamUIPlugin.PLUGIN_ID, PT_CONFIGURATION);
 		if (point != null) {
 			IExtension[] extensions = point.getExtensions();
 			for (int i = 0; i < extensions.length; i++) {
@@ -179,9 +149,9 @@
 		return result;
 	}
 	
-	private boolean filterItem(IConfigurationElement element) {
+	private static boolean filterItem(IConfigurationElement element) {
 		String extensionId = element.getAttribute(ATT_ID);
-		String extensionPluginId = element.getNamespace();
+		String extensionPluginId = element.getNamespaceIdentifier();
 	    IActivityManager activityMgr = PlatformUI.getWorkbench().getActivitySupport().getActivityManager();
 	    IIdentifier id = activityMgr.getIdentifier(extensionPluginId + "/" +  extensionId); //$NON-NLS-1$
 	    return (!id.isEnabled());
@@ -197,7 +167,7 @@
 	 * @param element  the element for which to create a wizard element
 	 * @return the wizard element for the given element
 	 */
-	protected ConfigurationWizardElement createWizardElement(IConfigurationElement element) {
+	private static ConfigurationWizardElement createWizardElement(IConfigurationElement element) {
 		// WizardElements must have a name attribute
 		String nameString = element.getAttribute(ATT_NAME);
 		if (nameString == null) {
@@ -220,7 +190,7 @@
 	 *	@param config  the registry to get properties from
 	 *	@return whether initialization was successful
 	 */
-	protected boolean initializeWizard(ConfigurationWizardElement element, IConfigurationElement config) {
+	private static boolean initializeWizard(ConfigurationWizardElement element, IConfigurationElement config) {
 		element.setID(config.getAttribute(ATT_ID));
 		String description = ""; //$NON-NLS-1$
 		IConfigurationElement [] children = config.getChildren(TAG_DESCRIPTION);
@@ -242,14 +212,11 @@
 			// Missing attribute
 			return false;
 		}
-		setForcePreviousAndNextButtons(true);
 		return true;	
 	}
-	/*
-	 * Method declared on IConfigurationWizard
-	 */
-	public void init(IWorkbench workbench, IProject project) {
-		this.workbench = workbench;
-		this.project = project;
+
+	public static void openWizard(Shell shell, IWizard wizard) {
+		WizardDialog dialog = new ResizeWizardDialog(shell, wizard);
+		dialog.open();
 	}
 }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureProjectWizardMainPage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureProjectWizardMainPage.java
index 33138b1..d738528 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureProjectWizardMainPage.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ConfigureProjectWizardMainPage.java
@@ -20,17 +20,15 @@
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.*;
-import org.eclipse.jface.wizard.IWizardPage;
-import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.jface.wizard.*;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.*;
+import org.eclipse.team.core.RepositoryProvider;
 import org.eclipse.team.internal.ui.*;
-import org.eclipse.team.ui.IConfigurationWizard;
-import org.eclipse.ui.IWorkbench;
 import org.eclipse.ui.PlatformUI;
 import org.eclipse.ui.activities.ITriggerPoint;
 import org.eclipse.ui.activities.WorkbenchActivityHelper;
@@ -48,11 +46,10 @@
 	private TableViewer viewer;
 	private AdaptableList wizards;
 	private AdaptableList disabledWizards;
-	private IWorkbench workbench;
-	private IProject project;
+	private IProject[] projects;
 	private String description;
 	
-	private IConfigurationWizard selectedWizard;
+	private IWizard selectedWizard;
 	
 	/**
 	 * Create a new ConfigureProjectWizardMainPage
@@ -84,7 +81,7 @@
 		this.description = description;
 	}
 	
-	public IConfigurationWizard getSelectedWizard() {
+	public IWizard getSelectedWizard() {
 		return selectedWizard;
 	}
 	/*
@@ -136,8 +133,7 @@
 				}
 				ConfigurationWizardElement selectedElement = (ConfigurationWizardElement)ss.getFirstElement();
 				try {
-					selectedWizard = (IConfigurationWizard)selectedElement.createExecutableExtension();
-					selectedWizard.init(workbench, project);
+					selectedWizard = (IWizard)selectedElement.createExecutableExtension(getUnsharedProjects());
 				} catch (CoreException e) {					
 					return;
 				}
@@ -187,6 +183,17 @@
 		}
         Dialog.applyDialogFont(parent);
 	}
+	
+	/* package */ IProject[] getUnsharedProjects() {
+		java.util.List unshared = new ArrayList();
+		for (int i = 0; i < projects.length; i++) {
+			IProject project = projects[i];
+			if (!RepositoryProvider.isShared(project)) 
+				unshared.add(project);
+		}
+		return (IProject[]) unshared.toArray(new IProject[unshared.size()]);
+	}
+
 	/**
 	 * The <code>WizardSelectionPage</code> implementation of 
 	 * this <code>IWizardPage</code> method returns the first page 
@@ -205,23 +212,11 @@
 			.getActivitySupport().getTriggerPointManager()
 			.getTriggerPoint(TeamUIPlugin.TRIGGER_POINT_ID);
 	}
-
-	/**
-	 * Set the workbench to the argument
-	 * 
-	 * @param workbench  the workbench to set
-	 */
-	public void setWorkbench(IWorkbench workbench) {
-		this.workbench = workbench;
+	
+	public void setProjects(IProject[] projects) {
+		this.projects = projects;
 	}
-	/**
-	 * Set the project to the argument
-	 * 
-	 * @param project  the project to set
-	 */
-	public void setProject(IProject project) {
-		this.project = project;
-	}
+	
 	public void setVisible(boolean visible) {
 		super.setVisible(visible);
 		if (visible) {
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ProjectSelectionPage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ProjectSelectionPage.java
new file mode 100644
index 0000000..5c6fdd4
--- /dev/null
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/wizards/ProjectSelectionPage.java
@@ -0,0 +1,140 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.internal.ui.wizards;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.osgi.util.NLS;
+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.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.team.core.RepositoryProvider;
+import org.eclipse.team.internal.ui.*;
+import org.eclipse.team.ui.IConfigurationWizard;
+import org.eclipse.team.ui.IConfigurationWizardExtension;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.model.*;
+import org.eclipse.ui.views.navigator.ResourceComparator;
+
+/**
+ * Page that supports the sharing of multiple projects for those repository providers
+ * that have not adapted their {@link IConfigurationWizard} to {@link IConfigurationWizardExtension}.
+ */
+public class ProjectSelectionPage extends WizardPage {
+
+	private final IProject[] projects;
+	private final ConfigurationWizardElement element;
+	private Button shareButton;
+	private TableViewer projectViewer;
+	private AdaptableList projectList;
+
+	protected ProjectSelectionPage(IProject[] projects, ConfigurationWizardElement element) {
+		super("projectSelectionPage", //$NON-NLS-1$
+				NLS.bind(TeamUIMessages.ProjectSelectionPage_1, element.getLabel(null)), 
+				TeamUIPlugin.getImageDescriptor(ITeamUIImages.IMG_WIZBAN_SHARE));
+		setDescription(NLS.bind(TeamUIMessages.ProjectSelectionPage_0, element.getLabel(null)));
+		this.projects = projects;
+		this.element = element;
+	}
+
+	public void createControl(Composite parent) {
+		Composite composite = SWTUtils.createHVFillComposite(parent, SWTUtils.MARGINS_DIALOG, 2);
+		createProjectList(composite);
+		createShareButton(composite);
+		updateEnablements();
+		setControl(composite);
+	}
+
+	private void createProjectList(Composite composite) {
+		projectViewer = new TableViewer(composite, SWT.SINGLE | SWT.BORDER);
+		projectViewer.getControl().setLayoutData(SWTUtils.createHVFillGridData());
+		projectList = new AdaptableList(projects);
+		projectViewer.setContentProvider(new WorkbenchContentProvider());
+		projectViewer.setLabelProvider(new WorkbenchLabelProvider());
+		projectViewer.setComparator(new ResourceComparator(ResourceComparator.NAME));
+		projectViewer.setInput(projectList);
+		projectViewer.getTable().select(0);
+		projectViewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				updateEnablements();
+			}
+		});
+	}
+
+	private void createShareButton(Composite composite) {
+		shareButton = new Button(composite, SWT.PUSH);
+		GridData gridData = new GridData();
+		gridData.horizontalAlignment = SWT.END;
+		gridData.verticalAlignment = SWT.TOP;
+		shareButton.setLayoutData(gridData);
+		shareButton.setText(TeamUIMessages.ProjectSelectionPage_2);
+		shareButton.addSelectionListener(new SelectionListener() {
+			public void widgetSelected(SelectionEvent e) {
+				shareSelectedProject();
+			}
+			public void widgetDefaultSelected(SelectionEvent e) {
+				// Ignore
+			}
+		});
+	}
+
+	/* package */ void shareSelectedProject() {
+		IProject project = getSelectedProject();
+		if (project != null) {
+			try {
+				IConfigurationWizard wizard = (IConfigurationWizard)element.createExecutableExtension();
+				wizard.init(PlatformUI.getWorkbench(), project);
+				ConfigureProjectWizard.openWizard(getShell(), wizard);
+				updateProjectList(project);
+				if (projectList.size() == 0) {
+					// TODO: Can we close the outer wizard from here?
+				}
+			} catch (CoreException e) {
+				ErrorDialog.openError(getShell(), null, null, e.getStatus());
+			}
+		}
+	}
+	
+	private void updateProjectList(IProject project) {
+		if (RepositoryProvider.isShared(project)) {
+			projectList.remove(project);
+			projectViewer.refresh();
+			if (hasUnsharedProjects()) {
+				projectViewer.getTable().select(0);
+			}
+			updateEnablements();
+		}
+	}
+
+	/* package */ void updateEnablements() {
+		shareButton.setEnabled(getSelectedProject() != null);
+	}
+
+	private IProject getSelectedProject() {
+		ISelection selection = projectViewer.getSelection();
+		if (selection instanceof IStructuredSelection) {
+			IStructuredSelection ss = (IStructuredSelection) selection;
+			return (IProject)ss.getFirstElement();
+		}
+		return null;
+	}
+
+	public boolean hasUnsharedProjects() {
+		return projectList.size() > 0;
+	}
+
+}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/IConfigurationWizard.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/IConfigurationWizard.java
index 0f164ca..eafbf8a 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/IConfigurationWizard.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/IConfigurationWizard.java
@@ -24,7 +24,7 @@
 public interface IConfigurationWizard extends IWizard {
 	/**
 	 * Initializes this creation wizard using the passed workbench and
-	 * object selection.
+	 * the selected project.
 	 * <p>
 	 * This method is called after the no argument constructor and
 	 * before other methods are called.
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/IConfigurationWizardExtension.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/IConfigurationWizardExtension.java
new file mode 100644
index 0000000..657f142
--- /dev/null
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/IConfigurationWizardExtension.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (c) 2007 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
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.ui;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IAdapterManager;
+import org.eclipse.ui.IWorkbench;
+
+/**
+ * Extends {@link IConfigurationWizard} to support the sharing of multiple projects.
+ * The Share Project wizard uses the "adaptable" mechanism (see {@link IAdapterManager} to obtain an 
+ * <code>IConfigurationWizardExtension</code> for an <code>IConfigurationWizard</code>
+ * class so clients may choose to have their <code>IConfigurationWizard</code> class implement this
+ * interface as well or may choose to use the adaptable mechanism to provide the extension.
+ * <p>
+ * Clients may implement this interface.
+ * 
+ * @see IConfigurationWizard
+ * @since 3.4
+ */
+public interface IConfigurationWizardExtension {
+
+	/**
+	 * Initializes this creation wizard using the passed workbench and
+	 * selected projects.
+	 * <p>
+	 * This method is called after the no argument constructor and
+	 * before other methods are called.
+	 * </p>
+	 *
+	 * @param workbench the current workbench 
+	 * 		TODO This parameter is useless. Should we pass the active page or part?
+	 * @param projects the selected projects
+	 */
+	void init(IWorkbench workbench, IProject[] projects);
+}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/history/RevisionAnnotationController.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/history/RevisionAnnotationController.java
index fb4d033..5d7a12a 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/history/RevisionAnnotationController.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/history/RevisionAnnotationController.java
@@ -28,7 +28,6 @@
 import org.eclipse.ui.*;
 import org.eclipse.ui.editors.text.EditorsUI;
 import org.eclipse.ui.ide.IDE;
-import org.eclipse.ui.internal.registry.EditorDescriptor;
 import org.eclipse.ui.part.FileEditorInput;
 import org.eclipse.ui.part.MultiPageEditorPart;
 import org.eclipse.ui.texteditor.AbstractDecoratedTextEditor;
@@ -179,7 +178,7 @@
 			id = EditorsUI.DEFAULT_TEXT_EDITOR_ID; 
 		} else {
 			try {
-				if (isTextEditor(descriptor)) {
+				if (Utils.isTextEditor(descriptor)) {
 					id = descriptor.getId();
 				} else {
 					id = EditorsUI.DEFAULT_TEXT_EDITOR_ID;
@@ -191,14 +190,7 @@
         return id;
     }
 
-	private static boolean isTextEditor(IEditorDescriptor descriptor)
-			throws CoreException {
-		if (descriptor instanceof EditorDescriptor) {
-			EditorDescriptor desc = (EditorDescriptor) descriptor;
-			return desc.createEditor() instanceof AbstractDecoratedTextEditor;
-		}
-		return false;
-	}
+
 	
 	private static AbstractDecoratedTextEditor findOpenTextEditorForFile(IWorkbenchPage page, IFile file) {
 		if (file == null)
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/AbstractSynchronizeLabelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/AbstractSynchronizeLabelProvider.java
index 6449b25..a8b7bde 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/AbstractSynchronizeLabelProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/AbstractSynchronizeLabelProvider.java
@@ -379,7 +379,7 @@
 	private ImageManager getImageManager() {
 		ISynchronizationContext context = getContext();
 		if (context != null) {
-			return ImageManager.getImageManager(context);
+			return ImageManager.getImageManager(context, getConfiguration());
 		}
 		if (localImageManager == null) {
 			localImageManager = new ImageManager();
@@ -387,6 +387,14 @@
 		return localImageManager;
 	}
 
+	private ISynchronizePageConfiguration getConfiguration() {
+		if (this instanceof SynchronizationLabelProvider) {
+			SynchronizationLabelProvider slp = (SynchronizationLabelProvider) this;
+			return (ISynchronizePageConfiguration)slp.getExtensionSite().getExtensionStateModel().getProperty(ITeamContentProviderManager.P_SYNCHRONIZATION_PAGE_CONFIGURATION);
+		}
+		return null;
+	}
+
 	private ISynchronizationContext getContext() {
 		if (this instanceof SynchronizationLabelProvider) {
 			SynchronizationLabelProvider slp = (SynchronizationLabelProvider) this;
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ModelParticipantAction.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ModelParticipantAction.java
index 7d1535f..cf410b9 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ModelParticipantAction.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/ModelParticipantAction.java
@@ -22,8 +22,7 @@
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.widgets.Shell;
-import org.eclipse.team.core.diff.IDiff;
-import org.eclipse.team.core.diff.IThreeWayDiff;
+import org.eclipse.team.core.diff.*;
 import org.eclipse.team.core.mapping.ISynchronizationContext;
 import org.eclipse.team.internal.ui.TeamUIMessages;
 import org.eclipse.team.ui.mapping.*;
@@ -135,6 +134,9 @@
 			case ISynchronizePageConfiguration.BOTH_MODE:
 				return true;
 			}
+		} else if (configuration.getComparisonType() == ISynchronizePageConfiguration.TWO_WAY
+				&& node instanceof ITwoWayDiff) {
+			return true;
 		}
 		return false;
 	}