Index: /applications/editors/josm/plugins/reverter/src/reverter/ChangesetIdQuery.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/ChangesetIdQuery.java	(revision 21699)
+++ /applications/editors/josm/plugins/reverter/src/reverter/ChangesetIdQuery.java	(revision 21700)
@@ -7,17 +7,25 @@
 import java.text.ParseException;
 
+import javax.swing.ButtonGroup;
 import javax.swing.JFormattedTextField;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
+import javax.swing.JRadioButton;
 
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.tools.GBC;
+import reverter.ChangesetReverter.RevertType;
 
 @SuppressWarnings("serial")
 public class ChangesetIdQuery extends ExtendedDialog {
     private JFormattedTextField tcid = new JFormattedTextField(NumberFormat.getInstance());
+    private ButtonGroup bgRevertType = new ButtonGroup();
+    private JRadioButton rbFull = new JRadioButton(tr("Revert changeset fully"));
+    private JRadioButton rbSelection = new JRadioButton(tr("Revert selection only"));
+    private JRadioButton rbSelectionUndelete =
+        new JRadioButton(tr("Revert selection and restore deleted objects"));
 
-    public int ChangesetId() {
+    public int getChangesetId() {
         try {
           return NumberFormat.getInstance().parse(tcid.getText()).intValue();
@@ -26,6 +34,14 @@
         }
     }
+
+    public RevertType getRevertType() {
+        if (rbFull.isSelected()) return RevertType.FULL;
+        if (rbSelection.isSelected()) return RevertType.SELECTION;
+        if (rbSelectionUndelete.isSelected()) return RevertType.SELECTION_WITH_UNDELETE;
+        return null;
+    }
+
     public ChangesetIdQuery() {
-        super(Main.parent, tr("Objects history"), new String[] {tr("Revert"),tr("Cancel")}, true);
+        super(Main.parent, tr("Revert changeset"), new String[] {tr("Revert"),tr("Cancel")}, true);
         contentConstraints = GBC.eol().fill().insets(10,10,10,5);
         setButtonIcons(new String[] {"ok.png", "cancel.png" });
@@ -33,4 +49,14 @@
         panel.add(new JLabel(tr("Changeset id:")));
         panel.add(tcid, GBC.eol().fill(GBC.HORIZONTAL));
+        
+        bgRevertType.add(rbFull);
+        bgRevertType.add(rbSelection);
+        bgRevertType.add(rbSelectionUndelete);
+        
+        rbFull.setSelected(true);
+        panel.add(rbFull, GBC.eol().insets(0,10,0,0).fill(GBC.HORIZONTAL));
+        panel.add(rbSelection, GBC.eol().fill(GBC.HORIZONTAL));
+        panel.add(rbSelectionUndelete, GBC.eol().fill(GBC.HORIZONTAL));
+        
         setContent(panel);
         setupDialog();        
Index: /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 21699)
+++ /applications/editors/josm/plugins/reverter/src/reverter/ChangesetReverter.java	(revision 21700)
@@ -52,4 +52,5 @@
     public final int changesetId;
     public final Changeset changeset;
+    public final RevertType revertType;
 
     private final OsmDataLayer layer; // data layer associated with reverter 
@@ -107,4 +108,20 @@
     
     /**
+     * Checks if {@see ChangesetDataSetEntry} conforms to current RevertType
+     * @param entry entry to be checked
+     * @return <code>true</code> if {@see ChangesetDataSetEntry} conforms to current RevertType 
+     */
+    private boolean CheckOsmChangeEntry(ChangesetDataSetEntry entry) {
+        if (revertType == RevertType.FULL) return true;
+        if (revertType == RevertType.SELECTION_WITH_UNDELETE &&
+                entry.getModificationType() == ChangesetModificationType.DELETED) {
+            return true;
+        }
+        OsmPrimitive p = ds.getPrimitiveById(entry.getPrimitive().getPrimitiveId());
+        if (p == null) return false;
+        return p.isSelected();
+    }
+    
+    /**
      * creates a reverter for specific changeset and fetches initial data
      * @param changesetId
@@ -112,8 +129,10 @@
      * @throws OsmTransferException
      */
-    public ChangesetReverter(int changesetId, ProgressMonitor monitor) throws OsmTransferException {
+    public ChangesetReverter(int changesetId, RevertType revertType, ProgressMonitor monitor)
+            throws OsmTransferException {
         this.changesetId = changesetId;
         this.layer = Main.main.getEditLayer();
         this.ds = layer.data;
+        this.revertType = revertType;
 
         OsmServerChangesetReader csr = new OsmServerChangesetReader();
@@ -129,4 +148,5 @@
         for (Iterator<ChangesetDataSetEntry> it = cds.iterator();it.hasNext();) {
             ChangesetDataSetEntry entry = it.next();
+            if (!CheckOsmChangeEntry(entry)) continue;
             if (entry.getModificationType() == ChangesetModificationType.CREATED) {
                 created.add(entry.getPrimitive());
@@ -290,4 +310,5 @@
         for (Iterator<ChangesetDataSetEntry> it = cds.iterator();it.hasNext();) {
             ChangesetDataSetEntry entry = it.next();
+            if (!CheckOsmChangeEntry(entry)) continue;
             HistoryOsmPrimitive hp = entry.getPrimitive();
             OsmPrimitive dp = ds.getPrimitiveById(hp.getPrimitiveId());
@@ -323,5 +344,5 @@
                 if (nds.getPrimitiveById(referrer) != null)
                     continue; /* object is going to be modified so it cannot refer to
-                               * objects created in same changeset
+                               * objects created in changeset to be reverted
                                */
                 if (!conflicted.contains(p)) {
Index: /applications/editors/josm/plugins/reverter/src/reverter/PrimitiveIdVersion.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/PrimitiveIdVersion.java	(revision 21699)
+++ /applications/editors/josm/plugins/reverter/src/reverter/PrimitiveIdVersion.java	(revision 21700)
@@ -2,5 +2,4 @@
 
 import org.openstreetmap.josm.data.osm.PrimitiveId;
-import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
Index: /applications/editors/josm/plugins/reverter/src/reverter/RevertChangesetAction.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/RevertChangesetAction.java	(revision 21699)
+++ /applications/editors/josm/plugins/reverter/src/reverter/RevertChangesetAction.java	(revision 21700)
@@ -14,9 +14,9 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.tools.Shortcut;
+import reverter.ChangesetReverter.RevertType;
 
 @SuppressWarnings("serial")
@@ -40,14 +40,17 @@
         if (getCurrentDataSet() == null)
             return;
-        ChangesetIdQuery dlg = new ChangesetIdQuery();
+        final ChangesetIdQuery dlg = new ChangesetIdQuery();
         dlg.setVisible(true);
         if (dlg.getValue() != 1) return;
-        final int changesetId = dlg.ChangesetId();
+        final int changesetId = dlg.getChangesetId();
+        final RevertType revertType = dlg.getRevertType();
         if (changesetId == 0) return;
+        if (revertType == null) return;
+        
         Main.worker.submit(new PleaseWaitRunnable(tr("Reverting...")) {
             private ChangesetReverter rev;
             private boolean downloadConfirmed = false;
             
-            private boolean checkMissing() throws OsmTransferException {
+            private boolean checkAndDownloadMissing() throws OsmTransferException {
                 if (!rev.hasMissingObjects()) return true;
                 if (!downloadConfirmed) {
@@ -65,24 +68,34 @@
                     monitor.close();
                 }
-                return true;
+                return !monitor.isCancelled();
             }
             
             @Override
             protected void realRun() throws OsmTransferException {
-                progressMonitor.indeterminateSubTask("Downloading changeset");
-                rev = new ChangesetReverter(changesetId, NullProgressMonitor.INSTANCE);
+                progressMonitor.indeterminateSubTask(tr("Downloading changeset"));
+                rev = new ChangesetReverter(changesetId, revertType,
+                        progressMonitor.createSubTaskMonitor(0, true));
                 if (progressMonitor.isCancelled()) return;
-                rev.checkMissingDeleted();
-                // Don't ask user to download primitives going to be undeleted
-                rev.downloadMissingPrimitives(progressMonitor.createSubTaskMonitor(0, false));
-                if (progressMonitor.isCancelled()) return;
+
+                // Check missing objects
                 rev.checkMissingCreated();
                 rev.checkMissingUpdated();
-                if (!checkMissing()) return;
+                if (rev.hasMissingObjects()) {
+                    // If missing created or updated objects, ask user
+                    rev.checkMissingDeleted();
+                    if (!checkAndDownloadMissing()) return;
+                } else {
+                    // Don't ask user to download primitives going to be undeleted
+                    rev.checkMissingDeleted();
+                    rev.downloadMissingPrimitives(progressMonitor.createSubTaskMonitor(0, false));
+                }
+                
+                if (progressMonitor.isCancelled()) return;
                 rev.downloadObjectsHistory(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
                 if (progressMonitor.isCancelled()) return;
-                if (!checkMissing()) return;
+                if (!checkAndDownloadMissing()) return;
                 List<Command> cmds = rev.getCommands();
-                Command cmd = new SequenceCommand(tr("Revert changeset #{0}",changesetId),cmds);
+                Command cmd = new SequenceCommand(tr(revertType == RevertType.FULL ? "Revert changeset #{0}" : 
+                        "Partially revert changeset #{0}",changesetId),cmds);
                 Main.main.undoRedo.add(cmd);
             }
Index: /applications/editors/josm/plugins/reverter/src/reverter/ReverterUploadHook.java
===================================================================
--- /applications/editors/josm/plugins/reverter/src/reverter/ReverterUploadHook.java	(revision 21699)
+++ /applications/editors/josm/plugins/reverter/src/reverter/ReverterUploadHook.java	(revision 21700)
@@ -6,9 +6,4 @@
 import java.util.Collections;
 import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map.Entry;
 
 import javax.swing.JOptionPane;
