Index: /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 1951)
@@ -7,4 +7,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -225,6 +226,5 @@
         // modify all relations containing the now-deleted ways
         for (Relation r : relationsUsingWays) {
-            Relation newRel = new Relation(r);
-            newRel.members.clear();
+            List<RelationMember> newMembers = new ArrayList<RelationMember>();
             HashSet<String> rolesToReAdd = new HashSet<String>();
             for (RelationMember rm : r.getMembers()) {
@@ -234,10 +234,12 @@
                     rolesToReAdd.add(rm.getRole());
                 } else {
-                    newRel.members.add(rm);
+                    newMembers.add(rm);
                 }
             }
             for (String role : rolesToReAdd) {
-                newRel.members.add(new RelationMember(role, modifyWay));
-            }
+                newMembers.add(new RelationMember(role, modifyWay));
+            }
+            Relation newRel = new Relation(r);
+            newRel.setMembers(newMembers);
             cmds.add(new ChangeCommand(r, newRel));
         }
Index: /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/actions/MergeNodesAction.java	(revision 1951)
@@ -12,4 +12,5 @@
 import java.util.HashSet;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -275,6 +276,5 @@
         // modify all relations containing the now-deleted nodes
         for (Relation r : relationsUsingNodes) {
-            Relation newRel = new Relation(r);
-            newRel.members.clear();
+            List<RelationMember> newMembers = new ArrayList<RelationMember>();
             HashSet<String> rolesToReAdd = new HashSet<String>();
             for (RelationMember rm : r.getMembers()) {
@@ -284,10 +284,12 @@
                     rolesToReAdd.add(rm.getRole());
                 } else {
-                    newRel.members.add(rm);
+                    newMembers.add(rm);
                 }
             }
             for (String role : rolesToReAdd) {
-                newRel.members.add(new RelationMember(role, dest));
-            }
+                newMembers.add(new RelationMember(role, dest));
+            }
+            Relation newRel = new Relation(r);
+            newRel.setMembers(newMembers);
             cmds.add(new ChangeCommand(r, newRel));
         }
Index: /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/actions/SplitWayAction.java	(revision 1951)
@@ -326,7 +326,7 @@
                             j++;
                             if (backwards) {
-                                c.members.add(i, em);
+                                c.addMember(i, em);
                             } else {
-                                c.members.add(j, em);
+                                c.addMember(j, em);
                             }
                         }
Index: /trunk/src/org/openstreetmap/josm/command/RelationMemberConflictResolverCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/RelationMemberConflictResolverCommand.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/command/RelationMemberConflictResolverCommand.java	(revision 1951)
@@ -40,5 +40,5 @@
 
     /**
-     * 
+     *
      * @param my my relation
      * @param their their relation
@@ -72,12 +72,8 @@
         // nodes
         //
-        my.members.clear();
-        for (int i=0; i<mergedMembers.size();i++) {
-            RelationMember n = mergedMembers.get(i);
-            my.members.add(n);
-        }
+        my.setMembers(mergedMembers);
 
         // remember the layer
-        layer = Main.main.map.mapView.getEditLayer();
+        layer = Main.map.mapView.getEditLayer();
         return true;
     }
Index: /trunk/src/org/openstreetmap/josm/command/RemoveRelationMemberCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/RemoveRelationMemberCommand.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/command/RemoveRelationMemberCommand.java	(revision 1951)
@@ -44,18 +44,18 @@
     @Override public boolean executeCommand() {
         super.executeCommand();
-        int removed_at = relation.members.indexOf(member);
-        relation.members.remove(member);
-        if ((location != -1) && (removed_at != location)) {
-            relation.members.add(removed_at, member);
+        int removeIndex = relation.getMembers().indexOf(member);
+        if ((location != -1) && (removeIndex != location)) {
             Main.debug("error removing relation member");
             return false;
+        } else {
+            relation.removeMember(removeIndex);
+            relation.modified = true;
+            return true;
         }
-        relation.modified = true;
-        return true;
     }
 
     @Override public void undoCommand() {
         super.undoCommand();
-        relation.members.add(member);
+        relation.addMember(member);
         relation.modified = this.getOrig(relation).modified;
     }
Index: /trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 1951)
@@ -63,4 +63,44 @@
     public RelationMember getMember(int index) {
         return members.get(index);
+    }
+
+    /**
+     *
+     * @param member
+     * @since 1951
+     */
+    public void addMember(RelationMember member) {
+        members.add(member);
+    }
+
+    /**
+     *
+     * @param index
+     * @param member
+     * @since 1951
+     */
+    public void addMember(int index, RelationMember member) {
+        members.add(index, member);
+    }
+
+    /**
+     * Replace member at position specified by index.
+     * @param index
+     * @param member
+     * @return Member that was at the position
+     * @since 1951
+     */
+    public RelationMember setMember(int index, RelationMember member) {
+        return members.set(index, member);
+    }
+
+    /**
+     * Removes member at specified position.
+     * @param index
+     * @return Member that was at the position
+     * @since 1951
+     */
+    public RelationMember removeMember(int index) {
+        return members.remove(index);
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitor.java	(revision 1951)
@@ -90,9 +90,13 @@
             clone = new Relation(r);
         }
