Index: trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 2609)
+++ trunk/src/org/openstreetmap/josm/actions/JoinAreasAction.java	(revision 2610)
@@ -9,4 +9,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.awt.geom.Area;
 import java.awt.geom.Line2D;
 import java.util.ArrayList;
@@ -34,10 +35,8 @@
 import org.openstreetmap.josm.command.DeleteCommand;
 import org.openstreetmap.josm.command.SequenceCommand;
-import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.UndoRedoHandler;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.DataSource;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -47,5 +46,4 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -109,27 +107,19 @@
      */
     public void actionPerformed(ActionEvent e) {
-        Collection<OsmPrimitive> selection = Main.main.getCurrentDataSet().getSelectedWays();
-
-        int ways = 0;
-        Way[] selWays = new Way[2];
-
-        LinkedList<Bounds> bounds = new LinkedList<Bounds>();
-        OsmDataLayer dataLayer = Main.map.mapView.getEditLayer();
-        for (DataSource ds : dataLayer.data.dataSources) {
-            if (ds.bounds != null) {
-                bounds.add(ds.bounds);
-            }
-        }
-
-        boolean askedAlready = false;
-        for (OsmPrimitive prim : selection) {
-            Way way = (Way) prim;
-
-            // Too many ways
-            if(ways == 2) {
-                JOptionPane.showMessageDialog(Main.parent, tr("Only up to two areas can be joined at the moment."));
-                return;
-            }
-
+        LinkedList<Way> ways = new LinkedList<Way>(Main.main.getCurrentDataSet().getSelectedWays());
+
+        if (ways.isEmpty()) {
+            JOptionPane.showMessageDialog(Main.parent, tr("Please select at least one closed way that should be joined."));
+            return;
+        }
+
+        // Too many ways
+        if(ways.size() > 2) {
+            JOptionPane.showMessageDialog(Main.parent, tr("Only up to two areas can be joined at the moment."));
+            return;
+        }
+
+        List<Node> allNodes = new ArrayList<Node>();
+        for (Way way: ways) {
             if(!way.isClosed()) {
                 JOptionPane.showMessageDialog(Main.parent, tr("\"{0}\" is not closed and therefore can't be joined.", way.getName()));
@@ -137,18 +127,12 @@
             }
 
-            // This is copied from SimplifyAction and should be probably ported to tools
-            for (Node node : way.getNodes()) {
-                if(askedAlready) {
-                    break;
-                }
-                boolean isInsideOneBoundingBox = false;
-                for (Bounds b : bounds) {
-                    if (b.contains(node.getCoor())) {
-                        isInsideOneBoundingBox = true;
-                        break;
-                    }
-                }
-
-                if (!isInsideOneBoundingBox) {
+            allNodes.addAll(way.getNodes());
+        }
+
+        // TODO: Only display this warning when nodes outside dataSourceArea are deleted
+        Area dataSourceArea = Main.main.getCurrentDataSet().getDataSourceArea();
+        if (dataSourceArea != null) {
+            for (Node node: allNodes) {
+                if (!dataSourceArea.contains(node.getCoor())) {
                     int option = JOptionPane.showConfirmDialog(Main.parent,
                             tr("The selected way(s) have nodes outside of the downloaded data region.\n"
@@ -159,19 +143,10 @@
 
                     if (option != JOptionPane.YES_OPTION) return;
-                    askedAlready = true;
                     break;
                 }
             }
-
-            selWays[ways] = way;
-            ways++;
-        }
-
-        if (ways < 1) {
-            JOptionPane.showMessageDialog(Main.parent, tr("Please select at least one closed way the should be joined."));
-            return;
-        }
-
-        if(joinAreas(selWays[0], selWays[ways == 2 ? 1 : 0])) {
+        }
+
+        if(joinAreas(ways.getFirst(), ways.getLast())) {
             Main.map.mapView.repaint();
             DataSet ds = Main.main.getCurrentDataSet();
@@ -459,6 +434,7 @@
         ArrayList<RelationRole> result = new ArrayList<RelationRole>();
         for (Relation r : Main.main.getCurrentDataSet().getRelations()) {
-            if (r.isDeleted())
+            if (r.isDeleted()) {
                 continue;
+            }
             for (RelationMember rm : r.getMembers()) {
                 if (rm.getMember() != osm) {
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2609)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 2610)
@@ -293,5 +293,5 @@
      * Return selected nodes.
      */
-    public Collection<OsmPrimitive> getSelectedNodes() {
+    public Collection<Node> getSelectedNodes() {
         return getSelected(nodes);
     }
@@ -300,5 +300,5 @@
      * Return selected ways.
      */
-    public Collection<OsmPrimitive> getSelectedWays() {
+    public Collection<Way> getSelectedWays() {
         return getSelected(ways);
     }
@@ -307,5 +307,5 @@
      * Return selected relations.
      */
-    public Collection<OsmPrimitive> getSelectedRelations() {
+    public Collection<Relation> getSelectedRelations() {
         return getSelected(relations);
     }
@@ -315,12 +315,12 @@
      * @param list The collection from which the selected items are returned.
      */
-    private Collection<OsmPrimitive> getSelected(Collection<? extends OsmPrimitive> list) {
+    private <T extends OsmPrimitive> Collection<T> getSelected(Collection<T> list) {
         if (list == null)
-            return new LinkedList<OsmPrimitive>();
+            return new LinkedList<T>();
         // getSelected() is called with large lists, so
         // creating the return list from the selection
         // should be faster most of the time.
-        Collection<OsmPrimitive> sel = new LinkedHashSet<OsmPrimitive>(selectedPrimitives);
-        sel.retainAll(list);
+        Collection<T> sel = new LinkedHashSet<T>(list);
+        sel.retainAll(selectedPrimitives);
         return sel;
     }
