diff --git a/cycle_infrastructure.json b/cycle_infrastructure.json
index 36a8058..d12d4d9 100644
--- a/cycle_infrastructure.json
+++ b/cycle_infrastructure.json
@@ -29,7 +29,44 @@
             "  {% if c in ['opposite_track'] %}{% set backward = 'cycleway' %}{% endif %}",
             "  {% if c == 'track' %}{% set c = 'cycleway' %}{% endif %}",
             "  {% if const[c] %}{% if oneway in ['yes', '1', '-1'] %}{% set forward = c %}{% else %}{% set forward = c %}{% set backward = c %}{% endif %}{% endif %}",
-            "{% endfor %}"
+            "{% endfor %}",
+            "",
+            "{% set left = false %}{% set right = false %}",
+            "{% set left_direction = 'forward' %}{% set right_direction = 'forward' %}",
+            "{% if attribute(tags, 'cycleway:left') %}",
+            "  {% set left = attribute(tags, 'cycleway:left') %}",
+            "  {% if left in ['opposite_lane'] %}",
+            "    {% set left = 'lane' %}{% set left_direction = 'backward' %}",
+            "  {% elseif left in ['opposite_track'] %}",
+            "    {% set left = 'cycleway' %}{% set left_direction = 'backward' %}",
+            "  {% elseif left in ['track'] %}",
+            "    {% set left = 'cycleway' %}",
+            "  {% elseif left in ['no'] %}",
+            "    {% set left = 'shared_lane' %}",
+            "  {% endif %}",
+            "  {% if attribute(tags, 'cycleway:left:oneway') == 'no' %}",
+            "    {% set left_direction = 'both' %}",
+            "  {% elseif attribute(tags, 'cycleway:left:oneway') == '-1' %}",
+            "    {% set left_direction = 'backward' %}",
+            "  {% endif %}",
+            "{% endif %}",
+            "{% if attribute(tags, 'cycleway:right') %}",
+            "  {% set right = attribute(tags, 'cycleway:right') %}",
+            "  {% if right in ['opposite_lane'] %}",
+            "    {% set right = 'lane' %}{% set right_direction = 'backward' %}",
+            "  {% elseif right in ['opposite_track'] %}",
+            "    {% set right = 'cycleway' %}{% set right_direction = 'backward' %}",
+            "  {% elseif right in ['track'] %}",
+            "    {% set right = 'cycleway' %}",
+            "  {% elseif right in ['no'] %}",
+            "    {% set right = 'shared_lane' %}",
+            "  {% endif %}",
+            "  {% if attribute(tags, 'cycleway:right:oneway') == 'no' %}",
+            "    {% set right_direction = 'both' %}",
+            "  {% elseif attribute(tags, 'cycleway:right:oneway') == '-1' %}",
+            "    {% set right_direction = 'backward' %}",
+            "  {% endif %}",
+            "{% endif %}"
         ],
         "body": [
             "{{ keyTrans('highway') }}: {{ tagTrans('highway', tags.highway) }}<br>",
@@ -38,7 +75,14 @@
         ],
         "markerSymbol": null,
         "listMarkerSymbol": "line",
-        "styles": "{% if forward and backward and forward == backward %}default{% else %}{% if forward %},forward{% endif %}{% if backward %},backward{% endif %}{% endif %}",
+        "styles": [
+            "{% if left or right %}",
+            "  {% if left and left_direction == 'both' %},left_both{% elseif left %},left{% endif %}",
+            "  {% if right and right_direction == 'both' %},right_both{% elseif right %},right{% endif %}",
+            "{% else %}",
+            "   {% if forward and backward and forward == backward %}default{% else %}{% if forward %},forward{% endif %}{% if backward %},backward{% endif %}{% endif %}",
+            "{% endif %}"
+            ],
         "style": {
             "color": "{{ const[forward].color }}",
             "fill": "{% if tags.area == 'yes' %}true{% else %}false{% endif %}",
@@ -89,6 +133,57 @@
             "pattern2-lineOffset": "0",
             "pattern2-path-lineCap": "butt",
             "pattern2-path-fillOpacity": "1"
+        },
+        "style:left_both": {
+            "width": "{{ const[left].width }}",
+            "color": "{{ const[left].color }}",
+            "offset": "{{ -1 - const[left].width / 2 }}"
+        },
+        "style:left": {
+            "width": "0",
+            "fill": "false",
+            "pattern": "arrowHead",
+            "pattern-offset": "{{ left_direction == 'forward' ? 8 : 10 }}",
+            "pattern-repeat": "60",
+            "pattern-polygon": "true",
+            "pattern-pixelSize": "9",
+            "pattern-angleCorrection": "{{ left_direction == 'forward' ? 0 : 180 }}",
+            "pattern-path-width": "0",
+            "pattern-path-color": "{{ const[left].color }}",
+            "pattern-path-fillOpacity": "1",
+            "pattern-lineOffset": "{{ -1 - const[left].width / 2 }}",
+            "pattern2": "dash",
+            "pattern2-offset": "{{ left_direction == 'forward' ? 50 : 25 }}",
+            "pattern2-repeat": "60",
+            "pattern2-pixelSize": "22",
+            "pattern2-path-width": "{{ const[left].width }}",
+            "pattern2-path-color": "{{ const[left].color }}",
+            "pattern2-lineOffset": "{{ -1 - const[left].width / 2 }}",
+            "pattern2-path-lineCap": "butt",
+            "pattern2-path-fillOpacity": "1"
+        },
+        "style:right": {
+            "width": "0",
+            "fill": "false",
+            "pattern": "arrowHead",
+            "pattern-offset": "{{ right_direction == 'forward' ? 8 : 10 }}",
+            "pattern-repeat": "60",
+            "pattern-polygon": "true",
+            "pattern-pixelSize": "9",
+            "pattern-angleCorrection": "{{ right_direction == 'forward' ? 0 : 180 }}",
+            "pattern-path-width": "0",
+            "pattern-path-color": "{{ const[right].color }}",
+            "pattern-path-fillOpacity": "1",
+            "pattern-lineOffset": "{{ 1 + const[right].width / 2 }}",
+            "pattern2": "dash",
+            "pattern2-offset": "{{ right_direction == 'forward' ? 50 : 25 }}",
+            "pattern2-repeat": "60",
+            "pattern2-pixelSize": "22",
+            "pattern2-path-width": "{{ const[right].width }}",
+            "pattern2-path-color": "{{ const[right].color }}",
+            "pattern2-lineOffset": "{{ 1 + const[right].width / 2 }}",
+            "pattern2-path-lineCap": "butt",
+            "pattern2-path-fillOpacity": "1"
         }
     },
     "info": [