Index: src/org/openstreetmap/josm/io/IncompleteDownloader.java
===================================================================
--- src/org/openstreetmap/josm/io/IncompleteDownloader.java	(revision 218)
+++ src/org/openstreetmap/josm/io/IncompleteDownloader.java	(revision 219)
@@ -10,4 +10,5 @@
 import java.io.StringReader;
 import java.util.Collection;
+import java.util.ArrayList;
 
 import org.openstreetmap.josm.Main;
@@ -19,4 +20,9 @@
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
+
+import javax.swing.JOptionPane;
+import org.openstreetmap.josm.command.ChangeCommand;
+import org.openstreetmap.josm.command.Command;
+import org.openstreetmap.josm.command.SequenceCommand;
 
 import uk.co.wilson.xml.MinML2;
@@ -48,8 +54,14 @@
 		Main.pleaseWaitDlg.progress.setMaximum(toDownload.size());
 		Main.pleaseWaitDlg.progress.setValue(0);
+		ArrayList<Command> cmds = new ArrayList<Command>();
 		int i = 0;
 		try {
 			for (Way w : toDownload) {
-				download(w);
+				// if some of the way's segments fail to download and the user
+				// decides to delete them, the download method will return an
+				// "edit way" command.
+				Command cmd = download(w); 
+				if (cmd != null)
+					cmds.add(cmd);
 				Main.pleaseWaitDlg.progress.setValue(++i);
 			}
@@ -63,4 +75,6 @@
 				throw (e instanceof RuntimeException) ? (RuntimeException)e : new RuntimeException(e);
 		}
+		if (cmds.size() > 0)
+			Main.main.editLayer().add(new SequenceCommand(tr("Fix data errors"), cmds));
 	}
 
@@ -75,16 +89,43 @@
 	}
 
-	private void download(Way w) throws IOException, SAXException {
+	/**
+	 * Downloads all missing segments from the given way. If segments fail do download, 
+	 * offers the user a chance to delete those segments from the way.
+	 * 
+	 * @param w way to complete
+	 * @return an "edit way" command if the user decided to delete segments
+	 * @throws IOException
+	 * @throws SAXException
+	 */
+	private Command download(Way w) throws IOException, SAXException {
 		// get all the segments
+		Way newway = null;
 		for (Segment s : w.segments) {
 			if (!s.incomplete)
 				continue;
 			BufferedReader segReader;
-		    try {
-		    	segReader = new BufferedReader(new InputStreamReader(getInputStream("segment/"+s.id, null), "UTF-8"));
-	        } catch (FileNotFoundException e) {
-		        e.printStackTrace();
-		        throw new IOException(tr("Data error: Segment {0} is deleted but part of Way {1}", s.id, w.id));
-	        }
+			try {
+				segReader = new BufferedReader(new InputStreamReader(getInputStream("segment/"+s.id, null), "UTF-8"));
+			} catch (FileNotFoundException e) {
+				Object[] options = {"Delete", "Ignore", "Abort"};
+				int n = JOptionPane.showOptionDialog(Main.parent,
+						tr("Segment {0} is deleted but part of Way {1}",s.id, w.id),
+						tr("Data error"),
+						JOptionPane.YES_NO_CANCEL_OPTION,
+						JOptionPane.ERROR_MESSAGE,
+						null, options, options[2]);
+				if (n == 0)
+				{
+					if( newway == null )
+						newway = new Way(w);
+					newway.segments.remove(s);
+				}
+				else if (n == 2)
+				{
+					e.printStackTrace();
+					throw new IOException(tr("Data error: Segment {0} is deleted but part of Way {1}", s.id, w.id));
+				}
+				continue;
+			}
 			StringBuilder segBuilder = new StringBuilder();
 			for (String line = segReader.readLine(); line != null; line = segReader.readLine())
@@ -100,4 +141,7 @@
 			readSegment(segBuilder.toString()).visit(merger);
 		}
+		if( newway != null )
+			return new ChangeCommand(w, newway);
+		return null;
 	}
 
