Index: .classpath
===================================================================
--- .classpath	(revision 6713)
+++ .classpath	(working copy)
@@ -1,25 +1,26 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="src" path="test/unit"/>
-	<classpathentry kind="src" path="test/functional"/>
-	<classpathentry excluding="build/|data_nodist/|dist/|doc/|lib/|macosx/|nb/|src/|test/|test/build/|test/functional/|test/performance/|test/unit/|tools/|utils/" kind="src" path=""/>
-	<classpathentry kind="src" path="test/performance"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
-	<classpathentry kind="lib" path="test/lib/fest/fest-assert-1.0.jar"/>
-	<classpathentry kind="lib" path="test/lib/fest/fest-reflect-1.1.jar"/>
-	<classpathentry kind="lib" path="test/lib/fest/fest-swing-1.1.jar"/>
-	<classpathentry kind="lib" path="test/lib/fest/fest-util-1.0.jar"/>
-	<classpathentry kind="lib" path="test/lib/fest/jcip-annotations-1.0.jar"/>
-	<classpathentry kind="lib" path="test/lib/fest/MRJToolkitStubs-1.0.jar"/>
-	<classpathentry kind="lib" path="test/lib/jfcunit.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
-	<classpathentry exported="true" kind="con" path="GROOVY_SUPPORT"/>
-	<classpathentry kind="lib" path="test/lib/unitils-core/commons-collections-3.2.jar"/>
-	<classpathentry kind="lib" path="test/lib/unitils-core/commons-lang-2.3.jar"/>
-	<classpathentry kind="lib" path="test/lib/unitils-core/commons-logging-1.1.jar"/>
-	<classpathentry kind="lib" path="test/lib/unitils-core/ognl-2.6.9.jar"/>
-	<classpathentry kind="lib" path="test/lib/unitils-core/unitils-core-3.3.jar"/>
-	<classpathentry kind="lib" path="test/lib/fest/debug-1.0.jar"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="test/unit"/>
+	<classpathentry kind="src" path="test/functional"/>
+	<classpathentry excluding="build/|data_nodist/|dist/|doc/|lib/|macosx/|nb/|src/|test/|test/build/|test/functional/|test/performance/|test/unit/|tools/|utils/" kind="src" path=""/>
+	<classpathentry kind="src" path="test/performance"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry kind="lib" path="test/lib/fest/fest-assert-1.0.jar"/>
+	<classpathentry kind="lib" path="test/lib/fest/fest-reflect-1.1.jar"/>
+	<classpathentry kind="lib" path="test/lib/fest/fest-swing-1.1.jar"/>
+	<classpathentry kind="lib" path="test/lib/fest/fest-util-1.0.jar"/>
+	<classpathentry kind="lib" path="test/lib/fest/jcip-annotations-1.0.jar"/>
+	<classpathentry kind="lib" path="test/lib/fest/MRJToolkitStubs-1.0.jar"/>
+	<classpathentry kind="lib" path="test/lib/jfcunit.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry exported="true" kind="con" path="GROOVY_SUPPORT"/>
+	<classpathentry kind="lib" path="test/lib/unitils-core/commons-collections-3.2.jar"/>
+	<classpathentry kind="lib" path="test/lib/unitils-core/commons-lang-2.3.jar"/>
+	<classpathentry kind="lib" path="test/lib/unitils-core/commons-logging-1.1.jar"/>
+	<classpathentry kind="lib" path="test/lib/unitils-core/ognl-2.6.9.jar"/>
+	<classpathentry kind="lib" path="test/lib/unitils-core/unitils-core-3.3.jar"/>
+	<classpathentry kind="lib" path="test/lib/fest/debug-1.0.jar"/>
+	<classpathentry kind="lib" path="test/lib/junit/hamcrest-core-1.3.jar"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
Index: REVISION.XML
===================================================================
--- REVISION.XML	(revision 0)
+++ REVISION.XML	(working copy)
@@ -0,0 +1 @@
+fatal: Not a git repository (or any of the parent directories): .git
Index: src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
===================================================================
--- src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(revision 6713)
+++ src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java	(working copy)
@@ -149,7 +149,7 @@
 
     private static final StringSwitcher[] stringSwitchers = new StringSwitcher[] {
         new StringSwitcher("left", "right"),
-        new StringSwitcher("forwards", "backwards"),
+        new StringSwitcher("forward", "backward"),
         new StringSwitcher("east", "west"),
         new StringSwitcher("north", "south"),
         FORWARD_BACKWARD, UP_DOWN
@@ -193,7 +193,7 @@
     @Override
     public Collection<Command> execute(Way oldway, Way way) throws UserCancelException {
         Map<OsmPrimitive, List<TagCorrection>> tagCorrectionsMap =
-            new HashMap<OsmPrimitive, List<TagCorrection>>();
+                new HashMap<OsmPrimitive, List<TagCorrection>>();
 
         List<TagCorrection> tagCorrections = new ArrayList<TagCorrection>();
         for (String key : way.keySet()) {
@@ -219,7 +219,7 @@
         }
 
         Map<OsmPrimitive, List<RoleCorrection>> roleCorrectionMap =
-            new HashMap<OsmPrimitive, List<RoleCorrection>>();
+                new HashMap<OsmPrimitive, List<RoleCorrection>>();
         List<RoleCorrection> roleCorrections = new ArrayList<RoleCorrection>();
 
         Collection<OsmPrimitive> referrers = oldway.getReferrers();
Index: src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java	(revision 6713)
+++ src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java	(working copy)
@@ -1,12 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.validation.tests;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.validation.Severity;
-import org.openstreetmap.josm.data.validation.Test;
-import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.tools.Predicates;
-import org.openstreetmap.josm.tools.Utils;
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -17,7 +12,12 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import static org.openstreetmap.josm.tools.I18n.tr;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.validation.Severity;
+import org.openstreetmap.josm.data.validation.Test;
+import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.tools.Predicates;
+import org.openstreetmap.josm.tools.Utils;
 
 public class ConditionalKeys extends Test.TagTest {
 
@@ -55,7 +55,9 @@
     }
 
     public static boolean isDirection(String part) {
-        return "forward".equals(part) || "backward".equals(part);
+        return "forward".equals(part) || "backward".equals(part) ||
+                (part != null && (part.startsWith("north") || part.startsWith("south") ||
+                        part.startsWith("east") || part.startsWith("west")));
     }
 
     public boolean isKeyValid(String key) {
@@ -68,7 +70,7 @@
         return parts.length == 3 && isRestrictionType(parts[0]) && isTransportationMode(parts[1]) && isDirection(parts[2])
                 || parts.length == 1 && (isRestrictionType(parts[0]) || isTransportationMode(parts[0]))
                 || parts.length == 2 && (
-                isRestrictionType(parts[0]) && (isTransportationMode(parts[1]) || isDirection(parts[1]))
+                        isRestrictionType(parts[0]) && (isTransportationMode(parts[1]) || isDirection(parts[1]))
                         || isTransportationMode(parts[0]) && isDirection(parts[1]));
     }
 
Index: src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(revision 6713)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java	(working copy)
@@ -120,217 +120,217 @@
     }
 
     ListSelectionListener highlighterListener = new ListSelectionListener() {
-            @Override
-            public void valueChanged(ListSelectionEvent lse) {
-                if (Main.isDisplayingMapView()) {
-                    Collection<RelationMember> sel = getMemberTableModel().getSelectedMembers();
-                    final List<OsmPrimitive> toHighlight = new ArrayList<OsmPrimitive>();
-                    for (RelationMember r: sel) {
-                        if (r.getMember().isUsable()) {
-                            toHighlight.add(r.getMember());
+        @Override
+        public void valueChanged(ListSelectionEvent lse) {
+            if (Main.isDisplayingMapView()) {
+                Collection<RelationMember> sel = getMemberTableModel().getSelectedMembers();
+                final List<OsmPrimitive> toHighlight = new ArrayList<OsmPrimitive>();
+                for (RelationMember r: sel) {
+                    if (r.getMember().isUsable()) {
+                        toHighlight.add(r.getMember());
+                    }
+                }
+                SwingUtilities.invokeLater(new Runnable() {
+                    @Override
+                    public void run() {
+                        if (highlightHelper.highlightOnly(toHighlight)) {
+                            Main.map.mapView.repaint();
                         }
                     }
-                    SwingUtilities.invokeLater(new Runnable() {
-                        @Override
-                        public void run() {
-                            if (highlightHelper.highlightOnly(toHighlight)) {
-                                Main.map.mapView.repaint();
-                            }
-                        }
-                    });
-                }
-            }};
+                });
+            }
+        }};
 
-    private void initHighlighting() {
-        highlightEnabled = Main.pref.getBoolean("draw.target-highlight", true);
-        if (!highlightEnabled) return;
-        getMemberTableModel().getSelectionModel().addListSelectionListener(highlighterListener);
-        if (Main.isDisplayingMapView()) {
-            HighlightHelper.clearAllHighlighted();
-            Main.map.mapView.repaint();
+        private void initHighlighting() {
+            highlightEnabled = Main.pref.getBoolean("draw.target-highlight", true);
+            if (!highlightEnabled) return;
+            getMemberTableModel().getSelectionModel().addListSelectionListener(highlighterListener);
+            if (Main.isDisplayingMapView()) {
+                HighlightHelper.clearAllHighlighted();
+                Main.map.mapView.repaint();
+            }
         }
-    }
 
-    /**
-     * 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();
+        /**
+         * 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();
             }
 
-            if (col == 0 && row < getRowCount() - 1) {
-                row++;
-            } else if (row < getRowCount() - 1) {
-                col = 0;
-                row++;
-            } else {
-                // go to next component, no more rows in this table
-                KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
-                manager.focusNextComponent();
-                return;
+            public void run() {
+                int col = getSelectedColumn();
+                int row = getSelectedRow();
+                if (getCellEditor() != null) {
+                    getCellEditor().stopCellEditing();
+                }
+
+                if (col == 0 && row < getRowCount() - 1) {
+                    row++;
+                } else if (row < getRowCount() - 1) {
+                    col = 0;
+                    row++;
+                } else {
+                    // go to next component, no more rows in this table
+                    KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
+                    manager.focusNextComponent();
+                    return;
+                }
+                changeSelection(row, col, false, false);
             }
-            changeSelection(row, col, false, false);
         }
-    }
 
-    /**
-     * Action to be run when the user navigates to the previous cell in the table, for instance by
-     * pressing Shift-TAB
-     *
-     */
-    private class SelectPreviousColumnCellAction extends AbstractAction {
+        /**
+         * Action to be run when the user navigates to the previous cell in the table, for instance by
+         * pressing Shift-TAB
+         *
+         */
+        private class SelectPreviousColumnCellAction extends AbstractAction {
 
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            int col = getSelectedColumn();
-            int row = getSelectedRow();
-            if (getCellEditor() != null) {
-                getCellEditor().stopCellEditing();
-            }
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                int col = getSelectedColumn();
+                int row = getSelectedRow();
+                if (getCellEditor() != null) {
+                    getCellEditor().stopCellEditing();
+                }
 
-            if (col <= 0 && row <= 0) {
-                // change nothing
-            } else if (row > 0) {
-                col = 0;
-                row--;
+                if (col <= 0 && row <= 0) {
+                    // change nothing
+                } else if (row > 0) {
+                    col = 0;
+                    row--;
+                }
+                changeSelection(row, col, false, false);
             }
-            changeSelection(row, col, false, false);
         }
-    }
 
-    @Override
-    public void unlinkAsListener() {
-        super.unlinkAsListener();
-        MapView.removeLayerChangeListener(zoomToGap);
-    }
+        @Override
+        public void unlinkAsListener() {
+            super.unlinkAsListener();
+            MapView.removeLayerChangeListener(zoomToGap);
+        }
 
-    public void stopHighlighting() {
-        if (highlighterListener == null) return;
-        if (!highlightEnabled) return;
-        getMemberTableModel().getSelectionModel().removeListSelectionListener(highlighterListener);
-        highlighterListener = null;
-        if (Main.isDisplayingMapView()) {
-            HighlightHelper.clearAllHighlighted();
-            Main.map.mapView.repaint();
+        public void stopHighlighting() {
+            if (highlighterListener == null) return;
+            if (!highlightEnabled) return;
+            getMemberTableModel().getSelectionModel().removeListSelectionListener(highlighterListener);
+            highlighterListener = null;
+            if (Main.isDisplayingMapView()) {
+                HighlightHelper.clearAllHighlighted();
+                Main.map.mapView.repaint();
+            }
         }
-    }
 
-    private class SelectPreviousGapAction extends AbstractAction {
+        private class SelectPreviousGapAction extends AbstractAction {
 
-        public SelectPreviousGapAction() {
-            putValue(NAME, tr("Select previous Gap"));
-            putValue(SHORT_DESCRIPTION, tr("Select the previous relation member which gives rise to a gap"));
-        }
+            public SelectPreviousGapAction() {
+                putValue(NAME, tr("Select previous Gap"));
+                putValue(SHORT_DESCRIPTION, tr("Select the previous relation member which gives rise to a gap"));
+            }
 
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            int i = getSelectedRow() - 1;
-            while (i >= 0 && getMemberTableModel().getWayConnection(i).linkPrev) {
-                i--;
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                int i = getSelectedRow() - 1;
+                while (i >= 0 && getMemberTableModel().getWayConnection(i).linkPrev) {
+                    i--;
+                }
+                if (i >= 0) {
+                    getSelectionModel().setSelectionInterval(i, i);
+                }
             }
-            if (i >= 0) {
-                getSelectionModel().setSelectionInterval(i, i);
-            }
         }
-    }
 
-    private class SelectNextGapAction extends AbstractAction {
+        private class SelectNextGapAction extends AbstractAction {
 
-        public SelectNextGapAction() {
-            putValue(NAME, tr("Select next Gap"));
-            putValue(SHORT_DESCRIPTION, tr("Select the next relation member which gives rise to a gap"));
-        }
+            public SelectNextGapAction() {
+                putValue(NAME, tr("Select next Gap"));
+                putValue(SHORT_DESCRIPTION, tr("Select the next relation member which gives rise to a gap"));
+            }
 
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            int i = getSelectedRow() + 1;
-            while (i < getRowCount() && getMemberTableModel().getWayConnection(i).linkNext) {
-                i++;
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                int i = getSelectedRow() + 1;
+                while (i < getRowCount() && getMemberTableModel().getWayConnection(i).linkNext) {
+                    i++;
+                }
+                if (i < getRowCount()) {
+                    getSelectionModel().setSelectionInterval(i, i);
+                }
             }
-            if (i < getRowCount()) {
-                getSelectionModel().setSelectionInterval(i, i);
-            }
         }
-    }
 
-    private class ZoomToGapAction extends AbstractAction implements LayerChangeListener, ListSelectionListener {
+        private class ZoomToGapAction extends AbstractAction implements LayerChangeListener, ListSelectionListener {
 
-        public ZoomToGapAction() {
-            putValue(NAME, tr("Zoom to Gap"));
-            putValue(SHORT_DESCRIPTION, tr("Zoom to the gap in the way sequence"));
-            updateEnabledState();
-        }
+            public ZoomToGapAction() {
+                putValue(NAME, tr("Zoom to Gap"));
+                putValue(SHORT_DESCRIPTION, tr("Zoom to the gap in the way sequence"));
+                updateEnabledState();
+            }
 
-        private WayConnectionType getConnectionType() {
-            return getMemberTableModel().getWayConnection(getSelectedRows()[0]);
-        }
+            private WayConnectionType getConnectionType() {
+                return getMemberTableModel().getWayConnection(getSelectedRows()[0]);
+            }
 
-        private final Collection<Direction> connectionTypesOfInterest = Arrays.asList(WayConnectionType.Direction.FORWARD, WayConnectionType.Direction.BACKWARD);
+            private final Collection<Direction> connectionTypesOfInterest = Arrays.asList(WayConnectionType.Direction.FORWARD, WayConnectionType.Direction.BACKWARD);
 
-        private boolean hasGap() {
-            WayConnectionType connectionType = getConnectionType();
-            return connectionTypesOfInterest.contains(connectionType.direction)
-                    && !(connectionType.linkNext && connectionType.linkPrev);
-        }
+            private boolean hasGap() {
+                WayConnectionType connectionType = getConnectionType();
+                return connectionTypesOfInterest.contains(connectionType.direction.interpretation())
+                        && !(connectionType.linkNext && connectionType.linkPrev);
+            }
 
-        @Override
-        public void actionPerformed(ActionEvent e) {
-            WayConnectionType connectionType = getConnectionType();
-            Way way = (Way) getMemberTableModel().getReferredPrimitive(getSelectedRows()[0]);
-            if (!connectionType.linkPrev) {
-                getLayer().data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction)
-                        ? way.firstNode() : way.lastNode());
-                AutoScaleAction.autoScale("selection");
-            } else if (!connectionType.linkNext) {
-                getLayer().data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction)
-                        ? way.lastNode() : way.firstNode());
-                AutoScaleAction.autoScale("selection");
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                WayConnectionType connectionType = getConnectionType();
+                Way way = (Way) getMemberTableModel().getReferredPrimitive(getSelectedRows()[0]);
+                if (!connectionType.linkPrev) {
+                    getLayer().data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction.interpretation())
+                            ? way.firstNode() : way.lastNode());
+                    AutoScaleAction.autoScale("selection");
+                } else if (!connectionType.linkNext) {
+                    getLayer().data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction.interpretation())
+                            ? way.lastNode() : way.firstNode());
+                    AutoScaleAction.autoScale("selection");
+                }
             }
