Index: applications/editors/josm/plugins/merge-overlap/build.xml
===================================================================
--- applications/editors/josm/plugins/merge-overlap/build.xml	(revision 30765)
+++ applications/editors/josm/plugins/merge-overlap/build.xml	(revision 30766)
@@ -4,5 +4,5 @@
     <property name="commit.message" value="MergeOverlap: help shortcut parser, rebuild"/>
     <!-- enter the *lowest* JOSM version this plugin is currently compatible with -->
-    <property name="plugin.main.version" value="7610"/>
+    <property name="plugin.main.version" value="7661"/>
     
     <!-- Configure these properties (replace "..." accordingly).
Index: applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapAction.java
===================================================================
--- applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapAction.java	(revision 30765)
+++ applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/MergeOverlapAction.java	(revision 30766)
@@ -602,5 +602,5 @@
 		if (askForMergeTag(ways) || duplicateParentRelations(ways)) {
 			dialog.setVisible(true);
-			if (dialog.isCancelled())
+			if (dialog.isCanceled())
 				throw new UserCancelException();
 		}
Index: applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyCombinePrimitiveResolverDialog.java
===================================================================
--- applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyCombinePrimitiveResolverDialog.java	(revision 30765)
+++ applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyCombinePrimitiveResolverDialog.java	(revision 30766)
@@ -43,8 +43,10 @@
 import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecision;
 import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecisionType;
+import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictResolver;
 import org.openstreetmap.josm.gui.conflict.tags.TagConflictResolver;
 import org.openstreetmap.josm.gui.conflict.tags.TagConflictResolverModel;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.WindowGeometry;
@@ -55,9 +57,9 @@
  *
  * There is a singleton instance of this dialog which can be retrieved using