-        clone.members.clear();
+
+        List<RelationMember> newMembers = new ArrayList<RelationMember>();
         for (RelationMember member: r.getMembers()) {
-            RelationMember cloneMember = new RelationMember(member.getRole(), mappedPrimitives.get(member.getMember()));
-            clone.members.add(cloneMember);
-        }
+            newMembers.add(
+                new RelationMember(member.getRole(), mappedPrimitives.get(member.getMember())));
+
+        }
+        clone.setMembers(newMembers);
+
         if (! mappedPrimitives.keySet().contains(r)) {
             mappedPrimitives.put(r, clone);
@@ -104,5 +108,5 @@
             return;
         Relation clone = new Relation(r);
-        clone.members.clear();
+        clone.setMembers(null);
         mappedPrimitives.put(r, clone);
     }
@@ -148,5 +152,5 @@
             clone = new Relation(r);
         }
-        clone.members.clear();
+        clone.setMembers(null);
         clone.incomplete = true;
         if (! isAlreadyRemembered(r)) {
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/PropertiesDialog.java	(revision 1951)
@@ -854,12 +854,14 @@
             Relation rel = new Relation(cur);
             Collection<OsmPrimitive> sel = Main.main.getCurrentDataSet().getSelected();
+            int index = 0;
             for (RelationMember rm : cur.getMembers()) {
                 for (OsmPrimitive osm : sel) {
                     if (rm.getMember() == osm)
                     {
-                        rel.members.remove(rm);
+                        rel.removeMember(index);
                         break;
                     }
                 }
+                index++;
             }
             Main.main.undoRedo.add(new ChangeCommand(cur, rel));
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java	(revision 1951)
@@ -229,8 +229,8 @@
         if (relation == null)
             return false;
-        if (relation.members.size() != members.size())
+        if (relation.getMembersCount() != members.size())
             return false;
-        for (int i = 0; i < relation.members.size(); i++) {
-            if (!relation.members.get(i).equals(members.get(i)))
+        for (int i = 0; i < relation.getMembersCount(); i++) {
+            if (!relation.getMember(i).equals(members.get(i)))
                 return false;
         }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeModel.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeModel.java	(revision 1951)
@@ -57,5 +57,5 @@
         if (members == null) return;
         Relation root = new Relation();
-        root.members.addAll(members);
+        root.setMembers(members);
         this.root = root;
         listeners = new CopyOnWriteArrayList<TreeModelListener>();
@@ -150,5 +150,5 @@
         if (members == null) return;
         Relation r = new Relation();
-        r.members.addAll(members);
+        r.setMembers(members);
         this.root = r;
         fireRootReplacedEvent();
Index: /trunk/src/org/openstreetmap/josm/io/OsmReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 1950)
+++ /trunk/src/org/openstreetmap/josm/io/OsmReader.java	(revision 1951)
@@ -412,4 +412,6 @@
             if (en == null) throw new Error("Failed to create relation " + e.getKey().id);
 
+            List<RelationMember> relationMembers = new ArrayList<RelationMember>();
+
             for (RelationMemberData emd : e.getValue()) {
                 OsmPrimitive member;
@@ -438,6 +440,7 @@
                     throw new SAXException(tr("Unknown relation member type {0}", emd.type));
                 }
-                en.members.add(new RelationMember(emd.role, member));
-            }
+                relationMembers.add(new RelationMember(emd.role, member));
+            }
+            en.setMembers(relationMembers);
         }
         hm = null;
