Index: trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CombineWayAction.java	(revision 1949)
+++ 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 1949)
+++ 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 1949)
+++ 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 1949)
+++ 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 1949)
+++ 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 1949)
+++ 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 1949)
+++ 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 1949)
+++ 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 1949)
+++ 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 1949)
+++ 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 1949)
+++ 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;