- * {@see #getInstance()}.
+ * {@link #getInstance()}.
  *
  * The dialog uses two models: one  for resolving tag conflicts, the other
  * for resolving conflicts in relation memberships. For both models there are accessors,
- * i.e {@see #getTagConflictResolverModel()} and {@see #getRelationMemberConflictResolverModel()}.
+ * i.e {@link #getTagConflictResolverModel()} and {@link #getRelationMemberConflictResolverModel()}.
  *
  * Models have to be <strong>populated</strong> before the dialog is launched. Example:
@@ -70,17 +72,15 @@
  *
  * You should also set the target primitive which other primitives (ways or nodes) are
- * merged to, see {@see #setTargetPrimitive(OsmPrimitive)}.
+ * merged to, see {@link #setTargetPrimitive(OsmPrimitive)}.
  *
- * After the dialog is closed use {@see #isCancelled()} to check whether the user canceled
- * the dialog. If it wasn't canceled you may build a collection of {@see Command} objects
+ * After the dialog is closed use {@link #isCanceled()} to check whether the user canceled
+ * the dialog. If it wasn't canceled you may build a collection of {@link Command} objects
  * which reflect the conflict resolution decisions the user made in the dialog:
- * see {@see #buildResolutionCommands()}
- *
- *
+ * see {@link #buildResolutionCommands()}
  */
 public class MyCombinePrimitiveResolverDialog extends JDialog {
 
     /** the unique instance of the dialog */
-    static private MyCombinePrimitiveResolverDialog instance;
+    private static MyCombinePrimitiveResolverDialog instance;
 
     /**
@@ -91,5 +91,9 @@
     public static MyCombinePrimitiveResolverDialog getInstance() {
         if (instance == null) {
-            instance = new MyCombinePrimitiveResolverDialog(Main.parent);
+            GuiHelper.runInEDTAndWait(new Runnable() {
+                @Override public void run() {
+                    instance = new MyCombinePrimitiveResolverDialog(Main.parent);
+                }
+            });
         }
         return instance;
@@ -98,6 +102,6 @@
     private AutoAdjustingSplitPane spTagConflictTypes;
     private TagConflictResolver pnlTagConflictResolver;
-    private MyRelationMemberConflictResolver pnlRelationMemberConflictResolver;
-    private boolean cancelled;
+    private RelationMemberConflictResolver pnlRelationMemberConflictResolver;
+    private boolean canceled;
     private JPanel pnlButtons;
     private OsmPrimitive targetPrimitive;
@@ -119,17 +123,20 @@
 
     /**
-     * Sets the primitive the collection of primitives is merged or combined
-     * to.
+     * Sets the primitive the collection of primitives is merged or combined to.
      *
      * @param primitive the target primitive
      */
-    public void setTargetPrimitive(OsmPrimitive primitive) {
+    public void setTargetPrimitive(final OsmPrimitive primitive) {
         this.targetPrimitive = primitive;
-        updateTitle();
-        if (primitive instanceof Way) {
-            pnlRelationMemberConflictResolver.initForWayCombining();
-        } else if (primitive instanceof Node) {
-            pnlRelationMemberConflictResolver.initForNodeMerging();
-        }
+        GuiHelper.runInEDTAndWait(new Runnable() {
+            @Override public void run() {
+                updateTitle();
+                if (primitive instanceof Way) {
+                    pnlRelationMemberConflictResolver.initForWayCombining();
+                } else if (primitive instanceof Node) {
+                    pnlRelationMemberConflictResolver.initForNodeMerging();
+                }
+            }
+        });
     }
 
@@ -152,5 +159,5 @@
     }
 
-    protected void build() {
+    protected final void build() {
         getContentPane().setLayout(new BorderLayout());
         updateTitle();
@@ -169,11 +176,10 @@
 
     protected JPanel buildRelationMemberConflictResolverPanel() {
-        pnlRelationMemberConflictResolver = new MyRelationMemberConflictResolver();
+        pnlRelationMemberConflictResolver = new RelationMemberConflictResolver(new MyRelationMemberConflictResolverModel());
         return pnlRelationMemberConflictResolver;
     }
 
     protected JPanel buildButtonPanel() {
-        JPanel pnl = new JPanel();
-        pnl.setLayout(new FlowLayout(FlowLayout.CENTER));
+        JPanel pnl = new JPanel(new FlowLayout(FlowLayout.CENTER));
 
         // -- apply button
@@ -196,15 +202,27 @@
     }
 
-    public MyCombinePrimitiveResolverDialog(Component owner) {
-        super(JOptionPane.getFrameForComponent(owner), ModalityType.DOCUMENT_MODAL);
+    /**
+     * Constructs a new {@code MyCombinePrimitiveResolverDialog}.
+     * @param parent The parent component in which this dialog will be displayed.
+     */
+    public MyCombinePrimitiveResolverDialog(Component parent) {
+        super(JOptionPane.getFrameForComponent(parent), ModalityType.DOCUMENT_MODAL);
         build();
     }
 
+    /**
+     * Replies the tag conflict resolver model.
+     * @return The tag conflict resolver model.
+     */
     public TagConflictResolverModel getTagConflictResolverModel() {
         return pnlTagConflictResolver.getModel();
     }
 
+    /**
+     * Replies the relation membership conflict resolver model.
+     * @return The relation membership conflict resolver model.
+     */
     public MyRelationMemberConflictResolverModel getRelationMemberConflictResolverModel() {
-        return pnlRelationMemberConflictResolver.getModel();
+        return (MyRelationMemberConflictResolverModel) pnlRelationMemberConflictResolver.getModel();
     }
 
@@ -230,5 +248,5 @@
 
         TagCollection allResolutions = getTagConflictResolverModel().getAllResolutions();
-        if (allResolutions.size() > 0) {
+        if (!allResolutions.isEmpty()) {
             cmds.addAll(buildTagChangeCommand(targetPrimitive, allResolutions));
         }
@@ -279,4 +297,7 @@
     }
 
+    /**
+     * Prepares the default decisions for populated tag and relation membership conflicts.
+     */
     public void prepareDefaultDecisions() {
         prepareDefaultTagDecisions();
@@ -285,6 +306,5 @@
 
     protected JPanel buildEmptyConflictsPanel() {
-        JPanel pnl = new JPanel();
-        pnl.setLayout(new BorderLayout());
+        JPanel pnl = new JPanel(new BorderLayout());
         pnl.add(new JLabel(tr("No conflicts to resolve")));
         return pnl;
@@ -297,6 +317,5 @@
 
         if (relModel.getNumDecisions() > 0 && tagModel.getNumDecisions() > 0) {
-            // display both, the dialog for resolving relation conflicts and for resolving
-            // tag conflicts
+            // display both, the dialog for resolving relation conflicts and for resolving tag conflicts
             spTagConflictTypes.setTopComponent(pnlTagConflictResolver);
             spTagConflictTypes.setBottomComponent(pnlRelationMemberConflictResolver);
@@ -304,9 +323,7 @@
         } else if (relModel.getNumDecisions() > 0) {
             // relation conflicts only
-            //
             getContentPane().add(pnlRelationMemberConflictResolver, BorderLayout.CENTER);
         } else if (tagModel.getNumDecisions() > 0) {
             // tag conflicts only
-            //
             getContentPane().add(pnlTagConflictResolver, BorderLayout.CENTER);
         } else {
@@ -324,10 +341,14 @@
     }
 
-    protected void setCancelled(boolean cancelled) {
-        this.cancelled = cancelled;
-    }
-
-    public boolean isCancelled() {
-        return cancelled;
+    protected void setCanceled(boolean canceled) {
+        this.canceled = canceled;
+    }
+
+    /**
+     * Determines if this dialog has been cancelled.
+     * @return true if this dialog has been cancelled, false otherwise.
+     */
+    public boolean isCanceled() {
+        return canceled;
     }
 
@@ -338,5 +359,5 @@
             new WindowGeometry(getClass().getName() + ".geometry", WindowGeometry.centerInWindow(Main.parent,
                     new Dimension(600, 400))).applySafe(this);
-            setCancelled(false);
+            setCanceled(false);
             btnApply.requestFocusInWindow();
         } else if (isShowing()) { // Avoid IllegalComponentStateException like in #8775
@@ -357,5 +378,5 @@
         @Override
         public void actionPerformed(ActionEvent arg0) {
-            setCancelled(true);
+            setCanceled(true);
             setVisible(false);
         }
@@ -377,5 +398,5 @@
         }
 
-        protected void updateEnabledState() {
+        protected final void updateEnabledState() {
             setEnabled(pnlTagConflictResolver.getModel().getNumConflicts() == 0
                     && pnlRelationMemberConflictResolver.getModel().getNumConflicts() == 0);
Index: applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolver.java
===================================================================
--- applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolver.java	(revision 30765)
+++ 	(revision )
@@ -1,207 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package mergeoverlap.hack;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trc;
-
-import java.awt.BorderLayout;
-import java.awt.FlowLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-import java.awt.event.ActionEvent;
-import java.awt.event.FocusAdapter;
-import java.awt.event.FocusEvent;
-import java.util.Collection;
-
-import javax.swing.AbstractAction;
-import javax.swing.AbstractButton;
-import javax.swing.BoxLayout;
-import javax.swing.ButtonModel;
-import javax.swing.JButton;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.UIManager;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.command.ChangePropertyCommand;
-import org.openstreetmap.josm.command.Command;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Tag;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionList;
-import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
-import org.openstreetmap.josm.tools.ImageProvider;
-
-public class MyRelationMemberConflictResolver extends JPanel {
-
-    private AutoCompletingTextField tfRole;
-    private AutoCompletingTextField tfKey;
-    private AutoCompletingTextField tfValue;
-    private JCheckBox cbTagRelations;
-    private MyRelationMemberConflictResolverModel model;
-    private MyRelationMemberConflictResolverTable tblResolver;
-    private JMultilineLabel lblHeader;
-
-    protected final void build() {
-        setLayout(new GridBagLayout());
-        JPanel pnl = new JPanel();
-        pnl.setLayout(new BorderLayout());
-        pnl.add(lblHeader = new JMultilineLabel(""));
-        GridBagConstraints gc = new GridBagConstraints();
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.weighty = 0.0;
-        gc.weightx = 1.0;
-        gc.insets = new Insets(5,5,5,5);
-        add(pnl, gc);
-        model = new MyRelationMemberConflictResolverModel();
-
-        gc.gridy = 1;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.insets = new Insets(0,0,0,0);
-        add(new JScrollPane(tblResolver = new MyRelationMemberConflictResolverTable(model)), gc);
-        pnl = new JPanel();
-        pnl.setLayout(new BoxLayout(pnl, BoxLayout.Y_AXIS));
-        pnl.add(buildRoleEditingPanel());
-        pnl.add(buildTagRelationsPanel());
-        gc.gridy = 2;
-        gc.weighty = 0.0;
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        add(pnl,gc);
-    }
-
-    protected JPanel buildRoleEditingPanel() {
-        JPanel pnl = new JPanel();
-        pnl.setLayout(new FlowLayout(FlowLayout.LEFT));
-        pnl.add(new JLabel(tr("Role:")));
-        pnl.add(tfRole = new AutoCompletingTextField(10));
-        tfRole.setToolTipText(tr("Enter a role for all relation memberships"));
-        pnl.add(new JButton(new ApplyRoleAction()));
-        tfRole.addActionListener(new ApplyRoleAction());
-        tfRole.addFocusListener(
-                new FocusAdapter() {
-                    @Override
-                    public void focusGained(FocusEvent e) {
-                        tfRole.selectAll();
-                    }
-                }
-        );
-        return pnl;
-    }
-
-    protected JPanel buildTagRelationsPanel() {
-        JPanel pnl = new JPanel();
-        pnl.setLayout(new FlowLayout(FlowLayout.LEFT));
-        cbTagRelations = new JCheckBox(tr("Tag modified relations with "));
-        cbTagRelations.addChangeListener(new ToggleTagRelationsAction());
-        cbTagRelations.setToolTipText(
-                tr("<html>Select to enable entering a tag which will be applied<br>"
-                        + "to all modified relations.</html>"));
-        pnl.add(cbTagRelations);
-        pnl.add(new JLabel(trc("tag", "Key:")));
-        pnl.add(tfKey = new AutoCompletingTextField(10));
-        tfKey.setToolTipText(tr("<html>Enter a tag key, e.g. <strong><tt>fixme</tt></strong></html>"));
-        pnl.add(new JLabel(tr("Value:")));
-        pnl.add(tfValue = new AutoCompletingTextField(10));
-        tfValue.setToolTipText(tr("<html>Enter a tag value, e.g. <strong><tt>check members</tt></strong></html>"));
-        cbTagRelations.setSelected(false);
-        tfKey.setEnabled(false);
-        tfValue.setEnabled(false);
-        return pnl;
-    }
-
-    /**
-     * Constructs a new {@code MyRelationMemberConflictResolver}.
-     */
-    public MyRelationMemberConflictResolver() {
-        build();
-    }
-
-    /**
-     * Initializes for way combining.
-     */
-    public void initForWayCombining() {
-        lblHeader.setText(tr("<html>The combined ways are members in one or more relations. "
-                + "Please decide whether you want to <strong>keep</strong> these memberships "
-                + "for the combined way or whether you want to <strong>remove</strong> them.<br>"
-                + "The default is to <strong>keep</strong> the first way and <strong>remove</strong> "
-                + "the other ways that are members of the same relation: the combined way will "
-                + "take the place of the original way in the relation."
-                + "</html>"));
-        invalidate();
-    }
-
-    /**
-     * Initializes for node merging.
-     */
-    public void initForNodeMerging() {
-        lblHeader.setText(tr("<html>The merged nodes are members in one or more relations. "
-                + "Please decide whether you want to <strong>keep</strong> these memberships "
-                + "for the target node or whether you want to <strong>remove</strong> them.<br>"
-                + "The default is to <strong>keep</strong> the first node and <strong>remove</strong> "
-                + "the other nodes that are members of the same relation: the target node will "
-                + "take the place of the original node in the relation."
-                + "</html>"));
-        invalidate();
-    }
-
-    class ApplyRoleAction extends AbstractAction {
-        public ApplyRoleAction() {
-            putValue(NAME, tr("Apply"));
-            putValue(SMALL_ICON, ImageProvider.get("ok"));
-            putValue(SHORT_DESCRIPTION, tr("Apply this role to all members"));
-        }
-
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            model.applyRole(tfRole.getText());
-        }
-    }
-
-    class ToggleTagRelationsAction implements ChangeListener {
-        @Override
-        public void stateChanged(ChangeEvent e) {
-            ButtonModel buttonModel = ((AbstractButton) e.getSource()).getModel();
-            tfKey.setEnabled(buttonModel.isSelected());
-            tfValue.setEnabled(buttonModel.isSelected());
-            tfKey.setBackground(buttonModel.isSelected() ? UIManager.getColor("TextField.background") : UIManager
-                    .getColor("Panel.background"));
-            tfValue.setBackground(buttonModel.isSelected() ? UIManager.getColor("TextField.background") : UIManager
-                    .getColor("Panel.background"));
-        }
-    }
-
-    public MyRelationMemberConflictResolverModel getModel() {
-        return model;
-    }
-
-    public Command buildTagApplyCommands(Collection<? extends OsmPrimitive> primitives) {
-        if (!cbTagRelations.isSelected())
-            return null;
-        if (tfKey.getText().trim().isEmpty())
-            return null;
-        if (tfValue.getText().trim().isEmpty())
-            return null;
-        if (primitives == null || primitives.isEmpty())
-            return null;
-        return new ChangePropertyCommand(primitives, Tag.removeWhiteSpaces(tfKey.getText()), Tag.removeWhiteSpaces(tfValue.getText()));
-    }
-
-    public void prepareForEditing() {
-        AutoCompletionList acList = new AutoCompletionList();
-        Main.main.getEditLayer().data.getAutoCompletionManager().populateWithMemberRoles(acList);
-        tfRole.setAutoCompletionList(acList);
-        AutoCompletingTextField editor = (AutoCompletingTextField) tblResolver.getColumnModel().getColumn(2).getCellEditor();
-        if (editor != null) {
-            editor.setAutoCompletionList(acList);
-        }
-        AutoCompletionList acList2 = new AutoCompletionList();
-        Main.main.getEditLayer().data.getAutoCompletionManager().populateWithKeys(acList2);
-        tfKey.setAutoCompletionList(acList2);
-    }
-}
Index: applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolverModel.java
===================================================================
--- applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolverModel.java	(revision 30765)
+++ applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolverModel.java	(revision 30766)
@@ -2,26 +2,18 @@
 package mergeoverlap.hack;
 
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashSet;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
-
-import javax.swing.table.DefaultTableModel;
 
 import mergeoverlap.MergeOverlapAction;
 
+import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
-import org.openstreetmap.josm.data.osm.RelationToChildReference;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecision;
-import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecisionType;
-import org.openstreetmap.josm.gui.util.GuiHelper;
+import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictResolverModel;
 
 /**
@@ -30,100 +22,16 @@
  * It can be used as {@link javax.swing.table.TableModel}.
  */
-public class MyRelationMemberConflictResolverModel extends DefaultTableModel {
+public class MyRelationMemberConflictResolverModel extends RelationMemberConflictResolverModel {
     /** the property name for the number conflicts managed by this model */
     public static final String NUM_CONFLICTS_PROP = MyRelationMemberConflictResolverModel.class.getName() + ".numConflicts";
 
-    /** the list of conflict decisions */
-    private List<RelationMemberConflictDecision> decisions;
-    /** the collection of relations for which we manage conflicts */
-    private Collection<Relation> relations;
-    /** the number of conflicts */
-    private int numConflicts;
-    private PropertyChangeSupport support;
-
-    /**
-     * Replies true if each {@link MultiValueResolutionDecision} is decided.
-     *
-     * @return true if each {@link MultiValueResolutionDecision} is decided; false
-     * otherwise
-     */
-    public boolean isResolvedCompletely() {
-        return numConflicts == 0;
+    @Override
+    protected String getProperty() {
+        return NUM_CONFLICTS_PROP;
     }
-
-    /**
-     * Replies the current number of conflicts
-     *
-     * @return the current number of conflicts
-     */
-    public int getNumConflicts() {
-        return numConflicts;
-    }
-
-    /**
-     * Updates the current number of conflicts from list of decisions and emits
-     * a property change event if necessary.
-     *
-     */
-    protected void updateNumConflicts() {
-        int count = 0;
-        for (RelationMemberConflictDecision decision: decisions) {
-            if (!decision.isDecided()) {
-                count++;
-            }
-        }
-        int oldValue = numConflicts;
-        numConflicts = count;
-        if (numConflicts != oldValue) {
-            support.firePropertyChange(NUM_CONFLICTS_PROP, oldValue, numConflicts);
-        }
-    }
-
-    public void addPropertyChangeListener(PropertyChangeListener l) {
-        support.addPropertyChangeListener(l);
-    }
-
-    public void removePropertyChangeListener(PropertyChangeListener l) {
-        support.removePropertyChangeListener(l);
-    }
-
-    public MyRelationMemberConflictResolverModel() {
-        decisions = new ArrayList<>();
-        support = new PropertyChangeSupport(this);
-    }
-
+    
     @Override
-    public int getRowCount() {
-        return getNumDecisions();
-    }
-
-    @Override
-    public Object getValueAt(int row, int column) {
-        if (decisions == null) return null;
-
-        RelationMemberConflictDecision d = decisions.get(row);
-        switch(column) {
-        case 0: /* relation */ return d.getRelation();
-        case 1: /* pos */ return Integer.toString(d.getPos() + 1); // position in "user space" starting at 1
-        case 2: /* role */ return d.getRole();
-        case 3: /* original */ return d.getOriginalPrimitive();
-        case 4: /* decision */ return d.getDecision();
-        }
-        return null;
-    }
-
-    @Override
-    public void setValueAt(Object value, int row, int column) {
-        RelationMemberConflictDecision d = decisions.get(row);
-        switch(column) {
-        case 2: /* role */
-            d.setRole((String)value);
-            break;
-        case 4: /* decision */
-            d.decide((RelationMemberConflictDecisionType)value);
-            refresh();
-            break;
-        }
-        fireTableDataChanged();
+    protected void populate(Relation relation, OsmPrimitive primitive) {
+        throw new UnsupportedOperationException("Use populate(Relation, OsmPrimitive, Map<Way, Way>) instead");
     }
 
@@ -141,4 +49,9 @@
             }
         }
+    }
+
+    @Override
+    public void populate(Collection<Relation> relations, Collection<? extends OsmPrimitive> memberPrimitives) {
+        throw new UnsupportedOperationException("Use populate(Collection<Relation>, Collection<? extends OsmPrimitive>, Map<Way, Way>) instead");
     }
 
@@ -163,72 +76,7 @@
     }
 
-    /**
-     * Populates the model with the relation members represented as a collection of
-     * {@link RelationToChildReference}s.
-     *
-     * @param references the references. Empty list assumed if null.
-     */
-    public void populate(Collection<RelationToChildReference> references) {
-        references = references == null ? new LinkedList<RelationToChildReference>() : references;
-        decisions.clear();
-        this.relations = new HashSet<>(references.size());
-        for (RelationToChildReference reference: references) {
-            decisions.add(new RelationMemberConflictDecision(reference.getParent(), reference.getPosition()));
-            relations.add(reference.getParent());
-        }
-        refresh();
-    }
-
-    /**
-     * Replies the decision at position <code>row</code>
-     *
-     * @param row
-     * @return the decision at position <code>row</code>
-     */
-    public RelationMemberConflictDecision getDecision(int row) {
-        return decisions.get(row);
-    }
-
-    /**
-     * Replies the number of decisions managed by this model
-     *
-     * @return the number of decisions managed by this model
-     */
-    public int getNumDecisions() {
-        return decisions == null ? 0 : decisions.size();
-    }
-
-    /**
-     * Refreshes the model state. Invoke this method to trigger necessary change
-     * events after an update of the model data.
-     *
-     */
-    public void refresh() {
-        updateNumConflicts();
-        GuiHelper.runInEDTAndWait(new Runnable() {
-            @Override public void run() {
-                fireTableDataChanged();
-            }
-        });
-    }
-
-    /**
-     * Apply a role to all member managed by this model.
-     *
-     * @param role the role. Empty string assumed if null.
-     */
-    public void applyRole(String role) {
-        role = role == null ? "" : role;
-        for (RelationMemberConflictDecision decision : decisions) {
-            decision.setRole(role);
-        }
-        refresh();
-    }
-
-    protected RelationMemberConflictDecision getDecision(Relation relation, int pos) {
-        for(RelationMemberConflictDecision decision: decisions) {
-            if (decision.matches(relation, pos)) return decision;
-        }
-        return null;
+    @Override
+    protected Command buildResolveCommand(Relation relation, OsmPrimitive newPrimitive) {
+        throw new UnsupportedOperationException("Use buildResolveCorrespondance(Relation, OsmPrimitive, Map<Relation, Relation>, Map<Way, Way>) instead");
     }
 
@@ -238,19 +86,12 @@
     	Relation modifiedRelation = MergeOverlapAction.getNew(relation, newRelations);
         modifiedRelation.setMembers(null);
-//      boolean isChanged = false;
         for (int i=0; i < relationsMembers.size(); i++) {
         	RelationMember rm = relationsMembers.get(i);
-//          RelationMember rm = relation.getMember(i);
-//          RelationMember rmNew;
             RelationMemberConflictDecision decision = getDecision(relation, i);
             if (decision == null) {
                 modifiedRelation.addMember(rm);
             } else {
-            	System.out.println(modifiedRelation);
-            	System.out.println(111);
                 switch(decision.getDecision()) {
                 case KEEP:
-//                  modifiedRelation.removeMembersFor(newPrimitive);
-                	System.out.println(222);
                 	if (newPrimitive instanceof Way) {
                         modifiedRelation.addMember(new RelationMember(decision.getRole(), MergeOverlapAction.getOld((Way)newPrimitive, oldWays)));
@@ -259,10 +100,6 @@
                 		modifiedRelation.addMember(new RelationMember(decision.getRole(), newPrimitive));
                 	}
-//                  modifiedRelation.addMember(new RelationMember(decision.getRole(), newPrimitive));
                     break;
                 case REMOVE:
-                	System.out.println(333);
-//                  modifiedRelation.removeMembersFor(rm.getMember());
-//                  isChanged = true;
                     // do nothing
                     break;
@@ -275,4 +112,9 @@
     }
 
+    @Override
+    public List<Command> buildResolutionCommands(OsmPrimitive newPrimitive) {
+        throw new UnsupportedOperationException("Use buildRelationCorrespondance(OsmPrimitive, Map<Relation, Relation>, Map<Way, Way>) instead");
+    }
+
     /**
      * Builds a collection of commands executing the decisions made in this model.
@@ -280,5 +122,4 @@
      * @param newPrimitive the primitive which members shall refer to if the
      * decision is {@see RelationMemberConflictDecisionType#REPLACE}
-     * @return a list of commands
      */
     public void buildRelationCorrespondance(OsmPrimitive newPrimitive, Map<Relation, Relation> newRelations, Map<Way, Way> oldWays) {
@@ -287,43 +128,3 @@
         }
     }
-
-    protected boolean isChanged(Relation relation, OsmPrimitive newPrimitive) {
-        for (int i=0; i < relation.getMembersCount(); i++) {
-            RelationMemberConflictDecision decision = getDecision(relation, i);
-            if (decision == null) {
-                continue;
-            }
-            switch(decision.getDecision()) {
-            case REMOVE: return true;
-            case KEEP:
-                if (!relation.getMember(i).getRole().equals(decision.getRole()))
-                    return true;
-                if (relation.getMember(i).getMember() != newPrimitive)
-                    return true;
-            case UNDECIDED:
-                // FIXME: handle error
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Replies the set of relations which have to be modified according
-     * to the decisions managed by this model.
-     *
-     * @param newPrimitive the primitive which members shall refer to if the
-     * decision is {@see RelationMemberConflictDecisionType#REPLACE}
-     *
-     * @return the set of relations which have to be modified according
-     * to the decisions managed by this model
-     */
-    public Set<Relation> getModifiedRelations(OsmPrimitive newPrimitive) {
-        HashSet<Relation> ret = new HashSet<>();
-        for (Relation relation: relations) {
-            if (isChanged(relation, newPrimitive)) {
-                ret.add(relation);
-            }
-        }
-        return ret;
-    }
 }
Index: applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolverTable.java
===================================================================
--- applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolverTable.java	(revision 30765)
+++ 	(revision )
@@ -1,120 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package mergeoverlap.hack;
-
-import java.awt.event.ActionEvent;
-import java.awt.event.KeyEvent;
-
-import javax.swing.AbstractAction;
-import javax.swing.JComponent;
-import javax.swing.JTable;
-import javax.swing.KeyStroke;
-import javax.swing.ListSelectionModel;
-
-import org.openstreetmap.josm.gui.conflict.tags.MultiValueCellEditor;
-import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictResolverColumnModel;
-import org.openstreetmap.josm.gui.widgets.JosmComboBox;
-
-public class MyRelationMemberConflictResolverTable extends JTable implements MultiValueCellEditor.NavigationListener {
-
-    private SelectNextColumnCellAction selectNextColumnCellAction;
-    private SelectPreviousColumnCellAction selectPreviousColumnCellAction;
-
-    public MyRelationMemberConflictResolverTable(MyRelationMemberConflictResolverModel model) {
-        super(model, new RelationMemberConflictResolverColumnModel());
-        build();
-    }
-
-    protected final void build() {
-        setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
-        setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-        putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
-
-        // make ENTER behave like TAB
-        //
-        getInputMap(JComponent.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(
-                KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false), "selectNextColumnCell");
-
-        // install custom navigation actions
-        //
-        selectNextColumnCellAction = new SelectNextColumnCellAction();
-        selectPreviousColumnCellAction = new SelectPreviousColumnCellAction();
-        getActionMap().put("selectNextColumnCell", selectNextColumnCellAction);
-        getActionMap().put("selectPreviousColumnCell", selectPreviousColumnCellAction);
-
-        setRowHeight((int)new JosmComboBox<String>().getPreferredSize().getHeight());
-    }
-
-    /**
-     * Action to be run when the user navigates to the next cell in the table, for instance by
-     * pressing TAB or ENTER. The action alters the standard navigation path from cell to cell: <ul>
-     * <li>it jumps over cells in the first column</li> <li>it automatically add a new empty row
-     * when the user leaves the last cell in the table</li></ul>
-     *
-     *
-     */
-    class SelectNextColumnCellAction extends AbstractAction {
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            run();
-        }
-
-        public void run() {
-            int col = getSelectedColumn();
-            int row = getSelectedRow();
-            if (getCellEditor() != null) {
-                getCellEditor().stopCellEditing();
-            }
-
-            if (col == 2 && row < getRowCount() - 1) {
-                row++;
-            } else if (row < getRowCount() - 1) {
-                col = 2;
-                row++;
-            }
-            changeSelection(row, col, false, false);
-            editCellAt(getSelectedRow(), getSelectedColumn());
-            getEditorComponent().requestFocusInWindow();
-        }
-    }
-
-    /**
-     * Action to be run when the user navigates to the previous cell in the table, for instance by
-     * pressing Shift-TAB
-     *
-     */
-    class SelectPreviousColumnCellAction extends AbstractAction {
-
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            run();
-        }
-
-        public void run() {
-            int col = getSelectedColumn();
-            int row = getSelectedRow();
-            if (getCellEditor() != null) {
-                getCellEditor().stopCellEditing();
-            }
-
-            if (col <= 0 && row <= 0) {
-                // change nothing
-            } else if (row > 0) {
-                col = 2;
-                row--;
-            }
-            changeSelection(row, col, false, false);
-            editCellAt(getSelectedRow(), getSelectedColumn());
-            getEditorComponent().requestFocusInWindow();
-        }
-    }
-
-    @Override
-    public void gotoNextDecision() {
-        selectNextColumnCellAction.run();
-    }
-
-    @Override
-    public void gotoPreviousDecision() {
-        selectPreviousColumnCellAction.run();
-    }
-}
