]> git.openstreetmap.org Git - rails.git/commitdiff
Update to iD v1.8.0
authorBryan Housel <bryan@mapbox.com>
Sun, 8 Nov 2015 04:18:03 +0000 (23:18 -0500)
committerBryan Housel <bryan@mapbox.com>
Sun, 8 Nov 2015 04:18:03 +0000 (23:18 -0500)
65 files changed:
vendor/assets/iD/iD.css.erb
vendor/assets/iD/iD.js
vendor/assets/iD/iD/img/iD-sprite.svg [new file with mode: 0644]
vendor/assets/iD/iD/img/line-presets.png [deleted file]
vendor/assets/iD/iD/img/maki-sprite.png [deleted file]
vendor/assets/iD/iD/img/maki-sprite.svg [new file with mode: 0644]
vendor/assets/iD/iD/img/relation-presets.png [deleted file]
vendor/assets/iD/iD/img/sprite.svg [deleted file]
vendor/assets/iD/iD/locales/af.json
vendor/assets/iD/iD/locales/ar-AA.json
vendor/assets/iD/iD/locales/ar.json
vendor/assets/iD/iD/locales/ast.json
vendor/assets/iD/iD/locales/bg-BG.json
vendor/assets/iD/iD/locales/bn.json
vendor/assets/iD/iD/locales/bs.json
vendor/assets/iD/iD/locales/ca.json
vendor/assets/iD/iD/locales/cs.json
vendor/assets/iD/iD/locales/da.json
vendor/assets/iD/iD/locales/de.json
vendor/assets/iD/iD/locales/el.json
vendor/assets/iD/iD/locales/en-GB.json
vendor/assets/iD/iD/locales/en.json
vendor/assets/iD/iD/locales/es.json
vendor/assets/iD/iD/locales/et.json
vendor/assets/iD/iD/locales/fa.json
vendor/assets/iD/iD/locales/fi.json
vendor/assets/iD/iD/locales/fr.json
vendor/assets/iD/iD/locales/gl.json
vendor/assets/iD/iD/locales/hi-IN.json [deleted file]
vendor/assets/iD/iD/locales/hr.json
vendor/assets/iD/iD/locales/hu.json
vendor/assets/iD/iD/locales/id.json
vendor/assets/iD/iD/locales/is.json
vendor/assets/iD/iD/locales/it.json
vendor/assets/iD/iD/locales/ja.json
vendor/assets/iD/iD/locales/kn.json
vendor/assets/iD/iD/locales/ko-KR.json
vendor/assets/iD/iD/locales/ko.json
vendor/assets/iD/iD/locales/lt.json
vendor/assets/iD/iD/locales/lv.json
vendor/assets/iD/iD/locales/nl.json
vendor/assets/iD/iD/locales/no.json
vendor/assets/iD/iD/locales/pl.json
vendor/assets/iD/iD/locales/pt-BR.json
vendor/assets/iD/iD/locales/pt.json
vendor/assets/iD/iD/locales/ro.json [moved from vendor/assets/iD/iD/locales/ro-RO.json with 87% similarity]
vendor/assets/iD/iD/locales/ru.json
vendor/assets/iD/iD/locales/si.json
vendor/assets/iD/iD/locales/sk.json
vendor/assets/iD/iD/locales/sl.json
vendor/assets/iD/iD/locales/sq.json
vendor/assets/iD/iD/locales/sr.json
vendor/assets/iD/iD/locales/sv.json
vendor/assets/iD/iD/locales/te.json
vendor/assets/iD/iD/locales/tl.json
vendor/assets/iD/iD/locales/tr.json
vendor/assets/iD/iD/locales/uk.json
vendor/assets/iD/iD/locales/vi.json
vendor/assets/iD/iD/locales/yue.json
vendor/assets/iD/iD/locales/zh-CN.json
vendor/assets/iD/iD/locales/zh-HK.json
vendor/assets/iD/iD/locales/zh-TW.json
vendor/assets/iD/iD/locales/zh.json
vendor/assets/iD/imagery.js
vendor/assets/iD/presets.js

index 69374d7db9ece90656f0738f6d5aaee114939812..25103657d84ec12eb8c0b738c6574c82b960bd28 100644 (file)
@@ -184,14 +184,11 @@ img.tile-removing {
     opacity: 0;
 }
 
     opacity: 0;
 }
 
