Index: /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/LaneGui.java
===================================================================
--- /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/LaneGui.java	(revision 34993)
+++ /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/LaneGui.java	(revision 34994)
@@ -312,5 +312,6 @@
         area.reset();
 
-        final double W = getContainer().getLaneWidth();
+        double W = road.getContainer().getModel().isLeftDirection() ? -getContainer().getLaneWidth() : getContainer().getLaneWidth();
+
         final double L = getLength();
 
Index: /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/RoadGui.java
===================================================================
--- /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/RoadGui.java	(revision 34993)
+++ /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/RoadGui.java	(revision 34994)
@@ -197,5 +197,5 @@
         @Override
         void paint(Graphics2D g2d, State state) {
-            if (!isVisible(state)) {
+            if (!isVisible()) {
                 return;
             }
@@ -214,5 +214,5 @@
         }
 
-        private boolean isVisible(State state) {
+        private boolean isVisible() {
             return end.getJunction().isPrimary();
         }
@@ -220,5 +220,5 @@
         @Override
         boolean contains(Point2D p, State state) {
-            return isVisible(state) && background.contains(p);
+            return isVisible() && background.contains(p);
         }
 
@@ -544,14 +544,27 @@
 
     private Point2D getLeftCorner(Road.End end) {
-        return getCorner(end, true);
+        if (this.container.getModel().isLeftDirection()) {
+            return getCorner(end, false);
+        } else {
+            return getCorner(end, true);
+        }
     }
 
     private Point2D getRightCorner(Road.End end) {
-        return getCorner(end, false);
+        if (this.container.getModel().isLeftDirection()) {
+            return getCorner(end, true);
+        } else {
+            return getCorner(end, false);
+        }
     }
 
     private Point2D getCorner(Road.End end, boolean left) {
         final JunctionGui j = end.isFromEnd() ? a : b;
-        final double w = left ? getWidth(end, true) : getWidth(end, false);
+
+        double w = left ? getWidth(end, false) : getWidth(end, true);
+        if (!this.container.getModel().isLeftDirection()) {
+            w = left ? getWidth(end, true) : getWidth(end, false);
+        }
+
         final double s = (left ? 1 : -1);
         final double a = getAngle(end) + PI;
@@ -598,5 +611,5 @@
         g2d.setColor(Color.RED);
         for (Segment s : segments) {
-            g2d.fill(new Ellipse2D.Double(s.from.getX() - 1, s.from.getY() - 1, 2, 2));
+            g2d.fill(new Ellipse2D.Double(s.from.getX() - 0.5, s.from.getY() - 0.5, 1, 1));
         }
 
@@ -621,16 +634,14 @@
 
     private List<Extender> extenders(Road.End end) {
-        if (!end.isExtendable()) {
-            return Collections.emptyList();
-        }
-
         final List<Extender> result = new ArrayList<>();
 
-        final Node n = end.getJunction().getNode();
-        for (Way w : org.openstreetmap.josm.tools.Utils.filteredCollection(n.getReferrers(), Way.class)) {
-            if (w.getNodesCount() > 1 && !end.getWay().equals(w) && w.isFirstLastNode(n) && TurnlanesUtils.isRoad(w)) {
-                final Node nextNode = w.firstNode().equals(n) ? w.getNode(1) : w.getNode(w.getNodesCount() - 2);
-                final Point2D nextNodeLoc = getContainer().translateAndScale(loc(nextNode));
-                result.add(new Extender(end, w, angle(a.getPoint(), nextNodeLoc)));
+        if (end.isExtendable()) {
+            final Node n = end.getJunction().getNode();
+            for (Way w : org.openstreetmap.josm.tools.Utils.filteredCollection(n.getReferrers(), Way.class)) {
+                if (w.getNodesCount() > 1 && !end.getWay().equals(w) && w.isFirstLastNode(n) && TurnlanesUtils.isRoad(w)) {
+                    final Node nextNode = w.firstNode().equals(n) ? w.getNode(1) : w.getNode(w.getNodesCount() - 2);
+                    final Point2D nextNodeLoc = getContainer().translateAndScale(loc(nextNode));
+                    result.add(new Extender(end, w, angle(a.getPoint(), nextNodeLoc)));
+                }
             }
         }
@@ -668,5 +679,9 @@
             middleArea = new Path2D.Double();
             middleArea.append(middleLines.getPathIterator(null), false);
-            middleArea.append(middlePath(backward).offset(outerMargin, -1, -1, outerMargin).getIterator(), true);
+            if (this.container.getModel().isLeftDirection()) {
+                middleArea.append(middlePath(backward).offset(-outerMargin, -1, -1, -outerMargin).getIterator(), true);
+            } else {
+                middleArea.append(middlePath(backward).offset(outerMargin, -1, -1, outerMargin).getIterator(), true);
+            }
             middleArea.closePath();
             g2d.setColor(Color.GRAY);
@@ -707,5 +722,11 @@
         final Path middle = middlePath(forward);
 
-        Path innerPath = middle.offset(innerMargin, -1, -1, innerMargin);
+        Path innerPath;
+        if (this.container.getModel().isLeftDirection()) {
+            innerPath = middle.offset(-innerMargin, -1, -1, -innerMargin);
+        } else {
+            innerPath = middle.offset(innerMargin, -1, -1, innerMargin);
+        }
+
         final List<Path> linePaths = new ArrayList<>();
         linePaths.add(innerPath);
@@ -718,5 +739,9 @@
 
         final Path2D area = new Path2D.Double();
-        area(area, middle, innerPath.offset(outerMargin, -1, -1, outerMargin));
+        if (this.container.getModel().isLeftDirection()) {
+            area(area, middle, innerPath.offset(-outerMargin, -1, -1, -outerMargin));
+        } else {
+            area(area, middle, innerPath.offset(outerMargin, -1, -1, outerMargin));
+        }
         g2d.setColor(Color.GRAY);
         g2d.fill(area);
@@ -786,6 +811,11 @@
     public Path getLaneMiddle(boolean forward) {
         final Path mid = middlePath(!forward);
-        final double w = getWidth(forward ? getModel().getFromEnd() : getModel().getToEnd(), true);
-        final double o = (w - outerMargin) / 2;
+
+        double w = getWidth(forward ? getModel().getFromEnd() : getModel().getToEnd(), true);
+        double o = (w + outerMargin) / 2;
+        if (this.container.getModel().isLeftDirection()) {
+            w = -getWidth(forward ? getModel().getFromEnd() : getModel().getToEnd(), false);
+            o = (w - outerMargin) / 2;
+        }
 
         return o > 0 ? mid.offset(-o, -1, -1, -o) : mid;
Index: /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/TurnLanesDialog.java
===================================================================
--- /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/TurnLanesDialog.java	(revision 34993)
+++ /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/gui/TurnLanesDialog.java	(revision 34994)
@@ -6,4 +6,5 @@
 import java.awt.BorderLayout;
 import java.awt.CardLayout;
+import java.awt.GridBagConstraints;
 import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
@@ -13,4 +14,6 @@
 
 import javax.swing.ButtonGroup;
+import javax.swing.JCheckBox;
+import javax.swing.JLabel;
 import javax.swing.JPanel;
 import javax.swing.JToggleButton;
@@ -132,4 +135,6 @@
 
     private final JPanel body = new JPanel();
+
+
     private final JunctionPane junctionPane = new JunctionPane(GuiContainer.empty());
 
@@ -141,4 +146,7 @@
     private boolean editing = true;
     private boolean wasShowing = false;
+
+    private ModelContainer modelContainer;
+    private boolean leftDirection = ModelContainer.empty().isLeftDirection();
 
     public TurnLanesDialog() {
@@ -152,4 +160,5 @@
         group.add(editButton);
         group.add(validateButton);
+        addTrafficDirectionCheckBox(buttonPanel);
         buttonPanel.add(editButton);
         buttonPanel.add(validateButton);
@@ -164,4 +173,34 @@
 
         editButton.doClick();
+    }
+
+    /**
+     * Add label and checkbox for traffic direction and change flag
+     * @param buttonPanel button panel
+     */
+    private void addTrafficDirectionCheckBox(JPanel buttonPanel) {
+        GridBagConstraints constraints = new GridBagConstraints();
+        JLabel aoiLabel = new JLabel(tr("Left-hand traffic direction:"));
+        constraints.gridx = 0;
+        constraints.gridwidth = 1; //next-to-last
+        constraints.fill = GridBagConstraints.NONE;      //reset to default
+        constraints.weightx = 0.0;
+        buttonPanel.add(aoiLabel, constraints);
+
+        constraints.gridx = 1;
+        constraints.gridwidth = GridBagConstraints.REMAINDER;     //end row
+        constraints.fill = GridBagConstraints.HORIZONTAL;
+        constraints.weightx = 1.0;
+        JCheckBox leftDirectionCheckbox = new JCheckBox();
+        leftDirectionCheckbox.setSelected(leftDirection);
+        buttonPanel.add(leftDirectionCheckbox, constraints);
+        leftDirectionCheckbox.addChangeListener(e -> {
+            if (modelContainer == null) {
+                return;
+            }
+            leftDirection = leftDirectionCheckbox.isSelected();
+            refresh();
+        });
+
     }
 
@@ -179,8 +218,9 @@
             final Collection<Way> ways = org.openstreetmap.josm.tools.Utils.filteredCollection(selected, Way.class);
 
-            final ModelContainer mc = nodes.isEmpty() ? ModelContainer.empty() : ModelContainer
+            modelContainer = nodes.isEmpty() ? ModelContainer.empty() : ModelContainer
                     .createEmpty(nodes, ways);
-
-            junctionPane.setJunction(new GuiContainer(mc));
+            modelContainer.setLeftDirection(leftDirection);
+
+            junctionPane.setJunction(new GuiContainer(modelContainer));
         }
     }
Index: /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/model/ModelContainer.java
===================================================================
--- /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/model/ModelContainer.java	(revision 34993)
+++ /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/model/ModelContainer.java	(revision 34994)
@@ -21,15 +21,19 @@
 
 public final class ModelContainer {
+
+    //set default direction of traffic for connecting lanes
+    private static final boolean DEFAULT_LEFT_DIRECTION = false;
+
     private static final ModelContainer EMPTY = new ModelContainer(Collections.<Node>emptySet(),
-            Collections.<Way>emptySet(), false);
+            Collections.<Way>emptySet(), false, DEFAULT_LEFT_DIRECTION);
 
     public static ModelContainer create(Iterable<Node> primaryNodes, Iterable<Way> primaryWays) {
         return new ModelContainer(new HashSet<>(CollectionUtils.toList(primaryNodes)), new HashSet<>(
-                CollectionUtils.toList(primaryWays)), false);
+                CollectionUtils.toList(primaryWays)), false, DEFAULT_LEFT_DIRECTION);
     }
 
     public static ModelContainer createEmpty(Iterable<Node> primaryNodes, Iterable<Way> primaryWays) {
         return new ModelContainer(new HashSet<>(CollectionUtils.toList(primaryNodes)), new HashSet<>(
-                CollectionUtils.toList(primaryWays)), true);
+                CollectionUtils.toList(primaryWays)), true, DEFAULT_LEFT_DIRECTION);
     }
 
@@ -122,5 +126,7 @@
     private final boolean empty;
 
-    private ModelContainer(Set<Node> primaryNodes, Set<Way> primaryWays, boolean empty) {
+    private boolean leftDirection;
+
+    private ModelContainer(Set<Node> primaryNodes, Set<Way> primaryWays, boolean empty, boolean leftDirection) {
         if (empty) {
             this.primaryNodes = Collections.unmodifiableSet(new HashSet<>(primaryNodes));
@@ -152,4 +158,5 @@
             this.empty = junctions.isEmpty();
         }
+        this.leftDirection = leftDirection;
     }
 
@@ -283,5 +290,5 @@
 
     public ModelContainer recalculate() {
-        return new ModelContainer(primaryNodes, primaryWays, false);
+        return new ModelContainer(primaryNodes, primaryWays, false, leftDirection);
     }
 
@@ -298,4 +305,12 @@
     }
 
+    public boolean isLeftDirection() {
+        return leftDirection;
+    }
+
+    public void setLeftDirection(boolean leftDirection) {
+        this.leftDirection = leftDirection;
+    }
+
     public boolean hasRoad(Way w) {
         return roads.containsKey(w);
Index: /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/model/Validator.java
===================================================================
--- /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/model/Validator.java	(revision 34993)
+++ /applications/editors/josm/plugins/turnlanes/src/org/openstreetmap/josm/plugins/turnlanes/model/Validator.java	(revision 34994)
@@ -7,5 +7,4 @@
 import java.util.Arrays;
 import java.util.BitSet;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -363,17 +362,14 @@
     private List<Integer> splitInts(Relation r, String key, List<Issue> issues) {
         final String ints = r.get(key);
-
-        if (ints == null) {
-            return Collections.emptyList();
-        }
-
         final List<Integer> result = new ArrayList<>();
 
-        for (String s : Constants.SPLIT_PATTERN.split(ints)) {
-            try {
-                int i = Integer.parseInt(s.trim());
-                result.add(Integer.valueOf(i));
-            } catch (NumberFormatException e) {
-                issues.add(Issue.newError(r, tr("Integer list \"{0}\" contains unexpected values.", key)));
+        if (ints != null) {
+            for (String s : Constants.SPLIT_PATTERN.split(ints)) {
+                try {
+                    int i = Integer.parseInt(s.trim());
+                    result.add(Integer.valueOf(i));
+                } catch (NumberFormatException e) {
+                    issues.add(Issue.newError(r, tr("Integer list \"{0}\" contains unexpected values.", key)));
+                }
             }
         }
