Index: /applications/editors/josm/plugins/merge-overlap/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/.settings/org.eclipse.jdt.core.prefs	(revision 30713)
+++ /applications/editors/josm/plugins/merge-overlap/.settings/org.eclipse.jdt.core.prefs	(revision 30714)
@@ -7,4 +7,5 @@
 org.eclipse.jdt.core.compiler.annotation.nullanalysis=disabled
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
 org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
@@ -62,6 +63,6 @@
 org.eclipse.jdt.core.compiler.problem.redundantNullAnnotation=warning
 org.eclipse.jdt.core.compiler.problem.redundantNullCheck=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=ignore
-org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=ignore
+org.eclipse.jdt.core.compiler.problem.redundantSpecificationOfTypeArguments=warning
+org.eclipse.jdt.core.compiler.problem.redundantSuperinterface=warning
 org.eclipse.jdt.core.compiler.problem.reportMethodCanBePotentiallyStatic=ignore
 org.eclipse.jdt.core.compiler.problem.reportMethodCanBeStatic=ignore
Index: /applications/editors/josm/plugins/merge-overlap/build.xml
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/build.xml	(revision 30713)
+++ /applications/editors/josm/plugins/merge-overlap/build.xml	(revision 30714)
@@ -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="7001"/>
+    <property name="plugin.main.version" value="7610"/>
     
     <!-- Configure these properties (replace "..." accordingly).
Index: /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyCombinePrimitiveResolverDialog.java
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyCombinePrimitiveResolverDialog.java	(revision 30713)
+++ /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyCombinePrimitiveResolverDialog.java	(revision 30714)
@@ -43,4 +43,6 @@
 import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecision;
 import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecisionType;
+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;
@@ -95,5 +97,5 @@
 
     private AutoAdjustingSplitPane spTagConflictTypes;
-    private MyTagConflictResolver pnlTagConflictResolver;
+    private TagConflictResolver pnlTagConflictResolver;
     private MyRelationMemberConflictResolver pnlRelationMemberConflictResolver;
     private boolean cancelled;
@@ -162,5 +164,5 @@
 
     protected JPanel buildTagConflictResolverPanel() {
-        pnlTagConflictResolver = new MyTagConflictResolver();
+        pnlTagConflictResolver = new TagConflictResolver();
         return pnlTagConflictResolver;
     }
@@ -199,5 +201,5 @@
     }
 