-        }
 
-        private void updateEnabledState() {
-            setEnabled(Main.main != null
-                    && Main.main.getEditLayer() == getLayer()
-                    && getSelectedRowCount() == 1
-                    && hasGap());
-        }
+            private void updateEnabledState() {
+                setEnabled(Main.main != null
+                        && Main.main.getEditLayer() == getLayer()
+                        && getSelectedRowCount() == 1
+                        && hasGap());
+            }
 
-        @Override
-        public void valueChanged(ListSelectionEvent e) {
-            updateEnabledState();
-        }
+            @Override
+            public void valueChanged(ListSelectionEvent e) {
+                updateEnabledState();
+            }
 
-        @Override
-        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-            updateEnabledState();
-        }
+            @Override
+            public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+                updateEnabledState();
+            }
 
-        @Override
-        public void layerAdded(Layer newLayer) {
-            updateEnabledState();
+            @Override
+            public void layerAdded(Layer newLayer) {
+                updateEnabledState();
+            }
+
+            @Override
+            public void layerRemoved(Layer oldLayer) {
+                updateEnabledState();
+            }
         }
 
-        @Override
-        public void layerRemoved(Layer oldLayer) {
-            updateEnabledState();
+        protected MemberTableModel getMemberTableModel() {
+            return (MemberTableModel) getModel();
         }
-    }
-
-    protected MemberTableModel getMemberTableModel() {
-        return (MemberTableModel) getModel();
-    }
 }
