diff --git a/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java b/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
index a31e397..4387b86 100644
--- a/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
+++ b/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
@@ -149,7 +149,7 @@ public class ReverseWayTagCorrector extends TagCorrector<Way> {
 
     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
diff --git a/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java b/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
index 89f6338..882a84e 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/ConditionalKeys.java
@@ -55,7 +55,9 @@ public class ConditionalKeys extends Test.TagTest {
     }
 
     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) {
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
index 43ce6a5..5ef5b2a 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTable.java
@@ -283,7 +283,7 @@ public class MemberTable extends OsmPrimitivesTable implements IMemberModelListe
 
         private boolean hasGap() {
             WayConnectionType connectionType = getConnectionType();
-            return connectionTypesOfInterest.contains(connectionType.direction)
+            return connectionTypesOfInterest.contains(connectionType.direction.interpretation())
                     && !(connectionType.linkNext && connectionType.linkPrev);
         }
 
@@ -292,11 +292,11 @@ public class MemberTable extends OsmPrimitivesTable implements IMemberModelListe
             WayConnectionType connectionType = getConnectionType();
             Way way = (Way) getMemberTableModel().getReferredPrimitive(getSelectedRows()[0]);
             if (!connectionType.linkPrev) {
-                getLayer().data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction)
+                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)
+                getLayer().data.setSelected(WayConnectionType.Direction.FORWARD.equals(connectionType.direction.interpretation())
                         ? way.lastNode() : way.firstNode());
                 AutoScaleAction.autoScale("selection");
             }
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
index 11ff6f4..03c0e23 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRenderer.java
@@ -161,9 +161,13 @@ public class MemberTableLinkedCellRenderer extends MemberTableCellRenderer {
         /* 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;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSortUtils.java b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSortUtils.java
index 6747a0b..b756dcd 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSortUtils.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/RelationSortUtils.java
@@ -49,11 +49,11 @@ final class RelationSortUtils {
     }
 
     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){
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java
index e7e4619..a06aae1 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionType.java
@@ -25,7 +25,62 @@ public class WayConnectionType {
     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;
diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java
index b5cbd2e..69d94ca 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/sort/WayConnectionTypeCalculator.java
@@ -248,9 +248,13 @@ public class WayConnectionTypeCalculator {
         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;
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
index da1b136..4ee0dc4 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
@@ -172,6 +172,11 @@ public final class TaggingPresetItems {
         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);
         }
