Index: applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/dumbutils/ReplaceGeometryAction.java
===================================================================
--- applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/dumbutils/ReplaceGeometryAction.java	(revision 27937)
+++ applications/editors/josm/plugins/utilsplugin2/src/utilsplugin2/dumbutils/ReplaceGeometryAction.java	(revision 27971)
@@ -80,9 +80,9 @@
      * Replace or upgrade a node to a way or multipolygon
      *
-     * @param node
-     * @param target
+     * @param subjectNode node to be replaced
+     * @param referenceObject object with greater spatial quality
      */
-    public boolean replaceNode(Node node, OsmPrimitive target) {
-        if (!OsmPrimitive.getFilteredList(node.getReferrers(), Way.class).isEmpty()) {
+    public boolean replaceNode(Node subjectNode, OsmPrimitive referenceObject) {
+        if (!OsmPrimitive.getFilteredList(subjectNode.getReferrers(), Way.class).isEmpty()) {
             JOptionPane.showMessageDialog(Main.parent, tr("Node belongs to way(s), cannot replace."),
                     TITLE, JOptionPane.INFORMATION_MESSAGE);
@@ -90,5 +90,5 @@
         }
 
-        if (target instanceof Relation && !((Relation) target).isMultipolygon()) {
+        if (referenceObject instanceof Relation && !((Relation) referenceObject).isMultipolygon()) {
             JOptionPane.showMessageDialog(Main.parent, tr("Relation is not a multipolygon, cannot be used as a replacement."),
                     TITLE, JOptionPane.INFORMATION_MESSAGE);
@@ -98,11 +98,11 @@
         Node nodeToReplace = null;
         // see if we need to replace a node in the replacement way to preserve connection in history
-        if (!node.isNew()) {
+        if (!subjectNode.isNew()) {
             // Prepare a list of nodes that are not important
             Collection<Node> nodePool = new HashSet<Node>();
-            if (target instanceof Way) {
-                nodePool.addAll(getUnimportantNodes((Way) target));
-            } else if (target instanceof Relation) {
-                for (RelationMember member : ((Relation) target).getMembers()) {
+            if (referenceObject instanceof Way) {
+                nodePool.addAll(getUnimportantNodes((Way) referenceObject));
+            } else if (referenceObject instanceof Relation) {
+                for (RelationMember member : ((Relation) referenceObject).getMembers()) {
                     if ((member.getRole().equals("outer") || member.getRole().equals("inner"))
                             && member.isWay()) {
@@ -115,12 +115,12 @@
                 assert false;
             }
-            nodeToReplace = findNearestNode(node, nodePool);
+            nodeToReplace = findNearestNode(subjectNode, nodePool);
         }
 
         List<Command> commands = new ArrayList<Command>();
-        AbstractMap<String, String> nodeTags = (AbstractMap<String, String>) node.getKeys();
+        AbstractMap<String, String> nodeTags = (AbstractMap<String, String>) subjectNode.getKeys();
 
         // merge tags
-        Collection<Command> tagResolutionCommands = getTagConflictResolutionCommands(node, target);
+        Collection<Command> tagResolutionCommands = getTagConflictResolutionCommands(subjectNode, referenceObject);
         if (tagResolutionCommands == null) {
             // user canceled tag merge dialog
@@ -135,11 +135,11 @@
             List<Node> wayNodes = parentWay.getNodes();
             int idx = wayNodes.indexOf(nodeToReplace);
-            wayNodes.set(idx, node);
+            wayNodes.set(idx, subjectNode);
             if (idx == 0 && parentWay.isClosed()) {
                 // node is at start/end of way
-                wayNodes.set(wayNodes.size() - 1, node);
+                wayNodes.set(wayNodes.size() - 1, subjectNode);
             }
             commands.add(new ChangeNodesCommand(parentWay, wayNodes));
-            commands.add(new MoveCommand(node, nodeToReplace.getCoor()));
+            commands.add(new MoveCommand(subjectNode, nodeToReplace.getCoor()));
             commands.add(new DeleteCommand(nodeToReplace));
 
@@ -147,5 +147,5 @@
             if (!nodeTags.isEmpty()) {
                 for (String key : nodeTags.keySet()) {
-                    commands.add(new ChangePropertyCommand(node, key, null));
+                    commands.add(new ChangePropertyCommand(subjectNode, key, null));
                 }
 
@@ -153,11 +153,11 @@
         } else {
             // no node to replace, so just delete the original node
-            commands.add(new DeleteCommand(node));
-        }
-
-        getCurrentDataSet().setSelected(target);
+            commands.add(new DeleteCommand(subjectNode));
+        }
+
+        getCurrentDataSet().setSelected(referenceObject);
 
         Main.main.undoRedo.add(new SequenceCommand(
-                tr("Replace geometry for node {0}", node.getDisplayName(DefaultNameFormatter.getInstance())),
+                tr("Replace geometry for node {0}", subjectNode.getDisplayName(DefaultNameFormatter.getInstance())),
                 commands));
         return true;
@@ -184,8 +184,8 @@
             }
         }
-        Way geometry = selection.get(idxNew);
-        Way way = selection.get(1 - idxNew);
-        
-        if( !overrideNewCheck && (way.isNew() || !geometry.isNew()) ) {
+        Way referenceWay = selection.get(idxNew);
+        Way subjectWay = selection.get(1 - idxNew);
+        
+        if( !overrideNewCheck && (subjectWay.isNew() || !referenceWay.isNew()) ) {
             JOptionPane.showMessageDialog(Main.parent,
                     tr("Please select one way that exists in the database and one new way with correct geometry."),
@@ -193,7 +193,11 @@
             return false;
         }
+        return replaceWayWithWay(subjectWay, referenceWay);
+    }
+    
+    public static boolean replaceWayWithWay(Way subjectWay, Way referenceWay) {
 
         Area a = getCurrentDataSet().getDataSourceArea();
-        if (!isInArea(way, a) || !isInArea(geometry, a)) {
+        if (!isInArea(subjectWay, a) || !isInArea(referenceWay, a)) {
             JOptionPane.showMessageDialog(Main.parent,
                     tr("The ways must be entirely within the downloaded area."),
@@ -202,5 +206,5 @@
         }
         
-        if (hasImportantNode(geometry, way)) {
+        if (hasImportantNode(referenceWay, subjectWay)) {
             JOptionPane.showMessageDialog(Main.parent,
                     tr("The way to be replaced cannot have any nodes with properties or relation memberships unless they belong to both ways."),
@@ -212,5 +216,5 @@
                 
         // merge tags
-        Collection<Command> tagResolutionCommands = getTagConflictResolutionCommands(geometry, way);
+        Collection<Command> tagResolutionCommands = getTagConflictResolutionCommands(referenceWay, subjectWay);
         if (tagResolutionCommands == null) {
             // user canceled tag merge dialog
@@ -220,12 +224,12 @@
         
         // Prepare a list of nodes that are not used anywhere except in the way
-        Collection<Node> nodePool = getUnimportantNodes(way);
+        Collection<Node> nodePool = getUnimportantNodes(subjectWay);
 
         // And the same for geometry, list nodes that can be freely deleted
         Set<Node> geometryPool = new HashSet<Node>();
-        for( Node node : geometry.getNodes() ) {
+        for( Node node : referenceWay.getNodes() ) {
             List<OsmPrimitive> referrers = node.getReferrers();
             if( node.isNew() && !node.isDeleted() && referrers.size() == 1
-                    && referrers.get(0).equals(geometry) && !way.containsNode(node)
+                    && referrers.get(0).equals(referenceWay) && !subjectWay.containsNode(node)
                     && !hasInterestingKey(node))
                 geometryPool.add(node);
@@ -248,5 +252,5 @@
 
         // And prepare a list of nodes with all the replacements
-        List<Node> geometryNodes = geometry.getNodes();
+        List<Node> geometryNodes = referenceWay.getNodes();
         for( int i = 0; i < geometryNodes.size(); i++ )
             if( nodeAssoc.containsKey(geometryNodes.get(i)) )
@@ -254,5 +258,5 @@
 
         // Now do the replacement
-        commands.add(new ChangeNodesCommand(way, geometryNodes));
+        commands.add(new ChangeNodesCommand(subjectWay, geometryNodes));
 
         // Move old nodes to new positions
@@ -261,8 +265,8 @@
 
         // Remove geometry way from selection
-        getCurrentDataSet().clearSelection(geometry);
+        getCurrentDataSet().clearSelection(referenceWay);
 
         // And delete old geometry way
-        commands.add(new DeleteCommand(geometry));
+        commands.add(new DeleteCommand(referenceWay));
 
         // Delete nodes that are not used anymore
@@ -272,5 +276,5 @@
         // Two items in undo stack: change original way and delete geometry way
         Main.main.undoRedo.add(new SequenceCommand(
-                tr("Replace geometry for way {0}", way.getDisplayName(DefaultNameFormatter.getInstance())),
+                tr("Replace geometry for way {0}", subjectWay.getDisplayName(DefaultNameFormatter.getInstance())),
                 commands));
         return true;
@@ -283,5 +287,5 @@
      * @return 
      */
-    protected Collection<Node> getUnimportantNodes(Way way) {
+    protected static Collection<Node> getUnimportantNodes(Way way) {
         Set<Node> nodePool = new HashSet<Node>();
         for (Node n : way.getNodes()) {
@@ -302,5 +306,5 @@
      * @return 
      */
-    protected boolean hasImportantNode(Way geometry, Way way) {
+    protected static boolean hasImportantNode(Way geometry, Way way) {
         for (Node n : way.getNodes()) {
             // if original and replacement way share a node, it's safe to replace
@@ -321,5 +325,5 @@
     }
     
-    protected boolean hasInterestingKey(OsmPrimitive object) {
+    protected static boolean hasInterestingKey(OsmPrimitive object) {
         for (String key : object.getKeys().keySet()) {
             if (!OsmPrimitive.isUninterestingKey(key)) {
@@ -355,9 +359,9 @@
      * needed.
      *
-     * @param source
-     * @param target
+     * @param source object tags are merged from
+     * @param target object tags are merged to
      * @return
      */
-    public List<Command> getTagConflictResolutionCommands(OsmPrimitive source, OsmPrimitive target) {
+    protected static List<Command> getTagConflictResolutionCommands(OsmPrimitive source, OsmPrimitive target) {
         Collection<OsmPrimitive> primitives = Arrays.asList(source, target);
         
@@ -394,5 +398,5 @@
      * @return null if there is no such node.
      */
-    private Node findNearestNode( Node node, Collection<Node> nodes ) {
+    protected static Node findNearestNode( Node node, Collection<Node> nodes ) {
         if( nodes.contains(node) )
             return node;
