Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 4627)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/Multipolygon.java	(revision 4628)
@@ -9,4 +9,5 @@
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
@@ -172,12 +173,14 @@
 
         public final Path2D.Double poly;
-        public final boolean selected;
+        public boolean selected;
         private Rectangle2D bounds;
-
-        public PolyData(JoinedWay joinedWay) {
-            this(joinedWay.getNodes(), joinedWay.isSelected());
-        }
-
-        public PolyData(List<Node> nodes, boolean selected) {
+        private final Collection<Way> ways;
+
+        public PolyData(JoinedWay joinedWay, Collection<Way> refWays) {
+            this(joinedWay.getNodes(), joinedWay.isSelected(), refWays);
+        }
+
+        public PolyData(List<Node> nodes, boolean selected, Collection<Way> refWays) {
+            this.ways = Collections.unmodifiableCollection(refWays);
             this.selected = selected;
             boolean initial = true;
@@ -200,4 +203,5 @@
             this.selected = copy.selected;
             this.poly = (Double) copy.poly.clone();
+            this.ways = new ArrayList<Way>(copy.ways);
         }
         
@@ -235,4 +239,8 @@
             return bounds;
         }
+        
+        public Collection<Way> getWays() {
+            return ways;
+        }
     }
 
@@ -282,5 +290,5 @@
         for (Way way: ways) {
             if (way.isClosed()) {
-                result.add(new PolyData(way.getNodes(), way.isSelected()));
+                result.add(new PolyData(way.getNodes(), way.isSelected(), Collections.singleton(way)));
             } else {
                 waysToJoin.add(way);
@@ -289,5 +297,5 @@
 
         for (JoinedWay jw: joinWays(waysToJoin)) {
-            result.add(new PolyData(jw));
+            result.add(new PolyData(jw, waysToJoin));
         }
     }
@@ -449,4 +457,8 @@
             }
         }
+        
+        // Clear inner and outer polygons to reduce memory footprint
+        innerPolygons.clear();
+        outerPolygons.clear();
     }
 
@@ -458,5 +470,5 @@
         return innerWays;
     }
-
+/*
     public List<PolyData> getInnerPolygons() {
         return innerPolygons;
@@ -466,5 +478,5 @@
         return outerPolygons;
     }
-
+*/
     public List<PolyData> getCombinedPolygons() {
         return combinedPolygons;
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java	(revision 4627)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/relations/MultipolygonCache.java	(revision 4628)
@@ -4,8 +4,10 @@
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -22,4 +24,5 @@
 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
+import org.openstreetmap.josm.data.osm.visitor.paint.relations.Multipolygon.PolyData;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
@@ -33,13 +36,17 @@
  * 
  */
-public class MultipolygonCache implements DataSetListener, LayerChangeListener, ProjectionChangeListener {
+public class MultipolygonCache implements DataSetListener, LayerChangeListener, ProjectionChangeListener, SelectionChangedListener {
 
     private static final MultipolygonCache instance = new MultipolygonCache(); 
     
     private final Map<NavigatableComponent, Map<DataSet, Map<Relation, Multipolygon>>> cache;
+    
+    private final Collection<PolyData> selectedPolyData;
     
     private MultipolygonCache() {
         this.cache = new HashMap<NavigatableComponent, Map<DataSet, Map<Relation, Multipolygon>>>();
+        this.selectedPolyData = new ArrayList<Multipolygon.PolyData>();
         Main.addProjectionChangeListener(this);
+        DataSet.addSelectionListener(this);
     }
 
@@ -66,4 +73,9 @@
             if (multipolygon == null || forceRefresh) {
                 map2.put(r, multipolygon = new Multipolygon(r));
+                for (PolyData pd : multipolygon.getCombinedPolygons()) {
+                    if (pd.selected) {
+                        selectedPolyData.add(pd);
+                    }
+                }
             }
         }
@@ -157,35 +169,35 @@
     @Override
     public void primitivesRemoved(PrimitivesRemovedEvent event) {
-        removeMultipolygonsReferringTo(event);
+        removeMultipolygonsReferringTo(event);// FIXME: See if it is possible to update only concerned PolyData
     }
 
     @Override
     public void tagsChanged(TagsChangedEvent event) {
-        removeMultipolygonsReferringTo(event);
+        //removeMultipolygonsReferringTo(event);
     }
 
     @Override
     public void nodeMoved(NodeMovedEvent event) {
-        removeMultipolygonsReferringTo(event);
+        removeMultipolygonsReferringTo(event);// FIXME: See if it is possible to update only concerned PolyData
     }
 
     @Override
     public void wayNodesChanged(WayNodesChangedEvent event) {
-        removeMultipolygonsReferringTo(event);
+        removeMultipolygonsReferringTo(event);// FIXME: See if it is possible to update only concerned PolyData
     }
 
     @Override
     public void relationMembersChanged(RelationMembersChangedEvent event) {
-        removeMultipolygonsReferringTo(event);
+        removeMultipolygonsReferringTo(event);// FIXME: See if it is possible to update only concerned PolyData
     }
 
     @Override
     public void otherDatasetChange(AbstractDatasetChangedEvent event) {
-        removeMultipolygonsReferringTo(event);
+        removeMultipolygonsReferringTo(event);// FIXME: See if it is possible to update only concerned PolyData
     }
 
     @Override
     public void dataChanged(DataChangedEvent event) {
-        removeMultipolygonsReferringTo(event);
+        removeMultipolygonsReferringTo(event);// FIXME: See if it is possible to update only concerned PolyData
     }
 
@@ -211,3 +223,40 @@
         clear();
     }
+
+    @Override
+    public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
+        
+        for (Iterator<PolyData> it = selectedPolyData.iterator(); it.hasNext();) {
+            it.next().selected = false;
+            it.remove();
+        }
+        
+        DataSet ds = null;
+        Collection<Map<Relation, Multipolygon>> maps = null;
+        for (OsmPrimitive p : newSelection) {
+            if (p instanceof Way && p.getDataSet() != null) {
+                if (ds == null) {
+                    ds = p.getDataSet();
+                }
+                for (OsmPrimitive ref : p.getReferrers()) {
+                    if (isMultipolygon(ref)) {
+                        if (maps == null) {
+                            maps = getMapsFor(ds);
+                        }
+                        for (Map<Relation, Multipolygon> map : maps) {
+                            Multipolygon multipolygon = map.get(ref);
+                            if (multipolygon != null) {
+                                for (PolyData pd : multipolygon.getCombinedPolygons()) {
+                                    if (pd.getWays().contains(p)) {
+                                        pd.selected = true;
+                                        selectedPolyData.add(pd);
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
 }
