Index: trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java	(revision 2276)
+++ trunk/src/org/openstreetmap/josm/actions/UpdateSelectionAction.java	(revision 2277)
@@ -25,4 +25,5 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.MultiFetchServerObjectReader;
+import org.openstreetmap.josm.io.OsmServerObjectReader;
 import org.openstreetmap.josm.io.OsmTransferException;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -79,5 +80,5 @@
         OsmPrimitive primitive = getEditLayer().data.getPrimitiveById(id, type);
         if (primitive == null)
-            throw new IllegalStateException(tr("Didn't find a primitive with id {0} in the current dataset", id));
+            throw new IllegalStateException(tr("Didn''t find an object with id {0} in the current dataset", id));
         updatePrimitives(Collections.singleton(primitive));
     }
@@ -212,4 +213,16 @@
                 MergeVisitor merger = new MergeVisitor(ds, theirDataSet);
                 merger.merge();
+                // a ways loaded with MultiFetch may be incomplete because at least one of its
+                // nodes isn't present in the local data set. We therefore fully load all
+                // incomplete ways.
+                //
+                for (Way w: ds.ways) {
+                    if (w.incomplete) {
+                        OsmServerObjectReader reader = new OsmServerObjectReader(w.getId(), OsmPrimitiveType.WAY, true /* full */);
+                        theirDataSet = reader.parseOsm(progressMonitor.createSubTaskMonitor(ProgressMonitor.ALL_TICKS, false));
+                        merger = new MergeVisitor(ds, theirDataSet);
+                        merger.merge();
+                    }
+                }
             } catch(Exception e) {
                 if (canceled)
