NLSed strings
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ComparePreferencePage.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ComparePreferencePage.java
index ceb4f36..febf886 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ComparePreferencePage.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/ComparePreferencePage.java
@@ -31,7 +31,7 @@
      * @see org.eclipse.team.internal.ccvs.ui.CVSFieldEditorPreferencePage#getPageDescription()
      */
     protected String getPageDescription() {
-        return "Options for CVS comparisons:";
+        return Policy.bind("ComparePreferencePage.0"); //$NON-NLS-1$
     }
 
     /* (non-Javadoc)
@@ -56,7 +56,7 @@
 				getFieldEditorParent()));
 		addField(new BooleanFieldEditor(
 		        ICVSUIConstants.PREF_SHOW_AUTHOR_IN_EDITOR, 
-		        "Show the file author in compare editors",
+		        Policy.bind("ComparePreferencePage.1"), //$NON-NLS-1$
 				BooleanFieldEditor.DEFAULT, 
 				getFieldEditorParent()));
     }
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties
index dd8b4ac..ffd1c7b 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/messages.properties
@@ -1022,11 +1022,25 @@
 CheckoutIntoWizard.projectSelectionPageDescription=Select the local folder that is the target of the checkout operation.
 CheckoutIntoWizard.error=Checkout Error
 ChangeLogModelProvider.0=Sort &Comments By
+ChangeLogModelProvider.0=&New Commit Set...
 ChangeLogModelProvider.1=&Comment
+ChangeLogModelProvider.1=New Set
+ChangeLogModelProvider.10=Could not add files
+ChangeLogModelProvider.11=A problem occurred while rying to add the files to the commit set
+ChangeLogModelProvider.12=Add &To
 ChangeLogModelProvider.2=&Date
+ChangeLogModelProvider.2=New Commit Set
 ChangeLogModelProvider.3=&User
+ChangeLogModelProvider.3=Enter the name and comment for the new commit set
 ChangeLogModelProvider.4=Retrieving revision histories
+ChangeLogModelProvider.4=Could not create set
 ChangeLogModelProvider.5=Commit &Sets
+ChangeLogModelProvider.5=A problem occurred while trying to create the commit set
+ChangeLogModelProvider.6=Ed&it Comment...
+ChangeLogModelProvider.7=Edit Commit Set Comment
+ChangeLogModelProvider.8=Edit the name and comment for the new commit set
+ChangeLogModelProvider.9=Make De&fault
+ChangeLogModelManager.0=Show Commit Sets
 
 CheckoutIntoWizard.thisResourceExists=The resource ''{0}'' already exists in the workspace.  Overwrite?
 CheckoutIntoWizard.confirmOverwrite=Confirm Overwrite
@@ -1187,6 +1201,8 @@
 CVSRepositoryPropertiesPage.1=You have chosen to change the host name or repository root path for this location. You should ensure that this new information still identifies the same repository.
 CompareRevertAction.0=Reverting {0} resources
 CompareParticipant.0={0} ({1})
+ComparePreferencePage.0=Options for CVS comparisons:
+ComparePreferencePage.1=Show the file author in compare editors
 FileModificationValidator.3=Perform Edit?
 FileModificationValidator.4=A CVS edit notification is required to be sent to the server in order to allow editing of one or more selected files. Continue?
 CVSSynchronizeViewPage.0=Show incoming grouped by comment
@@ -1246,6 +1262,10 @@
 BranchOperation.0=Branching
 BranchOperation.1=Branching {0}
 CommitOperation.0=Committing {0}
+CommitSetDialog.0=&Name:
+CommitSetDialog.2=Use the &title as the commit comment
+CommitSetDialog.3=Enter a commit &comment
+CommitSetDiffNode.0={0} (default)
 UpdateOperation.0=Updating {0}
 ReplaceOperation.0=Replacing {0}
 TagOperation.0=Tagging {0}
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 0f77290..e80472e 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
@@ -42,12 +42,7 @@
 	}
 	
 	public boolean equals(Object obj) {
-		if(obj == this) return true;
-		if(! (obj instanceof ChangeLogDiffNode)) return false;
-		ChangeLogDiffNode other = (ChangeLogDiffNode)obj;
-		ILogEntry otherLog = other.getComment();
-		ILogEntry thisLog = getComment();
-		return thisLog.getComment().equals(otherLog.getComment()) && thisLog.getAuthor().equals(otherLog.getAuthor());
+		return (obj == this);
 	}
 
 	/* (non-Javadoc)
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelManager.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelManager.java
index 686a8e8..1a22ec6 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelManager.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/ChangeLogModelManager.java
@@ -15,6 +15,7 @@
 import org.eclipse.jface.util.IPropertyChangeListener;
 import org.eclipse.jface.util.PropertyChangeEvent;
 import org.eclipse.team.internal.ccvs.core.CVSTag;
+import org.eclipse.team.internal.ccvs.ui.*;
 import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
 import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants;
 import org.eclipse.team.internal.ui.synchronize.*;
@@ -38,7 +39,7 @@
 	
 	private class ToggleCommitSetAction extends Action {
         public ToggleCommitSetAction() {
-            super("Show Commit Sets", CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_CHANGELOG));
+            super(Policy.bind("ChangeLogModelManager.0"), CVSUIPlugin.getPlugin().getImageDescriptor(ICVSUIConstants.IMG_CHANGELOG)); //$NON-NLS-1$
             update();
         }
         public void run() {
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 c69f7b6..ef60476 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
@@ -133,7 +133,7 @@
 	private class CreateCommitSetAction extends SynchronizeModelAction {
 	    
         public CreateCommitSetAction(ISynchronizePageConfiguration configuration) {
-            super("&New Commit Set...", configuration);
+            super(Policy.bind("ChangeLogModelProvider.0"), configuration); //$NON-NLS-1$
         }
         
         /* (non-Javadoc)
@@ -153,16 +153,16 @@
                         public void run() {
                             try {
                                 IResource[] resources = Utils.getResources(getSelectedDiffElements());
-                                CommitSet set = CommitSetManager.getInstance().createCommitSet("New Set", null);
+                                CommitSet set = CommitSetManager.getInstance().createCommitSet(Policy.bind("ChangeLogModelProvider.1"), null); //$NON-NLS-1$
                         		CommitSetDialog dialog = new CommitSetDialog(getConfiguration().getSite().getShell(), set, resources,
-                        		        "New Commit Set", "Enter the name and comment for the new commit set");
+                        		        Policy.bind("ChangeLogModelProvider.2"), Policy.bind("ChangeLogModelProvider.3")); //$NON-NLS-1$ //$NON-NLS-2$
                         		dialog.open();
                         		if (dialog.getReturnCode() != InputDialog.OK) return;
                         		set.addFiles(resources);
                 	            CommitSetManager.getInstance().add(set);
                             } catch (CVSException e) {
                                 CVSUIPlugin.openError(getConfiguration().getSite().getShell(),
-                                        "Could not create set", "A problem occurred while trying to create the commit set", e);
+                                        Policy.bind("ChangeLogModelProvider.4"), Policy.bind("ChangeLogModelProvider.5"), e); //$NON-NLS-1$ //$NON-NLS-2$
                             }
                         }
                     });
@@ -201,14 +201,14 @@
 	private class EditCommitSetAction extends CommitSetAction {
 
         public EditCommitSetAction(ISynchronizePageConfiguration configuration) {
-            super("Ed&it Comment...", configuration);
+            super(Policy.bind("ChangeLogModelProvider.6"), configuration); //$NON-NLS-1$
         }
         
         public void run() {
             CommitSet set = getSelectedSet();
             if (set == null) return;
     		CommitSetDialog dialog = new CommitSetDialog(getConfiguration().getSite().getShell(), set, set.getFiles(),
-    		        "Edit Commit Set Comment", "Edit the name and comment for the new commit set");
+    		        Policy.bind("ChangeLogModelProvider.7"), Policy.bind("ChangeLogModelProvider.8")); //$NON-NLS-1$ //$NON-NLS-2$
     		dialog.open();
     		if (dialog.getReturnCode() != InputDialog.OK) return;
     		// Nothing to do here as the set was updated by the dialog
@@ -219,7 +219,7 @@
 	private class MakeDefaultCommitSetAction extends CommitSetAction {
 
         public MakeDefaultCommitSetAction(ISynchronizePageConfiguration configuration) {
-            super("Make De&fault", configuration);
+            super(Policy.bind("ChangeLogModelProvider.9"), configuration); //$NON-NLS-1$
         }
         
         public void run() {
@@ -258,7 +258,7 @@
                         set.addFiles(Utils.getResources(getSelectedDiffElements()));
                     } catch (CVSException e) {
                         CVSUIPlugin.openError(getConfiguration().getSite().getShell(),
-                                "Could not add files", "A problem occurred while rying to add the files to the commit set", e);
+                                Policy.bind("ChangeLogModelProvider.10"), Policy.bind("ChangeLogModelProvider.11"), e); //$NON-NLS-1$ //$NON-NLS-2$
                     }
                 }
             };
@@ -277,7 +277,7 @@
 		public void initialize(ISynchronizePageConfiguration configuration) {
 			super.initialize(configuration);
 			sortByComment = new MenuManager(Policy.bind("ChangeLogModelProvider.0"));	 //$NON-NLS-1$
-			addToCommitSet = new MenuManager("Add &To");
+			addToCommitSet = new MenuManager(Policy.bind("ChangeLogModelProvider.12")); //$NON-NLS-1$
 			addToCommitSet.setRemoveAllWhenShown(true);
 			addToCommitSet.addMenuListener(new IMenuListener() {
                 public void menuAboutToShow(IMenuManager manager) {
@@ -938,7 +938,7 @@
     protected void nodeRemoved(ISynchronizeModelElement node, AbstractSynchronizeModelProvider provider) {
         super.nodeRemoved(node, provider);
         // TODO: This should be done using the proper API
-		if (node instanceof SynchronizeModelElement) {
+		if (node instanceof SyncInfoModelElement) {
 			CVSSyncInfo info = (CVSSyncInfo) ((SyncInfoModelElement) node).getSyncInfo();
 			if (info != null) {
 				ICVSRemoteResource remote = getRemoteResource(info);
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CommitSetDialog.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CommitSetDialog.java
index e4570a7..3043f63 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CommitSetDialog.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CommitSetDialog.java
@@ -117,7 +117,7 @@
 		composite.setFont(parent.getFont());
 		
 		Label label = new Label(composite, SWT.NONE);
-		label.setText("&Name:");
+		label.setText(Policy.bind("CommitSetDialog.0")); //$NON-NLS-1$
 		label.setLayoutData(new GridData(GridData.BEGINNING));
 		
 		nameText = new Text(composite, SWT.BORDER);
@@ -131,7 +131,7 @@
 
     private void initializeValues() {
         String initialText = set.getTitle();
-        if (initialText == null) initialText = "";
+        if (initialText == null) initialText = ""; //$NON-NLS-1$
         nameText.setText(initialText);
         
         if (useTitleButton != null) {
@@ -141,8 +141,8 @@
     }
     
     private void createOptionsArea(Composite composite) {
-        useTitleButton = createRadioButton(composite, "Use the &title as the commit comment");
-        enterCommentButton = createRadioButton(composite, "Enter a commit &comment");
+        useTitleButton = createRadioButton(composite, Policy.bind("CommitSetDialog.2")); //$NON-NLS-1$
+        enterCommentButton = createRadioButton(composite, Policy.bind("CommitSetDialog.3")); //$NON-NLS-1$
         SelectionAdapter listener = new SelectionAdapter() {
             public void widgetSelected(SelectionEvent e) {
                 updateEnablements();
diff --git a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CommitSetDiffNode.java b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CommitSetDiffNode.java
index 70a9c5d..2844188 100644
--- a/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CommitSetDiffNode.java
+++ b/bundles/org.eclipse.team.cvs.ui/src/org/eclipse/team/internal/ccvs/ui/subscriber/CommitSetDiffNode.java
@@ -12,6 +12,7 @@
 
 import org.eclipse.core.resources.IResource;
 import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.team.internal.ccvs.ui.*;
 import org.eclipse.team.internal.ccvs.ui.CVSUIPlugin;
 import org.eclipse.team.internal.ccvs.ui.ICVSUIConstants;
 import org.eclipse.team.internal.ui.synchronize.SynchronizeModelElement;
@@ -54,7 +55,7 @@
 	public String getName() {
 	    String name = set.getTitle();
 	    if (CommitSetManager.getInstance().isDefault(set)) {
-	        name = name + " (default)";
+	        name = Policy.bind("CommitSetDiffNode.0", name); //$NON-NLS-1$
 	    }
 		return name;
 	}
diff --git a/bundles/org.eclipse.team.ui/.options b/bundles/org.eclipse.team.ui/.options
new file mode 100644
index 0000000..1665a8f
--- /dev/null
+++ b/bundles/org.eclipse.team.ui/.options
@@ -0,0 +1,7 @@
+# Debugging options for the org.eclipse.team.ui plugin.
+
+# Turn on debugging for the plugin.
+org.eclipse.team.ui/debug=false
+
+# Shows stream debugging information
+org.eclipse.team.ui/syncmodels=false
\ No newline at end of file
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/Policy.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/Policy.java
index 9f85e59..94e8b1b 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/Policy.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/Policy.java
@@ -16,8 +16,7 @@
 import java.util.ResourceBundle;
 
 import org.eclipse.core.runtime.*;
-import org.eclipse.team.internal.core.InfiniteSubProgressMonitor;
-import org.eclipse.team.internal.core.NullSubProgressMonitor;
+import org.eclipse.team.internal.core.*;
 
 /**
  * Policy implements NLS convenience methods for the plugin and
@@ -27,6 +26,16 @@
 	// The resource bundle to get strings from
 	protected static ResourceBundle bundle = null;
 	
+	//debug constants
+	public static boolean DEBUG_SYNC_MODELS = false;
+
+	static {
+		//init debug options
+		if (TeamUIPlugin.getPlugin().isDebugging()) {
+			DEBUG_SYNC_MODELS = "true".equalsIgnoreCase(Platform.getDebugOption(TeamUIPlugin.ID + "/syncmodels"));//$NON-NLS-1$ //$NON-NLS-2$
+		}
+	}
+	
 	/**
 	 * Creates a NLS catalog for the given locale.
 	 * 
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 5c33f0b..1ed2d6f 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
@@ -429,6 +429,7 @@
 SynchronizeManager.19=Could not create synchronization: {0}
 SynchronizeManager.20=Not allowed to create multiple synchronize instances of this type: {0}
 SynchronizeModelProvider.0=Synchronize View: Processing label changes
+SynchronizeModelUpdateHandler.0=Errors occurred while updating problem markers
 WorkspaceScope.0=Workspace
 WorkingSetScope.0=Workspace
 SubscriberParticipant.namePattern={0} ({1})
@@ -466,3 +467,4 @@
 FlatModelProvider.7=&Name
 FlatModelProvider.8=&Path
 FlatModelProvider.9=&Parent Name
+FlatModelProvider.0=Flat
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java
index 479cf03..ce10a6d 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/AbstractSynchronizeModelProvider.java
@@ -27,7 +27,6 @@
 import org.eclipse.team.internal.ui.Policy;
 import org.eclipse.team.ui.synchronize.*;
 
-
 /**
  * This class is reponsible for creating and maintaining a presentation model of 
  * {@link SynchronizeModelElement} elements that can be shown in a viewer. The model
@@ -552,7 +551,6 @@
     }
     
 	protected void addToViewer(ISynchronizeModelElement node) {
-	    updateHandler.nodeAdded(node, this);
 		propogateConflictState(node, false);
 		// Set the marker property on this node.
 		// There is no need to propogate this to the parents 
@@ -564,6 +562,7 @@
 		if (Utils.canUpdateViewer(getViewer())) {
 			doAdd((SynchronizeModelElement)node.getParent(), node);
 		}
+		updateHandler.nodeAdded(node, this);
 	}
 	
 	/**
@@ -589,6 +588,7 @@
 	 * @param node the root node
 	 */
 	protected void clearModelObjects(ISynchronizeModelElement node) {
+	    // Clear all the children of the node
 		IDiffElement[] children = node.getChildren();
 		for (int i = 0; i < children.length; i++) {
 			IDiffElement element = children[i];
@@ -602,10 +602,13 @@
                 }
 			}
 		}
