Index: applications/editors/josm/plugins/ImproveWayAccuracy/src/org/openstreetmap/josm/plugins/iwa/IWAMode.java
===================================================================
--- applications/editors/josm/plugins/ImproveWayAccuracy/src/org/openstreetmap/josm/plugins/iwa/IWAMode.java	(revision 26610)
+++ applications/editors/josm/plugins/ImproveWayAccuracy/src/org/openstreetmap/josm/plugins/iwa/IWAMode.java	(revision 27474)
@@ -26,6 +26,8 @@
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import javax.swing.JOptionPane;
@@ -36,4 +38,5 @@
 import org.openstreetmap.josm.command.ChangeCommand;
 import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.MoveCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
@@ -80,4 +83,5 @@
     final private Cursor cursorImprove;
     final private Cursor cursorImproveAdd;
+    final private Cursor cursorImproveDelete;
     final private Cursor cursorImproveAddLock;
     final private Cursor cursorImproveLock;
@@ -85,6 +89,5 @@
     private boolean shift = false;
     private boolean ctrl = false;
-    private boolean oldShift = false;
-    private boolean oldCtrl = false;
+    private boolean alt = false;
 
     private final Color guideColor;
@@ -108,5 +111,6 @@
         cursorSelectHover = ImageProvider.getCursor("hand", "mode");
         cursorImprove = ImageProvider.getCursor("crosshair", null);
-        cursorImproveAdd = ImageProvider.getCursor("crosshair", "add_node");
+        cursorImproveAdd = ImageProvider.getCursor("crosshair", "addnode");
+        cursorImproveDelete = ImageProvider.getCursor("crosshair", "delete_node");
         cursorImproveAddLock = ImageProvider.getCursor("crosshair",
                 "add_node_lock");
@@ -355,5 +359,5 @@
             }
 
-            if (ctrl && candidateSegment != null) {
+            if (ctrl && !alt && candidateSegment != null) {
                 // Adding a new node to the highlighted segment
                 // Important: If there are other ways containing the same
@@ -413,4 +417,38 @@
                 Main.main.undoRedo.add(new SequenceCommand(text, virtualCmds));
 
+            } else if(alt && ctrl && candidateNode != null) { 
+            	
+            	//check to see if node has interesting keys
+            	Iterator<String> keyIterator = candidateNode.getKeys().keySet().iterator();
+            	boolean hasTags = false;
+            	while(keyIterator.hasNext()) {
+            		String key = keyIterator.next();
+            		if(!OsmPrimitive.isUninterestingKey(key)) {
+            			hasTags = true;
+            			break;
+            		}
+            	}
+            	
+            	//check to see if node is in use by more than one object
+            	List<OsmPrimitive> referrers = candidateNode.getReferrers();
+            	List<Way> ways = OsmPrimitive.getFilteredList(referrers, Way.class);
+            	if(referrers.size() != 1 || ways.size() != 1) {
+            		JOptionPane.showMessageDialog(Main.parent,
+                            tr("Cannot delete node that is referenced by multiple objects"),
+                            tr("Error"), JOptionPane.ERROR_MESSAGE);
+            	}
+            	else if(hasTags) {
+            		JOptionPane.showMessageDialog(Main.parent,
+                            tr("Cannot delete node that has tags"),
+                            tr("Error"), JOptionPane.ERROR_MESSAGE);
+            	}
+            	else {
+            		List<Node> nodeList = new ArrayList<Node>();
+            		nodeList.add(candidateNode);
+            		Command deleteCmd = DeleteCommand.delete(getEditLayer(), nodeList, true);
+            		Main.main.undoRedo.add(deleteCmd);
+            	}
+            	
+            	
             } else if (candidateNode != null) {
                 // Moving the highlighted node
@@ -450,8 +488,7 @@
     @Override
     protected void updateKeyModifiers(InputEvent e) {
-        oldCtrl = ctrl;
-        oldShift = shift;
         ctrl = (e.getModifiers() & ActionEvent.CTRL_MASK) != 0;
         shift = (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0;
+        alt = (e.getModifiers() & ActionEvent.ALT_MASK) != 0;
     }
 
@@ -469,8 +506,19 @@
                     : cursorSelectHover, this);
         } else if (state == State.improving) {
-            mv.setNewCursor(ctrl ? (shift || dragging ? cursorImproveAddLock
-                    : cursorImproveAdd)
-                    : (shift || dragging ? cursorImproveLock : cursorImprove),
-                    this);
+        	if(alt && ctrl) {
+        		mv.setNewCursor(cursorImproveDelete, this);
+        	} else if(shift || dragging) {
+        		if(ctrl) {
+        			mv.setNewCursor(cursorImproveAddLock, this);
+        		} else {
+        			mv.setNewCursor(cursorImproveLock, this);
+        		}
+        	}
+        	else if(ctrl && !alt){
+        		mv.setNewCursor(cursorImproveAdd, this);
+        	}
+        	else {
+        		mv.setNewCursor(cursorImprove, this);
+        	}
         }
     }
@@ -482,5 +530,4 @@
     public void updateCursorDependentObjectsIfNeeded() {
         if (state == State.improving && (shift || dragging)
-                && (ctrl == oldCtrl)
                 && !(candidateNode == null && candidateSegment == null))
             return;
@@ -495,5 +542,5 @@
             targetWay = IWATargetWayHelper.findWay(mv, mousePos);
         } else if (state == State.improving) {
-            if (ctrl) {
+            if (ctrl && !alt) {
                 candidateSegment = IWATargetWayHelper.findCandidateSegment(mv,
                         targetWay, mousePos);