Index: /trunk/test/functional/org/openstreetmap/josm/gui/conflict/relation/RelationMemberMergerTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/conflict/relation/RelationMemberMergerTest.java	(revision 1950)
+++ /trunk/test/functional/org/openstreetmap/josm/gui/conflict/relation/RelationMemberMergerTest.java	(revision 1951)
@@ -10,27 +10,25 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.gui.conflict.nodes.NodeListMerger;
-import org.openstreetmap.josm.gui.conflict.nodes.NodeListMergerTest;
 
 public class RelationMemberMergerTest extends JFrame {
-    
+
     private RelationMemberMerger merger;
-    
+
     protected void populate() {
         Relation r1 = new Relation();
-        r1.members.add(new RelationMember("role1", new Node(1)));
-        r1.members.add(new RelationMember("role2", new Way(2)));
-        r1.members.add(new RelationMember("role3", new Relation(3)));
+        r1.addMember(new RelationMember("role1", new Node(1)));
+        r1.addMember(new RelationMember("role2", new Way(2)));
+        r1.addMember(new RelationMember("role3", new Relation(3)));
 
-        
+
         Relation r2 = new Relation();
-        r2.members.add(new RelationMember("role1", new Node(1)));
-        r2.members.add(new RelationMember("role2", new Way(2)));
-        r2.members.add(new RelationMember("role3", new Relation(3)));
-        
+        r2.addMember(new RelationMember("role1", new Node(1)));
+        r2.addMember(new RelationMember("role2", new Way(2)));
+        r2.addMember(new RelationMember("role3", new Relation(3)));
+
         merger.populate(r1, r2);
 
     }
-    
+
     protected void build() {
         merger = new RelationMemberMerger();
@@ -38,10 +36,10 @@
         getContentPane().add(merger, BorderLayout.CENTER);
     }
-    
+
     public RelationMemberMergerTest() {
         build();
         populate();
     }
-    
+
     static public void main(String args[]) {
         RelationMemberMergerTest test = new RelationMemberMergerTest();
Index: /trunk/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java	(revision 1950)
+++ /trunk/test/functional/org/openstreetmap/josm/io/MultiFetchServerObjectReaderTest.java	(revision 1951)
@@ -95,5 +95,5 @@
                 int idx = (start + j) % 500;
                 Node n = nodes.get(idx);
-                r.members.add(new RelationMember("role-" + j, n));
+                r.addMember(new RelationMember("role-" + j, n));
             }
             int numWaysInRelation = (int)Math.round(Math.random() * 10);
@@ -102,5 +102,5 @@
                 int idx = (start + j) % 500;
                 Way w = ways.get(idx);
-                r.members.add(new RelationMember("role-" + j, w));
+                r.addMember(new RelationMember("role-" + j, w));
             }
             ds.addPrimitive(r);
@@ -288,5 +288,5 @@
             Relation r2 = (Relation)ds.getPrimitiveById(r1.id);
             assertNotNull(r2);
-            assertEquals(r2.members.size(), r1.members.size());
+            assertEquals(r2.getMembersCount(), r1.getMembersCount());
             assertEquals(r2.get("name"),r2.get("name"));
         }