Index: src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java	(revision 6713)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java	(working copy)
@@ -161,9 +161,13 @@
         /* special icons */
         Image arrow = null;
         switch (value.direction) {
+        case NORTH:
+        case EAST:
         case FORWARD:
             arrow = arrowDown;
             break;
+        case SOUTH:
+        case WEST:
         case BACKWARD:
             arrow = arrowUp;
             break;
Index: src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSortUtils.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSortUtils.java	(revision 6713)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSortUtils.java	(working copy)
@@ -15,7 +15,7 @@
     private RelationSortUtils() {
         // Hide default constructor for utils classes
     }
-    
+
     /**
      * determine, if the way i is a roundabout and if yes, what type of roundabout
      */
@@ -49,11 +49,11 @@
     }
 
     static boolean isBackward(final RelationMember member){
-        return member.getRole().equals("backward");
+        return member.getRole().equals("backward") || member.getRole().startsWith("south") || member.getRole().startsWith("west");
     }
 
     static boolean isForward(final RelationMember member){
-        return member.getRole().equals("forward");
+        return member.getRole().equals("forward") || member.getRole().startsWith("north") || member.getRole().startsWith("east");
     }
 
     static boolean isOneway(final RelationMember member){
Index: src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java	(revision 6713)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java	(working copy)
@@ -25,8 +25,63 @@
     public Direction direction;
 
     public enum Direction {
-        FORWARD, BACKWARD, ROUNDABOUT_LEFT, ROUNDABOUT_RIGHT, NONE;
+        FORWARD {
+            @Override
+            public Direction interpretation() {
+                return FORWARD;
+            }
+        },
+        BACKWARD {
+            @Override
+            public Direction interpretation() {
+                return BACKWARD;
+            }
+        },
+        ROUNDABOUT_LEFT {
+            @Override
+            public Direction interpretation() {
+                return FORWARD;
+            }
+        },
+        ROUNDABOUT_RIGHT {
+            @Override
+            public Direction interpretation() {
+                return BACKWARD;
+            }
+        },
+        NONE {
+            @Override
+            public Direction interpretation() {
+                return FORWARD;
+            }
+        },
+        NORTH {
+            @Override
+            public Direction interpretation() {
+                return FORWARD;
+            }
+        },
+        SOUTH {
+            @Override
+            public Direction interpretation() {
+                return BACKWARD;
+            }
+        },
+        EAST {
+            @Override
+            public Direction interpretation() {
+                return FORWARD;
+            }
+        },
+        WEST {
+            @Override
+            public Direction interpretation() {
+                return BACKWARD;
+            }
+        };
 
+        public abstract Direction interpretation();
+
         public boolean isRoundabout() {
             return this == ROUNDABOUT_RIGHT || this == ROUNDABOUT_LEFT;
         }
Index: src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java	(revision 6713)
+++ src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java	(working copy)
@@ -248,9 +248,13 @@
         List<Node> refNodes= new ArrayList<Node>();
 
         switch (ref_direction) {
+        case NORTH:
+        case EAST:
         case FORWARD:
             refNodes.add(way_ref.lastNode());
             break;
+        case SOUTH:
+        case WEST:
         case BACKWARD:
             refNodes.add(way_ref.firstNode());
             break;
Index: src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java	(revision 6713)
+++ src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java	(working copy)
@@ -171,6 +171,11 @@
 
         public boolean required = false;
         public long count = 0;
+        
+        @Override
+        public String toString() {
+            return "[Role key = " + key + ", text = " + text + "]";
+        }
 
         public void setType(String types) throws SAXException {
             this.types = getType(types);