-    public MyTagConflictResolverModel getTagConflictResolverModel() {
+    public TagConflictResolverModel getTagConflictResolverModel() {
         return pnlTagConflictResolver.getModel();
     }
@@ -208,5 +210,5 @@
 
     protected List<Command> buildTagChangeCommand(OsmPrimitive primitive, TagCollection tc) {
-        LinkedList<Command> cmds = new LinkedList<Command>();
+        LinkedList<Command> cmds = new LinkedList<>();
         for (String key : tc.getKeys()) {
             if (tc.hasUniqueEmptyValue(key)) {
@@ -225,5 +227,5 @@
 
     public List<Command> buildWayResolutionCommands() {
-        List<Command> cmds = new LinkedList<Command>();
+        List<Command> cmds = new LinkedList<>();
 
         TagCollection allResolutions = getTagConflictResolverModel().getAllResolutions();
@@ -248,5 +250,5 @@
     
     protected void prepareDefaultTagDecisions() {
-        MyTagConflictResolverModel model = getTagConflictResolverModel();
+        TagConflictResolverModel model = getTagConflictResolverModel();
         for (int i = 0; i < model.getRowCount(); i++) {
             MultiValueResolutionDecision decision = model.getDecision(i);
@@ -264,5 +266,5 @@
     protected void prepareDefaultRelationDecisions() {
         MyRelationMemberConflictResolverModel model = getRelationMemberConflictResolverModel();
-        Set<Relation> relations = new HashSet<Relation>();
+        Set<Relation> relations = new HashSet<>();
         for (int i = 0; i < model.getNumDecisions(); i++) {
             RelationMemberConflictDecision decision = model.getDecision(i);
@@ -291,5 +293,5 @@
     protected void prepareGUIBeforeConflictResolutionStarts() {
         MyRelationMemberConflictResolverModel relModel = getRelationMemberConflictResolverModel();
-        MyTagConflictResolverModel tagModel = getTagConflictResolverModel();
+        TagConflictResolverModel tagModel = getTagConflictResolverModel();
         getContentPane().removeAll();
 
@@ -382,5 +384,5 @@
         @Override
         public void propertyChange(PropertyChangeEvent evt) {
-            if (evt.getPropertyName().equals(MyTagConflictResolverModel.NUM_CONFLICTS_PROP)) {
+            if (evt.getPropertyName().equals(TagConflictResolverModel.NUM_CONFLICTS_PROP)) {
                 updateEnabledState();
             }
Index: /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolver.java
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolver.java	(revision 30713)
+++ /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolver.java	(revision 30714)
@@ -32,4 +32,5 @@
 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;
@@ -47,5 +48,5 @@
     private JMultilineLabel lblHeader;
 
-    protected void build() {
+    protected final void build() {
         setLayout(new GridBagLayout());
         JPanel pnl = new JPanel();
@@ -105,8 +106,8 @@
         pnl.add(new JLabel(trc("tag", "Key:")));
         pnl.add(tfKey = new AutoCompletingTextField(10));
-        tfKey.setToolTipText(tr("<html>Enter a tag key, i.e. <strong><tt>fixme</tt></strong></html>"));
+        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, i.e. <strong><tt>check members</tt></strong></html>"));
+        tfValue.setToolTipText(tr("<html>Enter a tag value, e.g. <strong><tt>check members</tt></strong></html>"));
         cbTagRelations.setSelected(false);
         tfKey.setEnabled(false);
@@ -115,10 +116,16 @@
     }
 
+    /**
+     * 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 ore more relations. "
+        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>"
@@ -130,6 +137,9 @@
     }
 
+    /**
+     * Initializes for node merging.
+     */
     public void initForNodeMerging() {
-        lblHeader.setText(tr("<html>The merged nodes are members in one ore more relations. "
+        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>"
@@ -174,11 +184,11 @@
         if (!cbTagRelations.isSelected())
             return null;
-        if (tfKey.getText().trim().equals(""))
-            return null;
-        if (tfValue.getText().trim().equals(""))
+        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, tfKey.getText(), tfValue.getText());
+        return new ChangePropertyCommand(primitives, Tag.removeWhiteSpaces(tfKey.getText()), Tag.removeWhiteSpaces(tfValue.getText()));
     }
 
Index: /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolverModel.java
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolverModel.java	(revision 30713)
+++ /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolverModel.java	(revision 30714)
@@ -23,296 +23,307 @@
 import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecision;
 import org.openstreetmap.josm.gui.conflict.tags.RelationMemberConflictDecisionType;
+import org.openstreetmap.josm.gui.util.GuiHelper;
 
 /**
-     * This model manages a list of conflicting relation members.
-     *
-     * It can be used as {@see TableModel}.
-     *
-     *
-     */
-    public class MyRelationMemberConflictResolverModel extends DefaultTableModel {
-        /** the property name for the number conflicts managed by this model */
-        static public 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 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++;
+ * This model manages a list of conflicting relation members.
+ *
+ * It can be used as {@link javax.swing.table.TableModel}.
+ */
+public class MyRelationMemberConflictResolverModel extends DefaultTableModel {
+    /** 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;
+    }
+
+    /**
+     * 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();
+    }
+
+    /**
+     * Populates the model with the members of the relation <code>relation</code>
+     * referring to <code>primitive</code>.
+     *
+     * @param relation the parent relation
+     * @param primitive the child primitive
+     */
+    protected void populate(Relation relation, OsmPrimitive primitive, Map<Way, Way> oldWays) {
+        for (int i =0; i<relation.getMembersCount();i++) {
+            if (MergeOverlapAction.getOld(relation.getMember(i).getWay(), oldWays) == MergeOverlapAction.getOld((Way)primitive, oldWays)) {
+                decisions.add(new RelationMemberConflictDecision(relation, i));
+            }
+        }
+    }
+
+    /**
+     * Populates the model with the relation members belonging to one of the relations in <code>relations</code>
+     * and referring to one of the primitives in <code>memberPrimitives</code>.
+     *
+     * @param relations  the parent relations. Empty list assumed if null.
+     * @param memberPrimitives the child primitives. Empty list assumed if null.
+     */
+    public void populate(Collection<Relation> relations, Collection<? extends OsmPrimitive> memberPrimitives, Map<Way, Way> oldWays) {
+        decisions.clear();
+        relations = relations == null ? new LinkedList<Relation>() : relations;
+        memberPrimitives = memberPrimitives == null ? new LinkedList<OsmPrimitive>() : memberPrimitives;
+        for (Relation r : relations) {
+            for (OsmPrimitive p: memberPrimitives) {
+                populate(r, p, oldWays);
+            }
+        }
+        this.relations = relations;
+        refresh();
+    }
+
+    /**
+     * 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;
+    }
+
+    protected void buildResolveCorrespondance(Relation relation, OsmPrimitive newPrimitive, Map<Relation, Relation> newRelations, Map<Way, Way> oldWays) {
+
+    	List<RelationMember> relationsMembers = relation.getMembers();
+    	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)));
+                	}
+                	else {
+                		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;
+                case UNDECIDED:
+                    // FIXME: this is an error
+                    break;
                 }
             }
-            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() {
-            if (decisions == null) return 0;
-            return decisions.size();
-        }
-
-        @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();
-        }
-
-        /**
-         * Populates the model with the members of the relation <code>relation</code>
-         * referring to <code>primitive</code>.
-         *
-         * @param relation the parent relation
-         * @param primitive the child primitive
-         */
-        protected void populate(Relation relation, OsmPrimitive primitive, Map<Way, Way> oldWays) {
-            for (int i = 0; i<relation.getMembersCount(); i++) {
-                if (MergeOverlapAction.getOld(relation.getMember(i).getWay(), oldWays) == MergeOverlapAction.getOld((Way)primitive, oldWays)) {
-                    decisions.add(new RelationMemberConflictDecision(relation, i));
-                }
-            }
-        }
-
-        /**
-         * Populates the model with the relation members belonging to one of the relations in <code>relations</code>
-         * and referring to one of the primitives in <code>memberPrimitives</code>.
-         *
-         * @param relations  the parent relations. Empty list assumed if null.
-         * @param memberPrimitives the child primitives. Empty list assumed if null.
-         */
-        public void populate(Collection<Relation> relations, Collection<? extends OsmPrimitive> memberPrimitives, Map<Way, Way> oldWays) {
-            decisions.clear();
-        	
-            relations = relations == null ? new LinkedList<Relation>() : relations;
-            memberPrimitives = memberPrimitives == null ? new LinkedList<OsmPrimitive>() : memberPrimitives;
-            for (Relation r : relations) {
-                for (OsmPrimitive p: memberPrimitives) {
-                    populate(r, p, oldWays);
-                }
-            }
-            this.relations = relations;
-            refresh();
-        }
-
-        /**
-         * Populates the model with the relation members represented as a collection of
-         * {@see 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  getRowCount();
-        }
-
-        /**
-         * Refreshes the model state. Invoke this method to trigger necessary change
-         * events after an update of the model data.
-         *
-         */
-        public void refresh() {
-            updateNumConflicts();
-            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;
-        }
-
-        protected void buildResolveCorrespondance(Relation relation, OsmPrimitive newPrimitive, Map<Relation, Relation> newRelations, Map<Way, Way> oldWays) {
-
-        	List<RelationMember> relationsMembers = relation.getMembers();
-        	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)));
-                    	}
-                    	else {
-                    		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;
-                    case UNDECIDED:
-                        // FIXME: this is an error
-                        break;
-                    }
-                }
-            }
-        }
-
-        /**
-         * Builds a collection of commands executing the decisions made in this model.
-         *
-         * @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) {
-            for (Relation relation : relations) {
-            	buildResolveCorrespondance(relation, newPrimitive, newRelations, oldWays);
-            }
-        }
-
-        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;
-        }
-    }
+        }
+    }
+
+    /**
+     * Builds a collection of commands executing the decisions made in this model.
+     *
+     * @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) {
+        for (Relation relation : relations) {
+        	buildResolveCorrespondance(relation, newPrimitive, newRelations, oldWays);
+        }
+    }
+
+    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 30713)
+++ /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyRelationMemberConflictResolverTable.java	(revision 30714)
@@ -6,5 +6,4 @@
 
 import javax.swing.AbstractAction;
-import javax.swing.JComboBox;
 import javax.swing.JComponent;
 import javax.swing.JTable;
@@ -14,4 +13,5 @@
 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 {
@@ -25,5 +25,5 @@
     }
 
-    protected void build() {
+    protected final void build() {
         setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
         setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
@@ -42,5 +42,5 @@
         getActionMap().put("selectPreviousColumnCell", selectPreviousColumnCellAction);
 
-        setRowHeight((int)new JComboBox<>().getPreferredSize().getHeight());
+        setRowHeight((int)new JosmComboBox<String>().getPreferredSize().getHeight());
     }
 
@@ -49,5 +49,5 @@
      * 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>
+     * when the user leaves the last cell in the table</li></ul>
      *
      *
Index: plications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyTagConflictResolver.java
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyTagConflictResolver.java	(revision 30713)
+++ 	(revision )
@@ -1,110 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package mergeoverlap.hack;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.BorderLayout;
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-
-import javax.swing.BorderFactory;
-import javax.swing.JCheckBox;
-import javax.swing.JLabel;
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import org.openstreetmap.josm.Main;
-
-/**
- * This is a UI widget for resolving tag conflicts, i.e. differences of the tag values
- * of multiple {@link org.openstreetmap.josm.data.osm.OsmPrimitive}s.
- *
- *
- */
-public class MyTagConflictResolver extends JPanel {
-
-    /** the model for the tag conflict resolver */
-    private MyTagConflictResolverModel model;
-    /** selects whether only tags with conflicts are displayed */
-    private JCheckBox cbShowTagsWithConflictsOnly;
-    private JCheckBox cbShowTagsWithMultiValuesOnly;
-
-    protected JPanel buildInfoPanel() {
-        JPanel pnl = new JPanel();
-        pnl.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
-        pnl.setLayout(new GridBagLayout());
-        GridBagConstraints gc = new GridBagConstraints();
-        gc.fill = GridBagConstraints.BOTH;
-        gc.weighty = 1.0;
-        gc.weightx = 1.0;
-        gc.anchor = GridBagConstraints.LINE_START;
-        gc.gridwidth = 2;
-        pnl.add(new JLabel(tr("<html>Please select the values to keep for the following tags.</html>")), gc);
-
-        gc.gridwidth = 1;
-        gc.gridy = 1;
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.weighty = 0.0;
-        pnl.add(cbShowTagsWithConflictsOnly = new JCheckBox(tr("Show tags with conflicts only")), gc);
-        pnl.add(cbShowTagsWithMultiValuesOnly = new JCheckBox(tr("Show tags with multiple values only")), gc);
-        cbShowTagsWithConflictsOnly.addChangeListener(
-                new ChangeListener() {
-                    @Override
-                    public void stateChanged(ChangeEvent e) {
-                        model.setShowTagsWithConflictsOnly(cbShowTagsWithConflictsOnly.isSelected());
-                        cbShowTagsWithMultiValuesOnly.setEnabled(cbShowTagsWithConflictsOnly.isSelected());
-                    }
-                }
-        );
-        cbShowTagsWithConflictsOnly.setSelected(
-                Main.pref.getBoolean(getClass().getName() + ".showTagsWithConflictsOnly", false)
-        );
-        cbShowTagsWithMultiValuesOnly.addChangeListener(
-                new ChangeListener() {
-                    @Override
-                    public void stateChanged(ChangeEvent e) {
-                        model.setShowTagsWithMultiValuesOnly(cbShowTagsWithMultiValuesOnly.isSelected());
-                    }
-                }
-        );
-        cbShowTagsWithMultiValuesOnly.setSelected(
-                Main.pref.getBoolean(getClass().getName() + ".showTagsWithMultiValuesOnly", false)
-        );
-        cbShowTagsWithMultiValuesOnly.setEnabled(cbShowTagsWithConflictsOnly.isSelected());
-        return pnl;
-    }
-
-    /**
-     * Remembers the current settings in the global preferences
-     *
-     */
-    public void rememberPreferences() {
-        Main.pref.put(getClass().getName() + ".showTagsWithConflictsOnly", cbShowTagsWithConflictsOnly.isSelected());
-        Main.pref.put(getClass().getName() + ".showTagsWithMultiValuesOnly", cbShowTagsWithMultiValuesOnly.isSelected());
-    }
-
-    protected final void build() {
-        setLayout(new BorderLayout());
-        add(buildInfoPanel(), BorderLayout.NORTH);
-        add(new JScrollPane(new MyTagConflictResolverTable(model)), BorderLayout.CENTER);
-    }
-
-    /**
-     * Constructs a new {@code MyTagConflictResolver}.
-     */
-    public MyTagConflictResolver() {
-        this.model = new MyTagConflictResolverModel();
-        build();
-    }
-
-    /**
-     * Replies the model used by this dialog
-     *
-     * @return the model
-     */
-    public MyTagConflictResolverModel getModel() {
-        return model;
-    }
-}
Index: plications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyTagConflictResolverModel.java
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyTagConflictResolverModel.java	(revision 30713)
+++ 	(revision )
@@ -1,283 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package mergeoverlap.hack;
-
-import java.beans.PropertyChangeListener;
-import java.beans.PropertyChangeSupport;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.swing.table.DefaultTableModel;
-
-import org.openstreetmap.josm.data.osm.TagCollection;
-import org.openstreetmap.josm.gui.conflict.tags.MultiValueDecisionType;
-import org.openstreetmap.josm.gui.conflict.tags.MultiValueResolutionDecision;
-import org.openstreetmap.josm.gui.util.GuiHelper;
-import org.openstreetmap.josm.tools.CheckParameterUtil;
-
-public class MyTagConflictResolverModel extends DefaultTableModel {
-    public static final String NUM_CONFLICTS_PROP = MyTagConflictResolverModel.class.getName() + ".numConflicts";
-
-    private TagCollection tags;
-    private List<String> displayedKeys;
-    private Set<String> keysWithConflicts;
-    private Map<String, MultiValueResolutionDecision> decisions;
-    private int numConflicts;
-    private PropertyChangeSupport support;
-    private boolean showTagsWithConflictsOnly = false;
-    private boolean showTagsWithMultiValuesOnly = false;
-
-    /**
-     * Constructs a new {@code MyTagConflictResolverModel}.
-     */
-    public MyTagConflictResolverModel() {
-        numConflicts = 0;
-        support = new PropertyChangeSupport(this);
-    }
-
-    public void addPropertyChangeListener(PropertyChangeListener listener) {
-        support.addPropertyChangeListener(listener);
-    }
-
-    public void removePropertyChangeListener(PropertyChangeListener listener) {
-        support.removePropertyChangeListener(listener);
-    }
-
-    protected void setNumConflicts(int numConflicts) {
-        int oldValue = this.numConflicts;
-        this.numConflicts = numConflicts;
-        if (oldValue != this.numConflicts) {
-            support.firePropertyChange(NUM_CONFLICTS_PROP, oldValue, this.numConflicts);
-        }
-    }
-
-    protected void refreshNumConflicts() {
-        int count = 0;
-        for (MultiValueResolutionDecision d : decisions.values()) {
-            if (!d.isDecided()) {
-                count++;
-            }
-        }
-        setNumConflicts(count);
-    }
-
-    protected void sort() {
-        Collections.sort(
-                displayedKeys,
-                new Comparator<String>() {
-                    @Override
-                    public int compare(String key1, String key2) {
-                        if (decisions.get(key1).isDecided() && ! decisions.get(key2).isDecided())
-                            return 1;
-                        else if (!decisions.get(key1).isDecided() && decisions.get(key2).isDecided())
-                            return -1;
-                        return key1.compareTo(key2);
-                    }
-                }
-        );
-    }
-
-    /**
-     * initializes the model from the current tags
-     *
-     */
-    protected void rebuild() {
-        if (tags == null) return;
-        for(String key: tags.getKeys()) {
-            MultiValueResolutionDecision decision = new MultiValueResolutionDecision(tags.getTagsFor(key));
-            if (decisions.get(key) == null) {
-                decisions.put(key,decision);
-            }
-        }
-        displayedKeys.clear();
-        Set<String> keys = tags.getKeys();
-        if (showTagsWithConflictsOnly) {
-            keys.retainAll(keysWithConflicts);
-            if (showTagsWithMultiValuesOnly) {
-                Set<String> keysWithMultiValues = new HashSet<>();
-                for (String key: keys) {
-                    if (decisions.get(key).canKeepAll()) {
-                        keysWithMultiValues.add(key);
-                    }
-                }
-                keys.retainAll(keysWithMultiValues);
-            }
-            for (String key: tags.getKeys()) {
-                if (!decisions.get(key).isDecided() && !keys.contains(key)) {
-                    keys.add(key);
-                }
-            }
-        }
-        displayedKeys.addAll(keys);
-        refreshNumConflicts();
-        sort();
-        GuiHelper.runInEDTAndWait(new Runnable() {
-            @Override public void run() {
-                fireTableDataChanged();
-            }
-        });
-    }
-
-    /**
-     * Populates the model with the tags for which conflicts are to be resolved.
-     *
-     * @param tags  the tag collection with the tags. Must not be null.
-     * @param keysWithConflicts the set of tag keys with conflicts
-     * @throws IllegalArgumentException thrown if tags is null
-     */
-    public void populate(TagCollection tags, Set<String> keysWithConflicts) {
-        CheckParameterUtil.ensureParameterNotNull(tags, "tags");
-        this.tags = tags;
-        displayedKeys = new ArrayList<>();
-        this.keysWithConflicts = keysWithConflicts == null ? new HashSet<String>() : keysWithConflicts;
-        decisions = new HashMap<>();
-        rebuild();
-    }
-
-    /**
-     * Returns the OSM key at the given row.
-     * @param row The table row
-     * @return the OSM key at the given row.
-     * @since 6616
-     */
-    public final String getKey(int row) {
-        return displayedKeys.get(row);
-    }
-
-    @Override
-    public int getRowCount() {
-        if (displayedKeys == null) return 0;
-        return displayedKeys.size();
-    }
-
-    @Override
-    public Object getValueAt(int row, int column) {
-        return getDecision(row);
-    }
-
-    @Override
-    public boolean isCellEditable(int row, int column) {
-        return column == 2;
-    }
-
-    @Override
-    public void setValueAt(Object value, int row, int column) {
-        MultiValueResolutionDecision decision = getDecision(row);
-        if (value instanceof String) {
-            decision.keepOne((String)value);
-        } else if (value instanceof MultiValueDecisionType) {
-            MultiValueDecisionType type = (MultiValueDecisionType)value;
-            switch(type) {
-            case KEEP_NONE:
-                decision.keepNone();
-                break;
-            case KEEP_ALL:
-                decision.keepAll();
-                break;
-            }
-        }
-        GuiHelper.runInEDTAndWait(new Runnable() {
-            @Override public void run() {
-                fireTableDataChanged();
-            }
-        });
-        refreshNumConflicts();
-    }
-
-    /**
-     * Replies true if each {@link MultiValueResolutionDecision} is decided.
-     *
-     * @return true if each {@link MultiValueResolutionDecision} is decided; false
-     * otherwise
-     */
-    public boolean isResolvedCompletely() {
-        return numConflicts == 0;
-    }
-
-    public int getNumConflicts() {
-        return numConflicts;
-    }
-
-    public int getNumDecisions() {
-        return decisions == null ? 0 : decisions.size();
-    }
-
-    //TODO Should this method work with all decisions or only with displayed decisions? For MergeNodes it should be
-    //all decisions, but this method is also used on other places, so I've made new method just for MergeNodes
-    public TagCollection getResolution() {
-        TagCollection tc = new TagCollection();
-        for (String key: displayedKeys) {
-            tc.add(decisions.get(key).getResolution());
-        }
-        return tc;
-    }
-
-    public TagCollection getAllResolutions() {
-        TagCollection tc = new TagCollection();
-        for (MultiValueResolutionDecision value: decisions.values()) {
-            tc.add(value.getResolution());
-        }
-        return tc;
-    }
-
-    /**
-     * Returns the conflict resolution decision at the given row.
-     * @param row The table row
-     * @return the conflict resolution decision at the given row.
-     */
-    public MultiValueResolutionDecision getDecision(int row) {
-        return decisions.get(getKey(row));
-    }
-
-    /**
-     * Sets whether all tags or only tags with conflicts are displayed
-     *
-     * @param showTagsWithConflictsOnly if true, only tags with conflicts are displayed
-     */
-    public void setShowTagsWithConflictsOnly(boolean showTagsWithConflictsOnly) {
-        this.showTagsWithConflictsOnly = showTagsWithConflictsOnly;
-        rebuild();
-    }
-
-    /**
-     * Sets whether all conflicts or only conflicts with multiple values are displayed
-     *
-     * @param showTagsWithMultiValuesOnly if true, only tags with multiple values are displayed
-     */
-    public void setShowTagsWithMultiValuesOnly(boolean showTagsWithMultiValuesOnly) {
-        this.showTagsWithMultiValuesOnly = showTagsWithMultiValuesOnly;
-        rebuild();
-    }
-
-    /**
-     * Prepare the default decisions for the current model
-     *
-     */
-    public void prepareDefaultTagDecisions() {
-        for (MultiValueResolutionDecision decision: decisions.values()) {
-            List<String> values = decision.getValues();
-            values.remove("");
-            if (values.size() == 1) {
-                // TODO: Do not suggest to keep the single value in order to avoid long highways to become tunnels+bridges+... (only if both primitives are tagged)
-                decision.keepOne(values.get(0));
-            } else {
-                // Do not suggest to keep all values in order to reduce the wrong usage of semicolon values, see #9104!
-            }
-        }
-        rebuild();
-    }
-
-    /**
-     * Returns the set of keys in conflict.
-     * @return the set of keys in conflict.
-     * @since 6616
-     */
-    public final Set<String> getKeysWithConflicts() {
-        return new HashSet<>(keysWithConflicts);
-    }
-}
Index: plications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyTagConflictResolverTable.java
===================================================================
--- /applications/editors/josm/plugins/merge-overlap/src/mergeoverlap/hack/MyTagConflictResolverTable.java	(revision 30713)
+++ 	(revision )
@@ -1,124 +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.TagConflictResolverColumnModel;
-import org.openstreetmap.josm.gui.widgets.JosmComboBox;
-
-public class MyTagConflictResolverTable extends JTable implements MultiValueCellEditor.NavigationListener {
-
-    private SelectNextColumnCellAction selectNextColumnCellAction;
-    private SelectPreviousColumnCellAction selectPreviousColumnCellAction;
-
-    public MyTagConflictResolverTable(MyTagConflictResolverModel model) {
-        super(model, new TagConflictResolverColumnModel());
-        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);
-
-        ((MultiValueCellEditor)getColumnModel().getColumn(2).getCellEditor()).addNavigationListeners(this);
-
-        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);
-            if (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);
-            if (editCellAt(getSelectedRow(), getSelectedColumn())) {
-                getEditorComponent().requestFocusInWindow();
-            }
-        }
-    }
-
-    @Override
-    public void gotoNextDecision() {
-        selectNextColumnCellAction.run();
-    }
-
-    @Override
-    public void gotoPreviousDecision() {
-        selectPreviousColumnCellAction.run();
-    }
-}