Index: /trunk/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java	(revision 1950)
+++ /trunk/test/functional/org/openstreetmap/josm/io/OsmServerBackreferenceReaderTest.java	(revision 1951)
@@ -88,9 +88,9 @@
             for (int j =0; j < 10; j++) {
                 RelationMember member = new RelationMember("node-" + j, lookupNode(ds, i + j));
-                r.members.add(member);
+                r.addMember(member);
             }
             for (int j =0; j < 5; j++) {
                 RelationMember member = new RelationMember("way-" + j, lookupWay(ds, i + j));
-                r.members.add(member);
+                r.addMember(member);
             }
             if (i > 5) {
@@ -98,5 +98,5 @@
                     RelationMember member = new RelationMember("relation-" + j, lookupRelation(ds, j));
                     logger.info(MessageFormat.format("adding relation {0} to relation {1}", j, i));
-                    r.members.add(member);
+                    r.addMember(member);
                 }
             }
Index: /trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java	(revision 1950)
+++ /trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeSourceBuildingVisitorTest.java	(revision 1951)
@@ -153,5 +153,5 @@
         Relation r1 = new Relation(1);
         Node n20 = new Node(20);
-        r1.members.add(new RelationMember("node-20",n20));
+        r1.addMember(new RelationMember("node-20",n20));
         Way w30 = new Way(30);
         Node n21;
@@ -159,7 +159,7 @@
         Node n22;
         w30.addNode(n22 = new Node(22));
-        r1.members.add(new RelationMember("way-30",w30));
+        r1.addMember(new RelationMember("way-30",w30));
         Relation r40 = new Relation(40);
-        r1.members.add(new RelationMember("relation-40", r40));
+        r1.addMember(new RelationMember("relation-40", r40));
         source.nodes.add(n20);
         source.nodes.add(n21);
@@ -199,9 +199,9 @@
         assertEquals(3, r.getMembersCount());
         RelationMember m = new RelationMember("node-20", hull.getPrimitiveById(20));
-        assertTrue(r.members.contains(m));
+        assertTrue(r.getMembers().contains(m));
         m = new RelationMember("way-30", hull.getPrimitiveById(30));
-        assertTrue(r.members.contains(m));
+        assertTrue(r.getMembers().contains(m));
         m = new RelationMember("relation-40", hull.getPrimitiveById(40));
-        assertTrue(r.members.contains(m));
+        assertTrue(r.getMembers().contains(m));
     }
 
@@ -211,5 +211,5 @@
         Relation r1 = new Relation(1);
         Node n20 = new Node(20);
-        r1.members.add(new RelationMember("node-20",n20));
+        r1.addMember(new RelationMember("node-20",n20));
         Way w30 = new Way(30);
         Node n21;
@@ -217,7 +217,7 @@
         Node n22;
         w30.addNode(n22 = new Node(22));
-        r1.members.add(new RelationMember("way-30",w30));
+        r1.addMember(new RelationMember("way-30",w30));
         Relation r40 = new Relation(40);
-        r1.members.add(new RelationMember("relation-40", r40));
+        r1.addMember(new RelationMember("relation-40", r40));
         source.nodes.add(n20);
         source.nodes.add(n21);
@@ -258,9 +258,9 @@
         assertEquals(3, r.getMembersCount());
         RelationMember m = new RelationMember("node-20", hull.getPrimitiveById(20));
-        assertTrue(r.members.contains(m));
+        assertTrue(r.getMembers().contains(m));
         m = new RelationMember("way-30", hull.getPrimitiveById(30));
-        assertTrue(r.members.contains(m));
+        assertTrue(r.getMembers().contains(m));
         m = new RelationMember("relation-40", hull.getPrimitiveById(40));
-        assertTrue(r.members.contains(m));
+        assertTrue(r.getMembers().contains(m));
     }
 
@@ -272,5 +272,5 @@
         Node n20 = new Node(new LatLon(20.0,20.0));
         n20.put("name", "n20");
-        r1.members.add(new RelationMember("node-20",n20));
+        r1.getMembers().add(new RelationMember("node-20",n20));
         Way w30 = new Way();
         w30.put("name", "w30");
