Index: trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 15872)
+++ trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 15873)
@@ -20,4 +20,5 @@
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.stream.Collectors;
 
 import javax.swing.JOptionPane;
@@ -641,5 +642,15 @@
         if (removedDuplicates) {
             hasChanges = true;
+            Set<Node> oldNodes = new LinkedHashSet<>();
+            allStartingWays.forEach(w -> oldNodes.addAll(w.getNodes()));
             commitCommands(marktr("Removed duplicate nodes"));
+            // remove now unconnected nodes without tags
+            List<Node> toRemove = oldNodes.stream().filter(
+                    n -> (n.isNew() || !n.isOutsideDownloadArea()) && !n.hasKeys() && n.getReferrers().isEmpty())
+                    .collect(Collectors.toList());
+            if (!toRemove.isEmpty()) {
+                cmds.add(new DeleteCommand(toRemove));
+                commitCommands("Removed  nodes");
+            }
         }
 
@@ -761,13 +772,11 @@
 
     /**
-     * This method removes duplicate points (if any) from the input way.
+     * This method removes duplicate points (if any) from the input ways.
      * @param ways the ways to process
      * @return {@code true} if any changes where made
      */
     private boolean removeDuplicateNodes(List<Way> ways) {
-        //TODO: maybe join nodes with JoinNodesAction, rather than reconnect the ways.
-
         Map<Node, Node> nodeMap = new TreeMap<>(new NodePositionComparator());
-        int totalNodesRemoved = 0;
+        int totalWaysModified = 0;
 
         for (Way way : ways) {
@@ -776,36 +785,30 @@
             }
 
-            int nodesRemoved = 0;
             List<Node> newNodes = new ArrayList<>();
             Node prevNode = null;
+            boolean modifyWay = false;
 
             for (Node node : way.getNodes()) {
-                if (!nodeMap.containsKey(node)) {
+                Node representator = nodeMap.get(node);
+                if (representator == null) {
                     //new node
                     nodeMap.put(node, node);
-
-                    //avoid duplicate nodes
-                    if (prevNode != node) {
-                        newNodes.add(node);
-                    } else {
-                        nodesRemoved++;
-                    }
+                    representator = node;
                 } else {
                     //node with same coordinates already exists, substitute with existing node
-                    Node representator = nodeMap.get(node);
-
                     if (representator != node) {
-                        nodesRemoved++;
+                        modifyWay = true;
                     }
-
-                    //avoid duplicate node
-                    if (prevNode != representator) {
-                        newNodes.add(representator);
-                    }
-                }
-                prevNode = node;
-            }
-
-            if (nodesRemoved > 0) {
+                }
+                //avoid duplicate node
+                if (prevNode != representator) {
+                    newNodes.add(representator);
+                    prevNode = representator;
+                } else {
+                    modifyWay = true;
+                }
+            }
+
+            if (modifyWay) {
 
                 if (newNodes.size() == 1) { //all nodes in the same coordinate - add one more node, to have closed way.
@@ -816,9 +819,8 @@
                 newWay.setNodes(newNodes);
                 cmds.add(new ChangeCommand(way, newWay));
-                totalNodesRemoved += nodesRemoved;
-            }
-        }
-
-        return totalNodesRemoved > 0;
+                ++totalWaysModified;
+            }
+        }
+        return totalWaysModified > 0;
     }
 
