Index: /applications/editors/josm/plugins/terracer/src/terracer/HouseNumberInputHandler.java
===================================================================
--- /applications/editors/josm/plugins/terracer/src/terracer/HouseNumberInputHandler.java	(revision 29508)
+++ /applications/editors/josm/plugins/terracer/src/terracer/HouseNumberInputHandler.java	(revision 29509)
@@ -27,4 +27,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.corrector.UserCancelException;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -304,17 +305,21 @@
                     saveValues();
 
-                    terracerAction.terraceBuilding(
-                        outline,
-                        init,
-                        street,
-                        associatedStreet,
-                        segments(),
-                        dialog.lo.getText(),
-                        dialog.hi.getText(),
-                        stepSize(),
-                        housenumbers,
-                        streetName(),
-                        doHandleRelation(),
-                        doDeleteOutline());
+                    try {
+                        terracerAction.terraceBuilding(
+                            outline,
+                            init,
+                            street,
+                            associatedStreet,
+                            segments(),
+                            dialog.lo.getText(),
+                            dialog.hi.getText(),
+                            stepSize(),
+                            housenumbers,
+                            streetName(),
+                            doHandleRelation(),
+                            doDeleteOutline());
+                    } catch (UserCancelException ex) {
+                        // Ignore
+                    }
 
                     this.dialog.dispose();
Index: /applications/editors/josm/plugins/terracer/src/terracer/TerracerAction.java
===================================================================
--- /applications/editors/josm/plugins/terracer/src/terracer/TerracerAction.java	(revision 29508)
+++ /applications/editors/josm/plugins/terracer/src/terracer/TerracerAction.java	(revision 29509)
@@ -14,4 +14,5 @@
 import java.awt.event.KeyEvent;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -21,5 +22,4 @@
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map.Entry;
 import java.util.Set;
 import java.util.regex.Matcher;
@@ -36,11 +36,14 @@
 import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
+import org.openstreetmap.josm.corrector.UserCancelException;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.TagCollection;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.ExtendedDialog;
+import org.openstreetmap.josm.gui.conflict.tags.CombinePrimitiveResolverDialog;
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -216,9 +219,15 @@
         if (housenumbers.size() == 1) {
             // Special case of one outline and one address node.
-            // Don't open the dialogue
-            terraceBuilding(outline, init, street, associatedStreet, 0, null, null, 0, housenumbers, streetname, associatedStreet != null, false);
+            // Don't open the dialog
+            try {
+                terraceBuilding(outline, init, street, associatedStreet, 0, null, null, 0, housenumbers, streetname, associatedStreet != null, false);
+            } catch (UserCancelException ex) {
+                // Ignore
+            } finally {
+                this.commands.clear();
+                this.commands = null;
+            }
         } else {
-            String title = trn("Change {0} object", "Change {0} objects", sel
-                    .size(), sel.size());
+            String title = trn("Change {0} object", "Change {0} objects", sel.size(), sel.size());
             // show input dialog.
             new HouseNumberInputHandler(this, outline, init, street, streetname,
@@ -303,4 +312,5 @@
      *        existing relation
      * @param deleteOutline If the outline way should be deleted when done
+     * @throws UserCancelException 
      */
     public void terraceBuilding(Way outline,
@@ -315,5 +325,5 @@
                 String streetName,
                 boolean handleRelations,
-                boolean deleteOutline) {
+                boolean deleteOutline) throws UserCancelException {
         final int nb;
         Integer to = null, from = null;
@@ -386,20 +396,7 @@
                 // add the tags of the outline to each building (e.g. source=*)
                 TagCollection.from(outline).applyTo(terr);
-
-                String number = null;
-                Set<Entry<String, String>> additionalKeys = null;
-                if (housenumbers.isEmpty()) {
-                    if (from != null) {
-                        // only, if the user has specified house numbers
-                        number = Integer.toString(from + i * step);
-                    }
-                } else {
-                    number = housenumbers.get(i).get("addr:housenumber");
-                    additionalKeys = housenumbers.get(i).getKeys().entrySet();
-                }
-
-                addressBuilding(terr, street, streetName, number, additionalKeys, associatedStreet);
-
-                ways.add(terr);
+                ways.add(addressBuilding(terr, street, streetName, associatedStreet, housenumbers, i, 
+                        from != null ? Integer.toString(from + i * step) : null));
+                
                 this.commands.add(new AddCommand(terr));
             }
@@ -420,15 +417,5 @@
         } else {
             // Single building, just add the address details
-            String number = null;
-            if (housenumbers == null || housenumbers.isEmpty()) {
-                number = From;
-            } else {
-                Node firstHouseNum = housenumbers.iterator().next();
-                if (firstHouseNum != null) {
-                    number = firstHouseNum.get("addr:housenumber");
-                }
-            }
-            addressBuilding(outline, street, streetName, number, null, associatedStreet);
-            ways.add(outline);
+            ways.add(addressBuilding(outline, street, streetName, associatedStreet, housenumbers, 0, From));
         }
 
@@ -478,5 +465,5 @@
         }
     }