-/* base styles */
-path {
-    fill: none;
-}
+use { pointer-events: none; }
 
 
-use {
-    pointer-events: none;
-}
+/* base styles */
+.layer path { fill: none; }
+.layer use path { fill: #333; }  /* FF svg icons */
 
 g.point .shadow,
 g.vertex .shadow,
 
 g.point .shadow,
 g.vertex .shadow,
@@ -310,13 +307,18 @@ g.vertex.selected .shadow {
 
 /* lines */
 
 
 /* lines */
 
+.preset-icon .icon.other-line {
+    color: #fff;
+    fill: #777;
+}
+
 path.line {
     stroke-linecap: round;
     stroke-linejoin: bevel;
 }
 
 path.stroke {
 path.line {
     stroke-linecap: round;
     stroke-linejoin: bevel;
 }
 
 path.stroke {
-    stroke: black;
+    stroke: #000;
     stroke-width: 4;
 }
 
     stroke-width: 4;
 }
 
@@ -335,12 +337,12 @@ path.shadow.selected {
 }
 
 path.line.stroke {
 }
 
 path.line.stroke {
-    stroke: white;
+    stroke: #fff;
     stroke-width: 2;
 }
 
 path.area.stroke {
     stroke-width: 2;
 }
 
 path.area.stroke {
-    stroke: white;
+    stroke: #fff;
     stroke-width: 1;
 }
 path.area.fill {
     stroke-width: 1;
 }
 path.area.fill {
@@ -450,8 +452,7 @@ path.fill.tag-landuse-residential {
 }
 .preset-icon-fill-area.tag-landuse-residential {
     border-color: rgb(196, 189, 25);
 }
 .preset-icon-fill-area.tag-landuse-residential {
     border-color: rgb(196, 189, 25);
-    background: none;
-    box-shadow: inset 0 0 0 5px rgba(196, 189, 25, 0.3);
+    background: rgba(196, 189, 25, 0.3);
 }
 
 path.stroke.tag-landuse-retail,
 }
 
 path.stroke.tag-landuse-retail,
@@ -466,8 +467,7 @@ path.fill.tag-landuse-commercial {
 .preset-icon-fill-area.tag-landuse-retail,
 .preset-icon-fill-area.tag-landuse-commercial {
     border-color: rgb(214, 136, 26);
 .preset-icon-fill-area.tag-landuse-retail,
 .preset-icon-fill-area.tag-landuse-commercial {
     border-color: rgb(214, 136, 26);
-    background: none;
-    box-shadow: inset 0 0 0 5px rgba(214, 136, 26, 0.3);
+    background-color: rgba(214, 136, 26, 0.3);
 }
 
 path.stroke.tag-landuse-industrial {
 }
 
 path.stroke.tag-landuse-industrial {
@@ -479,8 +479,7 @@ path.fill.tag-landuse-industrial {
 }
 .preset-icon-fill-area.tag-landuse-industrial {
     border-color: rgb(228, 164, 245);
 }
 .preset-icon-fill-area.tag-landuse-industrial {
     border-color: rgb(228, 164, 245);
-    background: none;
-    box-shadow: inset 0 0 0 5px rgba(228, 164, 245, 0.3);
+    background-color: rgba(228, 164, 245, 0.3);
 }
 
 path.stroke.tag-landuse-quarry {
 }
 
 path.stroke.tag-landuse-quarry {
@@ -627,6 +626,11 @@ path.stroke.area.tag-highway {
 
 /* wide highways */
 
 
 /* wide highways */
 
+.preset-icon .icon.tag-highway.other-line {
+    color: #fff;
+    fill: #777;
+}
+
 path.shadow.tag-highway {
     stroke-width:16;
 }
 path.shadow.tag-highway {
     stroke-width:16;
 }
@@ -649,33 +653,47 @@ path.stroke.tag-highway {
     stroke-width:4;
 }
 
     stroke-width:4;
 }
 
+.preset-icon .icon.highway-motorway,
+.preset-icon .icon.highway-motorway-link {
+    color: #CF2081;
+    fill: #70372f;
+}
 path.stroke.tag-highway-motorway,
 path.stroke.tag-highway-motorway_link,
 path.stroke.tag-motorway {
 path.stroke.tag-highway-motorway,
 path.stroke.tag-highway-motorway_link,
 path.stroke.tag-motorway {
-    stroke:#58a9ed;
+    stroke:#CF2081;
 }
 }
-
 path.casing.tag-highway-motorway,
 path.casing.tag-highway-motorway_link,
 path.casing.tag-motorway {
 path.casing.tag-highway-motorway,
 path.casing.tag-highway-motorway_link,
 path.casing.tag-motorway {
-    stroke:#2c5476;
+    stroke:#70372f;
 }
 
 }
 
+.preset-icon .icon.highway-trunk,
+.preset-icon .icon.highway-trunk-link {
+    color: #DD2F22;
+    fill: #70372f;
+}
 path.stroke.tag-highway-trunk,
 path.stroke.tag-highway-trunk_link,
 path.stroke.tag-trunk {
 path.stroke.tag-highway-trunk,
 path.stroke.tag-highway-trunk_link,
 path.stroke.tag-trunk {
-    stroke:#8cd05f;
+    stroke:#DD2F22;
 }
 path.casing.tag-highway-trunk,
 path.casing.tag-highway-trunk_link,
 path.casing.tag-trunk {
 }
 path.casing.tag-highway-trunk,
 path.casing.tag-highway-trunk_link,
 path.casing.tag-trunk {
-    stroke:#46682f;
+    stroke:#70372f;
 }
 
 }
 
+.preset-icon .icon.highway-primary,
+.preset-icon .icon.highway-primary-link {
+    color: #F99806;
+    fill: #70372f;
+}
 path.stroke.tag-highway-primary,
 path.stroke.tag-highway-primary_link,
 path.stroke.tag-primary {
 path.stroke.tag-highway-primary,
 path.stroke.tag-highway-primary_link,
 path.stroke.tag-primary {
-    stroke:#e06d5f;
+    stroke:#F99806;
 }
 path.casing.tag-highway-primary,
 path.casing.tag-highway-primary_link,
 }
 path.casing.tag-highway-primary,
 path.casing.tag-highway-primary_link,
@@ -683,28 +701,122 @@ path.casing.tag-primary {
     stroke:#70372f;
 }
 
     stroke:#70372f;
 }
 
+.preset-icon .icon.highway-secondary,
+.preset-icon .icon.highway-secondary-link {
+    color: #F3F312;
+    fill: #70372f;
+}
 path.stroke.tag-highway-secondary,
 path.stroke.tag-highway-secondary_link,
 path.stroke.tag-secondary {
 path.stroke.tag-highway-secondary,
 path.stroke.tag-highway-secondary_link,
 path.stroke.tag-secondary {
-    stroke:#eab056;
+    stroke:#F3F312;
 }
 path.casing.tag-highway-secondary,
 path.casing.tag-highway-secondary_link,
 path.casing.tag-secondary {
 }
 path.casing.tag-highway-secondary,
 path.casing.tag-highway-secondary_link,
 path.casing.tag-secondary {
-    stroke:#75582b;
+    stroke:#70372f;
 }
 
 }
 
+.preset-icon .icon.highway-tertiary,
+.preset-icon .icon.highway-tertiary-link {
+    color: #FFF9B3;
+    fill: #70372f;
+}
 path.stroke.tag-highway-tertiary,
 path.stroke.tag-highway-tertiary_link,
 path.stroke.tag-tertiary {
 path.stroke.tag-highway-tertiary,
 path.stroke.tag-highway-tertiary_link,
 path.stroke.tag-tertiary {
-    stroke:#ffff7e;
+    stroke:#FFF9B3;
 }
 path.casing.tag-highway-tertiary,
 path.casing.tag-highway-tertiary_link,
 path.casing.tag-tertiary {
 }
 path.casing.tag-highway-tertiary,
 path.casing.tag-highway-tertiary_link,
 path.casing.tag-tertiary {
+    stroke:#70372f;
+}
+
+.legacy-carto .preset-icon .icon.highway-motorway,
+.legacy-carto .preset-icon .icon.highway-motorway-link {
+    color: #58a9ed;
+    fill: #2c5476;
+}
+.legacy-carto path.stroke.tag-highway-motorway,
+.legacy-carto path.stroke.tag-highway-motorway_link,
+.legacy-carto path.stroke.tag-motorway {
+    stroke:#58a9ed;
+}
+.legacy-carto path.casing.tag-highway-motorway,
+.legacy-carto path.casing.tag-highway-motorway_link,
+.legacy-carto path.casing.tag-motorway {
+    stroke:#2c5476;
+}
+
+.legacy-carto .preset-icon .icon.highway-trunk,
+.legacy-carto .preset-icon .icon.highway-trunk-link {
+    color: #8cd05f;
+    fill: #46682f;
+}
+.legacy-carto path.stroke.tag-highway-trunk,
+.legacy-carto path.stroke.tag-highway-trunk_link,
+.legacy-carto path.stroke.tag-trunk {
+    stroke:#8cd05f;
+}
+.legacy-carto path.casing.tag-highway-trunk,
+.legacy-carto path.casing.tag-highway-trunk_link,
+.legacy-carto path.casing.tag-trunk {
+    stroke:#46682f;
+}
+
+.legacy-carto .preset-icon .icon.highway-primary,
+.legacy-carto .preset-icon .icon.highway-primary-link {
+    color: #e06d5f;
+    fill: #70372f;
+}
+.legacy-carto path.stroke.tag-highway-primary,
+.legacy-carto path.stroke.tag-highway-primary_link,
+.legacy-carto path.stroke.tag-primary {
+    stroke:#e06d5f;
+}
+.legacy-carto path.casing.tag-highway-primary,
+.legacy-carto path.casing.tag-highway-primary_link,
+.legacy-carto path.casing.tag-primary {
+    stroke:#70372f;
+}
+
+.legacy-carto .preset-icon .icon.highway-secondary,
+.legacy-carto .preset-icon .icon.highway-secondary-link {
+    color: #eab056;
+    fill: #75582b;
+}
+.legacy-carto path.stroke.tag-highway-secondary,
+.legacy-carto path.stroke.tag-highway-secondary_link,
+.legacy-carto path.stroke.tag-secondary {
+    stroke:#eab056;
+}
+.legacy-carto path.casing.tag-highway-secondary,
+.legacy-carto path.casing.tag-highway-secondary_link,
+.legacy-carto path.casing.tag-secondary {
+    stroke:#75582b;
+}
+
+.legacy-carto .preset-icon .icon.highway-tertiary,
+.legacy-carto .preset-icon .icon.highway-tertiary-link {
+    color: #ffff7e;
+    fill: #7f7f3f;
+}
+.legacy-carto path.stroke.tag-highway-tertiary,
+.legacy-carto path.stroke.tag-highway-tertiary_link,
+.legacy-carto path.stroke.tag-tertiary {
+    stroke:#ffff7e;
+}
+.legacy-carto path.casing.tag-highway-tertiary,
+.legacy-carto path.casing.tag-highway-tertiary_link,
+.legacy-carto path.casing.tag-tertiary {
     stroke:#7f7f3f;
 }
 
     stroke:#7f7f3f;
 }
 
+.preset-icon .icon.highway-unclassified {
+    color: #eaeaea;
+    fill: #444;
+}
 path.stroke.tag-highway-unclassified,
 path.stroke.tag-unclassified {
     stroke:#eaeaea;
 path.stroke.tag-highway-unclassified,
 path.stroke.tag-unclassified {
     stroke:#eaeaea;
@@ -714,6 +826,10 @@ path.casing.tag-unclassified {
     stroke:#444;
 }
 
     stroke:#444;
 }
 
+.preset-icon .icon.highway-residential {
+    color: #fff;
+    fill: #444;
+}
 path.stroke.tag-highway-residential,
 path.stroke.tag-residential {
     stroke:#fff;
 path.stroke.tag-highway-residential,
 path.stroke.tag-residential {
     stroke:#fff;
@@ -822,7 +938,10 @@ path.casing.tag-road {
     stroke-width:4;
 }
 
     stroke-width:4;
 }
 
-
+.preset-icon .icon.highway-living-street {
+    color: #ccc;
+    fill: #fff;
+}
 path.stroke.tag-highway-living_street,
 path.stroke.tag-living_street {
     stroke:#ccc;
 path.stroke.tag-highway-living_street,
 path.stroke.tag-living_street {
     stroke:#ccc;
@@ -832,6 +951,10 @@ path.casing.tag-living_street {
     stroke:#fff;
 }
 
     stroke:#fff;
 }
 
+.preset-icon .icon.highway-pedestrian {
+    color: #8cd05f;
+    fill: #fff;
+}
 path.stroke.tag-highway-corridor,
 path.stroke.tag-highway-pedestrian,
 path.stroke.tag-corridor,
 path.stroke.tag-highway-corridor,
 path.stroke.tag-highway-pedestrian,
 path.stroke.tag-corridor,
@@ -846,15 +969,23 @@ path.casing.tag-pedestrian {
     stroke:#8cd05f;
 }
 
     stroke:#8cd05f;
 }
 
+.preset-icon .icon.highway-road {
+    color: #9e9e9e;
+    fill: #666;
+}
 path.stroke.tag-highway-road,
 path.stroke.tag-road {
     stroke:#9e9e9e;
 }
 path.casing.tag-highway-road,
 path.casing.tag-road {
 path.stroke.tag-highway-road,
 path.stroke.tag-road {
     stroke:#9e9e9e;
 }
 path.casing.tag-highway-road,
 path.casing.tag-road {
-    stroke:#444;
+    stroke:#666;
 }
 
 }
 
+.preset-icon .icon.highway-service {
+    color: #fff;
+    fill: #666;
+}
 path.stroke.tag-highway-service,
 path.stroke.tag-service {
     stroke:#fff;
 path.stroke.tag-highway-service,
 path.stroke.tag-service {
     stroke:#fff;
@@ -864,6 +995,10 @@ path.casing.tag-service {
     stroke:#666;
 }
 
     stroke:#666;
 }
 
+.preset-icon .icon.highway-track {
+    color: #ccc;
+    fill: #996600;
+}
 path.stroke.tag-highway-track,
 path.stroke.tag-track {
     stroke: #ccc;
 path.stroke.tag-highway-track,
 path.stroke.tag-track {
     stroke: #ccc;
@@ -893,19 +1028,46 @@ path.casing.tag-highway-bridleway {
     stroke: #fff;
 }
 
     stroke: #fff;
 }
 
+.preset-icon .icon.category-path,
+.preset-icon .icon.highway-path {
+    color: #746f6f;
+    fill: #c5b59f;
+}
 path.stroke.tag-highway-path {
     stroke: #746f6f;
 }
 path.stroke.tag-highway-path {
     stroke: #746f6f;
 }
+
+.preset-icon .icon.tag-route-foot,
+.preset-icon .icon.tag-route-hiking,
+.preset-icon .icon.highway-footway {
+    color: #ae8681;
+    fill: #fff;
+}
 path.stroke.tag-highway-footway {
     stroke: #ae8681;
 }
 path.stroke.tag-highway-footway {
     stroke: #ae8681;
 }
+
+.preset-icon .icon.tag-route-bicycle,
+.preset-icon .icon.highway-cycleway {
+    color: #58a9ed;
+    fill: #fff;
+}
 path.stroke.tag-highway-cycleway {
     stroke: #58a9ed;
 }
 path.stroke.tag-highway-cycleway {
     stroke: #58a9ed;
 }
+
+.preset-icon .icon.highway-bridleway {
+    color: #e06d5f;
+    fill: #fff;
+}
 path.stroke.tag-highway-bridleway {
     stroke: #e06d5f;
 }
 
 path.stroke.tag-highway-bridleway {
     stroke: #e06d5f;
 }
 
+.preset-icon .icon.highway-steps {
+    color: #81d25c;
+    fill: #fff;
+}
 path.stroke.tag-highway-steps {
     stroke: #81d25c;
     stroke-linecap: butt;
 path.stroke.tag-highway-steps {
     stroke: #81d25c;
     stroke-linecap: butt;
@@ -949,19 +1111,30 @@ path.fill.tag-aeroway-apron {
 
 
 /* railways */
 
 
 /* railways */
-
+.preset-icon .icon.tag-railway.other-line {
+    color: #fff;
+    fill: #777;
+}
+.preset-icon .icon.tag-railway {
+    color: #555;
+    fill: #eee;
+}
 path.stroke.tag-railway {
     stroke: #eee;
     stroke-width: 2;
     stroke-linecap: butt;
     stroke-dasharray: 12,12;
 }
 path.stroke.tag-railway {
     stroke: #eee;
     stroke-width: 2;
     stroke-linecap: butt;
     stroke-dasharray: 12,12;
 }
-
 path.casing.tag-railway {
     stroke: #555;
     stroke-width: 4;
 }
 
 path.casing.tag-railway {
     stroke: #555;
     stroke-width: 4;
 }
 
+.preset-icon .icon.tag-railway-disused,
+.preset-icon .icon.tag-railway-abandoned {
+    color: #999;
+    fill: #eee;
+}
 path.stroke.tag-railway-abandoned {
     stroke: #eee;
 }
 path.stroke.tag-railway-abandoned {
     stroke: #eee;
 }
@@ -969,8 +1142,12 @@ path.casing.tag-railway-abandoned {
     stroke: #999;
 }
 
     stroke: #999;
 }
 
+.preset-icon .icon.tag-railway-subway {
+    color: #222;
+    fill: #bbb;
+}
 path.stroke.tag-railway-subway {
 path.stroke.tag-railway-subway {
-    stroke: #666;
+    stroke: #bbb;
 }
 path.casing.tag-railway-subway {
     stroke: #222;
 }
 path.casing.tag-railway-subway {
     stroke: #222;
@@ -995,6 +1172,16 @@ path.casing.tag-railway-platform {
 }
 
 /* waterways */
 }
 
 /* waterways */
+.preset-icon .icon.tag-waterway.other-line {
+    color: #77d3de;
+    fill: #77d3de;
+}
+.preset-icon .icon.category-water,
+.preset-icon .icon.tag-route-ferry,
+.preset-icon .icon.tag-waterway {
+    color: #77d3de;
+    fill: #fff;
+}
 
 path.fill.tag-waterway {
     stroke: rgba(119, 211, 222, 0.3);
 
 path.fill.tag-waterway {
     stroke: rgba(119, 211, 222, 0.3);
@@ -1017,6 +1204,9 @@ path.casing.tag-waterway-river {
     stroke-width: 6;
 }
 
     stroke-width: 6;
 }
 
+.preset-icon .icon.tag-waterway-ditch {
+    color: #6591ff;
+}
 path.stroke.tag-waterway-ditch {
     stroke: #6591ff;
     stroke-width: 1;
 path.stroke.tag-waterway-ditch {
     stroke: #6591ff;
     stroke-width: 1;
@@ -1027,6 +1217,11 @@ path.casing.tag-waterway-ditch {
 }
 
 /* power */
 }
 
 /* power */
+.preset-icon .icon.tag-man_made-pipeline,
+.preset-icon .icon.tag-power {
+    color: #939393;
+    fill: #939393;
+}
 
 path.stroke.tag-power {
     stroke: #939393;
 
 path.stroke.tag-power {
     stroke: #939393;
@@ -2003,19 +2198,38 @@ button.save.has-count .count::before {
 /* Icons */
 
 .icon {
 /* Icons */
 
 .icon {
-  display:inline-block;
-  vertical-align:top;
-  width:20px;
-  height:20px;
-  background:transparent url(<%= asset_path("iD/img/sprite.svg") %>) no-repeat 0 0;
-  text-indent:-9999px;
-  overflow:hidden;
-  }
-
-.icon-pre-text {
+    vertical-align: top;
+    width: 20px;
+    height: 20px;
+}
+
+.icon.inline {
+    vertical-align: text-top;
+    width: 14px;
+    height: 14px;
+    margin: 0px 3px;
+}
+
+.icon.pre-text {
     margin-right: 3px;
 }
 
     margin-right: 3px;
 }
 
+.icon.light {
+    color: #fff;
+}
+
+.icon.created {
+    color: #00ca07;
+}
+
+.icon.modified {
+    color: #666;
+}
+
+.icon.deleted {
+    color: #ea0000;
+}
+
 .user-icon {
     max-height: 20px;
     max-width: 20px;
 .user-icon {
     max-height: 20px;
     max-width: 20px;
@@ -2024,107 +2238,6 @@ button.save.has-count .count::before {
     border-radius: 3px;
 }
 
     border-radius: 3px;
 }
 
-/* Definitions for every icon */
-.icon.alert     { background-position:   0 0;}
-.icon.point,
-.icon.add-point  { background-position: -20px 0;}
-.icon.line,
-.icon.add-line   { background-position: -40px 0;}
-.icon.area,
-.icon.add-area   { background-position: -60px 0;}
-.icon.undo       { background-position: -80px 0;}
-.icon.redo       { background-position: -100px 0;}
-.icon.apply      { background-position: -120px 0;}
-.icon.save       { background-position: -140px 0;}
-.icon.close      { background-position: -160px 0;}
-.icon.delete     { background-position: -180px 0;}
-.icon.remove     { background-position: -200px 0;}
-.icon.inspect    { background-position: -220px 0;}
-.icon.plus       { background-position: -240px 0;}
-.icon.search     { background-position: -280px 0;}
-.icon.geocode    { background-position: -280px 0;}
-.icon.layers     { background-position: -300px 0;}
-.icon.avatar     { background-position: -320px 0;}
-.icon.nearby     { background-position: -340px 0;}
-.icon.geolocate  { background-position: -360px 0;}
-.icon.warning    { background-position: -380px 0;}
-.icon.bug        { background-position: -400px 0;}
-.icon.back       { background-position: -420px 0;}
-.icon.forward    { background-position: -440px 0;}
-.icon.help       { background-position: -460px 0;}
-.icon.relation    { background-position: -520px 0;}
-.icon.relation.route         { background-position: -540px 0;}
-.icon.relation.multipolygon  { background-position: -560px 0;}
-.icon.vertex     { background-position: -580px 0;}
-.icon.data       { background-position: -600px 0;}
-
-.icon.inspect.light    { background-position: -220px -20px;}
-.icon.plus.light       { background-position: -240px -20px;}
-.icon.zoom-in          { background-position: -240px -20px;}
-.icon.zoom-out         { background-position: -260px -20px;}
-.icon.geocode.light    { background-position: -280px -20px;}
-.icon.layers.light     { background-position: -300px -20px;}
-.icon.avatar.light     { background-position: -320px -20px;}
-.icon.nearby.light     { background-position: -340px -20px;}
-.icon.geolocate.light  { background-position: -360px -20px;}
-.icon.bug.light        { background-position: -400px -20px;}
-.icon.help.light       { background-position: -460px -20px;}
-.icon.data.light       { background-position: -600px -20px;}
-
-.icon.back.blue        { background-position: -420px -20px;}
-.icon.forward.blue     { background-position: -440px -20px;}
-
-.icon.full-screen              { background-position: -620px -20px;}
-.active .icon.full-screen      { background-position: -640px -20px;}
-
-button[disabled] .icon.alert      { background-position:   0 -40px;}
-button[disabled] .icon.add-point  { background-position: -20px -40px;}
-button[disabled] .icon.add-line   { background-position: -40px -40px;}
-button[disabled] .icon.add-area   { background-position: -60px -40px;}
-button.disabled  .icon.undo       { background-position: -80px -40px;}
-button.disabled  .icon.redo       { background-position: -100px -40px;}
-button[disabled] .apply.icon      { background-position: -120px -40px;}
-button[disabled] .close.icon      { background-position: -160px -40px;}
-button[disabled] .delete.icon     { background-position: -180px -40px;}
-button[disabled] .icon.remove     { background-position: -200px -40px;}
-button[disabled] .icon.inspect    { background-position: -220px -40px;}
-button[disabled] .icon.zoom-in    { background-position: -240px -40px;}
-button[disabled] .icon.zoom-out   { background-position: -260px -40px;}
-button[disabled] .icon.geocode    { background-position: -280px -40px;}
-button[disabled] .icon.layers     { background-position: -300px -40px;}
-button[disabled] .icon.avatar     { background-position: -320px -40px;}
-button[disabled] .icon.nearby     { background-position: -340px -40px;}
-button[disabled] .icon.data       { background-position: -600px -40px;}
-
-.icon.point.deleted  { background-position: -480px -80px;}
-.icon.line.deleted   { background-position: -500px -80px;}
-.icon.area.deleted   { background-position: -520px -80px;}
-
-.icon.point.created  { background-position: -480px -100px;}
-.icon.line.created   { background-position: -500px -100px;}
-.icon.area.created   { background-position: -520px -100px;}
-
-.icon.point.modified  { background-position: -22px 0; }
-
-.icon.modified { opacity: .5; }
-
-/* Out link is special */
-
-.icon.out-link   { height: 14px; width: 14px; background-position: -500px 0;}
-a:hover .icon.out-link   { background-position: -500px -14px;}
-
-.icon.plus-dark    { background-position: -240px -40px;}
-
-/* Universal preset icons */
-
-.icon.source     { background-position:   0 -200px;}
-.icon.address    { background-position: -20px -200px;}
-.icon.telephone  { background-position: -40px -200px;}
-.icon.website    { background-position: -60px -200px;}
-.icon.elevation  { background-position: -80px -200px;}
-.icon.wikipedia  { background-position: -100px -200px;}
-.icon.note       { background-position: -120px -200px;}
-.icon.wheelchair { background-position: -140px -200px;}
 
 /* ToolBar / Persistent UI Elements
 ------------------------------------------------------- */
 
 /* ToolBar / Persistent UI Elements
 ------------------------------------------------------- */
@@ -2177,6 +2290,12 @@ a:hover .icon.out-link   { background-position: -500px -14px;}
     top: 0;
 }
 
     top: 0;
 }
 
+.preset-choose {
+    font-size: 16px;
+    line-height: 1.25;
+    font-weight: bold;
+}
+
 .modal > button {
     position: absolute;
     right: 0;
 .modal > button {
     position: absolute;
     right: 0;
@@ -2399,17 +2518,52 @@ a:hover .icon.out-link   { background-position: -500px -14px;}
     background: #ececec;
 }
 
     background: #ececec;
 }
 
-.preset-icon {
+.preset-icon-fill-area {
+    cursor: inherit;
+    height: 40px;
+    width: 40px;
+    margin: auto;
     position: absolute;
     position: absolute;
-    top: 17px;
-    left: 17px;
+    left: 10px;
+    top: 10px;
+}
+
+.preset-icon-frame {
+    position: absolute;
+    top: 7px;
+    left: 7px;
+    height: 42px;
+    width: 42px;
     margin: auto;
 }
 
     margin: auto;
 }
 
-.preset-icon-line,
-.preset-icon-relation {
-    top: 0;
-    left: 0;
+.preset-icon-frame .icon {
+    width: 46px;
+    height: 46px;
+}
+
+.preset-icon-60 {
+    position: absolute;
+    top: 0px;
+    left: 0px;
+    margin: auto;
+}
+
+.preset-icon-60 .icon {
+    width: 60px;
+    height: 60px;
+}
+
+.preset-icon-32 {
+    position: absolute;
+    top: 14px;
+    left: 13px;   /* Maki icons off center? */
+    margin: auto;
+}
+
+.preset-icon-32 .icon {
+    width: 32px;
+    height: 32px;
 }
 
 .preset-list-button .label {
 }
 
 .preset-list-button .label {
@@ -2444,6 +2598,10 @@ a:hover .icon.out-link   { background-position: -500px -14px;}
     background: #fafafa;
 }
 
     background: #fafafa;
 }
 
+.preset-list-item button.tag-reference-button:hover {
+    background: #f1f1f1;
+}
+
 .preset-list-item button.tag-reference-button .icon {
     opacity: .5;
 }
 .preset-list-item button.tag-reference-button .icon {
     opacity: .5;
 }
@@ -2489,27 +2647,6 @@ a:hover .icon.out-link   { background-position: -500px -14px;}
     margin-top: -10px;
 }
 
     margin-top: -10px;
 }
 
-/* Preset icon colors */
-
-.preset-icon-fill-area {
-    cursor: inherit;
-    height: 39px;
-    width: 39px;
-    margin: auto;
-    position: absolute;
-    left: 10px;
-    top: 10px;
-}
-
-.preset-icon-fill-area:after {
-    content: '';
-    left: -4px;
-    top: -4px;
-    height: 45px;
-    width: 45px;
-    position: absolute;
-    background:transparent url(<%= asset_path("iD/img/sprite.svg") %>) no-repeat 0 -80px;
-}
 
 /* preset form basics */
 
 
 /* preset form basics */
 
@@ -2589,7 +2726,10 @@ a:hover .icon.out-link   { background-position: -500px -14px;}
     width: 10%;
     height: 100%;
     border-radius: 0;
     width: 10%;
     height: 100%;
     border-radius: 0;
-    background: #fafafa;
+    background: #f6f6f6;
+}
+.form-label button:hover {
+    background: #f1f1f1;
 }
 
 .form-label .modified-icon,
 }
 
 .form-label .modified-icon,
@@ -3781,6 +3921,7 @@ div.full-screen > button:hover {
     right:0;
     bottom:0;
     border-radius: 0;
     right:0;
     bottom:0;
     border-radius: 0;
+    pointer-events: none;
 }
 
 #attrib {
 }
 
 #attrib {
@@ -3789,7 +3930,6 @@ div.full-screen > button:hover {
     margin-bottom: 5px;
     float: left;
     clear: both;
     margin-bottom: 5px;
     float: left;
     clear: both;
-    pointer-events: none;
 }
 
 #attrib * { pointer-events: all; }
 }
 
 #attrib * { pointer-events: all; }
@@ -3822,19 +3962,20 @@ div.full-screen > button:hover {
     width: 100%;
     float: left;
     clear: both;
     width: 100%;
     float: left;
     clear: both;
+    pointer-events: all;
 }
 
 #scale-block {
     display: table-cell;
     vertical-align: bottom;
     width: 250px;
 }
 
 #scale-block {
     display: table-cell;
     vertical-align: bottom;
     width: 250px;
-    height: 30px;
+    max-height: 30px;
     float: left;
     clear: left;
 }
 
 #info-block {
     float: left;
     clear: left;
 }
 
 #info-block {
-    float: right;
+    max-height: 30px;
     clear: right;
 }
 
     clear: right;
 }
 
@@ -3861,6 +4002,7 @@ div.full-screen > button:hover {
     text-align: right;
     margin-right: 10px;
     clear: right;
     text-align: right;
     margin-right: 10px;
     clear: right;
+    overflow: hidden;
 }
 
 #about-list li {
 }
 
 #about-list li {
@@ -3998,7 +4140,7 @@ div.full-screen > button:hover {
 }
 
 .modal-actions button:before,
 }
 
 .modal-actions button:before,
-.save-success a.button:before,
+.save-success a.button.osm:before,
 .walkthrough a:before {
     display: block;
     content: '';
 .walkthrough a:before {
     display: block;
     content: '';
@@ -4007,7 +4149,7 @@ div.full-screen > button:hover {
     max-width: 100px;
     margin: auto;
     margin-bottom: 10px;
     max-width: 100px;
     margin: auto;
     margin-bottom: 10px;
-    background:transparent url(<%= asset_path("iD/img/sprite.svg") %>) no-repeat 0 -220px;
+    background:transparent url(<%= asset_path("iD/img/iD-sprite.svg") %>) no-repeat -200px -460px;
 }
 
 .modal-actions :first-child {
 }
 
 .modal-actions :first-child {
@@ -4022,11 +4164,11 @@ div.full-screen > button:hover {
 ------------------------------------------------------- */
 
 .modal-actions .restore:before {
 ------------------------------------------------------- */
 
 .modal-actions .restore:before {
-    background-position: -600px -220px;
+    background-position: -500px -460px;
 }
 
 .modal-actions .reset:before {
 }
 
 .modal-actions .reset:before {
-    background-position: -700px -220px;
+    background-position: -600px -460px;
 }
 
 /* Success Modal
 }
 
 /* Success Modal
@@ -4040,28 +4182,18 @@ div.full-screen > button:hover {
     padding-top: 15px;
 }
 
     padding-top: 15px;
 }
 
-.save-success .button.social {
-    height: 80px;
+.save-success a.button.social {
+    height: auto;
 }
 
 }
 
-.save-success .button.social:before {
-    height: 50px;
+.save-success .icon.social {
+    height: 80px;
+    width: 80px;
+    color: #7092FF;
 }
 
 .save-success .button.osm:before {
 }
 
 .save-success .button.osm:before {
-    background-position: 0px -220px;
-}
-
-.save-success .button.twitter:before {
-    background-position: -100px -245px;
-}
-
-.save-success .button.facebook:before {
-    background-position: -200px -245px;
-}
-
-.save-success .button.google:before {
-    background-position: -300px -245px;
+    background-position: -200px -460px;
 }
 
 /* Splash Modal
 }
 
 /* Splash Modal
@@ -4069,11 +4201,11 @@ div.full-screen > button:hover {
 
 .modal-actions .walkthrough:before,
 .walkthrough a:before {
 
 .modal-actions .walkthrough:before,
 .walkthrough a:before {
-    background-position: -400px -220px;
+    background-position: -300px -460px;
 }
 
 .modal-actions .start:before {
 }
 
 .modal-actions .start:before {
-    background-position: -500px -220px;
+    background-position: -400px -460px;
 }
 
 /* Commit Modal
 }
 
 /* Commit Modal
@@ -4231,10 +4363,6 @@ div.full-screen > button:hover {
     margin-right:10px;
 }
 
     margin-right:10px;
 }
 
-.icon.zoom-in-invert {
-    background-position: -240px -40px;
-}
-
 /* Tooltips
 ------------------------------------------------------- */
 
 /* Tooltips
 ------------------------------------------------------- */
 
@@ -4443,27 +4571,35 @@ div.full-screen > button:hover {
 }
 
 .radial-menu-background {
 }
 
 .radial-menu-background {
+    fill: none;
     stroke: black;
     stroke-opacity: 0.5;
 }
 
     stroke: black;
     stroke-opacity: 0.5;
 }
 
-.radial-menu-item {
-    fill: white;
-}
-
-.radial-menu-item:hover {
-    fill: #ececec;
+.radial-menu-item circle {
+    fill: #eee;
 }
 
 }
 
-.radial-menu-item:active {
-    fill: #ececec;
+.radial-menu-item circle:active,
+.radial-menu-item circle:hover {
+    fill: #fff;
 }
 
 }
 
-.radial-menu-item.disabled {
+.radial-menu-item.disabled circle {
     cursor: auto;
     fill: rgba(255,255,255,.5);
 }
 
     cursor: auto;
     fill: rgba(255,255,255,.5);
 }
 
+.radial-menu-item use {
+    fill: #222;
+    color: #79f;
+}
+
+.radial-menu-item.disabled use {
+    fill: rgba(32,32,32,.5);
+    color: rgba(40,40,40,.5);
+}
+
 .lasso-box {
     fill-opacity:0.1;
     stroke: #fff;
 .lasso-box {
     fill-opacity:0.1;
     stroke: #fff;
@@ -4476,7 +4612,6 @@ div.full-screen > button:hover {
 ------------------------------------------------------- */
 
 @media only screen and (max-width: 840px) {
 ------------------------------------------------------- */
 
 @media only screen and (max-width: 840px) {
-    #bar .icon.icon-pre-text { margin-right: 0;}
     /* override hide for save button */
     #bar .save .label { display: block;}
 }
     /* override hide for save button */
     #bar .save .label { display: block;}
 }
@@ -4598,7 +4733,7 @@ div.full-screen > button:hover {
     content: "";
     height: 80px;
     width: 200px;
     content: "";
     height: 80px;
     width: 200px;
-    background:transparent url(<%= asset_path("iD/img/sprite.svg") %>) no-repeat 0 -320px;
+    background:transparent url(<%= asset_path("iD/img/iD-sprite.svg") %>) no-repeat 0 -320px;
 }
 
 .intro-areas-add .tooltip-inner::before {
 }
 
 .intro-areas-add .tooltip-inner::before {
@@ -4618,189 +4753,6 @@ div.full-screen > button:hover {
 .huge-modal-button .illustration {
     height: 100px;
     width: 100px;
 .huge-modal-button .illustration {
     height: 100px;
     width: 100px;
-    background: rgba(0, 0, 0, 0) url(<%= asset_path("iD/img/sprite.svg") %>) no-repeat -400px -220px;
+    background: rgba(0, 0, 0, 0) url(<%= asset_path("iD/img/iD-sprite.svg") %>) no-repeat -300px -460px;
     margin: auto;
 }
     margin: auto;
 }
-/* This file is generated by make. Do NOT edit manually. */
-
-.preset-icon{background-image:url(<%= asset_path("iD/img/maki-sprite.png") %>);background-repeat:no-repeat;width:24px;height:24px;}
-.preset-icon-line{background-image:url(<%= asset_path("iD/img/line-presets.png") %>);background-repeat:no-repeat;width:60px;height:60px;}
-.preset-icon-relation{background-image:url(<%= asset_path("iD/img/relation-presets.png") %>);background-repeat:no-repeat;width:60px;height:60px;}
-.feature-circle-stroked{background-position:-0px -0px;}
-.feature-circle{background-position:-54px -0px;}
-.feature-square-stroked{background-position:-108px -0px;}
-.feature-square{background-position:-162px -0px;}
-.feature-triangle-stroked{background-position:-216px -0px;}
-.feature-triangle{background-position:-0px -24px;}
-.feature-star-stroked{background-position:-54px -24px;}
-.feature-star{background-position:-108px -24px;}
-.feature-cross{background-position:-162px -24px;}
-.feature-marker-stroked{background-position:-216px -24px;}
-.feature-marker{background-position:-0px -48px;}
-.feature-religious-jewish{background-position:-54px -48px;}
-.feature-religious-christian{background-position:-108px -48px;}
-.feature-religious-muslim{background-position:-162px -48px;}
-.feature-cemetery{background-position:-216px -48px;}
-.feature-rocket{background-position:-0px -72px;}
-.feature-airport{background-position:-54px -72px;}
-.feature-heliport{background-position:-108px -72px;}
-.feature-rail{background-position:-162px -72px;}
-.feature-rail-metro{background-position:-216px -72px;}
-.feature-rail-light{background-position:-0px -96px;}
-.feature-bus{background-position:-54px -96px;}
-.feature-fuel{background-position:-108px -96px;}
-.feature-parking{background-position:-162px -96px;}
-.feature-parking-garage{background-position:-216px -96px;}
-.feature-airfield{background-position:-0px -120px;}
-.feature-roadblock{background-position:-54px -120px;}
-.feature-ferry{background-position:-108px -120px;}
-.feature-harbor{background-position:-162px -120px;}
-.feature-bicycle{background-position:-216px -120px;}
-.feature-park{background-position:-0px -144px;}
-.feature-park2{background-position:-54px -144px;}
-.feature-museum{background-position:-108px -144px;}
-.feature-lodging{background-position:-162px -144px;}
-.feature-monument{background-position:-216px -144px;}
-.feature-zoo{background-position:-0px -168px;}
-.feature-garden{background-position:-54px -168px;}
-.feature-campsite{background-position:-108px -168px;}
-.feature-theatre{background-position:-162px -168px;}
-.feature-art-gallery{background-position:-216px -168px;}
-.feature-pitch{background-position:-0px -192px;}
-.feature-soccer{background-position:-54px -192px;}
-.feature-america-football{background-position:-108px -192px;}
-.feature-tennis{background-position:-162px -192px;}
-.feature-basketball{background-position:-216px -192px;}
-.feature-baseball{background-position:-0px -216px;}
-.feature-golf{background-position:-54px -216px;}
-.feature-swimming{background-position:-108px -216px;}
-.feature-cricket{background-position:-162px -216px;}
-.feature-skiing{background-position:-216px -216px;}
-.feature-school{background-position:-0px -240px;}
-.feature-college{background-position:-54px -240px;}
-.feature-library{background-position:-108px -240px;}
-.feature-post{background-position:-162px -240px;}
-.feature-fire-station{background-position:-216px -240px;}
-.feature-town-hall{background-position:-0px -264px;}
-.feature-police{background-position:-54px -264px;}
-.feature-prison{background-position:-108px -264px;}
-.feature-embassy{background-position:-162px -264px;}
-.feature-beer{background-position:-216px -264px;}
-.feature-restaurant{background-position:-0px -288px;}
-.feature-cafe{background-position:-54px -288px;}
-.feature-shop{background-position:-108px -288px;}
-.feature-fast-food{background-position:-162px -288px;}
-.feature-bar{background-position:-216px -288px;}
-.feature-bank{background-position:-0px -312px;}
-.feature-grocery{background-position:-54px -312px;}
-.feature-cinema{background-position:-108px -312px;}
-.feature-pharmacy{background-position:-162px -312px;}
-.feature-hospital{background-position:-216px -312px;}
-.feature-danger{background-position:-0px -336px;}
-.feature-industrial{background-position:-54px -336px;}
-.feature-warehouse{background-position:-108px -336px;}
-.feature-commercial{background-position:-162px -336px;}
-.feature-building{background-position:-216px -336px;}
-.feature-place-of-worship{background-position:-0px -360px;}
-.feature-alcohol-shop{background-position:-54px -360px;}
-.feature-logging{background-position:-108px -360px;}
-.feature-oil-well{background-position:-162px -360px;}
-.feature-slaughterhouse{background-position:-216px -360px;}
-.feature-dam{background-position:-0px -384px;}
-.feature-water{background-position:-54px -384px;}
-.feature-wetland{background-position:-108px -384px;}
-.feature-disability{background-position:-162px -384px;}
-.feature-telephone{background-position:-216px -384px;}
-.feature-emergency-telephone{background-position:-0px -408px;}
-.feature-toilets{background-position:-54px -408px;}
-.feature-waste-basket{background-position:-108px -408px;}
-.feature-music{background-position:-162px -408px;}
-.feature-land-use{background-position:-216px -408px;}
-.feature-city{background-position:-0px -432px;}
-.feature-town{background-position:-54px -432px;}
-.feature-village{background-position:-108px -432px;}
-.feature-farm{background-position:-162px -432px;}
-.feature-bakery{background-position:-216px -432px;}
-.feature-dog-park{background-position:-0px -456px;}
-.feature-lighthouse{background-position:-54px -456px;}
-.feature-clothing-store{background-position:-108px -456px;}
-.feature-polling-place{background-position:-162px -456px;}
-.feature-playground{background-position:-216px -456px;}
-.feature-entrance{background-position:-0px -480px;}
-.feature-heart{background-position:-54px -480px;}
-.feature-london-underground{background-position:-108px -480px;}
-.feature-minefield{background-position:-162px -480px;}
-.feature-rail-underground{background-position:-216px -480px;}
-.feature-rail-above{background-position:-0px -504px;}
-.feature-camera{background-position:-54px -504px;}
-.feature-laundry{background-position:-108px -504px;}
-.feature-car{background-position:-162px -504px;}
-.feature-suitcase{background-position:-216px -504px;}
-.feature-hairdresser{background-position:-0px -528px;}
-.feature-chemist{background-position:-54px -528px;}
-.feature-mobilephone{background-position:-108px -528px;}
-.feature-scooter{background-position:-162px -528px;}
-.feature-gift{background-position:-216px -528px;}
-.feature-ice-cream{background-position:-0px -552px;}
-.preset-icon-line.feature-highway-motorway{background-position:-20px -25px;}
-.preset-icon-line.feature-highway-trunk{background-position:-80px -25px;}
-.preset-icon-line.feature-highway-primary{background-position:-140px -25px;}
-.preset-icon-line.feature-highway-secondary{background-position:-200px -25px;}
-.preset-icon-line.feature-highway-tertiary{background-position:-260px -25px;}
-.preset-icon-line.feature-highway-motorway-link{background-position:-320px -25px;}
-.preset-icon-line.feature-highway-trunk-link{background-position:-380px -25px;}
-.preset-icon-line.feature-highway-primary-link{background-position:-440px -25px;}
-.preset-icon-line.feature-highway-secondary-link{background-position:-500px -25px;}
-.preset-icon-line.feature-highway-tertiary-link{background-position:-560px -25px;}
-.preset-icon-line.feature-highway-residential{background-position:-620px -25px;}
-.preset-icon-line.feature-highway-unclassified{background-position:-680px -25px;}
-.preset-icon-line.feature-highway-service{background-position:-740px -25px;}
-.preset-icon-line.feature-highway-road{background-position:-800px -25px;}
-.preset-icon-line.feature-highway-track{background-position:-860px -25px;}
-.preset-icon-line.feature-highway-living-street{background-position:-920px -25px;}
-.preset-icon-line.feature-highway-path{background-position:-980px -25px;}
-.preset-icon-line.feature-highway-cycleway{background-position:-1040px -25px;}
-.preset-icon-line.feature-highway-footway{background-position:-1100px -25px;}
-.preset-icon-line.feature-highway-bridleway{background-position:-1160px -25px;}
-.preset-icon-line.feature-highway-steps{background-position:-1220px -25px;}
-.preset-icon-line.feature-railway-rail{background-position:-1280px -25px;}
-.preset-icon-line.feature-railway-disused{background-position:-1340px -25px;}
-.preset-icon-line.feature-railway-abandoned{background-position:-1400px -25px;}
-.preset-icon-line.feature-railway-subway{background-position:-1460px -25px;}
-.preset-icon-line.feature-railway-light-rail{background-position:-1520px -25px;}
-.preset-icon-line.feature-railway-monorail{background-position:-1580px -25px;}
-.preset-icon-line.feature-waterway-river{background-position:-1640px -25px;}
-.preset-icon-line.feature-waterway-stream{background-position:-1700px -25px;}
-.preset-icon-line.feature-waterway-canal{background-position:-1760px -25px;}
-.preset-icon-line.feature-waterway-ditch{background-position:-1820px -25px;}
-.preset-icon-line.feature-power-line{background-position:-1880px -25px;}
-.preset-icon-line.feature-other-line{background-position:-1940px -25px;}
-.preset-icon-line.feature-category-roads{background-position:-2000px -25px;}
-.preset-icon-line.feature-category-rail{background-position:-2060px -25px;}
-.preset-icon-line.feature-category-path{background-position:-2120px -25px;}
-.preset-icon-line.feature-category-water{background-position:-2180px -25px;}
-.preset-icon-line.feature-ferry{background-position:-2240px -25px;}
-.preset-icon-line.feature-pipeline{background-position:-2300px -25px;}
-.preset-icon-relation.feature-relation{background-position:-20px -25px;}
-.preset-icon-relation.feature-restriction{background-position:-80px -25px;}
-.preset-icon-relation.feature-multipolygon{background-position:-141px -25px;}
-.preset-icon-relation.feature-boundary{background-position:-200px -25px;}
-.preset-icon-relation.feature-route{background-position:-260px -25px;}
-.preset-icon-relation.feature-route-road{background-position:-320px -25px;}
-.preset-icon-relation.feature-route-bicycle{background-position:-380px -25px;}
-.preset-icon-relation.feature-route-foot{background-position:-440px -25px;}
-.preset-icon-relation.feature-route-bus{background-position:-500px -25px;}
-.preset-icon-relation.feature-route-train{background-position:-560px -25px;}
-.preset-icon-relation.feature-route-detour{background-position:-620px -25px;}
-.preset-icon-relation.feature-route-tram{background-position:-680px -25px;}
-.preset-icon-relation.feature-route-ferry{background-position:-740px -25px;}
-.preset-icon-relation.feature-route-power{background-position:-800px -25px;}
-.preset-icon-relation.feature-route-pipeline{background-position:-860px -25px;}
-.preset-icon-relation.feature-route-master{background-position:-920px -25px;}
-.preset-icon-relation.feature-restriction-no-straight-on{background-position:-980px -25px;}
-.preset-icon-relation.feature-restriction-no-u-turn{background-position:-1040px -25px;}
-.preset-icon-relation.feature-restriction-no-left-turn{background-position:-1100px -25px;}
-.preset-icon-relation.feature-restriction-no-right-turn{background-position:-1160px -25px;}
-.preset-icon-relation.feature-restriction-only-straight-on{background-position:-1220px -25px;}
-.preset-icon-relation.feature-restriction-only-left-turn{background-position:-1280px -25px;}
-.preset-icon-relation.feature-restriction-only-right-turn{background-position:-1340px -25px;}
index 25bc49f8975a1580b3084931f72facfc2ebcaa17..3adf062d3d9fad5c8cee0c9fdd7e59c3fe75b9d0 100644 (file)
@@ -6407,7 +6407,7 @@ d3.combobox = function() {
 
             for (var i = 0; i < suggestions.length; i++) {
                 if (suggestions[i].value.toLowerCase().indexOf(v.toLowerCase()) === 0) {
 
             for (var i = 0; i < suggestions.length; i++) {
                 if (suggestions[i].value.toLowerCase().indexOf(v.toLowerCase()) === 0) {
-                    var completion = v + suggestions[i].value.substr(v.length);
+                    var completion = suggestions[i].value;
                     idx = i;
                     input.property('value', completion);
                     input.node().setSelectionRange(v.length, completion.length);
                     idx = i;
                     input.property('value', completion);
                     input.node().setSelectionRange(v.length, completion.length);
@@ -19333,7 +19333,7 @@ window.iD = function () {
     return d3.rebind(context, dispatch, 'on');
 };
 
     return d3.rebind(context, dispatch, 'on');
 };
 
-iD.version = '1.7.4';
+iD.version = '1.8.0';
 
 (function() {
     var detected = {};
 
 (function() {
     var detected = {};
@@ -19380,7 +19380,7 @@ iD.version = '1.7.4';
     // Added due to incomplete svg style support. See #715
     detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
 
     // Added due to incomplete svg style support. See #715
     detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
 
-    detected.locale = navigator.language || navigator.userLanguage || 'en-US';
+    detected.locale = navigator.languages ? navigator.languages[0] : (navigator.language || navigator.userLanguage || 'en-US');
 
     detected.filedrop = (window.FileReader && 'ondrop' in window);
 
 
     detected.filedrop = (window.FileReader && 'ondrop' in window);
 
@@ -19486,19 +19486,10 @@ iD.taginfo = function() {
         return _.omit(parameters, 'geometry', 'debounce');
     }
 
         return _.omit(parameters, 'geometry', 'debounce');
     }
 
-    function shorten(parameters) {
-        if (!parameters.query) {
-            delete parameters.query;
-        } else {
-            parameters.query = parameters.query.slice(0, 3);
-        }
-        return parameters;
-    }
-
     function popularKeys(parameters) {
         var pop_field = 'count_all';
         if (parameters.filter) pop_field = 'count_' + parameters.filter;
     function popularKeys(parameters) {
         var pop_field = 'count_all';
         if (parameters.filter) pop_field = 'count_' + parameters.filter;
-        return function(d) { return parseFloat(d[pop_field]) > 10000; };
+        return function(d) { return parseFloat(d[pop_field]) > 5000 || d.in_wiki; };
     }
 
     function popularValues() {
     }
 
     function popularValues() {
@@ -19533,7 +19524,7 @@ iD.taginfo = function() {
 
     taginfo.keys = function(parameters, callback) {
         var debounce = parameters.debounce;
 
     taginfo.keys = function(parameters, callback) {
         var debounce = parameters.debounce;
-        parameters = clean(shorten(setSort(parameters)));
+        parameters = clean(setSort(parameters));
         request(endpoint + 'keys/all?' +
             iD.util.qsString(_.extend({
                 rp: 10,
         request(endpoint + 'keys/all?' +
             iD.util.qsString(_.extend({
                 rp: 10,
@@ -19548,7 +19539,7 @@ iD.taginfo = function() {
 
     taginfo.values = function(parameters, callback) {
         var debounce = parameters.debounce;
 
     taginfo.values = function(parameters, callback) {
         var debounce = parameters.debounce;
-        parameters = clean(shorten(setSort(setFilter(parameters))));
+        parameters = clean(setSort(setFilter(parameters)));
         request(endpoint + 'key/values?' +
             iD.util.qsString(_.extend({
                 rp: 25,
         request(endpoint + 'key/values?' +
             iD.util.qsString(_.extend({
                 rp: 25,
@@ -20236,43 +20227,82 @@ iD.geo.Turn = function(turn) {
 
 iD.geo.Intersection = function(graph, vertexId) {
     var vertex = graph.entity(vertexId),
 
 iD.geo.Intersection = function(graph, vertexId) {
     var vertex = graph.entity(vertexId),
-        highways = [];
+        parentWays = graph.parentWays(vertex),
+        coincident = [],
+        highways = {};
+
+    function addHighway(way, adjacentNodeId) {
+        if (highways[adjacentNodeId]) {
+            coincident.push(adjacentNodeId);
+        } else {
+            highways[adjacentNodeId] = way;
+        }
+    }
 
     // Pre-split ways that would need to be split in
     // order to add a restriction. The real split will
     // happen when the restriction is added.
 
     // Pre-split ways that would need to be split in
     // order to add a restriction. The real split will
     // happen when the restriction is added.
-    graph.parentWays(vertex).forEach(function(way) {
+    parentWays.forEach(function(way) {
         if (!way.tags.highway || way.isArea() || way.isDegenerate())
             return;
 
         if (!way.tags.highway || way.isArea() || way.isDegenerate())
             return;
 
-        if (way.affix(vertexId)) {
-            highways.push(way);
-        } else {
-            var idx = _.indexOf(way.nodes, vertex.id, 1),
-                wayA = iD.Way({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, idx + 1)}),
-                wayB = iD.Way({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(idx)});
+        var isFirst = (vertexId === way.first()),
+            isLast = (vertexId === way.last()),
+            isAffix = (isFirst || isLast),
+            isClosingNode = (isFirst && isLast);
 
 
-            graph = graph.replace(wayA);
-            graph = graph.replace(wayB);
+        if (isAffix && !isClosingNode) {
+            var index = (isFirst ? 1 : way.nodes.length - 2);
+            addHighway(way, way.nodes[index]);
 
 
-            highways.push(wayA);
-            highways.push(wayB);
+        } else {
+            var splitIndex, wayA, wayB, indexA, indexB;
+            if (isClosingNode) {
+                splitIndex = Math.ceil(way.nodes.length / 2);  // split at midpoint
+                wayA = iD.Way({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex)});
+                wayB = iD.Way({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)});
+                indexA = 1;
+                indexB = way.nodes.length - 2;
+            } else {
+                splitIndex = _.indexOf(way.nodes, vertex.id, 1);  // split at vertexid
+                wayA = iD.Way({id: way.id + '-a', tags: way.tags, nodes: way.nodes.slice(0, splitIndex + 1)});
+                wayB = iD.Way({id: way.id + '-b', tags: way.tags, nodes: way.nodes.slice(splitIndex)});
+                indexA = splitIndex - 1;
+                indexB = splitIndex + 1;
+            }
+            graph = graph.replace(wayA).replace(wayB);
+            addHighway(wayA, way.nodes[indexA]);
+            addHighway(wayB, way.nodes[indexB]);
         }
     });
 
         }
     });
 
+    // remove any ways from this intersection that are coincident
+    // (i.e. any adjacent node used by more than one intersecting way)
+    coincident.forEach(function (n) {
+        delete highways[n];
+    });
+
+
     var intersection = {
         highways: highways,
     var intersection = {
         highways: highways,
+        ways: _.values(highways),
         graph: graph
     };
 
         graph: graph
     };
 
-    intersection.turns = function(fromNodeID) {
-        if (!fromNodeID)
+    intersection.adjacentNodeId = function(fromWayId) {
+        return _.find(_.keys(highways), function(k) {
+            return highways[k].id === fromWayId;
+        });
+    };
+
+    intersection.turns = function(fromNodeId) {
+        var start = highways[fromNodeId];
+        if (!start)
             return [];
 
             return [];
 
-        var way = _.find(highways, function(way) { return way.contains(fromNodeID); });
-        if (way.first() === vertex.id && way.tags.oneway === 'yes')
+        if (start.first() === vertex.id && start.tags.oneway === 'yes')
             return [];
             return [];
-        if (way.last() === vertex.id && way.tags.oneway === '-1')
+        if (start.last() === vertex.id && start.tags.oneway === '-1')
             return [];
 
         function withRestriction(turn) {
             return [];
 
         function withRestriction(turn) {
@@ -20301,39 +20331,44 @@ iD.geo.Intersection = function(graph, vertexId) {
         }
 
         var from = {
         }
 
         var from = {
-                node: way.nodes[way.first() === vertex.id ? 1 : way.nodes.length - 2],
-                way: way.id.split(/-(a|b)/)[0]
+                node: fromNodeId,
+                way: start.id.split(/-(a|b)/)[0]
             },
             },
-            via = {node: vertex.id},
+            via = { node: vertex.id },
             turns = [];
 
             turns = [];
 
-        highways.forEach(function(parent) {
-            if (parent === way)
+        _.each(highways, function(end, adjacentNodeId) {
+            if (end === start)
                 return;
 
                 return;
 
-            var index = parent.nodes.indexOf(vertex.id);
-
             // backward
             // backward
-            if (parent.first() !== vertex.id && parent.tags.oneway !== 'yes') {
+            if (end.first() !== vertex.id && end.tags.oneway !== 'yes') {
                 turns.push(withRestriction({
                     from: from,
                     via: via,
                 turns.push(withRestriction({
                     from: from,
                     via: via,
-                    to: {node: parent.nodes[index - 1], way: parent.id.split(/-(a|b)/)[0]}
+                    to: {
+                        node: adjacentNodeId,
+                        way: end.id.split(/-(a|b)/)[0]
+                    }
                 }));
             }
 
             // forward
                 }));
             }
 
             // forward
-            if (parent.last() !== vertex.id && parent.tags.oneway !== '-1') {
+            if (end.last() !== vertex.id && end.tags.oneway !== '-1') {
                 turns.push(withRestriction({
                     from: from,
                     via: via,
                 turns.push(withRestriction({
                     from: from,
                     via: via,
-                    to: {node: parent.nodes[index + 1], way: parent.id.split(/-(a|b)/)[0]}
+                    to: {
+                        node: adjacentNodeId,
+                        way: end.id.split(/-(a|b)/)[0]
+                    }
                 }));
             }
                 }));
             }
+
         });
 
         // U-turn
         });
 
         // U-turn
-        if (way.tags.oneway !== 'yes' && way.tags.oneway !== '-1') {
+        if (start.tags.oneway !== 'yes' && start.tags.oneway !== '-1') {
             turns.push(withRestriction({
                 from: from,
                 via: via,
             turns.push(withRestriction({
                 from: from,
                 via: via,
@@ -20461,7 +20496,7 @@ iD.geo.joinWays = function(array, graph) {
     }
 
     function reverse(member) {
     }
 
     function reverse(member) {
-        return member.tags ? iD.actions.Reverse(member.id)(graph).entity(member.id) : member;
+        return member.tags ? iD.actions.Reverse(member.id, {reverseOneway: true})(graph).entity(member.id) : member;
     }
 
     while (array.length) {
     }
 
     while (array.length) {
@@ -21251,7 +21286,9 @@ iD.actions.Join = function(ids) {
             return 'not_adjacent';
 
         var nodeIds = _.pluck(joined[0].nodes, 'id').slice(1, -1),
             return 'not_adjacent';
 
         var nodeIds = _.pluck(joined[0].nodes, 'id').slice(1, -1),
-            relation;
+            relation,
+            tags = {},
+            conflicting = false;
 
         joined[0].forEach(function(way) {
             var parents = graph.parentRelations(way);
 
         joined[0].forEach(function(way) {
             var parents = graph.parentRelations(way);
@@ -21259,10 +21296,21 @@ iD.actions.Join = function(ids) {
                 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
                     relation = parent;
             });
                 if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
                     relation = parent;
             });
+
+            for (var k in way.tags) {
+                if (!(k in tags)) {
+                    tags[k] = way.tags[k];
+                } else if (tags[k] && iD.interestingTag(k) && tags[k] !== way.tags[k]) {
+                    conflicting = true;
+                }
+            }
         });
 
         if (relation)
             return 'restriction';
         });
 
         if (relation)
             return 'restriction';
+
+        if (conflicting)
+            return 'conflicting_tags';
     };
 
     return action;
     };
 
     return action;
@@ -22167,6 +22215,10 @@ iD.actions.RestrictTurn = function(turn, projection, restrictionId) {
             via  = graph.entity(turn.via.node),
             to   = graph.entity(turn.to.way);
 
             via  = graph.entity(turn.via.node),
             to   = graph.entity(turn.to.way);
 
+        function isClosingNode(way, nodeId) {
+            return nodeId === way.first() && nodeId === way.last();
+        }
+
         function split(toOrFrom) {
             var newID = toOrFrom.newID || iD.Way().id;
             graph = iD.actions.Split(via.id, [newID])
         function split(toOrFrom) {
             var newID = toOrFrom.newID || iD.Way().id;
             graph = iD.actions.Split(via.id, [newID])
@@ -22182,12 +22234,12 @@ iD.actions.RestrictTurn = function(turn, projection, restrictionId) {
             }
         }
 
             }
         }
 
-        if (!from.affix(via.id)) {
+        if (!from.affix(via.id) || isClosingNode(from, via.id)) {
             if (turn.from.node === turn.to.node) {
                 // U-turn
                 from = to = split(turn.from)[0];
             } else if (turn.from.way === turn.to.way) {
             if (turn.from.node === turn.to.node) {
                 // U-turn
                 from = to = split(turn.from)[0];
             } else if (turn.from.way === turn.to.way) {
-                // Straight-on
+                // Straight-on or circular
                 var s = split(turn.from);
                 from = s[0];
                 to   = s[1];
                 var s = split(turn.from);
                 from = s[0];
                 to   = s[1];
@@ -22197,7 +22249,7 @@ iD.actions.RestrictTurn = function(turn, projection, restrictionId) {
             }
         }
 
             }
         }
 
-        if (!to.affix(via.id)) {
+        if (!to.affix(via.id) || isClosingNode(to, via.id)) {
             to = split(turn.to)[0];
         }
 
             to = split(turn.to)[0];
         }
 
@@ -22252,7 +22304,7 @@ iD.actions.RestrictTurn = function(turn, projection, restrictionId) {
       http://wiki.openstreetmap.org/wiki/Route#Members
       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
  */
       http://wiki.openstreetmap.org/wiki/Route#Members
       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
  */
-iD.actions.Reverse = function(wayId) {
+iD.actions.Reverse = function(wayId, options) {
     var replacements = [
             [/:right$/, ':left'], [/:left$/, ':right'],
             [/:forward$/, ':backward'], [/:backward$/, ':forward']
     var replacements = [
             [/:right$/, ':left'], [/:left$/, ':right'],
             [/:forward$/, ':backward'], [/:backward$/, ':forward']
@@ -22282,6 +22334,8 @@ iD.actions.Reverse = function(wayId) {
             return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
         } else if (key === 'incline' || key === 'direction') {
             return {up: 'down', down: 'up'}[value] || value;
             return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
         } else if (key === 'incline' || key === 'direction') {
             return {up: 'down', down: 'up'}[value] || value;
+        } else if (options && options.reverseOneway && key === 'oneway') {
+            return {yes: '-1', '1': '-1', '-1': 'yes'}[value] || value;
         } else {
             return {left: 'right', right: 'left'}[value] || value;
         }
         } else {
             return {left: 'right', right: 'left'}[value] || value;
         }
@@ -22971,7 +23025,7 @@ iD.behavior.drag = function() {
 };
 iD.behavior.Draw = function(context) {
     var event = d3.dispatch('move', 'click', 'clickWay',
 };
 iD.behavior.Draw = function(context) {
     var event = d3.dispatch('move', 'click', 'clickWay',
-        'clickNode', 'undo', 'cancel', 'finish'),
+            'clickNode', 'undo', 'cancel', 'finish'),
         keybinding = d3.keybinding('draw'),
         hover = iD.behavior.Hover(context)
             .altDisables(true)
         keybinding = d3.keybinding('draw'),
         hover = iD.behavior.Hover(context)
             .altDisables(true)
@@ -22989,7 +23043,7 @@ iD.behavior.Draw = function(context) {
     function mousedown() {
 
         function point() {
     function mousedown() {
 
         function point() {
-            var p = element.node().parentNode;
+            var p = context.container().node();
             return touchId !== null ? d3.touches(p).filter(function(p) {
                 return p.identifier === touchId;
             })[0] : d3.mouse(p);
             return touchId !== null ? d3.touches(p).filter(function(p) {
                 return p.identifier === touchId;
             })[0] : d3.mouse(p);
@@ -22997,17 +23051,20 @@ iD.behavior.Draw = function(context) {
 
         var element = d3.select(this),
             touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null,
 
         var element = d3.select(this),
             touchId = d3.event.touches ? d3.event.changedTouches[0].identifier : null,
-            time = +new Date(),
-            pos = point();
+            t1 = +new Date(),
+            p1 = point();
 
         element.on('mousemove.draw', null);
 
         d3.select(window).on('mouseup.draw', function() {
 
         element.on('mousemove.draw', null);
 
         d3.select(window).on('mouseup.draw', function() {
+            var t2 = +new Date(),
+                p2 = point(),
+                dist = iD.geo.euclideanDistance(p1, p2);
+
             element.on('mousemove.draw', mousemove);
             element.on('mousemove.draw', mousemove);
-            if (iD.geo.euclideanDistance(pos, point()) < closeTolerance ||
-                (iD.geo.euclideanDistance(pos, point()) < tolerance &&
-                (+new Date() - time) < 500)) {
+            d3.select(window).on('mouseup.draw', null);
 
 
+            if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
                 // Prevent a quick second click
                 d3.select(window).on('click.draw-block', function() {
                     d3.event.stopPropagation();
                 // Prevent a quick second click
                 d3.select(window).on('click.draw-block', function() {
                     d3.event.stopPropagation();
@@ -23366,6 +23423,7 @@ iD.behavior.Hash = function(context) {
     };
 
     function update() {
     };
 
     function update() {
+        if (context.inIntro()) return;
         var s1 = formatter(context.map());
         if (s0 !== s1) location.replace(s0 = s1); // don't recenter the map!
     }
         var s1 = formatter(context.map());
         if (s0 !== s1) location.replace(s0 = s1); // don't recenter the map!
     }
@@ -26370,13 +26428,7 @@ iD.Entity.prototype = {
     },
 
     hasInterestingTags: function() {
     },
 
     hasInterestingTags: function() {
-        return _.keys(this.tags).some(function(key) {
-            return key !== 'attribution' &&
-                key !== 'created_by' &&
-                key !== 'source' &&
-                key !== 'odbl' &&
-                key.indexOf('tiger:') !== 0;
-        });
+        return _.keys(this.tags).some(iD.interestingTag);
     },
 
     isHighwayIntersection: function() {
     },
 
     isHighwayIntersection: function() {
@@ -27149,37 +27201,6 @@ _.extend(iD.Node.prototype, {
         };
     }
 });
         };
     }
 });
-iD.oneWayTags = {
-    'aerialway': {
-        'chair_lift': true,
-        'mixed_lift': true,
-        't-bar': true,
-        'j-bar': true,
-        'platter': true,
-        'rope_tow': true,
-        'magic_carpet': true,
-        'yes': true
-    },
-    'highway': {
-        'motorway': true,
-        'motorway_link': true
-    },
-    'junction': {
-        'roundabout': true
-    },
-    'man_made': {
-        'piste:halfpipe': true
-    },
-    'piste:type': {
-        'downhill': true,
-        'sled': true,
-        'yes': true
-    },
-    'waterway': {
-        'river': true,
-        'stream': true
-    }
-};
 iD.Relation = iD.Entity.relation = function iD_Relation() {
     if (!(this instanceof iD_Relation)) {
         return (new iD_Relation()).initialize(arguments);
 iD.Relation = iD.Entity.relation = function iD_Relation() {
     if (!(this instanceof iD_Relation)) {
         return (new iD_Relation()).initialize(arguments);
@@ -27460,6 +27481,46 @@ _.extend(iD.Relation.prototype, {
         return result;
     }
 });
         return result;
     }
 });
+iD.oneWayTags = {
+    'aerialway': {
+        'chair_lift': true,
+        'mixed_lift': true,
+        't-bar': true,
+        'j-bar': true,
+        'platter': true,
+        'rope_tow': true,
+        'magic_carpet': true,
+        'yes': true
+    },
+    'highway': {
+        'motorway': true,
+        'motorway_link': true
+    },
+    'junction': {
+        'roundabout': true
+    },
+    'man_made': {
+        'piste:halfpipe': true
+    },
+    'piste:type': {
+        'downhill': true,
+        'sled': true,
+        'yes': true
+    },
+    'waterway': {
+        'river': true,
+        'stream': true
+    }
+};
+
+iD.interestingTag = function (key) {
+    return key !== 'attribution' &&
+        key !== 'created_by' &&
+        key !== 'source' &&
+        key !== 'odbl' &&
+        key.indexOf('tiger:') !== 0;
+
+};
 iD.Tree = function(head) {
     var rtree = rbush(),
         rectangles = {};
 iD.Tree = function(head) {
     var rtree = rbush(),
         rectangles = {};
@@ -29314,18 +29375,16 @@ iD.MapillaryLayer = function (context) {
         enter.append('button')
             .on('click', hide)
             .append('div')
         enter.append('button')
             .on('click', hide)
             .append('div')
-            .attr('class', 'icon close');
+            .call(iD.svg.Icon('#icon-close'));
 
         enter.append('img');
 
 
         enter.append('img');
 
-        var link = enter.append('a')
+        enter
+            .append('a')
             .attr('class', 'link')
             .attr('class', 'link')
-            .attr('target', '_blank');
-
-        link.append('span')
-            .attr('class', 'icon icon-pre-text out-link');
-
-        link.append('span')
+            .attr('target', '_blank')
+            .call(iD.svg.Icon('#icon-out-link', 'inline'))
+            .append('span')
             .text(t('mapillary.view_on_mapillary'));
 
         if (!enable) {
             .text(t('mapillary.view_on_mapillary'));
 
         if (!enable) {
@@ -29815,36 +29874,22 @@ iD.svg.Areas = function(projection) {
     used once globally, since defs IDs must be unique within a document.
 */
 iD.svg.Defs = function(context) {
     used once globally, since defs IDs must be unique within a document.
 */
 iD.svg.Defs = function(context) {
-    function autosize(image) {
-        var img = document.createElement('img');
-        img.src = image.attr('xlink:href');
-        img.onload = function() {
-            image.attr({
-                width: img.width,
-                height: img.height
-            });
-        };
-    }
 
 
-    function SpriteDefinition(id, href, data) {
+    function SVGSpriteDefinition(id, href) {
         return function(defs) {
         return function(defs) {
-            defs.append('image')
-                .attr('id', id)
-                .attr('xlink:href', href)
-                .call(autosize);
-
-            defs.selectAll()
-                .data(data)
-                .enter().append('use')
-                .attr('id', function(d) { return d.key; })
-                .attr('transform', function(d) { return 'translate(-' + d.value[0] + ',-' + d.value[1] + ')'; })
-                .attr('xlink:href', '#' + id);
+            d3.xml(href, 'image/svg+xml', function(err, svg) {
+                if (err) return;
+                defs.node().appendChild(
+                    d3.select(svg.documentElement).attr('id', id).node()
+                );
+            });
         };
     }
 
     return function (selection) {
         var defs = selection.append('defs');
 
         };
     }
 
     return function (selection) {
         var defs = selection.append('defs');
 
+        // marker
         defs.append('marker')
             .attr({
                 id: 'oneway-marker',
         defs.append('marker')
             .attr({
                 id: 'oneway-marker',
@@ -29858,6 +29903,7 @@ iD.svg.Defs = function(context) {
             .append('path')
             .attr('d', 'M 5 3 L 0 3 L 0 2 L 5 2 L 5 0 L 10 2.5 L 5 5 z');
 
             .append('path')
             .attr('d', 'M 5 3 L 0 3 L 0 2 L 5 2 L 5 0 L 10 2.5 L 5 5 z');
 
+        // patterns
         var patterns = defs.selectAll('pattern')
             .data([
                 // pattern name, pattern image name
         var patterns = defs.selectAll('pattern')
             .data([
                 // pattern name, pattern image name
@@ -29903,6 +29949,7 @@ iD.svg.Defs = function(context) {
                 return context.imagePath('pattern/' + d[1] + '.png');
             });
 
                 return context.imagePath('pattern/' + d[1] + '.png');
             });
 
+        // clip paths
         defs.selectAll()
             .data([12, 18, 20, 32, 45])
             .enter().append('clipPath')
         defs.selectAll()
             .data([12, 18, 20, 32, 45])
             .enter().append('clipPath')
@@ -29919,24 +29966,25 @@ iD.svg.Defs = function(context) {
                 return d;
             });
 
                 return d;
             });
 
-        var maki = [];
-        _.forEach(iD.data.featureIcons, function (dimensions, name) {
-            if (dimensions['12'] && dimensions['18'] && dimensions['24']) {
-                maki.push({key: 'maki-' + name + '-12', value: dimensions['12']});
-                maki.push({key: 'maki-' + name + '-18', value: dimensions['18']});
-                maki.push({key: 'maki-' + name + '-24', value: dimensions['24']});
-            }
-        });
+        defs.call(SVGSpriteDefinition(
+            'iD-sprite',
+            context.imagePath('iD-sprite.svg')));
 
 
-        defs.call(SpriteDefinition(
-            'sprite',
-            context.imagePath('sprite.svg'),
-            d3.entries(iD.data.operations)));
-
-        defs.call(SpriteDefinition(
+        defs.call(SVGSpriteDefinition(
             'maki-sprite',
             'maki-sprite',
-            context.imagePath('maki-sprite.png'),
-            maki));
+            context.imagePath('maki-sprite.svg')));
+    };
+};
+iD.svg.Icon = function(name, svgklass, useklass) {
+    return function (selection) {
+        selection.selectAll('svg')
+            .data([0])
+            .enter()
+            .append('svg')
+            .attr('class', 'icon ' + (svgklass || ''))
+            .append('use')
+            .attr('xlink:href', name)
+            .attr('class', useklass);
     };
 };
 iD.svg.Labels = function(projection, context) {
     };
 };
 iD.svg.Labels = function(projection, context) {
@@ -30102,19 +30150,18 @@ iD.svg.Labels = function(projection, context) {
     }
 
     function drawAreaIcons(group, entities, filter, classes, labels) {
     }
 
     function drawAreaIcons(group, entities, filter, classes, labels) {
-
         var icons = group.selectAll('use')
             .filter(filter)
             .data(entities, iD.Entity.key);
 
         icons.enter()
             .append('use')
         var icons = group.selectAll('use')
             .filter(filter)
             .data(entities, iD.Entity.key);
 
         icons.enter()
             .append('use')
-            .attr('clip-path', 'url(#clip-square-18)')
-            .attr('class', 'icon');
+            .attr('width', '18px')
+            .attr('height', '18px');
 
         icons.attr('transform', get(labels, 'transform'))
             .attr('xlink:href', function(d) {
 
         icons.attr('transform', get(labels, 'transform'))
             .attr('xlink:href', function(d) {
-                return '#maki-' + context.presets().match(d, context.graph()).icon + '-18';
+                return '#' + context.presets().match(d, context.graph()).icon + '-18';
             });
 
 
             });
 
 
@@ -30646,9 +30693,10 @@ iD.svg.Points = function(projection, context) {
             .call(markerPath, 'stroke');
 
         group.append('use')
             .call(markerPath, 'stroke');
 
         group.append('use')
-            .attr('class', 'icon')
             .attr('transform', 'translate(-6, -20)')
             .attr('transform', 'translate(-6, -20)')
-            .attr('clip-path', 'url(#clip-square-12)');
+            .attr('class', 'icon')
+            .attr('width', '12px')
+            .attr('height', '12px');
 
         groups.attr('transform', iD.svg.PointTransform(projection))
             .call(iD.svg.TagClasses());
 
         groups.attr('transform', iD.svg.PointTransform(projection))
             .call(iD.svg.TagClasses());
@@ -30660,7 +30708,7 @@ iD.svg.Points = function(projection, context) {
         groups.select('.icon')
             .attr('xlink:href', function(entity) {
                 var preset = context.presets().match(entity, context.graph());
         groups.select('.icon')
             .attr('xlink:href', function(entity) {
                 var preset = context.presets().match(entity, context.graph());
-                return preset.icon ? '#maki-' + preset.icon + '-12' : '';
+                return preset.icon ? '#' + preset.icon + '-12' : '';
             });
 
         groups.exit()
             });
 
         groups.exit()
@@ -30787,9 +30835,9 @@ iD.svg.Turns = function(projection) {
         function icon(turn) {
             var u = turn.u ? '-u' : '';
             if (!turn.restriction)
         function icon(turn) {
             var u = turn.u ? '-u' : '';
             if (!turn.restriction)
-                return '#icon-restriction-yes' + u;
+                return '#turn-yes' + u;
             var restriction = graph.entity(turn.restriction).tags.restriction;
             var restriction = graph.entity(turn.restriction).tags.restriction;
-            return '#icon-restriction-' +
+            return '#turn-' +
                 (!turn.indirect_restriction && /^only_/.test(restriction) ? 'only' : 'no') + u;
         }
 
                 (!turn.indirect_restriction && /^only_/.test(restriction) ? 'only' : 'no') + u;
         }
 
@@ -30797,20 +30845,20 @@ iD.svg.Turns = function(projection) {
             .data(turns, key);
 
         // Enter
             .data(turns, key);
 
         // Enter
-
         var enter = groups.enter().append('g')
             .attr('class', 'turn');
 
         var nEnter = enter.filter(function (turn) { return !turn.u; });
 
         nEnter.append('rect')
         var enter = groups.enter().append('g')
             .attr('class', 'turn');
 
         var nEnter = enter.filter(function (turn) { return !turn.u; });
 
         nEnter.append('rect')
-            .attr('transform', 'translate(-12, -12)')
-            .attr('width', '45')
-            .attr('height', '25');
+            .attr('transform', 'translate(-22, -12)')
+            .attr('width', '44')
+            .attr('height', '24');
 
         nEnter.append('use')
 
         nEnter.append('use')
-            .attr('transform', 'translate(-12, -12)')
-            .attr('clip-path', 'url(#clip-square-45)');
+            .attr('width', '44')
+            .attr('height', '24');
+
 
         var uEnter = enter.filter(function (turn) { return turn.u; });
 
 
         var uEnter = enter.filter(function (turn) { return turn.u; });
 
@@ -30818,11 +30866,11 @@ iD.svg.Turns = function(projection) {
             .attr('r', '16');
 
         uEnter.append('use')
             .attr('r', '16');
 
         uEnter.append('use')
-            .attr('transform', 'translate(-16, -16)')
-            .attr('clip-path', 'url(#clip-square-32)');
+            .attr('width', '32')
+            .attr('height', '32');
 
 
-        // Update
 
 
+        // Update
         groups
             .attr('transform', function (turn) {
                 var v = graph.entity(turn.via.node),
         groups
             .attr('transform', function (turn) {
                 var v = graph.entity(turn.via.node),
@@ -30831,7 +30879,7 @@ iD.svg.Turns = function(projection) {
                     p = projection(v.loc),
                     r = turn.u ? 0 : 60;
 
                     p = projection(v.loc),
                     r = turn.u ? 0 : 60;
 
-                return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ')' +
+                return 'translate(' + (r * Math.cos(a) + p[0]) + ',' + (r * Math.sin(a) + p[1]) + ') ' +
                     'rotate(' + a * 180 / Math.PI + ')';
             });
 
                     'rotate(' + a * 180 / Math.PI + ')';
             });
 
@@ -30841,8 +30889,8 @@ iD.svg.Turns = function(projection) {
         groups.select('rect');
         groups.select('circle');
 
         groups.select('rect');
         groups.select('circle');
 
-        // Exit
 
 
+        // Exit
         groups.exit()
             .remove();
 
         groups.exit()
             .remove();
 
@@ -30970,8 +31018,9 @@ iD.svg.Vertices = function(projection, context) {
         enter.filter(function(d) { return icon(d); })
             .append('use')
             .attr('transform', 'translate(-6, -6)')
         enter.filter(function(d) { return icon(d); })
             .append('use')
             .attr('transform', 'translate(-6, -6)')
-            .attr('clip-path', 'url(#clip-square-12)')
-            .attr('xlink:href', function(d) { return '#maki-' + icon(d) + '-12'; });
+            .attr('xlink:href', function(d) { return '#' + icon(d) + '-12'; })
+            .attr('width', '12px')
+            .attr('height', '12px');
 
         // Vertices with tags get a fill.
         enter.filter(function(d) { return d.hasInterestingTags(); })
 
         // Vertices with tags get a fill.
         enter.filter(function(d) { return d.hasInterestingTags(); })
@@ -31162,20 +31211,28 @@ iD.ui = function(context) {
             .attr('href', 'http://github.com/openstreetmap/iD')
             .text(iD.version);
 
             .attr('href', 'http://github.com/openstreetmap/iD')
             .text(iD.version);
 
-        var bugReport = aboutList.append('li')
-            .append('a')
+        var issueLinks = aboutList.append('li');
+
+        issueLinks.append('a')
             .attr('target', '_blank')
             .attr('tabindex', -1)
             .attr('target', '_blank')
             .attr('tabindex', -1)
-            .attr('href', 'https://github.com/openstreetmap/iD/issues');
-
-        bugReport.append('span')
-            .attr('class','icon bug light');
-
-        bugReport.call(bootstrap.tooltip()
+            .attr('href', 'https://github.com/openstreetmap/iD/issues')
+            .call(iD.svg.Icon('#icon-bug', 'light'))
+            .call(bootstrap.tooltip()
                 .title(t('report_a_bug'))
                 .placement('top')
             );
 
                 .title(t('report_a_bug'))
                 .placement('top')
             );
 
+        issueLinks.append('a')
+            .attr('target', '_blank')
+            .attr('tabindex', -1)
+            .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
+            .call(iD.svg.Icon('#icon-translate', 'light'))
+            .call(bootstrap.tooltip()
+                .title(t('help_translate'))
+                .placement('top')
+            );
+
         aboutList.append('li')
             .attr('class', 'feature-warning')
             .attr('tabindex', -1)
         aboutList.append('li')
             .attr('class', 'feature-warning')
             .attr('tabindex', -1)
@@ -31299,11 +31356,11 @@ iD.ui.Account = function(context) {
             // Add thumbnail or dont
             if (details.image_url) {
                 userLink.append('img')
             // Add thumbnail or dont
             if (details.image_url) {
                 userLink.append('img')
-                    .attr('class', 'icon icon-pre-text user-icon')
+                    .attr('class', 'icon pre-text user-icon')
                     .attr('src', details.image_url);
             } else {
                     .attr('src', details.image_url);
             } else {
-                userLink.append('span')
-                    .attr('class', 'icon avatar light icon-pre-text');
+                userLink
+                    .call(iD.svg.Icon('#icon-avatar', 'pre-text light'));
             }
 
             // Add user name
             }
 
             // Add user name
@@ -31424,11 +31481,11 @@ iD.ui.Background = function(context) {
             ['right', [-1, 0]],
             ['bottom', [0, 1]]],
         opacityDefault = (context.storage('background-opacity') !== null) ?
             ['right', [-1, 0]],
             ['bottom', [0, 1]]],
         opacityDefault = (context.storage('background-opacity') !== null) ?
-            (+context.storage('background-opacity')) : 0.5,
+            (+context.storage('background-opacity')) : 1.0,
         customTemplate = context.storage('background-custom-template') || '';
 
     // Can be 0 from <1.3.0 use or due to issue #1923.
         customTemplate = context.storage('background-custom-template') || '';
 
     // Can be 0 from <1.3.0 use or due to issue #1923.
-    if (opacityDefault === 0) opacityDefault = 0.5;
+    if (opacityDefault === 0) opacityDefault = 1.0;
 
     function background(selection) {
 
 
     function background(selection) {
 
@@ -31603,13 +31660,10 @@ iD.ui.Background = function(context) {
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', toggle)
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', toggle)
+                .call(iD.svg.Icon('#icon-layers', 'light'))
                 .call(tooltip),
             shown = false;
 
                 .call(tooltip),
             shown = false;
 
-        button.append('span')
-            .attr('class', 'icon layers light');
-
-
         var opa = content.append('div')
                 .attr('class', 'opacity-options-wrapper');
 
         var opa = content.append('div')
                 .attr('class', 'opacity-options-wrapper');
 
@@ -31647,8 +31701,7 @@ iD.ui.Background = function(context) {
                 .title(t('background.custom_button'))
                 .placement('left'))
             .on('click', editCustom)
                 .title(t('background.custom_button'))
                 .placement('left'))
             .on('click', editCustom)
-            .append('span')
-            .attr('class', 'icon geocode');
+            .call(iD.svg.Icon('#icon-search'));
 
         var label = custom.append('label');
 
 
         var label = custom.append('label');
 
@@ -31716,15 +31769,14 @@ iD.ui.Background = function(context) {
             .attr('class', function(d) { return d[0] + ' nudge'; })
             .on('mousedown', clickNudge);
 
             .attr('class', function(d) { return d[0] + ' nudge'; })
             .on('mousedown', clickNudge);
 
-        var resetButton = nudgeContainer.append('button')
+        var resetButton = nudgeContainer
+            .append('button')
             .attr('class', 'reset disabled')
             .on('click', function () {
                 context.background().offset([0, 0]);
                 resetButton.classed('disabled', true);
             .attr('class', 'reset disabled')
             .on('click', function () {
                 context.background().offset([0, 0]);
                 resetButton.classed('disabled', true);
-            });
-
-        resetButton.append('div')
-            .attr('class', 'icon undo');
+            })
+            .call(iD.svg.Icon('#icon-undo'));
 
         context.map()
             .on('move.background-update', _.debounce(update, 1000));
 
         context.map()
             .on('move.background-update', _.debounce(update, 1000));
@@ -31752,30 +31804,32 @@ iD.ui.Background = function(context) {
 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
 // For example, ⌘Z -> Ctrl+Z
 iD.ui.cmd = function(code) {
 // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
 // For example, ⌘Z -> Ctrl+Z
 iD.ui.cmd = function(code) {
-    if (iD.detect().os === 'mac')
+    if (iD.detect().os === 'mac') {
         return code;
         return code;
-
-    var replacements = {
-        '⌘': 'Ctrl',
-        '⇧': 'Shift',
-        '⌥': 'Alt',
-        '⌫': 'Backspace',
-        '⌦': 'Delete'
-    }, keys = [];
+    }
 
     if (iD.detect().os === 'win') {
         if (code === '⌘⇧Z') return 'Ctrl+Y';
     }
 
 
     if (iD.detect().os === 'win') {
         if (code === '⌘⇧Z') return 'Ctrl+Y';
     }
 
+    var result = '',
+        replacements = {
+            '⌘': 'Ctrl',
+            '⇧': 'Shift',
+            '⌥': 'Alt',
+            '⌫': 'Backspace',
+            '⌦': 'Delete'
+        };
+
     for (var i = 0; i < code.length; i++) {
         if (code[i] in replacements) {
     for (var i = 0; i < code.length; i++) {
         if (code[i] in replacements) {
-            keys.push(replacements[code[i]]);
+            result += replacements[code[i]] + '+';
         } else {
         } else {
-            keys.push(code[i]);
+            result += code[i];
         }
     }
 
         }
     }
 
-    return keys.join('+');
+    return result;
 };
 iD.ui.Commit = function(context) {
     var dispatch = d3.dispatch('cancel', 'save');
 };
 iD.ui.Commit = function(context) {
     var dispatch = d3.dispatch('cancel', 'save');
@@ -31817,7 +31871,11 @@ iD.ui.Commit = function(context) {
             .attr('placeholder', t('commit.description_placeholder'))
             .attr('maxlength', 255)
             .property('value', context.storage('comment') || '')
             .attr('placeholder', t('commit.description_placeholder'))
             .attr('maxlength', 255)
             .property('value', context.storage('comment') || '')
-            .on('blur.save', function () {
+            .on('input.save', function() {
+                d3.selectAll('.save-section .save-button')
+                    .attr('disabled', (this.value.length ? null : true));
+            })
+            .on('blur.save', function() {
                 context.storage('comment', this.value);
             });
 
                 context.storage('comment', this.value);
             });
 
@@ -31847,12 +31905,13 @@ iD.ui.Commit = function(context) {
             .on('mouseout', mouseout)
             .on('click', warningClick);
 
             .on('mouseout', mouseout)
             .on('click', warningClick);
 
-        warningLi.append('span')
-            .attr('class', 'alert icon icon-pre-text');
+        warningLi
+            .call(iD.svg.Icon('#icon-alert', 'pre-text'));
 
 
-        warningLi.append('strong').text(function(d) {
-            return d.message;
-        });
+        warningLi
+            .append('strong').text(function(d) {
+                return d.message;
+            });
 
         warningLi.filter(function(d) { return d.tooltip; })
             .call(bootstrap.tooltip()
 
         warningLi.filter(function(d) { return d.tooltip; })
             .call(bootstrap.tooltip()
@@ -31877,7 +31936,7 @@ iD.ui.Commit = function(context) {
             if (user.image_url) {
                 userLink.append('img')
                     .attr('src', user.image_url)
             if (user.image_url) {
                 userLink.append('img')
                     .attr('src', user.image_url)
-                    .attr('class', 'icon icon-pre-text user-icon');
+                    .attr('class', 'icon pre-text user-icon');
             }
 
             userLink.append('a')
             }
 
             userLink.append('a')
@@ -31896,7 +31955,11 @@ iD.ui.Commit = function(context) {
             .attr('class','buttons fillL cf');
 
         var saveButton = buttonSection.append('button')
             .attr('class','buttons fillL cf');
 
         var saveButton = buttonSection.append('button')
-            .attr('class', 'action col5 button')
+            .attr('class', 'action col5 button save-button')
+            .attr('disabled', function() {
+                var n = d3.select('.commit-form textarea').node();
+                return (n && n.value.length) ? null : true;
+            })
             .on('click.save', function() {
                 dispatch.save({
                     comment: commentField.node().value
             .on('click.save', function() {
                 dispatch.save({
                     comment: commentField.node().value
@@ -31908,7 +31971,7 @@ iD.ui.Commit = function(context) {
             .text(t('commit.save'));
 
         var cancelButton = buttonSection.append('button')
             .text(t('commit.save'));
 
         var cancelButton = buttonSection.append('button')
-            .attr('class', 'action col5 button')
+            .attr('class', 'action col5 button cancel-button')
             .on('click.cancel', function() { dispatch.cancel(); });
 
         cancelButton.append('span')
             .on('click.cancel', function() { dispatch.cancel(); });
 
         cancelButton.append('span')
@@ -31936,10 +31999,10 @@ iD.ui.Commit = function(context) {
             .on('mouseout', mouseout)
             .on('click', zoomToEntity);
 
             .on('mouseout', mouseout)
             .on('click', zoomToEntity);
 
-        li.append('span')
-            .attr('class', function(d) {
-                return d.entity.geometry(d.graph) + ' ' + d.changeType + ' icon icon-pre-text';
-            });
+        li.each(function(d) {
+            d3.select(this)
+                .call(iD.svg.Icon('#icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
+        });
 
         li.append('span')
             .attr('class', 'change-type')
 
         li.append('span')
             .attr('class', 'change-type')
@@ -32039,8 +32102,7 @@ iD.ui.Conflicts = function(context) {
             .append('button')
             .attr('class', 'fr')
             .on('click', function() { dispatch.cancel(); })
             .append('button')
             .attr('class', 'fr')
             .on('click', function() { dispatch.cancel(); })
-            .append('span')
-            .attr('class', 'icon close');
+            .call(iD.svg.Icon('#icon-close'));
 
         header
             .append('h3')
 
         header
             .append('h3')
@@ -32291,8 +32353,7 @@ iD.ui.Contributors = function(context) {
             subset = u.slice(0, u.length > limit ? limit - 1 : limit);
 
         selection.html('')
             subset = u.slice(0, u.length > limit ? limit - 1 : limit);
 
         selection.html('')
-            .append('span')
-            .attr('class', 'icon nearby light icon-pre-text');
+            .call(iD.svg.Icon('#icon-nearby', 'pre-text light'));
 
         var userList = d3.select(document.createElement('span'));
 
 
         var userList = d3.select(document.createElement('span'));
 
@@ -32423,8 +32484,7 @@ iD.ui.EntityEditor = function(context) {
 
         $enter.append('button')
             .attr('class', 'fr preset-close')
 
         $enter.append('button')
             .attr('class', 'fr preset-close')
-            .append('span')
-            .attr('class', 'icon close');
+            .call(iD.svg.Icon('#icon-close'));
 
         $enter.append('h3');
 
 
         $enter.append('h3');
 
@@ -32689,8 +32749,8 @@ iD.ui.FeatureList = function(context) {
             .on('keypress', keypress)
             .on('input', inputevent);
 
             .on('keypress', keypress)
             .on('input', inputevent);
 
-        searchWrap.append('span')
-            .attr('class', 'icon search');
+        searchWrap
+            .call(iD.svg.Icon('#icon-search', 'pre-text'));
 
         var listWrap = selection.append('div')
             .attr('class', 'inspector-body');
 
         var listWrap = selection.append('div')
             .attr('class', 'inspector-body');
@@ -32797,10 +32857,8 @@ iD.ui.FeatureList = function(context) {
                 .data([0])
                 .enter().append('button')
                 .property('disabled', true)
                 .data([0])
                 .enter().append('button')
                 .property('disabled', true)
-                .attr('class', 'no-results-item');
-
-            resultsIndicator.append('span')
-                .attr('class', 'icon alert');
+                .attr('class', 'no-results-item')
+                .call(iD.svg.Icon('#icon-alert', 'pre-text'));
 
             resultsIndicator.append('span')
                 .attr('class', 'entity-name');
 
             resultsIndicator.append('span')
                 .attr('class', 'entity-name');
@@ -32832,17 +32890,21 @@ iD.ui.FeatureList = function(context) {
             var items = list.selectAll('.feature-list-item')
                 .data(results, function(d) { return d.id; });
 
             var items = list.selectAll('.feature-list-item')
                 .data(results, function(d) { return d.id; });
 
-            var enter = items.enter().insert('button', '.geocode-item')
+            var enter = items.enter()
+                .insert('button', '.geocode-item')
                 .attr('class', 'feature-list-item')
                 .on('mouseover', mouseover)
                 .on('mouseout', mouseout)
                 .on('click', click);
 
                 .attr('class', 'feature-list-item')
                 .on('mouseover', mouseover)
                 .on('mouseout', mouseout)
                 .on('click', click);
 
-            var label = enter.append('div')
+            var label = enter
+                .append('div')
                 .attr('class', 'label');
 
                 .attr('class', 'label');
 
-            label.append('span')
-                .attr('class', function(d) { return d.geometry + ' icon icon-pre-text'; });
+            label.each(function(d) {
+                d3.select(this)
+                    .call(iD.svg.Icon('#icon-' + d.geometry, 'pre-text'));
+            });
 
             label.append('span')
                 .attr('class', 'entity-type')
 
             label.append('span')
                 .attr('class', 'entity-type')
@@ -32982,7 +33044,7 @@ iD.ui.FullScreen = function(context) {
         //     .attr('class', 'icon full-screen');
 
         keybinding
         //     .attr('class', 'icon full-screen');
 
         keybinding
-            .on(iD.ui.cmd('f11'), fullScreen)
+            .on('f11', fullScreen)
             .on(iD.ui.cmd('⌘⇧F'), fullScreen);
 
         d3.select(document)
             .on(iD.ui.cmd('⌘⇧F'), fullScreen);
 
         d3.select(document)
@@ -33007,15 +33069,13 @@ iD.ui.Geolocate = function(map) {
     return function(selection) {
         if (!navigator.geolocation) return;
 
     return function(selection) {
         if (!navigator.geolocation) return;
 
-        var button = selection.append('button')
+        selection.append('button')
             .attr('tabindex', -1)
             .attr('title', t('geolocate.title'))
             .on('click', click)
             .attr('tabindex', -1)
             .attr('title', t('geolocate.title'))
             .on('click', click)
+            .call(iD.svg.Icon('#icon-geolocate', 'light'))
             .call(bootstrap.tooltip()
                 .placement('left'));
             .call(bootstrap.tooltip()
                 .placement('left'));
-
-         button.append('span')
-             .attr('class', 'icon geolocate light');
     };
 };
 iD.ui.Help = function(context) {
     };
 };
 iD.ui.Help = function(context) {
@@ -33097,8 +33157,7 @@ iD.ui.Help = function(context) {
                     .on('click', function() {
                         clickHelp(docs[i - 1], i - 1);
                     });
                     .on('click', function() {
                         clickHelp(docs[i - 1], i - 1);
                     });
-                prevLink.append('span').attr('class', 'icon back blue');
-                prevLink.append('span').html(docs[i - 1].title);
+                prevLink.append('span').html('&#9668; ' + docs[i - 1].title);
             }
             if (i < docs.length - 1) {
                 var nextLink = nav.append('a')
             }
             if (i < docs.length - 1) {
                 var nextLink = nav.append('a')
@@ -33106,8 +33165,7 @@ iD.ui.Help = function(context) {
                     .on('click', function() {
                         clickHelp(docs[i + 1], i + 1);
                     });
                     .on('click', function() {
                         clickHelp(docs[i + 1], i + 1);
                     });
-                nextLink.append('span').html(docs[i + 1].title);
-                nextLink.append('span').attr('class', 'icon forward blue');
+                nextLink.append('span').html(docs[i + 1].title + ' &#9658;');
             }
         }
 
             }
         }
 
@@ -33126,12 +33184,10 @@ iD.ui.Help = function(context) {
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', toggle)
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', toggle)
+                .call(iD.svg.Icon('#icon-help', 'light'))
                 .call(tooltip),
             shown = false;
 
                 .call(tooltip),
             shown = false;
 
-        button.append('span')
-            .attr('class', 'icon help light');
-
 
         var toc = pane.append('ul')
             .attr('class', 'toc');
 
         var toc = pane.append('ul')
             .attr('class', 'toc');
@@ -33193,6 +33249,19 @@ iD.ui.Info = function(context) {
             return r / 12.56637 * 510065621724000;
         }
 
             return r / 12.56637 * 510065621724000;
         }
 
+        function toLineString(feature) {
+            if (feature.type === 'LineString') return feature;
+
+            var result = { type: 'LineString', coordinates: [] };
+            if (feature.type === 'Polygon') {
+                result.coordinates = feature.coordinates[0];
+            } else if (feature.type === 'MultiPolygon') {
+                result.coordinates = feature.coordinates[0][0];
+            }
+
+            return result;
+        }
+
         function displayLength(m) {
             var d = m * (imperial ? 3.28084 : 1),
                 p, unit;
         function displayLength(m) {
             var d = m * (imperial ? 3.28084 : 1),
                 p, unit;
@@ -33265,7 +33334,7 @@ iD.ui.Info = function(context) {
             if (hidden()) return;
 
             var resolver = context.graph(),
             if (hidden()) return;
 
             var resolver = context.graph(),
-                selected = context.selectedIDs(),
+                selected = _.filter(context.selectedIDs(), function(e) { return context.hasEntity(e); }),
                 singular = selected.length === 1 ? selected[0] : null,
                 extent = iD.geo.Extent(),
                 entity;
                 singular = selected.length === 1 ? selected[0] : null,
                 extent = iD.geo.Extent(),
                 entity;
@@ -33301,7 +33370,7 @@ iD.ui.Info = function(context) {
             if (geometry === 'line' || geometry === 'area') {
                 var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
                     feature = entity.asGeoJSON(resolver),
             if (geometry === 'line' || geometry === 'area') {
                 var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate()),
                     feature = entity.asGeoJSON(resolver),
-                    length = radiansToMeters(d3.geo.length(feature)),
+                    length = radiansToMeters(d3.geo.length(toLineString(feature))),
                     lengthLabel = t('infobox.' + (closed ? 'perimeter' : 'length')),
                     centroid = d3.geo.centroid(feature);
 
                     lengthLabel = t('infobox.' + (closed ? 'perimeter' : 'length')),
                     centroid = d3.geo.centroid(feature);
 
@@ -33561,20 +33630,24 @@ iD.ui.intro = function(context) {
             .attr('class', 'joined')
             .selectAll('button.step');
 
             .attr('class', 'joined')
             .selectAll('button.step');
 
-        var entered = buttonwrap.data(steps)
-            .enter().append('button')
-                .attr('class', 'step')
-                .on('click', enter);
+        var entered = buttonwrap
+            .data(steps)
+            .enter()
+            .append('button')
+            .attr('class', 'step')
+            .on('click', enter);
+
+        entered
+            .call(iD.svg.Icon('#icon-apply', 'pre-text'));
+
+        entered
+            .append('label')
+            .text(function(d) { return t(d.title); });
 
 
-        entered.append('div').attr('class','icon icon-pre-text apply');
-        entered.append('label').text(function(d) { return t(d.title); });
         enter(steps[0]);
 
         function enter (newStep) {
         enter(steps[0]);
 
         function enter (newStep) {
-
-            if (step) {
-                step.exit();
-            }
+            if (step) { step.exit(); }
 
             context.enter(iD.modes.Browse(context));
 
 
             context.enter(iD.modes.Browse(context));
 
@@ -33893,12 +33966,10 @@ iD.ui.MapData = function(context) {
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', togglePanel)
             button = selection.append('button')
                 .attr('tabindex', -1)
                 .on('click', togglePanel)
+                .call(iD.svg.Icon('#icon-data', 'light'))
                 .call(tooltip),
             shown = false;
 
                 .call(tooltip),
             shown = false;
 
-        button.append('span')
-            .attr('class', 'icon data light');
-
         content.append('h4')
             .text(t('map_data.title'));
 
         content.append('h4')
             .text(t('map_data.title'));
 
@@ -33954,8 +34025,7 @@ iD.ui.MapData = function(context) {
                 d3.event.stopPropagation();
                 context.background().zoomToGpxLayer();
             })
                 d3.event.stopPropagation();
                 context.background().zoomToGpxLayer();
             })
-            .append('span')
-            .attr('class', 'icon geolocate');
+            .call(iD.svg.Icon('#icon-search'));
 
         gpxLayerItem.append('button')
             .attr('class', 'layer-browse')
 
         gpxLayerItem.append('button')
             .attr('class', 'layer-browse')
@@ -33970,8 +34040,7 @@ iD.ui.MapData = function(context) {
                     })
                     .node().click();
             })
                     })
                     .node().click();
             })
-            .append('span')
-            .attr('class', 'icon geocode');
+            .call(iD.svg.Icon('#icon-geolocate'));
 
         label = gpxLayerItem.append('label')
             .call(bootstrap.tooltip()
 
         label = gpxLayerItem.append('label')
             .call(bootstrap.tooltip()
@@ -34449,8 +34518,10 @@ iD.ui.Modes = function(context) {
         context
             .on('enter.modes', update);
 
         context
             .on('enter.modes', update);
 
-        buttons.append('span')
-            .attr('class', function(mode) { return mode.id + ' icon icon-pre-text'; });
+        buttons.each(function(d) {
+            d3.select(this)
+                .call(iD.svg.Icon('#icon-' + d.button, 'pre-text'));
+        });
 
         buttons.append('span')
             .attr('class', 'label')
 
         buttons.append('span')
             .attr('class', 'label')
@@ -34490,10 +34561,9 @@ iD.ui.Notice = function(context) {
             .attr('class', 'zoom-to notice')
             .on('click', function() { context.map().zoom(context.minEditableZoom()); });
 
             .attr('class', 'zoom-to notice')
             .on('click', function() { context.map().zoom(context.minEditableZoom()); });
 
-        button.append('span')
-            .attr('class', 'icon zoom-in-invert');
-
-        button.append('span')
+        button
+            .call(iD.svg.Icon('#icon-plus', 'pre-text'))
+            .append('span')
             .attr('class', 'label')
             .text(t('zoom_in_edit'));
 
             .attr('class', 'label')
             .text(t('zoom_in_edit'));
 
@@ -34622,13 +34692,12 @@ iD.ui.preset = function(context) {
 
         wrap.append('button')
             .attr('class', 'remove-icon')
 
         wrap.append('button')
             .attr('class', 'remove-icon')
-            .append('span').attr('class', 'icon delete');
+            .call(iD.svg.Icon('#operation-delete'));
 
         wrap.append('button')
             .attr('class', 'modified-icon')
             .attr('tabindex', -1)
 
         wrap.append('button')
             .attr('class', 'modified-icon')
             .attr('tabindex', -1)
-            .append('div')
-            .attr('class', 'icon undo');
+            .call(iD.svg.Icon('#icon-undo'));
 
         // Update
 
 
         // Update
 
@@ -34761,13 +34830,26 @@ iD.ui.PresetIcon = function() {
     var preset, geometry;
 
     function presetIcon(selection) {
     var preset, geometry;
 
     function presetIcon(selection) {
-        selection.each(setup);
+        selection.each(render);
     }
 
     }
 
-    function setup() {
+    function render() {
         var selection = d3.select(this),
             p = preset.apply(this, arguments),
         var selection = d3.select(this),
             p = preset.apply(this, arguments),
-            geom = geometry.apply(this, arguments);
+            geom = geometry.apply(this, arguments),
+            icon = p.icon || (geom === 'line' ? 'other-line' : 'marker-stroked'),
+            maki = iD.data.featureIcons.hasOwnProperty(icon + '-24');
+
+        function tag_classes(p) {
+            var s = '';
+            for (var i in p.tags) {
+                s += ' tag-' + i;
+                if (p.tags[i] !== '*') {
+                    s += ' tag-' + i + '-' + p.tags[i];
+                }
+            }
+            return s;
+        }
 
         var $fill = selection.selectAll('.preset-icon-fill')
             .data([0]);
 
         var $fill = selection.selectAll('.preset-icon-fill')
             .data([0]);
@@ -34775,32 +34857,39 @@ iD.ui.PresetIcon = function() {
         $fill.enter().append('div');
 
         $fill.attr('class', function() {
         $fill.enter().append('div');
 
         $fill.attr('class', function() {
-            var s = 'preset-icon-fill preset-icon-fill-' + geom;
-            for (var i in p.tags) {
-                s += ' tag-' + i + ' tag-' + i + '-' + p.tags[i];
-            }
-            return s;
+            return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
+        });
+
+        var $frame = selection.selectAll('.preset-icon-frame')
+            .data([0]);
+
+        $frame.enter()
+            .append('div')
+            .call(iD.svg.Icon('#preset-icon-frame'));
+
+        $frame.attr('class', function() {
+            return 'preset-icon-frame ' + (geom === 'area' ? '' : 'hide');
         });
 
         });
 
+
         var $icon = selection.selectAll('.preset-icon')
             .data([0]);
 
         var $icon = selection.selectAll('.preset-icon')
             .data([0]);
 
-        $icon.enter().append('div');
+        $icon.enter()
+            .append('div')
+            .attr('class', 'preset-icon')
+            .call(iD.svg.Icon(''));
 
 
-        $icon.attr('class', function() {
-            var icon = p.icon || (geom === 'line' ? 'other-line' : 'marker-stroked'),
-                klass = 'feature-' + icon + ' preset-icon';
+        $icon
+            .attr('class', 'preset-icon preset-icon-' + (maki ? '32' : '60'));
 
 
-            var featureicon = iD.data.featureIcons[icon];
-            if (featureicon && featureicon[geom]) {
-                klass += ' preset-icon-' + geom;
-            } else if (icon === 'multipolygon') {
-                // Special case (geometry === 'area')
-                klass += ' preset-icon-relation';
-            }
+        $icon.selectAll('svg')
+            .attr('class', function() {
+                return 'icon ' + icon + tag_classes(p);
+            });
 
 
-            return klass;
-        });
+        $icon.selectAll('use')       // workaround: maki parking-24 broken?
+            .attr('href', '#' + icon + (maki ? ( icon === 'parking' ? '-18' : '-24') : ''));
     }
 
     presetIcon.preset = function(_) {
     }
 
     presetIcon.preset = function(_) {
@@ -34840,15 +34929,14 @@ iD.ui.PresetList = function(context) {
                 .attr('class', 'preset-choose')
                 .on('click', function() { event.choose(currentPreset); })
                 .append('span')
                 .attr('class', 'preset-choose')
                 .on('click', function() { event.choose(currentPreset); })
                 .append('span')
-                .attr('class', 'icon forward');
+                .html('&#9658;');
         } else {
             messagewrap.append('button')
                 .attr('class', 'close')
                 .on('click', function() {
                     context.enter(iD.modes.Browse(context));
                 })
         } else {
             messagewrap.append('button')
                 .attr('class', 'close')
                 .on('click', function() {
                     context.enter(iD.modes.Browse(context));
                 })
-                .append('span')
-                .attr('class', 'icon close');
+                .call(iD.svg.Icon('#icon-close'));
         }
 
         function keydown() {
         }
 
         function keydown() {
@@ -34905,8 +34993,8 @@ iD.ui.PresetList = function(context) {
             .on('keypress', keypress)
             .on('input', inputevent);
 
             .on('keypress', keypress)
             .on('input', inputevent);
 
-        searchWrap.append('span')
-            .attr('class', 'icon search');
+        searchWrap
+            .call(iD.svg.Icon('#icon-search', 'pre-text'));
 
         if (autofocus) {
             search.node().focus();
 
         if (autofocus) {
             search.node().focus();
@@ -35102,25 +35190,28 @@ iD.ui.RadialMenu = function(context, operations) {
 
         var button = menu.selectAll()
             .data(operations)
 
         var button = menu.selectAll()
             .data(operations)
-            .enter().append('g')
+            .enter()
+            .append('g')
+            .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
+            .classed('disabled', function(d) { return d.disabled(); })
             .attr('transform', function(d, i) {
             .attr('transform', function(d, i) {
-                return 'translate(' + r * Math.sin(a0 + i * a) + ',' +
-                                      r * Math.cos(a0 + i * a) + ')';
+                return 'translate(' + iD.geo.roundCoords([
+                        r * Math.sin(a0 + i * a),
+                        r * Math.cos(a0 + i * a)]).join(',') + ')';
             });
 
         button.append('circle')
             });
 
         button.append('circle')
-            .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
             .attr('r', 15)
             .attr('r', 15)
-            .classed('disabled', function(d) { return d.disabled(); })
             .on('click', click)
             .on('mousedown', mousedown)
             .on('mouseover', mouseover)
             .on('mouseout', mouseout);
 
         button.append('use')
             .on('click', click)
             .on('mousedown', mousedown)
             .on('mouseover', mouseover)
             .on('mouseout', mouseout);
 
         button.append('use')
-            .attr('transform', 'translate(-10, -10)')
-            .attr('clip-path', 'url(#clip-square-20)')
-            .attr('xlink:href', function(d) { return '#icon-operation-' + (d.disabled() ? 'disabled-' : '') + d.id; });
+            .attr('transform', 'translate(-10,-10)')
+            .attr('width', '20')
+            .attr('height', '20')
+            .attr('xlink:href', function(d) { return '#operation-' + d.id; });
 
         tooltip = d3.select(document.body)
             .append('div')
 
         tooltip = d3.select(document.body)
             .append('div')
@@ -35291,8 +35382,7 @@ iD.ui.RawMemberEditor = function(context) {
                 .attr('tabindex', -1)
                 .attr('class', 'remove button-input-action member-delete minor')
                 .on('click', deleteMember)
                 .attr('tabindex', -1)
                 .attr('class', 'remove button-input-action member-delete minor')
                 .on('click', deleteMember)
-                .append('span')
-                .attr('class', 'icon delete');
+                .call(iD.svg.Icon('#operation-delete'));
 
             $items.exit()
                 .remove();
 
             $items.exit()
                 .remove();
@@ -35444,8 +35534,7 @@ iD.ui.RawMembershipEditor = function(context) {
                 .attr('tabindex', -1)
                 .attr('class', 'remove button-input-action member-delete minor')
                 .on('click', deleteMembership)
                 .attr('tabindex', -1)
                 .attr('class', 'remove button-input-action member-delete minor')
                 .on('click', deleteMembership)
-                .append('span')
-                .attr('class', 'icon delete');
+                .call(iD.svg.Icon('#operation-delete'));
 
             $items.exit()
                 .remove();
 
             $items.exit()
                 .remove();
@@ -35480,8 +35569,7 @@ iD.ui.RawMembershipEditor = function(context) {
                     .attr('tabindex', -1)
                     .attr('class', 'remove button-input-action member-delete minor')
                     .on('click', deleteMembership)
                     .attr('tabindex', -1)
                     .attr('class', 'remove button-input-action member-delete minor')
                     .on('click', deleteMembership)
-                    .append('span')
-                    .attr('class', 'icon delete');
+                    .call(iD.svg.Icon('#operation-delete'));
 
             } else {
                 $list.selectAll('.member-row-new')
 
             } else {
                 $list.selectAll('.member-row-new')
@@ -35491,10 +35579,10 @@ iD.ui.RawMembershipEditor = function(context) {
             var $add = $wrap.selectAll('.add-relation')
                 .data([0]);
 
             var $add = $wrap.selectAll('.add-relation')
                 .data([0]);
 
-            $add.enter().append('button')
+            $add.enter()
+                .append('button')
                 .attr('class', 'add-relation')
                 .attr('class', 'add-relation')
-                .append('span')
-                .attr('class', 'icon plus light');
+                .call(iD.svg.Icon('#icon-plus', 'light'));
 
             $wrap.selectAll('.add-relation')
                 .on('click', function() {
 
             $wrap.selectAll('.add-relation')
                 .on('click', function() {
@@ -35555,11 +35643,10 @@ iD.ui.RawTagEditor = function(context) {
         var $newTag = $wrap.selectAll('.add-tag')
             .data([0]);
 
         var $newTag = $wrap.selectAll('.add-tag')
             .data([0]);
 
-        var $enter = $newTag.enter().append('button')
-            .attr('class', 'add-tag');
-
-        $enter.append('span')
-            .attr('class', 'icon plus light');
+        $newTag.enter()
+            .append('button')
+            .attr('class', 'add-tag')
+            .call(iD.svg.Icon('#icon-plus', 'light'));
 
         $newTag.on('click', addTag);
 
 
         $newTag.on('click', addTag);
 
@@ -35568,7 +35655,7 @@ iD.ui.RawTagEditor = function(context) {
 
         // Enter
 
 
         // Enter
 
-        $enter = $items.enter().append('li')
+        var $enter = $items.enter().append('li')
             .attr('class', 'tag-row cf');
 
         $enter.append('div')
             .attr('class', 'tag-row cf');
 
         $enter.append('div')
@@ -35588,8 +35675,7 @@ iD.ui.RawTagEditor = function(context) {
         $enter.append('button')
             .attr('tabindex', -1)
             .attr('class', 'remove minor')
         $enter.append('button')
             .attr('tabindex', -1)
             .attr('class', 'remove minor')
-            .append('span')
-            .attr('class', 'icon delete');
+            .call(iD.svg.Icon('#operation-delete'));
 
         if (context.taginfo()) {
             $enter.each(bindTypeahead);
 
         if (context.taginfo()) {
             $enter.each(bindTypeahead);
@@ -35600,7 +35686,12 @@ iD.ui.RawTagEditor = function(context) {
         $items.order();
 
         $items.each(function(tag) {
         $items.order();
 
         $items.each(function(tag) {
-            var reference = iD.ui.TagReference({key: tag.key, value: tag.value}, context);
+            var isRelation = (context.entity(id).type === 'relation'),
+                reference;
+            if (isRelation && tag.key === 'type')
+                reference = iD.ui.TagReference({rtype: tag.value}, context);
+            else
+                reference = iD.ui.TagReference({key: tag.key, value: tag.value}, context);
 
             if (state === 'hover') {
                 reference.showing(false);
 
             if (state === 'hover') {
                 reference.showing(false);
@@ -35980,12 +36071,9 @@ iD.ui.SelectionList = function(context, selectedIDs) {
                 .on('click', selectEntity);
 
             // Enter
                 .on('click', selectEntity);
 
             // Enter
-
             var label = enter.append('div')
             var label = enter.append('div')
-                .attr('class', 'label');
-
-            label.append('span')
-                .attr('class', 'icon icon-pre-text');
+                .attr('class', 'label')
+                .call(iD.svg.Icon('', 'pre-text'));
 
             label.append('span')
                 .attr('class', 'entity-type');
 
             label.append('span')
                 .attr('class', 'entity-type');
@@ -35994,9 +36082,11 @@ iD.ui.SelectionList = function(context, selectedIDs) {
                 .attr('class', 'entity-name');
 
             // Update
                 .attr('class', 'entity-name');
 
             // Update
-
-            items.selectAll('.icon')
-                .attr('class', function(entity) { return context.geometry(entity.id) + ' icon icon-pre-text'; });
+            items.selectAll('use')
+                .attr('href', function() {
+                    var entity = this.parentElement.parentElement.__data__;
+                    return '#icon-' + context.geometry(entity.id);
+                });
 
             items.selectAll('.entity-type')
                 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
 
             items.selectAll('.entity-type')
                 .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
@@ -36005,7 +36095,6 @@ iD.ui.SelectionList = function(context, selectedIDs) {
                 .text(function(entity) { return iD.util.displayName(entity); });
 
             // Exit
                 .text(function(entity) { return iD.util.displayName(entity); });
 
             // Exit
-
             items.exit()
                 .remove();
         }
             items.exit()
                 .remove();
         }
@@ -36251,8 +36340,7 @@ iD.ui.Success = function(context) {
         header.append('button')
             .attr('class', 'fr')
             .on('click', function() { dispatch.cancel(); })
         header.append('button')
             .attr('class', 'fr')
             .on('click', function() { dispatch.cancel(); })
-            .append('span')
-            .attr('class', 'icon close');
+            .call(iD.svg.Icon('#icon-close'));
 
         header.append('h3')
             .text(t('success.just_edited'));
 
         header.append('h3')
             .text(t('success.just_edited'));
@@ -36279,13 +36367,15 @@ iD.ui.Success = function(context) {
 
         body.selectAll('.button.social')
             .data(d3.entries(sharing))
 
         body.selectAll('.button.social')
             .data(d3.entries(sharing))
-            .enter().append('a')
-            .attr('class', function(d) { return 'button social col4 ' + d.key; })
+            .enter()
+            .append('a')
+            .attr('class', 'button social col4')
             .attr('target', '_blank')
             .attr('href', function(d) { return d.value; })
             .call(bootstrap.tooltip()
                 .title(function(d) { return t('success.' + d.key); })
             .attr('target', '_blank')
             .attr('href', function(d) { return d.value; })
             .call(bootstrap.tooltip()
                 .title(function(d) { return t('success.' + d.key); })
-                .placement('bottom'));
+                .placement('bottom'))
+            .each(function(d) { d3.select(this).call(iD.svg.Icon('#logo-' + d.key, 'social')); });
     }
 
     success.changeset = function(_) {
     }
 
     success.changeset = function(_) {
@@ -36361,15 +36451,12 @@ iD.ui.TagReference = function(tag, context) {
                 .append('p')
                 .text(docs.description);
 
                 .append('p')
                 .text(docs.description);
 
-            var wikiLink = body
+            body
                 .append('a')
                 .attr('target', '_blank')
                 .append('a')
                 .attr('target', '_blank')
-                .attr('href', 'http://wiki.openstreetmap.org/wiki/' + docs.title);
-
-            wikiLink.append('span')
-                .attr('class','icon icon-pre-text out-link');
-
-            wikiLink.append('span')
+                .attr('href', 'http://wiki.openstreetmap.org/wiki/' + docs.title)
+                .call(iD.svg.Icon('#icon-out-link', 'inline'))
+                .append('span')
                 .text(t('inspector.reference'));
 
             return true;
                 .text(t('inspector.reference'));
 
             return true;
@@ -36403,12 +36490,11 @@ iD.ui.TagReference = function(tag, context) {
         button = selection.selectAll('.tag-reference-button')
             .data([0]);
 
         button = selection.selectAll('.tag-reference-button')
             .data([0]);
 
-        var enter = button.enter().append('button')
+        button.enter()
+            .append('button')
+            .attr('class', 'tag-reference-button')
             .attr('tabindex', -1)
             .attr('tabindex', -1)
-            .attr('class', 'tag-reference-button');
-
-        enter.append('span')
-            .attr('class', 'icon inspect');
+            .call(iD.svg.Icon('#icon-inspect'));
 
         button.on('click', function () {
             d3.event.stopPropagation();
 
         button.on('click', function () {
             d3.event.stopPropagation();
@@ -36446,7 +36532,8 @@ iD.ui.TagReference = function(tag, context) {
     };
 
     return tagReference;
     };
 
     return tagReference;
-};// toggles the visibility of ui elements, using a combination of the
+};
+// toggles the visibility of ui elements, using a combination of the
 // hide class, which sets display=none, and a d3 transition for opacity.
 // this will cause blinking when called repeatedly, so check that the
 // value actually changes between calls.
 // hide class, which sets display=none, and a d3 transition for opacity.
 // this will cause blinking when called repeatedly, so check that the
 // value actually changes between calls.
@@ -36497,8 +36584,10 @@ iD.ui.UndoRedo = function(context) {
             .on('click', function(d) { return d.action(); })
             .call(tooltip);
 
             .on('click', function(d) { return d.action(); })
             .call(tooltip);
 
-        buttons.append('span')
-            .attr('class', function(d) { return 'icon ' + d.id; });
+        buttons.each(function(d) {
+            d3.select(this)
+                .call(iD.svg.Icon('#icon-' + d.id));
+        });
 
         var keybinding = d3.keybinding('undo')
             .on(commands[0].cmd, function() { d3.event.preventDefault(); commands[0].action(); })
 
         var keybinding = d3.keybinding('undo')
             .on(commands[0].cmd, function() { d3.event.preventDefault(); commands[0].action(); })
@@ -36537,17 +36626,16 @@ iD.ui.ViewOnOSM = function(context) {
         var $link = selection.selectAll('.view-on-osm')
             .data([0]);
 
         var $link = selection.selectAll('.view-on-osm')
             .data([0]);
 
-        var $enter = $link.enter().append('a')
+        $link.enter()
+            .append('a')
             .attr('class', 'view-on-osm')
             .attr('class', 'view-on-osm')
-            .attr('target', '_blank');
-
-        $enter.append('span')
-            .attr('class', 'icon icon-pre-text out-link');
-
-        $enter.append('span')
+            .attr('target', '_blank')
+            .call(iD.svg.Icon('#icon-out-link', 'inline'))
+            .append('span')
             .text(t('inspector.view_on_osm'));
 
             .text(t('inspector.view_on_osm'));
 
-        $link.attr('href', context.connection().entityURL(entity));
+        $link
+            .attr('href', context.connection().entityURL(entity));
     }
 
     viewOnOSM.entityID = function(_) {
     }
 
     viewOnOSM.entityID = function(_) {
@@ -36561,11 +36649,13 @@ iD.ui.ViewOnOSM = function(context) {
 iD.ui.Zoom = function(context) {
     var zooms = [{
         id: 'zoom-in',
 iD.ui.Zoom = function(context) {
     var zooms = [{
         id: 'zoom-in',
+        icon: 'plus',
         title: t('zoom.in'),
         action: context.zoomIn,
         key: '+'
     }, {
         id: 'zoom-out',
         title: t('zoom.in'),
         action: context.zoomIn,
         key: '+'
     }, {
         id: 'zoom-out',
+        icon: 'minus',
         title: t('zoom.out'),
         action: context.zoomOut,
         key: '-'
         title: t('zoom.out'),
         action: context.zoomOut,
         key: '-'
@@ -36606,8 +36696,10 @@ iD.ui.Zoom = function(context) {
                     return iD.ui.tooltipHtml(d.title, d.key);
                 }));
 
                     return iD.ui.tooltipHtml(d.title, d.key);
                 }));
 
-        button.append('span')
-            .attr('class', function(d) { return d.id + ' icon'; });
+        button.each(function(d) {
+            d3.select(this)
+                .call(iD.svg.Icon('#icon-' + d.icon, 'light'));
+        });
 
         var keybinding = d3.keybinding('zoom');
 
 
         var keybinding = d3.keybinding('zoom');
 
@@ -37410,13 +37502,13 @@ iD.ui.preset.localized = function(field, context) {
         var translateButton = selection.selectAll('.localized-add')
             .data([0]);
 
         var translateButton = selection.selectAll('.localized-add')
             .data([0]);
 
-        translateButton.enter().append('button')
+        translateButton.enter()
+            .append('button')
             .attr('class', 'button-input-action localized-add minor')
             .attr('class', 'button-input-action localized-add minor')
+            .call(iD.svg.Icon('#icon-plus'))
             .call(bootstrap.tooltip()
                 .title(t('translate.translate'))
             .call(bootstrap.tooltip()
                 .title(t('translate.translate'))
-                .placement('left'))
-            .append('span')
-            .attr('class', 'icon plus');
+                .placement('left'));
 
         translateButton
             .on('click', addBlank);
 
         translateButton
             .on('click', addBlank);
@@ -37522,7 +37614,7 @@ iD.ui.preset.localized = function(field, context) {
                             .style('max-height','0px')
                             .remove();
                     })
                             .style('max-height','0px')
                             .remove();
                     })
-                    .append('span').attr('class', 'icon delete');
+                    .call(iD.svg.Icon('#operation-delete'));
 
                 wrap.append('input')
                     .attr('class', 'localized-lang')
 
                 wrap.append('input')
                     .attr('class', 'localized-lang')
@@ -37590,11 +37682,11 @@ iD.ui.preset.localized = function(field, context) {
 
         input.value(tags[field.key] || '');
 
 
         input.value(tags[field.key] || '');
 
-        var postfixed = [];
-        for (var i in tags) {
-            var m = i.match(new RegExp(field.key + ':([a-zA-Z_-]+)$'));
-            if (m && m[1]) {
-                postfixed.push({ lang: m[1], value: tags[i]});
+        var postfixed = [], k, m;
+        for (k in tags) {
+            m = k.match(/^(.*):([a-zA-Z_-]+)$/);
+            if (m && m[1] === field.key && m[2]) {
+                postfixed.push({ lang: m[2], value: tags[k] });
             }
         }
 
             }
         }
 
@@ -37843,7 +37935,7 @@ iD.ui.preset.restrictions = function(field, context) {
 
         surface
             .call(vertices, graph, [vertex], filter, extent, z)
 
         surface
             .call(vertices, graph, [vertex], filter, extent, z)
-            .call(lines, graph, intersection.highways, filter)
+            .call(lines, graph, intersection.ways, filter)
             .call(turns, graph, intersection.turns(fromNodeID));
 
         surface
             .call(turns, graph, intersection.turns(fromNodeID));
 
         surface
@@ -37857,7 +37949,7 @@ iD.ui.preset.restrictions = function(field, context) {
 
         if (fromNodeID) {
             surface
 
         if (fromNodeID) {
             surface
-                .selectAll('.' + _.find(intersection.highways, function(way) { return way.contains(fromNodeID); }).id)
+                .selectAll('.' + intersection.highways[fromNodeID].id)
                 .classed('selected', true);
         }
 
                 .classed('selected', true);
         }
 
@@ -37872,7 +37964,7 @@ iD.ui.preset.restrictions = function(field, context) {
         function click() {
             var datum = d3.event.target.__data__;
             if (datum instanceof iD.Entity) {
         function click() {
             var datum = d3.event.target.__data__;
             if (datum instanceof iD.Entity) {
-                fromNodeID = datum.nodes[(datum.first() === vertexID) ? 1 : datum.nodes.length - 2];
+                fromNodeID = intersection.adjacentNodeId(datum.id);
                 render();
             } else if (datum instanceof iD.geo.Turn) {
                 if (datum.restriction) {
                 render();
             } else if (datum instanceof iD.geo.Turn) {
                 if (datum.restriction) {
@@ -38039,17 +38131,19 @@ iD.ui.preset.wikipedia = function(field, context) {
         link.enter().append('a')
             .attr('class', 'wiki-link button-input-action minor')
             .attr('target', '_blank')
         link.enter().append('a')
             .attr('class', 'wiki-link button-input-action minor')
             .attr('target', '_blank')
-            .append('span')
-            .attr('class', 'icon out-link');
+            .call(iD.svg.Icon('#icon-out-link', 'inline'));
     }
 
     function language() {
         var value = lang.value().toLowerCase();
     }
 
     function language() {
         var value = lang.value().toLowerCase();
+        var locale = iD.detect().locale.toLowerCase();
+        var localeLanguage;
         return _.find(iD.data.wikipedia, function(d) {
         return _.find(iD.data.wikipedia, function(d) {
+            if (d[2] === locale) localeLanguage = d;
             return d[0].toLowerCase() === value ||
                 d[1].toLowerCase() === value ||
             return d[0].toLowerCase() === value ||
                 d[1].toLowerCase() === value ||
-                d[2].toLowerCase() === value;
-        }) || iD.data.wikipedia[0];
+                d[2] === value;
+        }) || localeLanguage || ['English', 'English', 'en'];
     }
 
     function changeLang() {
     }
 
     function changeLang() {
@@ -38849,6 +38943,11 @@ iD.presets.Collection = function(collection) {
                     return a.suggestion === true;
                 });
 
                     return a.suggestion === true;
                 });
 
+            function leading(a) {
+                var index = a.indexOf(value);
+                return index === 0 || a[index - 1] === ' ';
+            }
+
             // matches value to preset.name
             var leading_name = _.filter(searchable, function(a) {
                     return leading(a.name().toLowerCase());
             // matches value to preset.name
             var leading_name = _.filter(searchable, function(a) {
                     return leading(a.name().toLowerCase());
@@ -38868,10 +38967,6 @@ iD.presets.Collection = function(collection) {
                     return _.any(_.without(_.values(a.tags || {}), '*'), leading);
                 });
 
                     return _.any(_.without(_.values(a.tags || {}), '*'), leading);
                 });
 
-            function leading(a) {
-                var index = a.indexOf(value);
-                return index === 0 || a[index - 1] === ' ';
-            }
 
             // finds close matches to value in preset.name
             var levenstein_name = searchable.map(function(a) {
 
             // finds close matches to value in preset.name
             var levenstein_name = searchable.map(function(a) {
@@ -39016,7 +39111,7 @@ iD.presets.Preset = function(id, preset, fields) {
     };
 
     preset.terms = function() {
     };
 
     preset.terms = function() {
-        return preset.t('terms', {'default': ''}).toLowerCase().split(/\s*,+\s*/);
+        return preset.t('terms', {'default': ''}).toLowerCase().trim().split(/\s*,+\s*/);
     };
 
     preset.isFallback = function() {
     };
 
     preset.isFallback = function() {
@@ -39385,464 +39480,445 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
         "yh:STRUCTURE",
         "yh:TOTYUMONO",
         "yh:TYPE",
         "yh:STRUCTURE",
         "yh:TOTYUMONO",
         "yh:TYPE",
+        "yh:WIDTH",
         "yh:WIDTH_RANK",
         "SK53_bulk:load"
     ],
     "wikipedia": [
         [
         "yh:WIDTH_RANK",
         "SK53_bulk:load"
     ],
     "wikipedia": [
         [
-            "English",
-            "English",
-            "en"
-        ],
-        [
-            "German",
-            "Deutsch",
-            "de"
-        ],
-        [
-            "Dutch",
-            "Nederlands",
-            "nl"
-        ],
-        [
-            "French",
-            "Français",
-            "fr"
-        ],
-        [
-            "Italian",
-            "Italiano",
-            "it"
+            "Abkhazian",
+            "Аҧсшәа",
+            "ab"
         ],
         [
         ],
         [
-            "Russian",
-            "Русский",
-            "ru"
+            "Achinese",
+            "Acèh",
+            "ace"
         ],
         [
         ],
         [
-            "Spanish",
-            "Español",
-            "es"
+            "Afrikaans",
+            "Afrikaans",
+            "af"
         ],
         [
         ],
         [
-            "Polish",
-            "Polski",
-            "pl"
+            "Akan",
+            "Akan",
+            "ak"
         ],
         [
         ],
         [
-            "Swedish",
-            "Svenska",
-            "sv"
+            "Alemannisch",
+            "Alemannisch",
+            "als"
         ],
         [
         ],
         [
-            "Japanese",
-            "日本語",
-            "ja"
+            "Amharic",
+            "አማርኛ",
+            "am"
         ],
         [
         ],
         [
-            "Portuguese",
-            "Português",
-            "pt"
+            "Aragonese",
+            "aragonés",
+            "an"
         ],
         [
         ],
         [
-            "Chinese",
-            "中文",
-            "zh"
+            "Old English",
+            "Ænglisc",
+            "ang"
         ],
         [
         ],
         [
-            "Vietnamese",
-            "Tiếng Việt",
-            "vi"
+            "Arabic",
+            "العربية",
+            "ar"
         ],
         [
         ],
         [
-            "Ukrainian",
-            "Українська",
-            "uk"
+            "Aramaic",
+            "ܐܪܡܝܐ",
+            "arc"
         ],
         [
         ],
         [
-            "Catalan",
-            "Català",
-            "ca"
+            "Egyptian Arabic",
+            "مصرى",
+            "arz"
         ],
         [
         ],
         [
-            "Norwegian (Bokmål)",
-            "Norsk (Bokmål)",
-            "no"
+            "Assamese",
+            "অসমীয়া",
+            "as"
         ],
         [
         ],
         [
-            "Waray-Waray",
-            "Winaray",
-            "war"
+            "Asturian",
+            "asturianu",
+            "ast"
         ],
         [
         ],
         [
-            "Cebuano",
-            "Sinugboanong Binisaya",
-            "ceb"
+            "Avaric",
+            "авар",
+            "av"
         ],
         [
         ],
         [
-            "Finnish",
-            "Suomi",
-            "fi"
+            "Aymara",
+            "Aymar aru",
+            "ay"
         ],
         [
         ],
         [
-            "Persian",
-            "فارسی",
-            "fa"
+            "Azerbaijani",
+            "azərbaycanca",
+            "az"
         ],
         [
         ],
         [
-            "Czech",
-            "Čeština",
-            "cs"
+            "South Azerbaijani",
+            "تۆرکجه",
+            "azb"
         ],
         [
         ],
         [
-            "Hungarian",
-            "Magyar",
-            "hu"
+            "Bashkir",
+            "башҡортса",
+            "ba"
         ],
         [
         ],
         [
-            "Korean",
-            "한국어",
-            "ko"
+            "Bavarian",
+            "Boarisch",
+            "bar"
         ],
         [
         ],
         [
-            "Romanian",
-            "Română",
-            "ro"
+            "Samogitian",
+            "žemaitėška",
+            "bat-smg"
         ],
         [
         ],
         [
-            "Arabic",
-            "العربية",
-            "ar"
+            "Bikol Central",
+            "Bikol Central",
+            "bcl"
         ],
         [
         ],
         [
-            "Turkish",
-            "Türkçe",
-            "tr"
+            "Belarusian",
+            "беларуская",
+            "be"
         ],
         [
         ],
         [
-            "Indonesian",
-            "Bahasa Indonesia",
-            "id"
+            "беларуская (тарашкевіца)‎",
+            "беларуская (тарашкевіца)‎",
+            "be-x-old"
         ],
         [
         ],
         [
-            "Kazakh",
-            "Қазақша",
-            "kk"
+            "Bulgarian",
+            "български",
+            "bg"
         ],
         [
         ],
         [
-            "Malay",
-            "Bahasa Melayu",
-            "ms"
+            "भोजपुरी",
+            "भोजपुरी",
+            "bh"
         ],
         [
         ],
         [
-            "Serbian",
-            "Српски / Srpski",
-            "sr"
+            "Bislama",
+            "Bislama",
+            "bi"
         ],
         [
         ],
         [
-            "Slovak",
-            "Slovenčina",
-            "sk"
+            "Banjar",
+            "Bahasa Banjar",
+            "bjn"
         ],
         [
         ],
         [
-            "Esperanto",
-            "Esperanto",
-            "eo"
+            "Bambara",
+            "bamanankan",
+            "bm"
         ],
         [
         ],
         [
-            "Danish",
-            "Dansk",
-            "da"
+            "Bengali",
+            "বাংলা",
+            "bn"
         ],
         [
         ],
         [
-            "Lithuanian",
-            "Lietuvių",
-            "lt"
+            "Tibetan",
+            "བོད་ཡིག",
+            "bo"
         ],
         [
         ],
         [
-            "Basque",
-            "Euskara",
-            "eu"
+            "Bishnupriya",
+            "বিষ্ণুপ্রিয়া মণিপুরী",
+            "bpy"
         ],
         [
         ],
         [
-            "Bulgarian",
-            "Български",
-            "bg"
+            "Breton",
+            "brezhoneg",
+            "br"
         ],
         [
         ],
         [
-            "Hebrew",
-            "עברית",
-            "he"
+            "Bosnian",
+            "bosanski",
+            "bs"
         ],
         [
         ],
         [
-            "Slovenian",
-            "Slovenščina",
-            "sl"
+            "Buginese",
+            "ᨅᨔ ᨕᨘᨁᨗ",
+            "bug"
         ],
         [
         ],
         [
-            "Croatian",
-            "Hrvatski",
-            "hr"
+            "буряад",
+            "буряад",
+            "bxr"
         ],
         [
         ],
         [
-            "Volapük",
-            "Volapük",
-            "vo"
+            "Catalan",
+            "català",
+            "ca"
         ],
         [
         ],
         [
-            "Estonian",
-            "Eesti",
-            "et"
+            "Chavacano de Zamboanga",
+            "Chavacano de Zamboanga",
+            "cbk-zam"
         ],
         [
         ],
         [
-            "Hindi",
-            "हिन्दी",
-            "hi"
+            "Min Dong Chinese",
+            "Mìng-dĕ̤ng-ngṳ̄",
+            "cdo"
         ],
         [
         ],
         [
-            "Uzbek",
-            "O‘zbek",
-            "uz"
+            "Chechen",
+            "нохчийн",
+            "ce"
         ],
         [
         ],
         [
-            "Galician",
-            "Galego",
-            "gl"
+            "Cebuano",
+            "Cebuano",
+            "ceb"
         ],
         [
         ],
         [
-            "Norwegian (Nynorsk)",
-            "Nynorsk",
-            "nn"
+            "Chamorro",
+            "Chamoru",
+            "ch"
         ],
         [
         ],
         [
-            "Simple English",
-            "Simple English",
-            "simple"
+            "Cherokee",
+            "ᏣᎳᎩ",
+            "chr"
         ],
         [
         ],
         [
-            "Azerbaijani",
-            "Azərbaycanca",
-            "az"
+            "Cheyenne",
+            "Tsetsêhestâhese",
+            "chy"
         ],
         [
         ],
         [
-            "Latin",
-            "Latina",
-            "la"
+            "Central Kurdish",
+            "کوردیی ناوەندی",
+            "ckb"
         ],
         [
         ],
         [
-            "Greek",
-            "Ελληνικά",
-            "el"
+            "Corsican",
+            "corsu",
+            "co"
         ],
         [
         ],
         [
-            "Thai",
-            "ไทย",
-            "th"
+            "Cree",
+            "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
+            "cr"
         ],
         [
         ],
         [
-            "Serbo-Croatian",
-            "Srpskohrvatski / Српскохрватски",
-            "sh"
+            "Crimean Turkish",
+            "qırımtatarca",
+            "crh"
         ],
         [
         ],
         [
-            "Georgian",
-            "ქართული",
-            "ka"
+            "Czech",
+            "čeština",
+            "cs"
         ],
         [
         ],
         [
-            "Occitan",
-            "Occitan",
-            "oc"
+            "Kashubian",
+            "kaszëbsczi",
+            "csb"
         ],
         [
         ],
         [
-            "Macedonian",
-            "Македонски",
-            "mk"
+            "Church Slavic",
+            "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
+            "cu"
         ],
         [
         ],
         [
-            "Newar / Nepal Bhasa",
-            "नेपाल भाषा",
-            "new"
+            "Chuvash",
+            "Чӑвашла",
+            "cv"
         ],
         [
         ],
         [
-            "Tagalog",
-            "Tagalog",
-            "tl"
+            "Welsh",
+            "Cymraeg",
+            "cy"
         ],
         [
         ],
         [
-            "Piedmontese",
-            "Piemontèis",
-            "pms"
+            "Danish",
+            "dansk",
+            "da"
         ],
         [
         ],
         [
-            "Belarusian",
-            "Беларуская",
-            "be"
+            "German",
+            "Deutsch",
+            "de"
         ],
         [
         ],
         [
-            "Haitian",
-            "Krèyol ayisyen",
-            "ht"
+            "Zazaki",
+            "Zazaki",
+            "diq"
         ],
         [
         ],
         [
-            "Tamil",
-            "தமிழ்",
-            "ta"
+            "Lower Sorbian",
+            "dolnoserbski",
+            "dsb"
         ],
         [
         ],
         [
-            "Telugu",
-            "తెలుగు",
-            "te"
+            "Divehi",
+            "ދިވެހިބަސް",
+            "dv"
         ],
         [
         ],
         [
-            "Belarusian (Taraškievica)",
-            "Беларуская (тарашкевіца)",
-            "be-x-old"
+            "Dzongkha",
+            "ཇོང་ཁ",
+            "dz"
         ],
         [
         ],
         [
-            "Latvian",
-            "Latviešu",
-            "lv"
+            "Ewe",
+            "eʋegbe",
+            "ee"
         ],
         [
         ],
         [
-            "Breton",
-            "Brezhoneg",
-            "br"
+            "Greek",
+            "Ελληνικά",
+            "el"
         ],
         [
         ],
         [
-            "Malagasy",
-            "Malagasy",
-            "mg"
+            "Emiliano-Romagnolo",
+            "emiliàn e rumagnòl",
+            "eml"
         ],
         [
         ],
         [
-            "Albanian",
-            "Shqip",
-            "sq"
+            "English",
+            "English",
+            "en"
         ],
         [
         ],
         [
-            "Armenian",
-            "Հայերեն",
-            "hy"
+            "Esperanto",
+            "Esperanto",
+            "eo"
         ],
         [
         ],
         [
-            "Tatar",
-            "Tatarça / Татарча",
-            "tt"
+            "Spanish",
+            "español",
+            "es"
         ],
         [
         ],
         [
-            "Javanese",
-            "Basa Jawa",
-            "jv"
+            "Estonian",
+            "eesti",
+            "et"
         ],
         [
         ],
         [
-            "Welsh",
-            "Cymraeg",
-            "cy"
+            "Basque",
+            "euskara",
+            "eu"
         ],
         [
         ],
         [
-            "Marathi",
-            "मराठी",
-            "mr"
+            "Extremaduran",
+            "estremeñu",
+            "ext"
         ],
         [
         ],
         [
-            "Luxembourgish",
-            "Lëtzebuergesch",
-            "lb"
+            "Persian",
+            "فارسی",
+            "fa"
         ],
         [
         ],
         [
-            "Icelandic",
-            "Íslenska",
-            "is"
+            "Fulah",
+            "Fulfulde",
+            "ff"
         ],
         [
         ],
         [
-            "Bosnian",
-            "Bosanski",
-            "bs"
+            "Finnish",
+            "suomi",
+            "fi"
         ],
         [
         ],
         [
-            "Burmese",
-            "မြန်မာဘာသာ",
-            "my"
+            "Võro",
+            "Võro",
+            "fiu-vro"
         ],
         [
         ],
         [
-            "Yoruba",
-            "Yorùbá",
-            "yo"
+            "Fijian",
+            "Na Vosa Vakaviti",
+            "fj"
         ],
         [
         ],
         [
-            "Bashkir",
-            "Башҡорт",
-            "ba"
+            "Faroese",
+            "føroyskt",
+            "fo"
         ],
         [
         ],
         [
-            "Malayalam",
-            "മലയാളം",
-            "ml"
+            "French",
+            "français",
+            "fr"
         ],
         [
         ],
         [
-            "Aragonese",
-            "Aragonés",
-            "an"
+            "Arpitan",
+            "arpetan",
+            "frp"
         ],
         [
         ],
         [
-            "Lombard",
-            "Lumbaart",
-            "lmo"
+            "Northern Frisian",
+            "Nordfriisk",
+            "frr"
         ],
         [
         ],
         [
-            "Afrikaans",
-            "Afrikaans",
-            "af"
+            "Friulian",
+            "furlan",
+            "fur"
         ],
         [
         ],
         [
-            "West Frisian",
+            "Western Frisian",
             "Frysk",
             "fy"
         ],
         [
             "Frysk",
             "fy"
         ],
         [
-            "Western Panjabi",
-            "شاہ مکھی پنجابی (Shāhmukhī Pañjābī)",
-            "pnb"
+            "Irish",
+            "Gaeilge",
+            "ga"
         ],
         [
         ],
         [
-            "Bengali",
-            "বাংলা",
-            "bn"
+            "Gagauz",
+            "Gagauz",
+            "gag"
         ],
         [
         ],
         [
-            "Swahili",
-            "Kiswahili",
-            "sw"
+            "Gan Chinese",
+            "贛語",
+            "gan"
         ],
         [
         ],
         [
-            "Bishnupriya Manipuri",
-            "ইমার ঠার/বিষ্ণুপ্রিয়া মণিপুরী",
-            "bpy"
+            "Scottish Gaelic",
+            "Gàidhlig",
+            "gd"
         ],
         [
         ],
         [
-            "Ido",
-            "Ido",
-            "io"
+            "Galician",
+            "galego",
+            "gl"
         ],
         [
         ],
         [
-            "Kirghiz",
-            "Кыргызча",
-            "ky"
+            "Gilaki",
+            "گیلکی",
+            "glk"
         ],
         [
         ],
         [
-            "Urdu",
-            "اردو",
-            "ur"
+            "Guarani",
+            "Avañe'ẽ",
+            "gn"
         ],
         [
         ],
         [
-            "Nepali",
-            "नà¥\87पालà¥\80",
-            "ne"
+            "Goan Konkani",
+            "à¤\97à¥\8bवा à¤\95à¥\8bà¤\82à¤\95णà¥\80 / Gova Konknni",
+            "gom"
         ],
         [
         ],
         [
-            "Sicilian",
-            "Sicilianu",
-            "scn"
+            "Gothic",
+            "𐌲𐌿𐍄𐌹𐍃𐌺",
+            "got"
         ],
         [
             "Gujarati",
         ],
         [
             "Gujarati",
@@ -39850,439 +39926,439 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
             "gu"
         ],
         [
             "gu"
         ],
         [
-            "Cantonese",
-            "粵語",
-            "zh-yue"
+            "Manx",
+            "Gaelg",
+            "gv"
         ],
         [
         ],
         [
-            "Low Saxon",
-            "Plattdüütsch",
-            "nds"
+            "Hausa",
+            "Hausa",
+            "ha"
         ],
         [
         ],
         [
-            "Kurdish",
-            "Kurdî / كوردی",
-            "ku"
+            "Hakka Chinese",
+            "客家語/Hak-kâ-ngî",
+            "hak"
         ],
         [
         ],
         [
-            "Irish",
-            "Gaeilge",
-            "ga"
+            "Hawaiian",
+            "Hawai`i",
+            "haw"
         ],
         [
         ],
         [
-            "Asturian",
-            "Asturianu",
-            "ast"
+            "Hebrew",
+            "עברית",
+            "he"
         ],
         [
         ],
         [
-            "Quechua",
-            "Runa Simi",
-            "qu"
+            "Hindi",
+            "हिन्दी",
+            "hi"
         ],
         [
         ],
         [
-            "Sundanese",
-            "Basa Sunda",
-            "su"
+            "Fiji Hindi",
+            "Fiji Hindi",
+            "hif"
         ],
         [
         ],
         [
-            "Chuvash",
-            "Чăваш",
-            "cv"
+            "Croatian",
+            "hrvatski",
+            "hr"
         ],
         [
         ],
         [
-            "Scots",
-            "Scots",
-            "sco"
+            "Upper Sorbian",
+            "hornjoserbsce",
+            "hsb"
         ],
         [
         ],
         [
-            "Interlingua",
-            "Interlingua",
-            "ia"
+            "Haitian",
+            "Kreyòl ayisyen",
+            "ht"
         ],
         [
         ],
         [
-            "Alemannic",
-            "Alemannisch",
-            "als"
+            "Hungarian",
+            "magyar",
+            "hu"
         ],
         [
         ],
         [
-            "Buginese",
-            "Basa Ugi",
-            "bug"
+            "Armenian",
+            "Հայերեն",
+            "hy"
         ],
         [
         ],
         [
-            "Neapolitan",
-            "Nnapulitano",
-            "nap"
+            "Interlingua",
+            "interlingua",
+            "ia"
         ],
         [
         ],
         [
-            "Samogitian",
-            "Žemaitėška",
-            "bat-smg"
+            "Indonesian",
+            "Bahasa Indonesia",
+            "id"
         ],
         [
         ],
         [
-            "Kannada",
-            "ಕನ್ನಡ",
-            "kn"
+            "Interlingue",
+            "Interlingue",
+            "ie"
         ],
         [
         ],
         [
-            "Banyumasan",
-            "Basa Banyumasan",
-            "map-bms"
+            "Igbo",
+            "Igbo",
+            "ig"
         ],
         [
         ],
         [
-            "Walloon",
-            "Walon",
-            "wa"
+            "Inupiaq",
+            "Iñupiak",
+            "ik"
         ],
         [
         ],
         [
-            "Amharic",
-            "አማርኛ",
-            "am"
+            "Iloko",
+            "Ilokano",
+            "ilo"
         ],
         [
         ],
         [
-            "Sorani",
-            "Soranî / کوردی",
-            "ckb"
+            "Ido",
+            "Ido",
+            "io"
         ],
         [
         ],
         [
-            "Scottish Gaelic",
-            "Gàidhlig",
-            "gd"
+            "Icelandic",
+            "íslenska",
+            "is"
         ],
         [
         ],
         [
-            "Fiji Hindi",
-            "Fiji Hindi",
-            "hif"
+            "Italian",
+            "italiano",
+            "it"
         ],
         [
         ],
         [
-            "Min Nan",
-            "Bân-lâm-gú",
-            "zh-min-nan"
+            "Inuktitut",
+            "ᐃᓄᒃᑎᑐᑦ/inuktitut",
+            "iu"
         ],
         [
         ],
         [
-            "Tajik",
-            "Тоҷикӣ",
-            "tg"
+            "Japanese",
+            "日本語",
+            "ja"
         ],
         [
         ],
         [
-            "Mazandarani",
-            "مَزِروني",
-            "mzn"
+            "Lojban",
+            "Lojban",
+            "jbo"
         ],
         [
         ],
         [
-            "Egyptian Arabic",
-            "مصرى (Maṣrī)",
-            "arz"
+            "Javanese",
+            "Basa Jawa",
+            "jv"
         ],
         [
         ],
         [
-            "Yiddish",
-            "ייִדיש",
-            "yi"
+            "Georgian",
+            "ქართული",
+            "ka"
         ],
         [
         ],
         [
-            "Venetian",
-            "Vèneto",
-            "vec"
+            "Kara-Kalpak",
+            "Qaraqalpaqsha",
+            "kaa"
         ],
         [
         ],
         [
-            "Mongolian",
-            "Монгол",
-            "mn"
+            "Kabyle",
+            "Taqbaylit",
+            "kab"
         ],
         [
         ],
         [
-            "Tarantino",
-            "Tarandíne",
-            "roa-tara"
+            "Kabardian",
+            "Адыгэбзэ",
+            "kbd"
         ],
         [
         ],
         [
-            "Sanskrit",
-            "संस्कृतम्",
-            "sa"
+            "Kongo",
+            "Kongo",
+            "kg"
         ],
         [
         ],
         [
-            "Nahuatl",
-            "Nāhuatl",
-            "nah"
+            "Kikuyu",
+            "Gĩkũyũ",
+            "ki"
         ],
         [
         ],
         [
-            "Ossetian",
-            "Иронау",
-            "os"
+            "Kazakh",
+            "қазақша",
+            "kk"
         ],
         [
         ],
         [
-            "Sakha",
-            "Саха тыла (Saxa Tyla)",
-            "sah"
+            "Kalaallisut",
+            "kalaallisut",
+            "kl"
         ],
         [
         ],
         [
-            "Kapampangan",
-            "Kapampangan",
-            "pam"
+            "Khmer",
+            "ភាសាខ្មែរ",
+            "km"
         ],
         [
         ],
         [
-            "Upper Sorbian",
-            "Hornjoserbsce",
-            "hsb"
+            "Kannada",
+            "ಕನ್ನಡ",
+            "kn"
         ],
         [
         ],
         [
-            "Sinhalese",
-            "සිංහල",
-            "si"
+            "Korean",
+            "한국어",
+            "ko"
         ],
         [
         ],
         [
-            "Northern Sami",
-            "Sámegiella",
-            "se"
+            "Komi-Permyak",
+            "Перем Коми",
+            "koi"
         ],
         [
         ],
         [
-            "Limburgish",
-            "Limburgs",
-            "li"
+            "Karachay-Balkar",
+            "къарачай-малкъар",
+            "krc"
         ],
         [
         ],
         [
-            "Maori",
-            "Māori",
-            "mi"
+            "Kashmiri",
+            "कॉशुर / کٲشُر",
+            "ks"
         ],
         [
         ],
         [
-            "Bavarian",
-            "Boarisch",
-            "bar"
+            "Colognian",
+            "Ripoarisch",
+            "ksh"
         ],
         [
         ],
         [
-            "Corsican",
-            "Corsu",
-            "co"
+            "Kurdish",
+            "Kurdî",
+            "ku"
         ],
         [
         ],
         [
-            "Ilokano",
-            "Ilokano",
-            "ilo"
+            "Komi",
+            "коми",
+            "kv"
         ],
         [
         ],
         [
-            "Gan",
-            "贛語",
-            "gan"
+            "Cornish",
+            "kernowek",
+            "kw"
         ],
         [
         ],
         [
-            "Tibetan",
-            "བོད་སྐད",
-            "bo"
+            "Kyrgyz",
+            "Кыргызча",
+            "ky"
         ],
         [
         ],
         [
-            "Gilaki",
-            "گیلکی",
-            "glk"
+            "Latin",
+            "Latina",
+            "la"
         ],
         [
         ],
         [
-            "Faroese",
-            "Føroyskt",
-            "fo"
+            "Ladino",
+            "Ladino",
+            "lad"
         ],
         [
         ],
         [
-            "Rusyn",
-            "русиньскый язык",
-            "rue"
+            "Luxembourgish",
+            "Lëtzebuergesch",
+            "lb"
         ],
         [
         ],
         [
-            "Punjabi",
-            "ਪੰਜਾਬੀ",
-            "pa"
+            "лакку",
+            "лакку",
+            "lbe"
         ],
         [
         ],
         [
-            "Central_Bicolano",
-            "Bikol",
-            "bcl"
+            "Lezghian",
+            "лезги",
+            "lez"
         ],
         [
         ],
         [
-            "Hill Mari",
-            "Кырык Мары (Kyryk Mary) ",
-            "mrj"
+            "Ganda",
+            "Luganda",
+            "lg"
         ],
         [
         ],
         [
-            "Võro",
-            "Võro",
-            "fiu-vro"
+            "Limburgish",
+            "Limburgs",
+            "li"
         ],
         [
         ],
         [
-            "Dutch Low Saxon",
-            "Nedersaksisch",
-            "nds-nl"
+            "Ligurian",
+            "Ligure",
+            "lij"
         ],
         [
         ],
         [
-            "Turkmen",
-            "تركمن / Туркмен",
-            "tk"
+            "Lombard",
+            "lumbaart",
+            "lmo"
         ],
         [
         ],
         [
-            "Pashto",
-            "پښتو",
-            "ps"
+            "Lingala",
+            "lingála",
+            "ln"
         ],
         [
         ],
         [
-            "West Flemish",
-            "West-Vlams",
-            "vls"
+            "Lao",
+            "ລາວ",
+            "lo"
         ],
         [
         ],
         [
-            "Mingrelian",
-            "მარგალური (Margaluri)",
-            "xmf"
+            "Northern Luri",
+            "لۊری شومالی",
+            "lrc"
         ],
         [
         ],
         [
-            "Manx",
-            "Gaelg",
-            "gv"
+            "Lithuanian",
+            "lietuvių",
+            "lt"
         ],
         [
         ],
         [
-            "Zazaki",
-            "Zazaki",
-            "diq"
+            "Latgalian",
+            "latgaļu",
+            "ltg"
         ],
         [
         ],
         [
-            "Pangasinan",
-            "Pangasinan",
-            "pag"
+            "Latvian",
+            "latviešu",
+            "lv"
         ],
         [
         ],
         [
-            "Komi",
-            "Коми",
-            "kv"
+            "Maithili",
+            "मैथिली",
+            "mai"
         ],
         [
         ],
         [
-            "Zeelandic",
-            "Zeêuws",
-            "zea"
+            "Basa Banyumasan",
+            "Basa Banyumasan",
+            "map-bms"
         ],
         [
         ],
         [
-            "Divehi",
-            "ދިވެހިބަސް",
-            "dv"
+            "Moksha",
+            "мокшень",
+            "mdf"
         ],
         [
         ],
         [
-            "Oriya",
-            "ଓଡ଼ିଆ",
-            "or"
+            "Malagasy",
+            "Malagasy",
+            "mg"
         ],
         [
         ],
         [
-            "Khmer",
-            "ភាសាខ្មែរ",
-            "km"
+            "Eastern Mari",
+            "олык марий",
+            "mhr"
         ],
         [
         ],
         [
-            "Norman",
-            "Nouormand/Normaund",
-            "nrm"
+            "Maori",
+            "Māori",
+            "mi"
         ],
         [
         ],
         [
-            "Romansh",
-            "Rumantsch",
-            "rm"
+            "Minangkabau",
+            "Baso Minangkabau",
+            "min"
         ],
         [
         ],
         [
-            "Komi-Permyak",
-            "Ð\9fеÑ\80ем Ð\9aоми (Perem Komi)",
-            "koi"
+            "Macedonian",
+            "македонÑ\81ки",
+            "mk"
         ],
         [
         ],
         [
-            "Udmurt",
-            "Удмурт кыл",
-            "udm"
+            "Malayalam",
+            "മലയാളം",
+            "ml"
         ],
         [
         ],
         [
-            "Meadow Mari",
-            "Ð\9eлÑ\8bк Ð\9cаÑ\80ий (Olyk Marij)",
-            "mhr"
+            "Mongolian",
+            "монгол",
+            "mn"
         ],
         [
         ],
         [
-            "Ladino",
-            "Dzhudezmo",
-            "lad"
+            "Marathi",
+            "मराठी",
+            "mr"
         ],
         [
         ],
         [
-            "North Frisian",
-            "Nordfriisk",
-            "frr"
+            "Western Mari",
+            "кырык мары",
+            "mrj"
         ],
         [
         ],
         [
-            "Kashubian",
-            "Kaszëbsczi",
-            "csb"
+            "Malay",
+            "Bahasa Melayu",
+            "ms"
         ],
         [
         ],
         [
-            "Ligurian",
-            "Líguru",
-            "lij"
+            "Maltese",
+            "Malti",
+            "mt"
         ],
         [
         ],
         [
-            "Wu",
-            "吴语",
-            "wuu"
+            "Mirandese",
+            "Mirandés",
+            "mwl"
         ],
         [
         ],
         [
-            "Friulian",
-            "Furlan",
-            "fur"
+            "Burmese",
+            "မြန်မာဘာသာ",
+            "my"
         ],
         [
         ],
         [
-            "Vepsian",
-            "Vepsän",
-            "vep"
+            "Erzya",
+            "эрзянь",
+            "myv"
         ],
         [
         ],
         [
-            "Classical Chinese",
-            "古文 / 文言文",
-            "zh-classical"
+            "Mazanderani",
+            "مازِرونی",
+            "mzn"
         ],
         [
         ],
         [
-            "Uyghur",
-            "ئۇيغۇر تىلى",
-            "ug"
+            "Nauru",
+            "Dorerin Naoero",
+            "na"
         ],
         [
         ],
         [
-            "Saterland Frisian",
-            "Seeltersk",
-            "stq"
+            "Nāhuatl",
+            "Nāhuatl",
+            "nah"
         ],
         [
         ],
         [
-            "Sardinian",
-            "Sardu",
-            "sc"
+            "Neapolitan",
+            "Napulitano",
+            "nap"
         ],
         [
         ],
         [
-            "Aromanian",
-            "Armãneashce",
-            "roa-rup"
+            "Low German",
+            "Plattdüütsch",
+            "nds"
         ],
         [
         ],
         [
-            "Pali",
-            "पाऴि",
-            "pi"
+            "Low Saxon (Netherlands)",
+            "Nedersaksies",
+            "nds-nl"
         ],
         [
         ],
         [
-            "Somali",
-            "Soomaaliga",
-            "so"
+            "Nepali",
+            "नेपाली",
+            "ne"
         ],
         [
         ],
         [
-            "Bihari",
-            "भà¥\8bà¤\9cपà¥\81रà¥\80",
-            "bh"
+            "Newari",
+            "नà¥\87पाल à¤­à¤¾à¤·à¤¾",
+            "new"
         ],
         [
         ],
         [
-            "Maltese",
-            "Malti",
-            "mt"
+            "Dutch",
+            "Nederlands",
+            "nl"
         ],
         [
         ],
         [
-            "Aymara",
-            "Aymar",
-            "ay"
+            "Norwegian Nynorsk",
+            "norsk nynorsk",
+            "nn"
         ],
         [
         ],
         [
-            "Ripuarian",
-            "Ripoarisch",
-            "ksh"
+            "Norwegian",
+            "norsk bokmål",
+            "no"
         ],
         [
             "Novial",
         ],
         [
             "Novial",
@@ -40290,14 +40366,14 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
             "nov"
         ],
         [
             "nov"
         ],
         [
-            "Anglo-Saxon",
-            "Englisc",
-            "ang"
+            "Nouormand",
+            "Nouormand",
+            "nrm"
         ],
         [
         ],
         [
-            "Cornish",
-            "Kernewek/Karnuack",
-            "kw"
+            "Northern Sotho",
+            "Sesotho sa Leboa",
+            "nso"
         ],
         [
             "Navajo",
         ],
         [
             "Navajo",
@@ -40305,459 +40381,454 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
             "nv"
         ],
         [
             "nv"
         ],
         [
-            "Picard",
-            "Picard",
-            "pcd"
+            "Nyanja",
+            "Chi-Chewa",
+            "ny"
         ],
         [
         ],
         [
-            "Hakka",
-            "Hak-kâ-fa / 客家話",
-            "hak"
+            "Occitan",
+            "occitan",
+            "oc"
         ],
         [
         ],
         [
-            "Guarani",
-            "Avañe'ẽ",
-            "gn"
+            "Oromo",
+            "Oromoo",
+            "om"
         ],
         [
         ],
         [
-            "Extremaduran",
-            "Estremeñu",
-            "ext"
+            "Oriya",
+            "ଓଡ଼ିଆ",
+            "or"
         ],
         [
         ],
         [
-            "Franco-Provençal/Arpitan",
-            "Arpitan",
-            "frp"
+            "Ossetic",
+            "Ирон",
+            "os"
         ],
         [
         ],
         [
-            "Assamese",
-            "à¦\85সমà§\80à§\9fা",
-            "as"
+            "Punjabi",
+            "ਪੰà¨\9cਾਬà©\80",
+            "pa"
         ],
         [
         ],
         [
-            "Silesian",
-            "Ślůnski",
-            "szl"
+            "Pangasinan",
+            "Pangasinan",
+            "pag"
         ],
         [
         ],
         [
-            "Gagauz",
-            "Gagauz",
-            "gag"
+            "Pampanga",
+            "Kapampangan",
+            "pam"
         ],
         [
         ],
         [
-            "Interlingue",
-            "Interlingue",
-            "ie"
+            "Papiamento",
+            "Papiamentu",
+            "pap"
         ],
         [
         ],
         [
-            "Lingala",
-            "Lingala",
-            "ln"
+            "Picard",
+            "Picard",
+            "pcd"
         ],
         [
         ],
         [
-            "Emilian-Romagnol",
-            "Emiliàn e rumagnòl",
-            "eml"
+            "Pennsylvania German",
+            "Deitsch",
+            "pdc"
         ],
         [
         ],
         [
-            "Chechen",
-            "Нохчийн",
-            "ce"
+            "Palatine German",
+            "Pälzisch",
+            "pfl"
         ],
         [
         ],
         [
-            "Kalmyk",
-            "Хальмг",
-            "xal"
+            "Pali",
+            "पालि",
+            "pi"
         ],
         [
         ],
         [
-            "Palatinate German",
-            "Pfälzisch",
-            "pfl"
+            "Norfuk / Pitkern",
+            "Norfuk / Pitkern",
+            "pih"
         ],
         [
         ],
         [
-            "Hawaiian",
-            "Hawai`i",
-            "haw"
+            "Polish",
+            "polski",
+            "pl"
         ],
         [
         ],
         [
-            "Karachay-Balkar",
-            "Къарачай-Малкъар (Qarachay-Malqar)",
-            "krc"
+            "Piedmontese",
+            "Piemontèis",
+            "pms"
         ],
         [
         ],
         [
-            "Pennsylvania German",
-            "Deitsch",
-            "pdc"
+            "Western Punjabi",
+            "پنجابی",
+            "pnb"
         ],
         [
         ],
         [
-            "Kinyarwanda",
-            "Ikinyarwanda",
-            "rw"
+            "Pontic",
+            "Ποντιακά",
+            "pnt"
         ],
         [
         ],
         [
-            "Crimean Tatar",
-            "Qırımtatarca",
-            "crh"
+            "Pashto",
+            "پښتو",
+            "ps"
         ],
         [
         ],
         [
-            "Acehnese",
-            "Bahsa Acèh",
-            "ace"
+            "Portuguese",
+            "português",
+            "pt"
         ],
         [
         ],
         [
-            "Tongan",
-            "faka Tonga",
-            "to"
+            "Quechua",
+            "Runa Simi",
+            "qu"
         ],
         [
         ],
         [
-            "Greenlandic",
-            "Kalaallisut",
-            "kl"
+            "Romansh",
+            "rumantsch",
+            "rm"
         ],
         [
         ],
         [
-            "Lower Sorbian",
-            "Dolnoserbski",
-            "dsb"
+            "Romani",
+            "Romani",
+            "rmy"
         ],
         [
         ],
         [
-            "Aramaic",
-            "ܐܪܡܝܐ",
-            "arc"
+            "Rundi",
+            "Kirundi",
+            "rn"
         ],
         [
         ],
         [
-            "Erzya",
-            "Эрзянь (Erzjanj Kelj)",
-            "myv"
+            "Romanian",
+            "română",
+            "ro"
         ],
         [
         ],
         [
-            "Lezgian",
-            "Лезги чІал (Lezgi č’al)",
-            "lez"
+            "Aromanian",
+            "armãneashti",
+            "roa-rup"
         ],
         [
         ],
         [
-            "Banjar",
-            "Bahasa Banjar",
-            "bjn"
+            "tarandíne",
+            "tarandíne",
+            "roa-tara"
         ],
         [
         ],
         [
-            "Shona",
-            "chiShona",
-            "sn"
+            "Russian",
+            "русский",
+            "ru"
         ],
         [
         ],
         [
-            "Papiamentu",
-            "Papiamentu",
-            "pap"
+            "Rusyn",
+            "русиньскый",
+            "rue"
         ],
         [
         ],
         [
-            "Kabyle",
-            "Taqbaylit",
-            "kab"
+            "Kinyarwanda",
+            "Kinyarwanda",
+            "rw"
         ],
         [
         ],
         [
-            "Tok Pisin",
-            "Tok Pisin",
-            "tpi"
+            "Sanskrit",
+            "संस्कृतम्",
+            "sa"
         ],
         [
         ],
         [
-            "Lak",
-            "Лакку",
-            "lbe"
+            "Sakha",
+            "саха тыла",
+            "sah"
         ],
         [
         ],
         [
-            "Buryat (Russia)",
-            "Буряад",
-            "bxr"
+            "Sardinian",
+            "sardu",
+            "sc"
         ],
         [
         ],
         [
-            "Lojban",
-            "Lojban",
-            "jbo"
+            "Sicilian",
+            "sicilianu",
+            "scn"
         ],
         [
         ],
         [
-            "Wolof",
-            "Wolof",
-            "wo"
+            "Scots",
+            "Scots",
+            "sco"
         ],
         [
         ],
         [
-            "Moksha",
-            "Мокшень (Mokshanj Kälj)",
-            "mdf"
+            "Sindhi",
+            "سنڌي",
+            "sd"
         ],
         [
         ],
         [
-            "Zamboanga Chavacano",
-            "Chavacano de Zamboanga",
-            "cbk-zam"
+            "Northern Sami",
+            "sámegiella",
+            "se"
         ],
         [
         ],
         [
-            "Avar",
-            "Авар",
-            "av"
+            "Sango",
+            "Sängö",
+            "sg"
         ],
         [
         ],
         [
-            "Sranan",
-            "Sranantongo",
-            "srn"
+            "Serbo-Croatian",
+            "srpskohrvatski / српскохрватски",
+            "sh"
         ],
         [
         ],
         [
-            "Mirandese",
-            "Mirandés",
-            "mwl"
+            "Sinhala",
+            "සිංහල",
+            "si"
         ],
         [
         ],
         [
-            "Kabardian Circassian",
-            "Адыгэбзэ (Adighabze)",
-            "kbd"
+            "Simple English",
+            "Simple English",
+            "simple"
         ],
         [
         ],
         [
-            "Tahitian",
-            "Reo Mā`ohi",
-            "ty"
+            "Slovak",
+            "slovenčina",
+            "sk"
         ],
         [
         ],
         [
-            "Lao",
-            "ລາວ",
-            "lo"
-        ],
-        [
-            "Abkhazian",
-            "Аҧсуа",
-            "ab"
+            "Slovenian",
+            "slovenščina",
+            "sl"
         ],
         [
         ],
         [
-            "Tetum",
-            "Tetun",
-            "tet"
+            "Samoan",
+            "Gagana Samoa",
+            "sm"
         ],
         [
         ],
         [
-            "Latgalian",
-            "Latgaļu",
-            "ltg"
+            "Shona",
+            "chiShona",
+            "sn"
         ],
         [
         ],
         [
-            "Nauruan",
-            "dorerin Naoero",
-            "na"
+            "Somali",
+            "Soomaaliga",
+            "so"
         ],
         [
         ],
         [
-            "Kongo",
-            "KiKongo",
-            "kg"
+            "Albanian",
+            "shqip",
+            "sq"
         ],
         [
         ],
         [
-            "Igbo",
-            "Igbo",
-            "ig"
+            "Serbian",
+            "српски / srpski",
+            "sr"
         ],
         [
         ],
         [
-            "Northern Sotho",
-            "Sesotho sa Leboa",
-            "nso"
+            "Sranan Tongo",
+            "Sranantongo",
+            "srn"
         ],
         [
         ],
         [
-            "Zhuang",
-            "Cuengh",
-            "za"
+            "Swati",
+            "SiSwati",
+            "ss"
         ],
         [
         ],
         [
-            "Karakalpak",
-            "Qaraqalpaqsha",
-            "kaa"
+            "Southern Sotho",
+            "Sesotho",
+            "st"
         ],
         [
         ],
         [
-            "Zulu",
-            "isiZulu",
-            "zu"
+            "Saterland Frisian",
+            "Seeltersk",
+            "stq"
         ],
         [
         ],
         [
-            "Cheyenne",
-            "Tsetsêhestâhese",
-            "chy"
+            "Sundanese",
+            "Basa Sunda",
+            "su"
         ],
         [
         ],
         [
-            "Romani",
-            "romani - रोमानी",
-            "rmy"
+            "Swedish",
+            "svenska",
+            "sv"
         ],
         [
         ],
         [
-            "Old Church Slavonic",
-            "Словѣньскъ",
-            "cu"
+            "Swahili",
+            "Kiswahili",
+            "sw"
         ],
         [
         ],
         [
-            "Tswana",
-            "Setswana",
-            "tn"
+            "Silesian",
+            "ślůnski",
+            "szl"
         ],
         [
         ],
         [
-            "Cherokee",
-            "ᏣᎳᎩ",
-            "chr"
+            "Tamil",
+            "தமிழ்",
+            "ta"
         ],
         [
         ],
         [
-            "Bislama",
-            "Bislama",
-            "bi"
+            "Telugu",
+            "తెలుగు",
+            "te"
         ],
         [
         ],
         [
-            "Min Dong",
-            "Mìng-dĕ̤ng-ngṳ̄",
-            "cdo"
+            "Tetum",
+            "tetun",
+            "tet"
         ],
         [
         ],
         [
-            "Gothic",
-            "𐌲𐌿𐍄𐌹𐍃𐌺",
-            "got"
+            "Tajik",
+            "тоҷикӣ",
+            "tg"
         ],
         [
         ],
         [
-            "Samoan",
-            "Gagana Samoa",
-            "sm"
+            "Thai",
+            "ไทย",
+            "th"
         ],
         [
         ],
         [
-            "Moldovan",
-            "Молдовеняскэ",
-            "mo"
+            "Tigrinya",
+            "ትግርኛ",
+            "ti"
         ],
         [
         ],
         [
-            "Bambara",
-            "Bamanankan",
-            "bm"
+            "Turkmen",
+            "Türkmençe",
+            "tk"
         ],
         [
         ],
         [
-            "Inuktitut",
-            "ᐃᓄᒃᑎᑐᑦ",
-            "iu"
+            "Tagalog",
+            "Tagalog",
+            "tl"
         ],
         [
         ],
         [
-            "Norfolk",
-            "Norfuk",
-            "pih"
+            "Tswana",
+            "Setswana",
+            "tn"
         ],
         [
         ],
         [
-            "Pontic",
-            "Ποντιακά",
-            "pnt"
+            "Tongan",
+            "lea faka-Tonga",
+            "to"
         ],
         [
         ],
         [
-            "Sindhi",
-            "سنڌي، سندھی ، सिन्ध",
-            "sd"
+            "Tok Pisin",
+            "Tok Pisin",
+            "tpi"
         ],
         [
         ],
         [
-            "Swati",
-            "SiSwati",
-            "ss"
+            "Turkish",
+            "Türkçe",
+            "tr"
         ],
         [
         ],
         [
-            "Kikuyu",
-            "Gĩkũyũ",
-            "ki"
+            "Tsonga",
+            "Xitsonga",
+            "ts"
         ],
         [
         ],
         [
-            "Ewe",
-            "Eʋegbe",
-            "ee"
+            "Tatar",
+            "татарча/tatarça",
+            "tt"
         ],
         [
         ],
         [
-            "Hausa",
-            "هَوُسَ",
-            "ha"
+            "Tumbuka",
+            "chiTumbuka",
+            "tum"
         ],
         [
         ],
         [
-            "Oromo",
-            "Oromoo",
-            "om"
+            "Twi",
+            "Twi",
+            "tw"
         ],
         [
         ],
         [
-            "Fijian",
-            "Na Vosa Vakaviti",
-            "fj"
+            "Tahitian",
+            "reo tahiti",
+            "ty"
         ],
         [
         ],
         [
-            "Tigrinya",
-            "ትግርኛ",
-            "ti"
+            "Tuvinian",
+            "тыва дыл",
+            "tyv"
         ],
         [
         ],
         [
-            "Tsonga",
-            "Xitsonga",
-            "ts"
+            "Udmurt",
+            "удмурт",
+            "udm"
         ],
         [
         ],
         [
-            "Kashmiri",
-            "कश्मीरी / كشميري",
-            "ks"
+            "Uyghur",
+            "ئۇيغۇرچە / Uyghurche",
+            "ug"
         ],
         [
         ],
         [
-            "Venda",
-            "Tshivenda",
-            "ve"
+            "Ukrainian",
+            "українська",
+            "uk"
         ],
         [
         ],
         [
-            "Sango",
-            "Sängö",
-            "sg"
+            "Urdu",
+            "اردو",
+            "ur"
         ],
         [
         ],
         [
-            "Kirundi",
-            "Kirundi",
-            "rn"
+            "Uzbek",
+            "oʻzbekcha/ўзбекча",
+            "uz"
         ],
         [
         ],
         [
-            "Sesotho",
-            "Sesotho",
-            "st"
+            "Venda",
+            "Tshivenda",
+            "ve"
         ],
         [
         ],
         [
-            "Dzongkha",
-            "ཇོང་ཁ",
-            "dz"
+            "Venetian",
+            "vèneto",
+            "vec"
         ],
         [
         ],
         [
-            "Cree",
-            "Nehiyaw",
-            "cr"
+            "Veps",
+            "vepsän kel’",
+            "vep"
         ],
         [
         ],
         [
-            "Akan",
-            "Akana",
-            "ak"
+            "Vietnamese",
+            "Tiếng Việt",
+            "vi"
         ],
         [
         ],
         [
-            "Tumbuka",
-            "chiTumbuka",
-            "tum"
+            "West Flemish",
+            "West-Vlams",
+            "vls"
         ],
         [
         ],
         [
-            "Luganda",
-            "Luganda",
-            "lg"
+            "Volapük",
+            "Volapük",
+            "vo"
         ],
         [
         ],
         [
-            "Chichewa",
-            "Chi-Chewa",
-            "ny"
+            "Walloon",
+            "walon",
+            "wa"
         ],
         [
         ],
         [
-            "Fula",
-            "Fulfulde",
-            "ff"
+            "Waray",
+            "Winaray",
+            "war"
         ],
         [
         ],
         [
-            "Inupiak",
-            "Iñupiak",
-            "ik"
+            "Wolof",
+            "Wolof",
+            "wo"
         ],
         [
         ],
         [
-            "Chamorro",
-            "Chamoru",
-            "ch"
+            "Wu Chinese",
+            "吴语",
+            "wuu"
         ],
         [
         ],
         [
-            "Twi",
-            "Twi",
-            "tw"
+            "Kalmyk",
+            "хальмг",
+            "xal"
         ],
         [
             "Xhosa",
         ],
         [
             "Xhosa",
@@ -40765,54 +40836,54 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
             "xh"
         ],
         [
             "xh"
         ],
         [
-            "Ndonga",
-            "Oshiwambo",
-            "ng"
+            "Mingrelian",
+            "მარგალური",
+            "xmf"
         ],
         [
         ],
         [
-            "Sichuan Yi",
-            "ꆇꉙ",
-            "ii"
+            "Yiddish",
+            "ייִדיש",
+            "yi"
         ],
         [
         ],
         [
-            "Choctaw",
-            "Choctaw",
-            "cho"
+            "Yoruba",
+            "Yorùbá",
+            "yo"
         ],
         [
         ],
         [
-            "Marshallese",
-            "Ebon",
-            "mh"
+            "Zhuang",
+            "Vahcuengh",
+            "za"
         ],
         [
         ],
         [
-            "Afar",
-            "Afar",
-            "aa"
+            "Zeelandic",
+            "Zeêuws",
+            "zea"
         ],
         [
         ],
         [
-            "Kuanyama",
-            "Kuanyama",
-            "kj"
+            "Chinese",
+            "中文",
+            "zh"
         ],
         [
         ],
         [
-            "Hiri Motu",
-            "Hiri Motu",
-            "ho"
+            "Classical Chinese",
+            "文言",
+            "zh-classical"
         ],
         [
         ],
         [
-            "Muscogee",
-            "Muskogee",
-            "mus"
+            "Chinese (Min Nan)",
+            "Bân-lâm-gú",
+            "zh-min-nan"
         ],
         [
         ],
         [
-            "Kanuri",
-            "Kanuri",
-            "kr"
+            "Cantonese",
+            "粵語",
+            "zh-yue"
         ],
         [
         ],
         [
-            "Herero",
-            "Otsiherero",
-            "hz"
+            "Zulu",
+            "isiZulu",
+            "zu"
         ]
     ],
     "imperial": {
         ]
     ],
     "imperial": {
@@ -50198,2612 +50269,2584 @@ iD.introGraph = '{"n185954700":{"id":"n185954700","loc":[-85.642244,41.939081],"
                                 [
                                     -132.455735,
                                     57.420992
                                 [
                                     -132.455735,
                                     57.420992
-                                ],
-                                [
-                                    -132.362304,
-                                    57.3457
-                                ],
-                                [
-                                    -132.304684,
-                                    57.280355
-                                ],
-                                [
-                                    -132.230994,
-                                    57.19682
-                                ],
-                                [
-                                    -132.276366,
-                                    57.14889
-                                ],
-                                [
-                                    -132.34122,
-                                    57.080393
-                                ],
-                                [
-                                    -132.16229,
-                                    57.050317
-                                ],
-                                [
-                                    -132.031859,
-                                    57.028406
-                                ],
-                                [
-                                    -132.107384,
-                                    56.858753
-                                ],
-                                [
-                                    -131.871558,
-                                    56.79346
-                                ],
-                                [
-                                    -131.865874,
-                                    56.785708
-                                ],
-                                [
-                                    -131.872411,
-                                    56.77297
-                                ],
-                                [
-                                    -131.882617,
-                                    56.759146
-                                ],
-                                [
-                                    -131.887966,
-                                    56.747958
-                                ],
-                                [
-                                    -131.886028,
-                                    56.737055
-                                ],
-                                [
-                                    -131.880705,
-                                    56.728838
-                                ],
-                                [
-                                    -131.864789,
-                                    56.71349
-                                ],
-                                [
-                                    -131.838976,
-                                    56.682278
-                                ],
-                                [
-                                    -131.830424,
-                                    56.664759
-                                ],
-                                [
-                                    -131.826574,
-                                    56.644606
-                                ],
-                                [
-                                    -131.832103,
-                                    56.603368
-                                ],
-                                [
-                                    -131.825592,
-                                    56.593343
-                                ],
-                                [
-                                    -131.799108,
-                                    56.587658
-                                ],
-                                [
-                                    -131.692293,
-                                    56.585074
-                                ],
-                                [
-                                    -131.585891,
-                                    56.595048
-                                ],
-                                [
-                                    -131.560363,
-                                    56.594066
-                                ],
-                                [
-                                    -131.536437,
-                                    56.585229
-                                ],
-                                [
-                                    -131.491659,
-                                    56.560166
-                                ],
-                                [
-                                    -131.345699,
-                                    56.503271
-                                ],
-                                [
-                                    -131.215604,
-                                    56.45255
-                                ],
-                                [
-                                    -131.100546,
-                                    56.407669
-                                ],
-                                [
-                                    -131.016934,
-                                    56.38705
-                                ],
-                                [
-                                    -130.839089,
-                                    56.372452
-                                ],
-                                [
-                                    -130.760334,
-                                    56.345192
-                                ],
-                                [
-                                    -130.645768,
-                                    56.261942
-                                ],
-                                [
-                                    -130.602256,
-                                    56.247059
-                                ],
-                                [
-                                    -130.495518,
-                                    56.232434
-                                ],
-                                [
-                                    -130.47229,
-                                    56.22489
-                                ],
-                                [
-                                    -130.458053,
-                                    56.210653
-                                ],
-                                [
-                                    -130.427926,
-                                    56.143964
-                                ],
-                                [
-                                    -130.418159,
-                                    56.129702
-                                ],
-                                [
-                                    -130.403974,
-                                    56.121898
-                                ],
-                                [
-                                    -130.290311,
-                                    56.10097
-                                ],
-                                [
-                                    -130.243156,
-                                    56.092391
-                                ],
-                                [
-                                    -130.211246,
-                                    56.089962
-                                ],
-                                [
-                                    -130.116756,
-                                    56.105646
-                                ],
-                                [
-                                    -130.094328,
-                                    56.101486
-                                ],
-                                [
-                                    -130.071539,
-                                    56.084123
-                                ],
-                                [
-                                    -130.039319,
-                                    56.045521
-                                ],
-                                [
-                                    -130.026632,
-                                    56.024101
-                                ],
-                                [
-                                    -130.01901,
-                                    56.002216
-                                ],
-                                [
-                                    -130.014695,
-                                    55.963252
-                                ],
-                                [
-                                    -130.016788,
-                                    55.918913
-                                ],
-                                [
-                                    -130.019612,
-                                    55.907978
-                                ],
-                                [
-                                    -130.019618,
-                                    55.907952
-                                ],
-                                [
-                                    -130.022817,
-                                    55.901353
-                                ],
-                                [
-                                    -130.049387,
-                                    55.871405
-                                ],
-                                [
-                                    -130.104726,
-                                    55.825263
-                                ],
-                                [
-                                    -130.136627,
-                                    55.806464
-                                ],
-                                [
-                                    -130.148834,
-                                    55.795356
-                                ],
-                                [
-                                    -130.163482,
-                                    55.771145
-                                ],
-                                [
-                                    -130.167307,
-                                    55.766262
-                                ],
-                                [
-                                    -130.170806,
-                                    55.759833
-                                ],
-                                [
-                                    -130.173655,
-                                    55.749498
-                                ],
-                                [
-                                    -130.170806,