Index: src/org/tigris/subversion/subclipse/core/SVNProviderPlugin.java
===================================================================
--- src/org/tigris/subversion/subclipse/core/SVNProviderPlugin.java	(revision 3910)
+++ src/org/tigris/subversion/subclipse/core/SVNProviderPlugin.java	(working copy)
@@ -43,6 +43,7 @@
 import org.tigris.subversion.subclipse.core.resources.RepositoryResourcesManager;
 import org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot;
 import org.tigris.subversion.subclipse.core.resourcesListeners.FileModificationManager;
+import org.tigris.subversion.subclipse.core.resourcesListeners.RevertResourceManager;
 import org.tigris.subversion.subclipse.core.resourcesListeners.SyncFileChangeListener;
 import org.tigris.subversion.subclipse.core.resourcesListeners.TeamPrivateListener;
 import org.tigris.subversion.subclipse.core.status.StatusCacheManager;
@@ -97,6 +98,8 @@
 	
 	private SVNActiveChangeSetCollector changeSetManager;
 	
+	private RevertResourceManager revertManager;
+	
 	private static boolean consoleLoggingEnabled = true;
 	
 	/**
@@ -160,6 +163,8 @@
 		// subdir)
 		metaFileSyncListener = new SyncFileChangeListener();
 
+		revertManager = new RevertResourceManager();
+		
 		workspace.addResourceChangeListener(teamPrivateListener,
 				IResourceChangeEvent.POST_CHANGE);
 		workspace.addResourceChangeListener(statusCacheManager,
@@ -168,7 +173,8 @@
 				IResourceChangeEvent.PRE_BUILD);
 		workspace.addResourceChangeListener(fileModificationManager,
 				IResourceChangeEvent.POST_CHANGE);
-
+		workspace.addResourceChangeListener(revertManager, IResourceChangeEvent.PRE_BUILD);
+		
 		teamPrivateListener.registerSaveParticipant();
 		fileModificationManager.registerSaveParticipant();
 
@@ -190,7 +196,8 @@
 		workspace.removeResourceChangeListener(metaFileSyncListener);
 		workspace.removeResourceChangeListener(fileModificationManager);
 		workspace.removeResourceChangeListener(teamPrivateListener);
-
+		workspace.removeResourceChangeListener(revertManager);
+		
 		// save the state which includes the known repositories
 		if (repositories != null) {
 			repositories.shutdown();
Index: src/org/tigris/subversion/subclipse/core/resourcesListeners/RevertResourceManager.java
===================================================================
--- src/org/tigris/subversion/subclipse/core/resourcesListeners/RevertResourceManager.java	(revision 0)
+++ src/org/tigris/subversion/subclipse/core/resourcesListeners/RevertResourceManager.java	(revision 0)
@@ -0,0 +1,131 @@
+package org.tigris.subversion.subclipse.core.resourcesListeners;
+
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+import org.eclipse.core.runtime.CoreException;
+import org.tigris.subversion.subclipse.core.ISVNLocalFile;
+import org.tigris.subversion.subclipse.core.ISVNLocalFolder;
+import org.tigris.subversion.subclipse.core.ISVNLocalResource;
+import org.tigris.subversion.subclipse.core.SVNException;
+import org.tigris.subversion.subclipse.core.SVNProviderPlugin;
+import org.tigris.subversion.subclipse.core.client.OperationManager;
+import org.tigris.subversion.subclipse.core.resources.SVNWorkspaceRoot;
+import org.tigris.subversion.svnclientadapter.ISVNClientAdapter;
+import org.tigris.subversion.svnclientadapter.SVNClientException;
+
+public class RevertResourceManager implements IResourceChangeListener {
+
+    public void resourceChanged(final IResourceChangeEvent event) {
+        final List addedFileResources = new ArrayList();
+
+        try {
+            event.getDelta().accept(new IResourceDeltaVisitor() {
+
+                public boolean visit(IResourceDelta delta) throws CoreException {
+                    if (delta.getResource().getType() == IResource.FILE && delta.getKind() == IResourceDelta.ADDED) {
+                        addedFileResources.add(delta.getResource());
+                    }
+                    return true;
+                }
+
+            });
+            if (!addedFileResources.isEmpty()) {
+                final IResource[] resources = (IResource[]) addedFileResources.toArray(new IResource[addedFileResources
+                        .size()]);
+                processResources(resources);
+            }
+        } catch (CoreException e) {
+            SVNProviderPlugin.log(e.getStatus());
+        }
+
+    }
+
+    /**
+     * Revert previously deleted resources that are added again. When a file is
+     * reverted, it's parent directories are also reverted.
+     * When new files are added in folders that are scheduled for deletion, the parent
+     * folder tree is reverted.
+     * 
+     * @param resources
+     */
+    private void processResources(IResource[] resources) throws CoreException {
+        for (int i = 0; i < resources.length; i++) {
+            IResource resource = resources[i];
+            if (resource.getType() == IResource.FILE) {
+                ISVNLocalFile res = SVNWorkspaceRoot.getSVNFileFor((IFile) resource);
+                if (res.getFile().exists()) {
+                    boolean deleted = res.getStatus().isDeleted();
+                    if (deleted) {
+                        File file = res.getFile().getAbsoluteFile();
+                        // TODO a better location?
+                        File tmp = new File(res.getFile().getAbsolutePath() + ".svntmp");
+                        if (tmp.exists()) {
+                        	tmp.delete();
+                        }
+                        if (file.renameTo(tmp)) {
+                            // res.revert is recursive and updates local history
+                            revert(res);
+                            // on Windows it appears that the target file should not exist.
+                            if (!file.delete()) {
+                                //TODO handle this in a better way?
+                                throw SVNException.wrapException(new IllegalStateException("Could not remove "+file));                                                            	
+                            }
+                            if (!tmp.renameTo(file)) {
+                                //TODO handle this in a better way?
+                                throw SVNException.wrapException(new IllegalStateException("Could not rename "+tmp+" to "+file));                                
+                            }
+                        } else {
+                            //TODO handle this in a better way?
+                            throw SVNException.wrapException(new IllegalStateException("Could not rename "+file+" to "+tmp));
+                        }
+                        res.getResource().touch(null);
+                    }
+                    // revert any deleted parent folders
+                    ISVNLocalFolder parentFolder = res.getParent();
+                    while (parentFolder != null) {
+                        if (parentFolder.getStatus().isDeleted()) {
+                            revert(parentFolder);
+                        } else {
+                            break;
+                        }
+                        if (parentFolder.getParent() == null) {
+                            break;
+                        }
+                        parentFolder = parentFolder.getParent();
+                    }
+
+                    // update the status cache
+                    parentFolder.refreshStatus(true);
+                }
+            }
+        }
+    }
+
+    /**
+     * Like revert on ISVNLocalFile but without updating the local history. Non
+     * recursive revert for folders
+     * 
+     * @param resource
+     * @throws SVNException
+     */
+    private void revert(ISVNLocalResource resource) throws SVNException {
+        try {
+            ISVNClientAdapter svnClient = resource.getRepository().getSVNClient();
+            OperationManager.getInstance().beginOperation(svnClient);
+            svnClient.revert(resource.getFile(), false);
+        } catch (SVNClientException e) {
+            throw SVNException.wrapException(e);
+        } finally {
+            OperationManager.getInstance().endOperation();
+        }
+    }
+
+}