@@ -281,8 +281,8 @@
         w30.addNode(n22 = new Node(new LatLon(22.0,22.0)));
         n22.put("name","n22");
-        r1.members.add(new RelationMember("way-30",w30));
+        r1.addMember(new RelationMember("way-30",w30));
         Relation r40 = new Relation();
         r40.put("name", "r40");
-        r1.members.add(new RelationMember("relation-40", r40));
+        r1.addMember(new RelationMember("relation-40", r40));
         source.nodes.add(n20);
         source.nodes.add(n21);
@@ -323,9 +323,9 @@
         assertEquals(3, r.getMembersCount());
         RelationMember m = new RelationMember("node-20", lookupByName(hull.nodes, "n20"));
-        assertTrue(r.members.contains(m));
+        assertTrue(r.getMembers().contains(m));
         m = new RelationMember("way-30", lookupByName(hull.ways, "w30"));
-        assertTrue(r.members.contains(m));
+        assertTrue(r.getMembers().contains(m));
         m = new RelationMember("relation-40", lookupByName(hull.relations, "r40"));
-        assertTrue(r.members.contains(m));
+        assertTrue(r.getMembers().contains(m));
     }
 
@@ -334,5 +334,5 @@
         DataSet source = new DataSet();
         Relation r1 = new Relation(1);
-        r1.members.add(new RelationMember("relation-1",r1));
+        r1.addMember(new RelationMember("relation-1",r1));
         source.relations.add(r1);
         source.setSelected(r1);
@@ -346,5 +346,5 @@
         assertNotNull(r);
         assertEquals(1, r.getMembersCount());
-        assertTrue(r.members.contains(new RelationMember("relation-1",r)));
+        assertTrue(r.getMembers().contains(new RelationMember("relation-1",r)));
     }
 
@@ -354,5 +354,5 @@
         Relation r1 = new Relation();
         r1.put("name", "r1");
-        r1.members.add(new RelationMember("relation-1",r1));
+        r1.addMember(new RelationMember("relation-1",r1));
         source.relations.add(r1);
         source.setSelected(r1);
@@ -366,5 +366,5 @@
         assertNotNull(r);
         assertEquals(1, r.getMembersCount());
-        assertTrue(r.members.contains(new RelationMember("relation-1",r)));
+        assertTrue(r.getMembers().contains(new RelationMember("relation-1",r)));
     }
 
@@ -374,6 +374,6 @@
         Relation r1 = new Relation(1);
         Relation r2 = new Relation(2);
-        r1.members.add(new RelationMember("relation-2",r2));
-        r2.members.add(new RelationMember("relation-1",r1));
+        r1.addMember(new RelationMember("relation-2",r2));
+        r2.addMember(new RelationMember("relation-1",r1));
         source.relations.add(r1);
         source.relations.add(r2);
@@ -390,7 +390,7 @@
         assertNotNull(r2);
         assertEquals(1, r1.getMembersCount());
-        assertTrue(r1.members.contains(new RelationMember("relation-2",r2)));
+        assertTrue(r1.getMembers().contains(new RelationMember("relation-2",r2)));
         assertEquals(1, r2.getMembersCount());
-        assertTrue(r2.members.contains(new RelationMember("relation-1",r1)));
+        assertTrue(r2.getMembers().contains(new RelationMember("relation-1",r1)));
     }
 }
Index: /trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeVisitorTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeVisitorTest.java	(revision 1950)
+++ /trunk/test/unit/org/openstreetmap/josm/data/osm/visitor/MergeVisitorTest.java	(revision 1951)
@@ -965,7 +965,7 @@
         theirRelation.id = 4;
         theirRelation.version = 1;
-        theirRelation.members.add(new RelationMember("", n3));
-        theirRelation.members.add(new RelationMember("", n4));
-        theirRelation.members.add(new RelationMember("", n5));
+        theirRelation.addMember(new RelationMember("", n3));
+        theirRelation.addMember(new RelationMember("", n4));
+        theirRelation.addMember(new RelationMember("", n5));
         their.addPrimitive(theirRelation);
 