-
+    
     /**
      * Adds address details to a single building
@@ -485,26 +472,34 @@
      * @param street The street, the buildings belong to (may be null)
      * @param streetName the name of a street (may be null). Used if not null and street is null.
-     * @param number The house number
-     * @param additionalKeys More keys to be copied onto the new outline
      * @param associatedStreet The associated street. Used to determine if addr:street should be set or not.
-     */
-    private void addressBuilding(Way outline, Way street, String streetName,
-            String number, Set<Entry<String, String>> additionalKeys, Relation associatedStreet) {
-        if (number != null) {
-            // only, if the user has specified house numbers
-            this.commands.add(new ChangePropertyCommand(outline, "addr:housenumber", number));
-        }
+     * @return {@code outline}
+     * @throws UserCancelException 
+     */
+    private Way addressBuilding(Way outline, Way street, String streetName, Relation associatedStreet, ArrayList<Node> housenumbers, int i, String defaultNumber) throws UserCancelException {
+        Node houseNum = (housenumbers != null && i >= 0 && i < housenumbers.size()) ? housenumbers.get(i) : null;
         boolean buildingAdded = false;
-        if (additionalKeys != null) {
-            for (Entry<String, String> entry : additionalKeys) {
-                String key = entry.getKey();
-                if ("building".equals(key)) {
-                    buildingAdded = true;
-                }
-                this.commands.add(new ChangePropertyCommand(outline, key, entry.getValue()));
-            }
+        boolean numberAdded = false;
+        if (houseNum != null) {
+            Collection<OsmPrimitive> primitives = Arrays.asList(new OsmPrimitive[]{houseNum, outline});
+            
+            TagCollection tagsToCopy = TagCollection.unionOfAllPrimitives(primitives).getTagsFor(houseNum.keySet());
+            TagCollection tagsInConflict = tagsToCopy.getTagsFor(tagsToCopy.getKeysWithMultipleValues());
+            tagsToCopy = tagsToCopy.minus(tagsInConflict).minus(TagCollection.from(outline));
+            
+            for (Tag tag : tagsToCopy) {
+                this.commands.add(new ChangePropertyCommand(outline, tag.getKey(), tag.getValue()));
+            }
+            
+            this.commands.addAll(CombinePrimitiveResolverDialog.launchIfNecessary(
+                    tagsInConflict, primitives, Collections.singleton(outline)));
+            
+            buildingAdded = houseNum.hasKey("building");
+            numberAdded = houseNum.hasKey("addr:housenumber");
         }
         if (!outline.hasKey("building") && !buildingAdded) {
             this.commands.add(new ChangePropertyCommand(outline, "building", "yes"));
+        }
+        if (defaultNumber != null && !numberAdded) {
+            this.commands.add(new ChangePropertyCommand(outline, "addr:housenumber", defaultNumber));
         }
         // Only put addr:street if no relation exists or if it has no name
@@ -516,4 +511,5 @@
             }
         }
+        return outline;
     }
 