+		// Remove the node from the tree
 		IDiffContainer parent = node.getParent();
 		if (parent != null) {
 			parent.removeToRoot(node);
 		}
+		// Notify the update handler that the node has been cleared
+		updateHandler.modelObjectCleared(node);
 	}
 	
 	/**
@@ -652,13 +655,26 @@
 	/**
 	 * This is a callback from the model update handler that gets invoked 
 	 * when a node is removed from the viewer. It is only invoked for the
-	 * root level model provider.
+	 * root level model provider. A removed node may have children for
+	 * which a <code>nodeRemoved</code> callback is not recieved (see
+	 * <code>modelObjectCleared</code>).
 	 * @param node
 	 */
 	protected void nodeRemoved(ISynchronizeModelElement node, AbstractSynchronizeModelProvider provider) {
 	    // Default is to do nothing
 	}
 	
+    /**
+	 * This is a callback from the model update handler that gets invoked 
+	 * when a node is cleared from the model. It is only invoked for the
+	 * root level model provider. This calbakc is deep in the sense that 
+	 * a callbakc is sent for each node that is cleared.
+     * @param node the node that was removed.
+     */
+    public void modelObjectCleared(ISynchronizeModelElement node) {
+        // Default is to do nothing
+    }
+    
     public void addPropertyChangeListener(IPropertyChangeListener listener) {
         synchronized (this) {
             if (listeners == null) {
@@ -719,4 +735,21 @@
     protected void runViewUpdate(final Runnable runnable) {
         updateHandler.runViewUpdate(runnable);
     }
+    
+    /* (non-Javadoc)
+     * @see java.lang.Object#toString()
+     */
+    public String toString() {
+        ISynchronizeModelElement element = getModelRoot();
+        String name = getClass().getName();
+        int index = name.lastIndexOf("."); //$NON-NLS-1$
+        if (index != -1) {
+            name = name.substring(index + 1);
+        }
+        String name2 = element.getName();
+        if (name2.length() == 0) {
+            name2 = "/"; //$NON-NLS-1$
+        }
+        return name + ": " + name2; //$NON-NLS-1$
+    }
 }
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompositeModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompositeModelProvider.java
index 0ce4416..acf3dfe 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompositeModelProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/CompositeModelProvider.java
@@ -131,10 +131,10 @@
      */
     protected ISynchronizeModelProvider[] beginInput() {
         ISynchronizeModelProvider[] providers = getProviders();
-        for (int i = 0; i < providers.length; i++) {
-            ISynchronizeModelProvider provider = providers[i];
-            provider.getSyncInfoSet().beginInput();
-        }
+//        for (int i = 0; i < providers.length; i++) {
+//            ISynchronizeModelProvider provider = providers[i];
+//            provider.getSyncInfoSet().beginInput();
+//        }
         return providers;
     }
     
@@ -143,15 +143,15 @@
      */
     protected void endInput(ISynchronizeModelProvider[] providers, IProgressMonitor monitor) {
         RuntimeException exception = null;
-        for (int i = 0; i < providers.length; i++) {
-            ISynchronizeModelProvider provider = providers[i];
-            try {
-                provider.getSyncInfoSet().endInput(monitor);
-            } catch (RuntimeException e) {
-                // Remember the exception but continue so all locks are freed
-                exception = e;
-            }
-        } 
+//        for (int i = 0; i < providers.length; i++) {
+//            ISynchronizeModelProvider provider = providers[i];
+//            try {
+//                provider.getSyncInfoSet().endInput(monitor);
+//            } catch (RuntimeException e) {
+//                // Remember the exception but continue so all locks are freed
+//                exception = e;
+//            }
+//        } 
         if (exception != null) {
             throw exception;
         }
@@ -262,6 +262,15 @@
      */
     protected void nodeRemoved(ISynchronizeModelElement node, AbstractSynchronizeModelProvider provider) {
         // Update the resource-to-element map and the element-to-provider map
+        modelObjectCleared(node);
+        super.nodeRemoved(node, provider);
+    }
+    
+    /* (non-Javadoc)
+     * @see org.eclipse.team.internal.ui.synchronize.AbstractSynchronizeModelProvider#modelObjectCleared(org.eclipse.team.ui.synchronize.ISynchronizeModelElement)
+     */
+    public void modelObjectCleared(ISynchronizeModelElement node) {
+        super.modelObjectCleared(node);
 	    IResource r = node.getResource();
 		if(r != null) {
 			List elements = (List)resourceToElements.get(r);
@@ -273,7 +282,6 @@
 			}
 		}
 		elementToProvider.remove(node);
-        super.nodeRemoved(node, provider);
     }
     
     /* (non-Javadoc)
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/FlatModelProvider.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/FlatModelProvider.java
index bd43992..3c6a11b 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/FlatModelProvider.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/FlatModelProvider.java
@@ -37,7 +37,7 @@
 			return ID;
 		}		
 		public String getName() {
-			return "Flat";
+			return Policy.bind("FlatModelProvider.0"); //$NON-NLS-1$
 		}		
 		public ImageDescriptor getImageDescriptor() {
 			return TeamImages.getImageDescriptor(ITeamUIImages.IMG_FLAT);
diff --git a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelUpdateHandler.java b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelUpdateHandler.java
index afa3855..e2d2d91 100644
--- a/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelUpdateHandler.java
+++ b/bundles/org.eclipse.team.ui/src/org/eclipse/team/internal/ui/synchronize/SynchronizeModelUpdateHandler.java
@@ -36,7 +36,7 @@
  */
 public class SynchronizeModelUpdateHandler extends BackgroundEventHandler implements IResourceChangeListener, ISyncInfoSetChangeListener {
     
-    private static final boolean DEBUG = false;
+    private static final boolean DEBUG = Policy.DEBUG_SYNC_MODELS;
     
     private static final IWorkspaceRoot ROOT = ResourcesPlugin.getWorkspace().getRoot();
     
@@ -118,7 +118,7 @@
      * Create the marker update handler.
      */
     public SynchronizeModelUpdateHandler(AbstractSynchronizeModelProvider provider) {
-        super(Policy.bind("SynchronizeModelProvider.0"), "Errors occurred while updating problem markers"); //$NON-NLS-1$
+        super(Policy.bind("SynchronizeModelProvider.0"), Policy.bind("SynchronizeModelUpdateHandler.0")); //$NON-NLS-1$ //$NON-NLS-2$
         this.provider = provider;
         ResourcesPlugin.getWorkspace().addResourceChangeListener(this);
         provider.getSyncInfoSet().addSyncSetChangedListener(this);
@@ -403,19 +403,53 @@
     public void nodeAdded(ISynchronizeModelElement element, AbstractSynchronizeModelProvider provider) {
         element.addPropertyChangeListener(listener);
         this.provider.nodeAdded(element, provider);
+        if (DEBUG) {
+            System.out.println("Node added: " + getDebugDisplayLabel(element) + " -> " + getDebugDisplayLabel((ISynchronizeModelElement)element.getParent()) + " : " + getDebugDisplayLabel(provider)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+        }
     }
 
     /**
      * This method is invoked whenever a node is removed the viewer
      * by the provider or a sub-provider. The handler removes any
      * listener and notifies the root provider that 
-     * a node was removed.
+     * a node was removed. The node removed may have children for which 
+     * a nodeRemoved callback was not invoked (see modelObjectCleared).
      * @param element the removed element
      * @param provider the provider that added the element
      */
     public void nodeRemoved(ISynchronizeModelElement element, AbstractSynchronizeModelProvider provider) {
         element.removePropertyChangeListener(listener);
-        provider.nodeRemoved(element, provider);
+        this.provider.nodeRemoved(element, provider);
+        if (DEBUG) {
+            System.out.println("Node removed: " + getDebugDisplayLabel(element) + " -> " + getDebugDisplayLabel((ISynchronizeModelElement)element.getParent()) + " : " + getDebugDisplayLabel(provider)); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+        }
+    }
+
+    /**
+     * This method is invoked whenever a model object (i.e. node)
+     * is cleared from the model. This is similar to node removal but
+     * is deep.
+     * @param node the node that was cleared
+     */
+    public void modelObjectCleared(ISynchronizeModelElement node) {
+        this.provider.modelObjectCleared(node);
+        if (DEBUG) {
+            System.out.println("Node cleared: " + getDebugDisplayLabel(node)); //$NON-NLS-1$
+        }
+    }
+    
+    private String getDebugDisplayLabel(ISynchronizeModelElement node) {
+        if (node == null) {
+            return "ROOT"; //$NON-NLS-1$
+        }
+        if (node.getResource() != null) {
+            return node.getResource().getFullPath().toString();
+        }
+        return node.getName();
+    }
+
+    private String getDebugDisplayLabel(AbstractSynchronizeModelProvider provider2) {
+        return provider2.toString();
     }
     
     /* (non-Javadoc)
@@ -464,9 +498,6 @@
         return provider;
     }
 
-    /**
-     * @param monitor
-     */
     public void connect(IProgressMonitor monitor) {
         getProvider().getSyncInfoSet().connect(this, monitor);
     }