Refactored model ui parts
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberOperation.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberOperation.java
index fa2aee5..dd5ab72 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberOperation.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSubscriberOperation.java
@@ -28,10 +28,10 @@
 import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
 import org.eclipse.team.internal.ccvs.ui.Policy;
 import org.eclipse.team.internal.ui.TeamUIPlugin;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberOperation;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelOperation;
 import org.eclipse.ui.IWorkbenchPart;
 
-public abstract class CVSSubscriberOperation extends SubscriberOperation {
+public abstract class CVSSubscriberOperation extends SynchronizeModelOperation {
 	
 	protected CVSSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
 		super(part, elements);
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSynchronizeViewPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSynchronizeViewPage.java
deleted file mode 100644
index 39d87d1..0000000
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSynchronizeViewPage.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.team.internal.ccvs.ui.subscriber;
-
-import java.util.*;
-
-import org.eclipse.compare.structuremergeviewer.DiffNode;
-import org.eclipse.jface.action.*;
-import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.*;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.team.core.synchronize.SyncInfoTree;
-import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
-import org.eclipse.team.ui.synchronize.ISynchronizeView;
-import org.eclipse.team.ui.synchronize.subscriber.*;
-import org.eclipse.team.ui.synchronize.viewers.ISynchronizeModelChangeListener;
-import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement;
-import org.eclipse.ui.*;
-import org.eclipse.team.internal.ccvs.ui.Policy;
-
-public class CVSSynchronizeViewPage extends SubscriberParticipantPage implements ISynchronizeModelChangeListener {
-	
-	private List delegates = new ArrayList(2);
-	private CVSSynchronizeViewerAdvisor config;
-	private Action groupByComment;
-
-	protected class CVSActionDelegate extends Action {
-		private IActionDelegate delegate;
-
-		public CVSActionDelegate(IActionDelegate delegate) {
-			this.delegate = delegate;
-			// Associate delegate with the synchronize view, this will allow
-			if(delegate instanceof IViewActionDelegate) {
-				((IViewActionDelegate)delegate).init(getSynchronizeView());
-			}
-			addDelegate(this);
-		}
-
-		public void run() {
-			StructuredViewer viewer = (StructuredViewer)getViewer();
-			if (viewer != null) {
-				ISelection selection = new StructuredSelection(viewer.getInput());		
-				if (!selection.isEmpty()) {
-					delegate.selectionChanged(this, selection);
-					delegate.run(this);
-				}
-			}
-		}
-
-		public IActionDelegate getDelegate() {
-			return delegate;
-		}
-	}
-
-	public CVSSynchronizeViewPage(SubscriberParticipant participant, ISynchronizeView view) {
-		super(participant, view);
-		groupByComment = new Action(Policy.bind("CVSSynchronizeViewPage.0"), Action.AS_CHECK_BOX) { //$NON-NLS-1$
-			public void run() {
-				config.setGroupIncomingByComment(!config.isGroupIncomingByComment());
-				setChecked(config.isGroupIncomingByComment());
-			}
-		};
-	}	
-	
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @see org.eclipse.team.ui.sync.AbstractSynchronizeParticipant#dispose()
-	 */
-	public void dispose() {
-		super.dispose();
-		getViewerAdviser().removeInputChangedListener(this);
-		CVSUIPlugin.removePropertyChangeListener(this);
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.team.ui.synchronize.SubscriberParticipantPage#setActionBars(org.eclipse.ui.IActionBars)
-	 */
-	public void setActionBars(IActionBars actionBars) {
-		super.setActionBars(actionBars);
-		IMenuManager mgr = actionBars.getMenuManager();
-		mgr.add(new Separator());
-		//mgr.add(groupByComment);
-	}
-
-	/*
-	 * Update the enablement of any action delegates 
-	 */
-	private void updateActionEnablement(DiffNode input) {
-		ISelection selection = new StructuredSelection(input);
-		for (Iterator it = delegates.iterator(); it.hasNext(); ) {
-			CVSActionDelegate delegate = (CVSActionDelegate) it.next();
-			delegate.getDelegate().selectionChanged(delegate, selection);
-		}
-	}
-
-	private void addDelegate(CVSActionDelegate delagate) {
-		delegates.add(delagate);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.jface.util.IPropertyChangeListener#propertyChange(org.eclipse.jface.util.PropertyChangeEvent)
-	 */
-	public void propertyChange(PropertyChangeEvent event) {		
-		super.propertyChange(event);
-		String prop = event.getProperty();
-		if(prop.equals(CVSUIPlugin.P_DECORATORS_CHANGED) && getViewer() != null && getSyncInfoSet() != null) {
-			((StructuredViewer)getViewer()).refresh(true /* update labels */);
-		}
-	}
-	
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IPage#createControl(org.eclipse.swt.widgets.Composite)
-	 */
-	public void createControl(Composite parent) {
-		super.createControl(parent);
-		
-		// Sync changes are used to update the action state for the update/commit buttons.
-		getViewerAdviser().addInputChangedListener(this);
-		
-		// Listen for decorator changed to refresh the viewer's labels.
-		CVSUIPlugin.addPropertyChangeListener(this);
-		
-		updateActionEnablement((DiffNode)getViewer().getInput());
-	}
-	
-	private SyncInfoTree getSyncInfoSet() {
-		return getParticipant().getSubscriberSyncInfoCollector().getSyncInfoTree();
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.team.ui.synchronize.SubscriberParticipantPage#createSyncInfoSetCompareConfiguration()
-	 */
-	protected SynchronizeViewerAdvisor createSynchronizeViewerAdvisor() {
-		if(config == null) {
-			config = new CVSSynchronizeViewerAdvisor(getSynchronizeView(), getParticipant());
-		}
-		return config;
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.team.ui.synchronize.presentation.ISynchronizeModelChangeListener#inputChanged(org.eclipse.team.ui.synchronize.presentation.SynchronizeModelProvider)
-	 */
-	public void modelChanged(SynchronizeModelElement root) {
-		updateActionEnablement(root);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSynchronizeViewerAdvisor.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSynchronizeViewerAdvisor.java
index 9fb8a13..5cf7eb5 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSynchronizeViewerAdvisor.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CVSSynchronizeViewerAdvisor.java
@@ -10,28 +10,36 @@
  *******************************************************************************/
 package org.eclipse.team.internal.ccvs.ui.subscriber;
 
+import java.util.ArrayList;
+import java.util.List;
+
 import org.eclipse.core.resources.IResource;
+import org.eclipse.jface.action.Action;
 import org.eclipse.jface.util.PropertyChangeEvent;
-import org.eclipse.jface.viewers.ILabelDecorator;
-import org.eclipse.jface.viewers.ILabelProvider;
-import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.*;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.team.internal.ccvs.ui.CVSLightweightDecorator;
+import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
+import org.eclipse.team.internal.ui.synchronize.ActionDelegateManager;
 import org.eclipse.team.ui.synchronize.ISynchronizeView;
 import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant;
 import org.eclipse.team.ui.synchronize.subscriber.SynchronizeViewerAdvisor;
-import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement;
-import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElementLabelProvider;
+import org.eclipse.team.ui.synchronize.viewers.*;
 
-public class CVSSynchronizeViewerAdvisor extends SynchronizeViewerAdvisor {
+public class CVSSynchronizeViewerAdvisor extends SynchronizeViewerAdvisor implements ISynchronizeModelChangeListener {
 
 	private boolean isGroupIncomingByComment = false;
+	
+	private List delegates = new ArrayList(2);
+	private CVSSynchronizeViewerAdvisor config;
+	private Action groupByComment;
+	private ActionDelegateManager delegateManager;
 
 	private static class CVSLabelDecorator extends LabelProvider implements ILabelDecorator  {
 		public String decorateText(String input, Object element) {
 			String text = input;
-			if (element instanceof SynchronizeModelElement) {
-				IResource resource =  ((SynchronizeModelElement)element).getResource();
+			if (element instanceof ISynchronizeModelElement) {
+				IResource resource =  ((ISynchronizeModelElement)element).getResource();
 				if(resource != null && resource.getType() != IResource.ROOT) {
 					CVSLightweightDecorator.Decoration decoration = new CVSLightweightDecorator.Decoration();
 					CVSLightweightDecorator.decorateTextLabel(resource, decoration, false, true);
@@ -56,13 +64,21 @@
 	public CVSSynchronizeViewerAdvisor(ISynchronizeView view, SubscriberParticipant participant) {
 		super(view, participant);
 		participant.addPropertyChangeListener(this);
+		
+		// Sync changes are used to update the action state for the update/commit buttons.
+		addInputChangedListener(this);
+		
+		// Listen for decorator changed to refresh the viewer's labels.
+		CVSUIPlugin.addPropertyChangeListener(this);
+		this.delegateManager = new ActionDelegateManager();
 	}
 	
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.TreeViewerAdvisor#getLabelProvider()
 	 */
 	protected ILabelProvider getLabelProvider() {
-		return new SynchronizeModelElementLabelProvider.DecoratingColorLabelProvider(new SynchronizeModelElementLabelProvider(), new CVSLabelDecorator());
+		ILabelProvider oldProvider = super.getLabelProvider();
+		return new DecoratingColorLabelProvider(oldProvider, new CVSLabelDecorator());
 	}
 	
 	public boolean isGroupIncomingByComment() {
@@ -91,6 +107,31 @@
 				});				
 			}
 		}
+		if(property.equals(CVSUIPlugin.P_DECORATORS_CHANGED) && getViewer() != null && getSyncInfoSet() != null) {
+			((StructuredViewer)getViewer()).refresh(true /* update labels */);
+		}
 		super.propertyChange(event);
+	}	
+	
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see org.eclipse.team.ui.sync.AbstractSynchronizeParticipant#dispose()
+	 */
+	public void dispose() {
+		super.dispose();
+		removeInputChangedListener(this);
+		CVSUIPlugin.removePropertyChangeListener(this);
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.ui.synchronize.presentation.ISynchronizeModelChangeListener#inputChanged(org.eclipse.team.ui.synchronize.presentation.SynchronizeModelProvider)
+	 */
+	public void modelChanged(ISynchronizeModelElement root) {
+		delegateManager.updateActionEnablement(root);
+	}
+	
+	protected ActionDelegateManager getDelegateManager() {
+		return delegateManager;
 	}
 }
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogDiffNode.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogDiffNode.java
index 62d5102..cdbda2b 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogDiffNode.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogDiffNode.java
@@ -12,19 +12,19 @@
 
 import java.text.DateFormat;
 
-import org.eclipse.compare.structuremergeviewer.DiffNode;
 import org.eclipse.core.resources.IResource;
 import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.team.internal.ccvs.core.ILogEntry;
 import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
 import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants;
-import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement;
+import org.eclipse.team.internal.ui.synchronize.SynchronizeModelElement;
+import org.eclipse.team.ui.synchronize.viewers.ISynchronizeModelElement;
 
 public class ChangeLogDiffNode extends SynchronizeModelElement {
 
 	private ILogEntry logEntry;
 
-	public ChangeLogDiffNode(DiffNode parent, ILogEntry logEntry) {
+	public ChangeLogDiffNode(ISynchronizeModelElement parent, ILogEntry logEntry) {
 		super(parent);
 		this.logEntry = logEntry;
 	}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelProvider.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelProvider.java
index 3ff4dd5..cded145 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelProvider.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelProvider.java
@@ -25,7 +25,7 @@
 import org.eclipse.team.internal.ccvs.core.syncinfo.ResourceSyncInfo;
 import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
 import org.eclipse.team.internal.ui.synchronize.*;
-import org.eclipse.team.ui.synchronize.viewers.*;
+import org.eclipse.team.ui.synchronize.viewers.ISynchronizeModelElement;
 import org.eclipse.ui.progress.UIJob;
 
 /**
@@ -103,7 +103,7 @@
 		}
 		public IStatus run(IProgressMonitor monitor) {
 			if (set != null && !shutdown) {
-				final SynchronizeModelElement[] nodes = calculateRoots(getSyncInfoSet(), monitor);				
+				final ISynchronizeModelElement[] nodes = calculateRoots(getSyncInfoSet(), monitor);				
 				UIJob updateUI = new UIJob("updating change log viewers") {
 					public IStatus runInUIThread(IProgressMonitor monitor) {
 						StructuredViewer tree = getViewer();	
@@ -126,7 +126,7 @@
 	 * (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.viewers.HierarchicalModelProvider#buildModelObjects(org.eclipse.compare.structuremergeviewer.DiffNode)
 	 */
-	protected IDiffElement[] buildModelObjects(SynchronizeModelElement node) {
+	protected IDiffElement[] buildModelObjects(ISynchronizeModelElement node) {
 		if(node == getModelRoot()) {
 			if(fetchLogEntriesJob == null) {
 				fetchLogEntriesJob = new FetchLogEntriesJob();
@@ -144,7 +144,7 @@
 		return new IDiffElement[0];
 	}
 
-	private SynchronizeModelElement[] calculateRoots(SyncInfoSet set, IProgressMonitor monitor) {
+	private ISynchronizeModelElement[] calculateRoots(SyncInfoSet set, IProgressMonitor monitor) {
 		commentRoots.clear();
 		SyncInfo[] infos = set.getSyncInfos();
 		monitor.beginTask("fetching from server", set.size() * 100);
@@ -160,7 +160,7 @@
 					changeRoot = new ChangeLogDiffNode(getModelRoot(), logEntry);
 					commentRoots.put(dateComment, changeRoot);
 				}
-				SynchronizeModelElement element = new FullPathSyncInfoElement(changeRoot, infos[i]);
+				ISynchronizeModelElement element = new FullPathSyncInfoElement(changeRoot, infos[i]);
 				associateDiffNode(element);
 			}
 			monitor.worked(100);
@@ -233,7 +233,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.viewers.SynchronizeModelProvider#doAdd(org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement, org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement)
 	 */
-	protected void doAdd(SynchronizeModelElement parent, SynchronizeModelElement element) {
+	protected void doAdd(ISynchronizeModelElement parent, ISynchronizeModelElement element) {
 		AbstractTreeViewer viewer = (AbstractTreeViewer)getViewer();
 		viewer.add(parent, element);		
 	}
@@ -241,7 +241,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.viewers.SynchronizeModelProvider#doRemove(org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement)
 	 */
-	protected void doRemove(SynchronizeModelElement element) {
+	protected void doRemove(ISynchronizeModelElement element) {
 		AbstractTreeViewer viewer = (AbstractTreeViewer)getViewer();
 		viewer.remove(element);		
 	}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipant.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipant.java
index 3462ab8..56b67b6 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipant.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipant.java
@@ -21,7 +21,7 @@
 import org.eclipse.team.ui.synchronize.ISynchronizeParticipantDescriptor;
 import org.eclipse.team.ui.synchronize.ISynchronizeView;
 import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipantPage;
+import org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor;
 
 public class CompareParticipant extends SubscriberParticipant {
 	
@@ -60,13 +60,6 @@
 	}
 
 	/* (non-Javadoc)
-	 * @see org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant#doCreatePage(org.eclipse.team.ui.synchronize.ISynchronizeView)
-	 */
-	protected SubscriberParticipantPage doCreatePage(ISynchronizeView view) {
-		return new CompareParticipantPage(this, view);
-	}
-
-	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant#updateMode(int)
 	 */
 	protected void updateMode(int mode) {
@@ -80,4 +73,12 @@
 		super.preCollectingChanges();
 		getSubscriberSyncInfoCollector().setFilter(contentComparison);
 	}
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant#createSynchronizeViewerAdvisor(org.eclipse.team.ui.synchronize.ISynchronizeView)
+	 */
+	protected StructuredViewerAdvisor createSynchronizeViewerAdvisor(ISynchronizeView view) {
+		return new CVSSynchronizeViewerAdvisor(view, this);
+	}
 }
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipantPage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipantPage.java
deleted file mode 100644
index 0ffff4c6..0000000
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareParticipantPage.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.team.internal.ccvs.ui.subscriber;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.jface.action.*;
-import org.eclipse.team.core.TeamException;
-import org.eclipse.team.internal.ui.Utils;
-import org.eclipse.team.internal.ui.synchronize.SynchronizeModelProvider;
-import org.eclipse.team.internal.ui.synchronize.actions.RemoveSynchronizeParticipantAction;
-import org.eclipse.team.ui.synchronize.ISynchronizeView;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant;
-import org.eclipse.team.ui.synchronize.subscriber.SynchronizeViewerAdvisor;
-import org.eclipse.ui.IActionBars;
-
-public class CompareParticipantPage extends CVSSynchronizeViewPage {
-
-	private RemoveSynchronizeParticipantAction removeAction;
-	private Action groupByCommentAction;
-	private boolean groupByComment = false;
-
-	private class CompareAdvisor extends CVSSynchronizeViewerAdvisor {
-		public CompareAdvisor(ISynchronizeView view, SubscriberParticipant participant) {
-			super(view, participant);
-		}
-
-		protected SynchronizeModelProvider getModelProvider() {
-			if (groupByComment) {
-				return new ChangeLogModelProvider(getSyncInfoSet());
-			}
-			return super.getModelProvider();
-		}
-
-		public void refreshModel() {
-			setInput(getViewer());
-		}
-	}
-	
-	public CompareParticipantPage(SubscriberParticipant participant, ISynchronizeView view) {
-		super(participant, view);
-		removeAction = new RemoveSynchronizeParticipantAction(getParticipant());
-		groupByCommentAction = new Action("Group by comments", Action.AS_CHECK_BOX) { //$NON-NLS-1$
-			public void run() {
-				groupByComment = ! groupByComment;
-				setChecked(groupByComment);
-				CompareAdvisor advisor = ((CompareAdvisor)CompareParticipantPage.this.getViewerAdviser());
-				try {
-					advisor.prepareInput(new NullProgressMonitor());
-				} catch (TeamException e) {
-					Utils.handle(e);
-				}
-				advisor.refreshModel();
-			}
-		};
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars)
-	 */
-	public void setActionBars(IActionBars actionBars) {
-		super.setActionBars(actionBars);
-		if (actionBars != null) {
-			IToolBarManager toolbar = actionBars.getToolBarManager();
-			toolbar.add(new Separator());
-			toolbar.add(removeAction);
-			IMenuManager mgr = actionBars.getMenuManager();
-			//mgr.add(new Separator());
-			//mgr.add(groupByCommentAction);
-		}
-	}
-		
-	/* (non-Javadoc)
-	 * @see org.eclipse.team.internal.ccvs.ui.subscriber.CVSSynchronizeViewPage#createSynchronizeViewerAdvisor()
-	 */
-	protected SynchronizeViewerAdvisor createSynchronizeViewerAdvisor() {
-		return new CompareAdvisor(getSynchronizeView(), getParticipant());
-	}
-}
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareRevertAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareRevertAction.java
index 3b14a70..7f346ca 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareRevertAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CompareRevertAction.java
@@ -11,19 +11,19 @@
 package org.eclipse.team.internal.ccvs.ui.subscriber;
 
 import org.eclipse.compare.structuremergeviewer.IDiffElement;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberAction;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberOperation;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelAction;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelOperation;
 import org.eclipse.ui.IWorkbenchPart;
 
 /**
  * Action in compare editor that reverts the local contents to match the contents on the server.
  */
-public class CompareRevertAction extends SubscriberAction {
+public class CompareRevertAction extends SynchronizeModelAction {
 	
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.internal.ui.actions.SubscriberAction#getSubscriberOperation(org.eclipse.compare.structuremergeviewer.IDiffElement[])
 	 */
-	protected SubscriberOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
+	protected SynchronizeModelOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
 		return new CompareRevertOperation(part, elements);
 	}
 
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizePage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeAdvisor.java
similarity index 61%
rename from bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizePage.java
rename to bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeAdvisor.java
index 575ac00..eedcdb1 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizePage.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeAdvisor.java
@@ -10,9 +10,13 @@
  *******************************************************************************/
 package org.eclipse.team.internal.ccvs.ui.subscriber;
 
-import org.eclipse.jface.action.*;
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.team.internal.ccvs.ui.Policy;
 import org.eclipse.team.internal.ui.Utils;
+import org.eclipse.team.internal.ui.synchronize.ActionDelegateManager;
+import org.eclipse.team.internal.ui.synchronize.ActionDelegateManager.WrappedActionDelegate;
 import org.eclipse.team.internal.ui.synchronize.actions.RemoveSynchronizeParticipantAction;
 import org.eclipse.team.ui.synchronize.ISynchronizeView;
 import org.eclipse.team.ui.synchronize.subscriber.DirectionFilterActionGroup;
@@ -20,19 +24,28 @@
 import org.eclipse.ui.IActionBars;
 
 
-public class MergeSynchronizePage extends CVSSynchronizeViewPage {
+public class MergeSynchronizeAdvisor extends CVSSynchronizeViewerAdvisor {
 
 	private RemoveSynchronizeParticipantAction removeAction;
 	private DirectionFilterActionGroup modes;
-	private Action updateAdapter;
+	private WrappedActionDelegate updateAdapter;
 	
-	public MergeSynchronizePage(SubscriberParticipant participant, ISynchronizeView view) {
-		super(participant, view);		
+	public MergeSynchronizeAdvisor(ISynchronizeView view, SubscriberParticipant participant) {
+		super(view, participant);		
+	}
+		
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.ui.synchronize.subscriber.SynchronizeViewerAdvisor#initializeActions(org.eclipse.jface.viewers.StructuredViewer)
+	 */
+	protected void initializeActions(StructuredViewer treeViewer) {
+		super.initializeActions(treeViewer);
+		
 		removeAction = new RemoveSynchronizeParticipantAction(getParticipant());
 		modes = new DirectionFilterActionGroup(getParticipant(), SubscriberParticipant.INCOMING_MODE | SubscriberParticipant.CONFLICTING_MODE);
 		MergeUpdateAction action = new MergeUpdateAction();
 		action.setPromptBeforeUpdate(true);
-		updateAdapter = new CVSActionDelegate(action);
+		updateAdapter = new ActionDelegateManager.WrappedActionDelegate(action, getSynchronizeView(), treeViewer);
+		getDelegateManager().addDelegate(updateAdapter);
 		
 		Utils.initAction(updateAdapter, "action.SynchronizeViewUpdate.", Policy.getBundle()); //$NON-NLS-1$
 		getParticipant().setMode(SubscriberParticipant.INCOMING_MODE);
@@ -45,11 +58,13 @@
 		super.setActionBars(actionBars);
 		if(actionBars != null) {
 			IToolBarManager toolbar = actionBars.getToolBarManager();
-			toolbar.add(new Separator());
-			modes.fillToolBar(toolbar);
-			toolbar.add(new Separator());
-			toolbar.add(updateAdapter);
-			toolbar.add(removeAction);
+			if(toolbar != null) {
+				toolbar.add(new Separator());
+				modes.fillToolBar(toolbar);
+				toolbar.add(new Separator());
+				toolbar.add(updateAdapter);
+				toolbar.add(removeAction);
+			}
 		}		
 	}	
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java
index 26d207f..1b26e51 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeSynchronizeParticipant.java
@@ -24,7 +24,7 @@
 import org.eclipse.team.ui.synchronize.ISynchronizeParticipantDescriptor;
 import org.eclipse.team.ui.synchronize.ISynchronizeView;
 import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipantPage;
+import org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor;
 import org.eclipse.ui.IMemento;
 import org.eclipse.ui.PartInitException;
 
@@ -48,6 +48,14 @@
 		setSubscriber(subscriber);
 	}
 	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant#createSynchronizeViewerAdvisor(org.eclipse.team.ui.synchronize.ISynchronizeView)
+	 */
+	protected StructuredViewerAdvisor createSynchronizeViewerAdvisor(ISynchronizeView view) {
+		return new MergeSynchronizeAdvisor(view, this);
+	}
+	
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.sync.SubscriberParticipant#setSubscriber(org.eclipse.team.core.subscribers.TeamSubscriber)
 	 */
@@ -102,13 +110,6 @@
 	}
 	
 	/* (non-Javadoc)
-	 * @see org.eclipse.team.ui.synchronize.ISynchronizeParticipant#createPage(org.eclipse.team.ui.synchronize.ISynchronizeView)
-	 */
-	protected SubscriberParticipantPage doCreatePage(ISynchronizeView view) {
-		return new MergeSynchronizePage(this, view);
-	}
-	
-	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.ISynchronizeParticipant#getName()
 	 */
 	public String getName() {		
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeUpdateAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeUpdateAction.java
index 8ef72a6..5df2ec7 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeUpdateAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/MergeUpdateAction.java
@@ -15,12 +15,12 @@
 import org.eclipse.team.core.synchronize.SyncInfo;
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter.OrSyncInfoFilter;
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter.SyncInfoDirectionFilter;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberAction;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberOperation;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelAction;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelOperation;
 import org.eclipse.ui.IWorkbenchPart;
 
 
-public class MergeUpdateAction extends SubscriberAction {
+public class MergeUpdateAction extends SynchronizeModelAction {
 	
 	private boolean promptBeforeUpdate;
 
@@ -38,7 +38,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.internal.ui.actions.SubscriberAction#getSubscriberOperation(org.eclipse.compare.structuremergeviewer.IDiffElement[])
 	 */
-	protected SubscriberOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
+	protected SynchronizeModelOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
 		return new MergeUpdateOperation(part, elements, promptBeforeUpdate);
 	}
 
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndCommitAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndCommitAction.java
index 58af994..38cdb2f 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndCommitAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndCommitAction.java
@@ -13,11 +13,11 @@
 import org.eclipse.compare.structuremergeviewer.IDiffElement;
 import org.eclipse.team.core.synchronize.*;
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter.SyncInfoDirectionFilter;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberAction;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberOperation;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelAction;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelOperation;
 import org.eclipse.ui.IWorkbenchPart;
 
-public class OverrideAndCommitAction extends SubscriberAction {
+public class OverrideAndCommitAction extends SynchronizeModelAction {
 	
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.internal.ui.actions.SubscriberAction#getSyncInfoFilter()
@@ -29,7 +29,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.internal.ui.actions.SubscriberAction#getSubscriberOperation(org.eclipse.compare.structuremergeviewer.IDiffElement[])
 	 */
-	protected SubscriberOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
+	protected SynchronizeModelOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
 		return new SubscriberCommitOperation(part, elements, true /* override */);
 	}
 	
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndUpdateAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndUpdateAction.java
index a95cb47..ebddd07 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndUpdateAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/OverrideAndUpdateAction.java
@@ -14,8 +14,8 @@
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter;
 import org.eclipse.team.core.synchronize.SyncInfo;
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter.SyncInfoDirectionFilter;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberAction;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberOperation;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelAction;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelOperation;
 import org.eclipse.ui.IWorkbenchPart;
 
 /**
@@ -23,7 +23,7 @@
  * changes to files that have non-mergeable conflicts. All the prompting logic
  * is in the super class.
  */
-public class OverrideAndUpdateAction extends SubscriberAction {
+public class OverrideAndUpdateAction extends SynchronizeModelAction {
 	
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.sync.SubscriberAction#getSyncInfoFilter()
@@ -32,7 +32,7 @@
 		return new SyncInfoDirectionFilter(new int[] {SyncInfo.CONFLICTING, SyncInfo.OUTGOING});
 	}
 	
-	protected SubscriberOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
+	protected SynchronizeModelOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
 		return new OverrideAndUpdateSubscriberOperation(part, elements);
 	}
 }
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberCommitAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberCommitAction.java
index e2e04ba..b57c9a7 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberCommitAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberCommitAction.java
@@ -14,11 +14,11 @@
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter;
 import org.eclipse.team.core.synchronize.SyncInfo;
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter.SyncInfoDirectionFilter;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberAction;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberOperation;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelAction;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelOperation;
 import org.eclipse.ui.IWorkbenchPart;
 
-public class SubscriberCommitAction extends SubscriberAction {
+public class SubscriberCommitAction extends SynchronizeModelAction {
 
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.sync.SubscriberAction#getSyncInfoFilter()
@@ -30,7 +30,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.internal.ui.actions.SubscriberAction#getSubscriberOperation(org.eclipse.compare.structuremergeviewer.IDiffElement[])
 	 */
-	protected SubscriberOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
+	protected SynchronizeModelOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
 		return new SubscriberCommitOperation(part, elements, false /* override */);
 	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberConfirmMergedAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberConfirmMergedAction.java
index ca1db73..88f0a36 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberConfirmMergedAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/SubscriberConfirmMergedAction.java
@@ -14,11 +14,11 @@
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter;
 import org.eclipse.team.core.synchronize.SyncInfo;
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter.SyncInfoDirectionFilter;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberAction;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberOperation;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelAction;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelOperation;
 import org.eclipse.ui.IWorkbenchPart;
 
-public class SubscriberConfirmMergedAction extends SubscriberAction {
+public class SubscriberConfirmMergedAction extends SynchronizeModelAction {
 	
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.sync.SubscriberAction#getSyncInfoFilter()
@@ -30,7 +30,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.internal.ui.actions.SubscriberAction#getSubscriberOperation(org.eclipse.compare.structuremergeviewer.IDiffElement[])
 	 */
-	protected SubscriberOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
+	protected SynchronizeModelOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
 		return new SubscriberConfirmMergedOperation(part, elements);
 	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeAdvisor.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeAdvisor.java
new file mode 100644
index 0000000..e212be3
--- /dev/null
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeAdvisor.java
@@ -0,0 +1,66 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.internal.ccvs.ui.subscriber;
+
+import org.eclipse.jface.action.IToolBarManager;
+import org.eclipse.jface.action.Separator;
+import org.eclipse.jface.viewers.StructuredViewer;
+import org.eclipse.team.internal.ccvs.ui.Policy;
+import org.eclipse.team.internal.ui.Utils;
+import org.eclipse.team.internal.ui.synchronize.ActionDelegateManager;
+import org.eclipse.team.internal.ui.synchronize.ActionDelegateManager.WrappedActionDelegate;
+import org.eclipse.team.ui.synchronize.ISynchronizeView;
+import org.eclipse.team.ui.synchronize.subscriber.DirectionFilterActionGroup;
+import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant;
+import org.eclipse.ui.IActionBars;
+
+public class WorkspaceSynchronizeAdvisor extends CVSSynchronizeViewerAdvisor {
+
+	private DirectionFilterActionGroup modes;
+	private WrappedActionDelegate commitToolbar;
+	private WrappedActionDelegate updateToolbar;
+	
+	public WorkspaceSynchronizeAdvisor(ISynchronizeView view, SubscriberParticipant participant) {
+		super(view, participant);
+		
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.ui.synchronize.subscriber.SynchronizeViewerAdvisor#initializeActions(org.eclipse.jface.viewers.StructuredViewer)
+	 */
+	protected void initializeActions(StructuredViewer treeViewer) {
+		super.initializeActions(treeViewer);
+		
+		modes = new DirectionFilterActionGroup(getParticipant(), SubscriberParticipant.ALL_MODES);
+
+		commitToolbar = new ActionDelegateManager.WrappedActionDelegate(new SubscriberCommitAction(), getSynchronizeView(), treeViewer);
+		WorkspaceUpdateAction action = new WorkspaceUpdateAction();
+		action.setPromptBeforeUpdate(true);
+		updateToolbar = new ActionDelegateManager.WrappedActionDelegate(action, getSynchronizeView(), treeViewer);
+
+		Utils.initAction(commitToolbar, "action.SynchronizeViewCommit.", Policy.getBundle()); //$NON-NLS-1$
+		Utils.initAction(updateToolbar, "action.SynchronizeViewUpdate.", Policy.getBundle()); //$NON-NLS-1$
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor#setActionBars(org.eclipse.ui.IActionBars)
+	 */
+	public void setActionBars(IActionBars actionBars) {
+		super.setActionBars(actionBars);
+		IToolBarManager toolbar = actionBars.getToolBarManager();
+		if (toolbar != null) {
+			modes.fillToolBar(toolbar);
+			toolbar.add(new Separator());
+			toolbar.add(updateToolbar);
+			toolbar.add(commitToolbar);
+		}
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizePage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizePage.java
deleted file mode 100644
index d059235..0000000
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizePage.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2000, 2003 IBM Corporation and others.
- * All rights reserved. This program and the accompanying materials 
- * are made available under the terms of the Common Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/cpl-v10.html
- * 
- * Contributors:
- *     IBM Corporation - initial API and implementation
- *******************************************************************************/
-package org.eclipse.team.internal.ccvs.ui.subscriber;
-
-import org.eclipse.jface.action.*;
-import org.eclipse.team.internal.ccvs.ui.Policy;
-import org.eclipse.team.internal.ui.Utils;
-import org.eclipse.team.ui.synchronize.ISynchronizeView;
-import org.eclipse.team.ui.synchronize.subscriber.DirectionFilterActionGroup;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant;
-import org.eclipse.ui.IActionBars;
-
-public class WorkspaceSynchronizePage extends CVSSynchronizeViewPage {
-
-	private DirectionFilterActionGroup modes;
-
-	private Action commitToolbar;
-	private Action updateToolbar;
-
-	public WorkspaceSynchronizePage(SubscriberParticipant page, ISynchronizeView view) {
-		super(page, view);
-		modes = new DirectionFilterActionGroup(getParticipant(), SubscriberParticipant.ALL_MODES);
-
-		commitToolbar = new CVSActionDelegate(new SubscriberCommitAction());
-		WorkspaceUpdateAction action = new WorkspaceUpdateAction();
-		action.setPromptBeforeUpdate(true);
-		updateToolbar = new CVSActionDelegate(action);
-
-		Utils.initAction(commitToolbar, "action.SynchronizeViewCommit.", Policy.getBundle()); //$NON-NLS-1$
-		Utils.initAction(updateToolbar, "action.SynchronizeViewUpdate.", Policy.getBundle()); //$NON-NLS-1$
-		
-		// force enablement to be update on action delegates
-		//syncSetChanged(null);
-	}
-
-	/* (non-Javadoc)
-	 * @see org.eclipse.ui.part.IPage#setActionBars(org.eclipse.ui.IActionBars)
-	 */
-	public void setActionBars(IActionBars actionBars) {
-		super.setActionBars(actionBars);
-		IToolBarManager toolbar = actionBars.getToolBarManager();
-		modes.fillToolBar(toolbar);
-		toolbar.add(new Separator());
-		toolbar.add(updateToolbar);
-		toolbar.add(commitToolbar);
-	}
-}
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeParticipant.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeParticipant.java
index edac013..a6f8628 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeParticipant.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceSynchronizeParticipant.java
@@ -14,7 +14,7 @@
 import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
 import org.eclipse.team.ui.synchronize.ISynchronizeView;
 import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipantPage;
+import org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor;
 import org.eclipse.ui.IMemento;
 import org.eclipse.ui.PartInitException;
 
@@ -23,18 +23,19 @@
 	public final static String ID = "org.eclipse.team.cvs.ui.cvsworkspace-participant"; //$NON-NLS-1$
 	
 	/* (non-Javadoc)
-	 * @see org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant#doCreatePage(org.eclipse.team.ui.synchronize.ISynchronizeView)
-	 */
-	protected SubscriberParticipantPage doCreatePage(ISynchronizeView view) {
-		return new WorkspaceSynchronizePage(this, view);
-	}
-	
-	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.ISynchronizeParticipant#init(org.eclipse.ui.IMemento)
 	 */
 	public void init(IMemento memento) throws PartInitException {
 		super.init(memento);
 		Subscriber subscriber = CVSProviderPlugin.getPlugin().getCVSWorkspaceSubscriber(); 
 		setSubscriber(subscriber);
-	}		
+	}
+	
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant#createSynchronizeViewerAdvisor(org.eclipse.team.ui.synchronize.ISynchronizeView)
+	 */
+	protected StructuredViewerAdvisor createSynchronizeViewerAdvisor(ISynchronizeView view) {
+		return new WorkspaceSynchronizeAdvisor(view, this);
+	}
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceUpdateAction.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceUpdateAction.java
index 730d990..413a3a3 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceUpdateAction.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/WorkspaceUpdateAction.java
@@ -14,11 +14,11 @@
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter;
 import org.eclipse.team.core.synchronize.SyncInfo;
 import org.eclipse.team.core.synchronize.FastSyncInfoFilter.SyncInfoDirectionFilter;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberAction;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberOperation;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelAction;
+import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelOperation;
 import org.eclipse.ui.IWorkbenchPart;
 
-public class WorkspaceUpdateAction extends SubscriberAction {
+public class WorkspaceUpdateAction extends SynchronizeModelAction {
 	
 	private boolean promptBeforeUpdate;
 
@@ -32,7 +32,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.internal.ui.actions.SubscriberAction#getSubscriberOperation(org.eclipse.compare.structuremergeviewer.IDiffElement[])
 	 */
-	protected SubscriberOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
+	protected SynchronizeModelOperation getSubscriberOperation(IWorkbenchPart part, IDiffElement[] elements) {
 		return new WorkspaceUpdateOperation(part, elements, promptBeforeUpdate);
 	}
 
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 61ebefd..7920335 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
@@ -32,7 +32,7 @@
 import org.eclipse.team.core.variants.IResourceVariant;
 import org.eclipse.team.ui.TeamImages;
 import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant;
-import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement;
+import org.eclipse.team.ui.synchronize.viewers.ISynchronizeModelElement;
 import org.eclipse.ui.*;
 import org.eclipse.ui.progress.IWorkbenchSiteProgressService;
 
@@ -413,8 +413,8 @@
 			IResource resource = null;
 			if (element instanceof IResource) {
 				resource = (IResource)element;
-			} else if (element instanceof SynchronizeModelElement){
-				resource = ((SynchronizeModelElement) element).getResource();
+			} else if (element instanceof ISynchronizeModelElement){
+				resource = ((ISynchronizeModelElement) element).getResource();
 			} else {
 				resource = (IResource)getAdapter(element, IResource.class);
 			}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ActionDelegateManager.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ActionDelegateManager.java
new file mode 100644
index 0000000..a8bd9a8
--- /dev/null
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ActionDelegateManager.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2003 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials 
+ * are made available under the terms of the Common Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ * 
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.team.internal.ui.synchronize;
+
+import java.util.*;
+
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.viewers.*;
+import org.eclipse.ui.*;
+import org.eclipse.ui.IActionDelegate;
+import org.eclipse.ui.IViewActionDelegate;
+
+public class ActionDelegateManager {
+		
+		private List delegates = new ArrayList(2);
+		private IViewPart part;
+		private StructuredViewer viewer;
+		
+		public static class WrappedActionDelegate extends Action {
+			private IActionDelegate delegate;
+			private Viewer viewer;
+
+			public WrappedActionDelegate(IActionDelegate delegate, IViewPart part, Viewer viewer) {
+				this.delegate = delegate;
+				this.viewer = viewer;
+				// Associate delegate with the synchronize view, this will allow
+				if(delegate instanceof IViewActionDelegate) {
+					((IViewActionDelegate)delegate).init(part);
+				}
+			}
+
+			public void run() {
+				if (viewer != null) {
+					ISelection selection = new StructuredSelection(viewer.getInput());		
+					if (!selection.isEmpty()) {
+						delegate.selectionChanged(this, selection);
+						delegate.run(this);
+					}
+				}
+			}
+
+			public IActionDelegate getDelegate() {
+				return delegate;
+			}
+		}
+
+		public ActionDelegateManager() {
+		}
+		
+		/*
+		 * Update the enablement of any action delegates 
+		 */
+		public void updateActionEnablement(Object input) {
+			ISelection selection = new StructuredSelection(input);
+			for (Iterator it = delegates.iterator(); it.hasNext(); ) {
+				WrappedActionDelegate delegate = (WrappedActionDelegate) it.next();
+				delegate.getDelegate().selectionChanged(delegate, selection);
+			}
+		}
+
+		public void addDelegate(WrappedActionDelegate delagate) {
+			delegates.add(delagate);
+		}
+}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ChangesSection.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ChangesSection.java
index 9ef961d..b087af9 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ChangesSection.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/ChangesSection.java
@@ -18,15 +18,15 @@
 import org.eclipse.swt.graphics.Color;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.*;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
 import org.eclipse.team.core.ITeamStatus;
 import org.eclipse.team.core.synchronize.*;
 import org.eclipse.team.internal.ui.*;
 import org.eclipse.team.ui.ISharedImages;
 import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant;
-import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipantPage;
 import org.eclipse.team.ui.synchronize.viewers.ISynchronizeModelChangeListener;
-import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement;
+import org.eclipse.team.ui.synchronize.viewers.ISynchronizeModelElement;
 import org.eclipse.ui.forms.HyperlinkGroup;
 import org.eclipse.ui.forms.events.HyperlinkAdapter;
 import org.eclipse.ui.forms.events.HyperlinkEvent;
@@ -76,7 +76,7 @@
 	 * Listen to sync set changes so that we can update message to user and totals.
 	 */
 	private ISynchronizeModelChangeListener changedListener = new ISynchronizeModelChangeListener() {
-		public void modelChanged(SynchronizeModelElement root) {
+		public void modelChanged(ISynchronizeModelElement root) {
 			calculateDescription();
 		}
 	};
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompressedFoldersModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompressedFoldersModelProvider.java
index 786d858..20bad78 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompressedFoldersModelProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompressedFoldersModelProvider.java
@@ -20,7 +20,7 @@
 import org.eclipse.team.core.synchronize.*;
 import org.eclipse.team.internal.ui.TeamUIPlugin;
 import org.eclipse.team.ui.ISharedImages;
-import org.eclipse.team.ui.synchronize.viewers.*;
+import org.eclipse.team.ui.synchronize.viewers.ISynchronizeModelElement;
 
 public class CompressedFoldersModelProvider extends HierarchicalModelProvider {
 
@@ -156,10 +156,10 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.viewers.HierarchicalModelProvider#createModelObject(org.eclipse.compare.structuremergeviewer.DiffNode, org.eclipse.core.resources.IResource)
 	 */
-	protected SynchronizeModelElement createModelObject(SynchronizeModelElement parent, IResource resource) {
+	protected ISynchronizeModelElement createModelObject(ISynchronizeModelElement parent, IResource resource) {
 		if (resource.getType() == IResource.FOLDER) {
 			SyncInfo info = getSyncInfoTree().getSyncInfo(resource);
-			SynchronizeModelElement newNode;
+			ISynchronizeModelElement newNode;
 			if(info != null) {
 				newNode = new CompressedFolderDiffNode(parent, info);
 			} else {
@@ -187,12 +187,12 @@
 	
 	private void addResource(SyncInfo info) {
 		IResource local = info.getLocal();
-		SynchronizeModelElement existingNode = getModelObject(local);
+		ISynchronizeModelElement existingNode = getModelObject(local);
 		if (existingNode == null) {
 			if (local.getType() == IResource.FILE) {
-				SynchronizeModelElement parentNode = getModelObject(local.getParent());
+				ISynchronizeModelElement parentNode = getModelObject(local.getParent());
 				if (parentNode == null) {
-					SynchronizeModelElement projectNode = getModelObject(local.getProject());
+					ISynchronizeModelElement projectNode = getModelObject(local.getProject());
 					if (projectNode == null) {
 						projectNode = createModelObject(getModelRoot(), local.getProject());
 					}
@@ -204,7 +204,7 @@
 				}
 				createModelObject(parentNode, local);
 			} else {
-				SynchronizeModelElement projectNode = getModelObject(local.getProject());
+				ISynchronizeModelElement projectNode = getModelObject(local.getProject());
 				if (projectNode == null) {
 					projectNode = createModelObject(getModelRoot(), local.getProject());
 				}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/DiffNodeWorkbenchAdapter.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/DiffNodeWorkbenchAdapter.java
index ea3991b..c9271bb 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/DiffNodeWorkbenchAdapter.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/DiffNodeWorkbenchAdapter.java
@@ -12,7 +12,7 @@
 
 import org.eclipse.compare.structuremergeviewer.DiffNode;
 import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement;
+import org.eclipse.team.ui.synchronize.viewers.ISynchronizeModelElement;
 import org.eclipse.ui.model.IWorkbenchAdapter;
 
 public class DiffNodeWorkbenchAdapter implements IWorkbenchAdapter {
@@ -30,8 +30,8 @@
 	 */
 	public ImageDescriptor getImageDescriptor(Object o) {
 		DiffNode node = getDiffNode(o);
-		if(node instanceof SynchronizeModelElement) {
-			return ((SynchronizeModelElement)node).getImageDescriptor(o);
+		if(node instanceof ISynchronizeModelElement) {
+			return ((ISynchronizeModelElement)node).getImageDescriptor(o);
 		}
 		return null;
 	}
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/HierarchicalModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/HierarchicalModelProvider.java
index 7ecfb3a..00665e2 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/HierarchicalModelProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/HierarchicalModelProvider.java
@@ -16,7 +16,7 @@
 import org.eclipse.jface.viewers.AbstractTreeViewer;
 import org.eclipse.jface.viewers.ViewerSorter;
 import org.eclipse.team.core.synchronize.*;
-import org.eclipse.team.ui.synchronize.viewers.*;
+import org.eclipse.team.ui.synchronize.viewers.ISynchronizeModelElement;
 
 /**
  * An input that can be used with both {@link } and 
@@ -61,7 +61,7 @@
 	 * @param container
 	 * @return
 	 */
-	protected IDiffElement[] createModelObjects(SynchronizeModelElement container) {
+	protected IDiffElement[] createModelObjects(ISynchronizeModelElement container) {
 		IResource resource = null;
 		if (container == getModelRoot()) {
 			resource = ResourcesPlugin.getWorkspace().getRoot();
@@ -71,7 +71,7 @@
 		if(resource != null) {
 			SyncInfoTree infoTree = getSyncInfoTree();
 			IResource[] children = infoTree.members(resource);
-			SynchronizeModelElement[] nodes = new SynchronizeModelElement[children.length];
+			ISynchronizeModelElement[] nodes = new ISynchronizeModelElement[children.length];
 			for (int i = 0; i < children.length; i++) {
 				nodes[i] = createModelObject(container, children[i]);
 			}
@@ -80,7 +80,7 @@
 		return new IDiffElement[0];
 	}
 
-	protected SynchronizeModelElement createModelObject(SynchronizeModelElement parent, IResource resource) {
+	protected ISynchronizeModelElement createModelObject(ISynchronizeModelElement parent, IResource resource) {
 		SyncInfo info = getSyncInfoTree().getSyncInfo(resource);
 		SynchronizeModelElement newNode;
 		if(info != null) {
@@ -112,9 +112,9 @@
 	 * @param diffNode the diff node to be changed
 	 * @param info the new sync info for the diff node
 	 */
-	protected void handleChange(SynchronizeModelElement diffNode, SyncInfo info) {
+	protected void handleChange(ISynchronizeModelElement diffNode, SyncInfo info) {
 		IResource local = info.getLocal();
-		// TODO: Get any additional sync bits
+
 		if(diffNode instanceof SyncInfoModelElement) {
 			boolean wasConflict = isConflicting(diffNode);
 			// The update preserves any of the additional sync info bits
@@ -130,20 +130,19 @@
 			removeFromViewer(local);
 			addResources(new IResource[] {local});
 		}
-		// TODO: set any additional sync info bits
 	}
 
 	protected void addResources(IResource[] added) {
 		for (int i = 0; i < added.length; i++) {
 			IResource resource = added[i];
-			SynchronizeModelElement node = getModelObject(resource);
+			ISynchronizeModelElement node = getModelObject(resource);
 			if (node != null) {
 				// Somehow the node exists. Remove it and read it to ensure
 				// what is shown matches the contents of the sync set
 				removeFromViewer(resource);
 			}
 			// Build the sub-tree rooted at this node
-			SynchronizeModelElement parent = getModelObject(resource.getParent());
+			ISynchronizeModelElement parent = getModelObject(resource.getParent());
 			if (parent != null) {
 				node = createModelObject(parent, resource);
 				buildModelObjects(node);
@@ -154,12 +153,12 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.viewers.SynchronizeModelProvider#buildModelObjects(org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement)
 	 */
-	protected IDiffElement[] buildModelObjects(SynchronizeModelElement node) {
+	protected IDiffElement[] buildModelObjects(ISynchronizeModelElement node) {
 		IDiffElement[] children = createModelObjects(node);
 		for (int i = 0; i < children.length; i++) {
 			IDiffElement element = children[i];
-			if (element instanceof SynchronizeModelElement) {
-				buildModelObjects((SynchronizeModelElement) element);
+			if (element instanceof ISynchronizeModelElement) {
+				buildModelObjects((ISynchronizeModelElement) element);
 			}
 		}
 		return children;
@@ -168,7 +167,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.viewers.SynchronizeModelProvider#doAdd(org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement, org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement)
 	 */
-	protected void doAdd(SynchronizeModelElement parent, SynchronizeModelElement element) {
+	protected void doAdd(ISynchronizeModelElement parent, ISynchronizeModelElement element) {
 		AbstractTreeViewer viewer = (AbstractTreeViewer)getViewer();
 		viewer.add(parent, element);		
 	}
@@ -176,7 +175,7 @@
 	/* (non-Javadoc)
 	 * @see org.eclipse.team.ui.synchronize.viewers.SynchronizeModelProvider#doRemove(org.eclipse.team.ui.synchronize.viewers.SynchronizeModelElement)
 	 */
-	protected void doRemove(SynchronizeModelElement element) {
+	protected void doRemove(ISynchronizeModelElement element) {
 		AbstractTreeViewer viewer = (AbstractTreeViewer)getViewer();
 		viewer.remove(element);		
 	}
@@ -198,7 +197,7 @@
 		for (int i = 0; i < infos.length; i++) {
 			SyncInfo info = infos[i];
 			IResource local = info.getLocal();
-			SynchronizeModelElement diffNode = getModelObject(local);
+			ISynchronizeModelElement diffNode = getModelObject(local);
 			if (diffNode != null) {
 				handleChange(diffNode, info);
 			}
@@ -220,7 +219,7 @@
 		for (int i = 0; i < removedResources.length; i++) {
 			IResource resource = removedResources[i];
 			if (resource.getType() != IResource.FILE) {
-				SynchronizeModelElement node = getModelObject(resource);
+				ISynchronizeModelElement node = getModelObject(resource);
 				if (node != null) {
 					removeFromViewer(resource);
 					addResources(new IResource[] {resource});
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/subscriber/SubscriberParticipantPage.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SubscriberParticipantPage.java
similarity index 93%
rename from bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/subscriber/SubscriberParticipantPage.java
rename to bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SubscriberParticipantPage.java
index a385ae5..47e360b 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/ui/synchronize/subscriber/SubscriberParticipantPage.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SubscriberParticipantPage.java
@@ -8,7 +8,7 @@
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
-package org.eclipse.team.ui.synchronize.subscriber;
+package org.eclipse.team.internal.ui.synchronize;
 
 import org.eclipse.compare.internal.INavigatable;
 import org.eclipse.core.runtime.IAdaptable;
@@ -22,10 +22,10 @@
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.*;
 import org.eclipse.team.internal.ui.*;
-import org.eclipse.team.internal.ui.synchronize.ChangesSection;
-import org.eclipse.team.internal.ui.synchronize.ConfigureRefreshScheduleDialog;
 import org.eclipse.team.internal.ui.synchronize.actions.*;
 import org.eclipse.team.ui.synchronize.ISynchronizeView;
+import org.eclipse.team.ui.synchronize.subscriber.SubscriberParticipant;
+import org.eclipse.team.ui.synchronize.subscriber.SubscriberRefreshWizard;
 import org.eclipse.team.ui.synchronize.viewers.StructuredViewerAdvisor;
 import org.eclipse.team.ui.synchronize.viewers.TreeViewerAdvisor;
 import org.eclipse.ui.*;
@@ -42,7 +42,7 @@
  * </p> 
  * @since 3.0
  */
-public class SubscriberParticipantPage implements IPageBookViewPage, IPropertyChangeListener, IAdaptable {
+public final class SubscriberParticipantPage implements IPageBookViewPage, IPropertyChangeListener, IAdaptable {
 	// Parent composite of this view. It is remembered so that we can dispose of its children when 
 	// the viewer type is switched.
 	private Composite composite = null;
@@ -64,14 +64,15 @@
 	private Action collapseAll;
 	private WorkingSetFilterActionGroup workingSetGroup;
 	private StatusLineContributionGroup statusLine;
-	private SynchronizeViewerAdvisor viewerAdvisor;
+	private StructuredViewerAdvisor viewerAdvisor;
 		
 	/**
 	 * Constructs a new SynchronizeView.
 	 */
-	public SubscriberParticipantPage(SubscriberParticipant page, ISynchronizeView view) {
+	public SubscriberParticipantPage(SubscriberParticipant page, ISynchronizeView view, StructuredViewerAdvisor viewerAdvisor) {
 		this.participant = page;
 		this.view = view;
+		this.viewerAdvisor = viewerAdvisor;
 	}
 	
 	/* (non-Javadoc)
@@ -253,6 +254,9 @@
 			
 			// status line
 			statusLine.fillActionBars(actionBars);
+			
+			// allow the advisor to contribute
+			getViewerConfiguration().setActionBars(actionBars);
 		}		
 	}
 
@@ -310,7 +314,6 @@
 	}
 	
 	private Viewer createChangesViewer(Composite parent) {
-		viewerAdvisor = createSynchronizeViewerAdvisor();
 		TreeViewer viewer = new TreeViewerAdvisor.NavigableTreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);
 		GridData data = new GridData(GridData.FILL_BOTH);
 		viewer.getControl().setLayoutData(data);
@@ -319,19 +322,15 @@
 		return viewer;
 	}
 	
-	public StructuredViewerAdvisor getViewerAdviser() {
+	public StructuredViewerAdvisor getViewerConfiguration() {
 		return viewerAdvisor;
 	}
 	
 	public Viewer getViewer() {
 		return changesViewer;
 	}
-	
-	protected SynchronizeViewerAdvisor createSynchronizeViewerAdvisor() {
-		return new SynchronizeViewerAdvisor(getSynchronizeView(), getParticipant());
-	}
 
 	public void setSelection(Object[] objects, boolean reveal) {
-		getViewerAdviser().setSelection(objects, reveal);
+		getViewerConfiguration().setSelection(objects, reveal);
 	}
 }
\ No newline at end of file
diff --git a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/TestDiffNodePresentationModel.java b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/TestDiffNodePresentationModel.java
index d881e83..ea9c943 100644
--- a/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/TestDiffNodePresentationModel.java
+++ b/tests/org.eclipse.team.tests.core/src/org/eclipse/team/tests/ui/synchronize/TestDiffNodePresentationModel.java
@@ -54,7 +54,7 @@
 		super.setUp();
 		this.set = new SyncInfoTree();
 		this.configuration = new TreeViewerAdvisor(set) {
-			protected SynchronizeModelProvider getModelProvider() {
+			protected ISynchronizeModelProvider getModelProvider() {
 				return TestDiffNodePresentationModel.this.getDiffNodeController(set);
 			}
 		};
diff --git a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSSyncSubscriberTest.java b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSSyncSubscriberTest.java
index 6d24e48..0496a4d 100644
--- a/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSSyncSubscriberTest.java
+++ b/tests/org.eclipse.team.tests.cvs.core/src/org/eclipse/team/tests/ccvs/core/subscriber/CVSSyncSubscriberTest.java
@@ -24,9 +24,9 @@
 import org.eclipse.team.internal.ccvs.core.CVSProviderPlugin;
 import org.eclipse.team.internal.ccvs.core.CVSSyncTreeSubscriber;
 import org.eclipse.team.internal.ccvs.ui.subscriber.SubscriberConfirmMergedOperation;
+import org.eclipse.team.internal.ui.synchronize.SyncInfoModelElement;
 import org.eclipse.team.tests.ccvs.core.EclipseTest;
 import org.eclipse.team.tests.ccvs.ui.SynchronizeViewTestAdapter;
-import org.eclipse.team.ui.synchronize.viewers.SyncInfoModelElement;
 
 /**
  * Provides test methods common to CVS sync subscribers