diff --git a/assets/layers/bike_cleaning/bike_cleaning.json b/assets/layers/bike_cleaning/bike_cleaning.json
index fedd79d62..fe85d1ecc 100644
--- a/assets/layers/bike_cleaning/bike_cleaning.json
+++ b/assets/layers/bike_cleaning/bike_cleaning.json
@@ -34,8 +34,7 @@
       "or": [
         "service:bicycle:cleaning=yes",
         "service:bicycle:cleaning=diy",
-        "amenity=bicycle_wash",
-        "amenity=bike_wash"
+        "amenity=bicycle_wash"
       ]
     }
   },
@@ -83,7 +82,6 @@
           "if": {
             "and": [
               "service:bicycle:cleaning~*",
-              "amenity!=bike_wash",
               "amenity!=bicycle_wash"
             ]
           },
@@ -106,7 +104,6 @@
       ]
     }
   ],
-  "lineRendering": [],
   "presets": [
     {
       "title": {
@@ -158,7 +155,6 @@
       },
       "condition": {
         "and": [
-          "amenity!=bike_wash",
           "amenity!=bicycle_wash",
           "service:bicycle:cleaning!=no",
           "service:bicycle:cleaning!="
@@ -169,7 +165,7 @@
         "addExtraTags": [
           "service:bicycle:cleaning:fee=yes"
         ],
-        "inline": true
+        "inline": false
       },
       "mappings": [
         {
@@ -241,7 +237,6 @@
       },
       "condition": {
         "or": [
-          "amenity=bike_wash",
           "amenity=bicycle_wash"
         ]
       },
@@ -285,6 +280,54 @@
         }
       ],
       "id": "bike_cleaning-charge"
+    },
+    {
+      "question": {
+        "en": "Is this bicycle cleaning service automated?",
+        "nl": "Is dit fietsschoonmaakpunt geautomatiseerd?"
+      },
+      "id": "automated",
+      "mappings": [
+        {
+          "if": "automated=no",
+          "then": {
+            "en": "This is a manual bike washing station",
+            "nl": "Dit is een handmatig fietsschoonmaakpunt"
+          }
+        },
+        {
+          "if": "automated=yes",
+          "then": {
+            "en": "This is an automated bike wash",
+            "nl": "Dit is een automatisch fietsschoonmaakpunt"
+          }
+        }
+      ],
+      "condition": "amenity=bicycle_wash"
+    },
+    {
+      "question": {
+        "nl": "Is dit fietsschoonmaakpunt zelfbediening?",
+        "en": "Is this cleaning service self-service?"
+      },
+      "id": "self_service",
+      "mappings": [
+        {
+          "if": "self_service=yes",
+          "then": {
+            "nl": "Dit fietsschoonmaakpunt is zelfbediening",
+            "en": "This cleaning service is self-service"
+          }
+        },
+        {
+          "if": "self_service=no",
+          "then": {
+            "nl": "Dit fietsschoonmaakpunt wordt bediend door aanwezig personeel",
+            "en": "This cleaning service is operated by an employee"
+          }
+        }
+      ],
+      "condition": "amenity=bicycle_wash"
     }
   ],
   "deletion": {
@@ -300,4 +343,4 @@
     "enableRelocation": false,
     "enableImproveAccuracy": true
   }
-}
+}
\ No newline at end of file
diff --git a/assets/layers/clock/clock.json b/assets/layers/clock/clock.json
index 5c159a579..20a91e0e6 100644
--- a/assets/layers/clock/clock.json
+++ b/assets/layers/clock/clock.json
@@ -97,8 +97,8 @@
         "support=wall_mounted"
       ],
       "title": {
-        "en": "a wall-mounted clock",
-        "nl": "een klok aan een muur",
+        "en": "a wall-mounted clock, mounted using a support perpendicular to the wall",
+        "nl": "een klok aan een muur, bevestigd met een steun loodrecht op de muur",
         "de": "eine an der Wand montierte Uhr",
         "ca": "un rellotge muntat en un paret",
         "fr": "une horloge fixée au mur",
@@ -117,6 +117,23 @@
       "snapToLayer": [
         "walls_and_buildings"
       ]
+    },
+    {
+      "tags": [
+        "amenity=clock",
+        "support=wall"
+      ],
+      "title": {
+        "en": "a wall-mounted clock, mounted directly on a wall",
+        "nl": "een klok aan een muur, rechtstreeks bevestigd aan een muur"
+      },
+      "description": {
+        "en": "A publicly visible clock mounted directly on a wall",
+        "nl": "Een publiekelijk zichtbare klok rechtstreeks bevestigd aan een muur"
+      },
+      "snapToLayer": [
+        "walls_and_buildings"
+      ]
     }
   ],
   "tagRenderings": [
@@ -148,8 +165,8 @@
         {
           "if": "support=wall_mounted",
           "then": {
-            "en": "This clock is mounted on a wall",
-            "nl": "Deze klok is bevestigd aan een muur",
+            "en": "This clock is mounted on a wall, usually through a support perpendicular to the wall",
+            "nl": "Deze klok is bevestigd aan een muur, meestal met een steun loodrecht op de muur",
             "de": "Diese Uhr ist an einer Wand montiert",
             "ca": "Aquest rellotge està muntat en una paret",
             "fr": "Cette horloge est fixée sur un mur",
@@ -157,6 +174,13 @@
             "cs": "Tyto hodiny jsou namontovány na stěně"
           }
         },
+        {
+          "if": "support=wall",
+          "then": {
+            "en": "This clock is mounted directly on a wall",
+            "nl": "Deze klok is rechtstreeks aan een muur bevestigd"
+          }
+        },
         {
           "if": "support=billboard",
           "then": {
@@ -245,6 +269,30 @@
         }
       ]
     },
+    {
+      "builtin": "indoor",
+      "override": {
+        "question": {
+          "en": "Is this clock indoors?",
+          "nl": "Is deze klok binnen?"
+        },
+        "mappings": [
+          {
+            "then": {
+              "en": "This clock is indoors",
+              "nl": "Deze klok is binnen"
+            }
+          },
+          {
+            "if": "indoor=no",
+            "then": {
+              "en": "This clock is outdoors",
+              "nl": "Deze klok is buiten"
+            }
+          }
+        ]
+      }
+    },
     {
       "id": "visibility",
       "question": {
@@ -293,7 +341,8 @@
             "cs": "Tyto hodiny jsou viditelné ze vzdálenosti větší než 20 metrů (např. kostelní nebo nádražní hodiny)"
           }
         }
-      ]
+      ],
+      "condition": "indoor!=yes"
     },
     {
       "id": "date",
@@ -572,4 +621,4 @@
   ],
   "deletion": true,
   "allowMove": true
-}
+}
\ No newline at end of file
diff --git a/assets/layers/crossings/crossing_unmarked.png b/assets/layers/crossings/crossing_unmarked.png
new file mode 100644
index 000000000..629009d32
Binary files /dev/null and b/assets/layers/crossings/crossing_unmarked.png differ
diff --git a/assets/layers/crossings/crossing_unmarked.png.license b/assets/layers/crossings/crossing_unmarked.png.license
new file mode 100644
index 000000000..8bbbce063
--- /dev/null
+++ b/assets/layers/crossings/crossing_unmarked.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: StenSoft
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/crossings/crossings.json b/assets/layers/crossings/crossings.json
index 2cd743b98..57d7f554d 100644
--- a/assets/layers/crossings/crossings.json
+++ b/assets/layers/crossings/crossings.json
@@ -91,7 +91,8 @@
       ],
       "location": [
         "point"
-      ]
+      ],
+      "anchor": "center"
     }
   ],
   "lineRendering": [
@@ -222,49 +223,181 @@
             "fr": "Passage piéton sans marquages",
             "ca": "Creuament sense senyalitzar",
             "cs": "Přechod bez označení přechodu"
-          }
+          },
+          "hideInAnswer": true
         }
       ]
     },
     {
-      "id": "crossing-is-zebra",
+      "id": "markings",
       "question": {
-        "en": "Is this is a zebra crossing?",
-        "nl": "Is dit een zebrapad?",
-        "de": "Ist das ein Zebrastreifen?",
-        "es": "¿Esto es un paso de cebra?",
-        "fr": "Est-ce un passage piéton ?",
-        "ca": "Açò és un pas de vianants?",
-        "pl": "Czy to jest przejście dla pieszych typu \"zebra\"?",
-        "cs": "Jedná se o zebra přechod?"
+        "en": "What kind of markings does this crossing have?",
+        "nl": "Wat voor markering heeft deze oversteekplaats?"
       },
-      "condition": "crossing=uncontrolled",
       "mappings": [
         {
-          "if": "crossing_ref=zebra",
+          "if": "crossing:markings=no",
           "then": {
-            "en": "This is a zebra crossing",
-            "nl": "Dit is een zebrapad",
-            "de": "Dies ist ein Zebrastreifen",
-            "es": "Esto es un paso de cebra",
-            "fr": "C'est un passage piéton",
-            "ca": "Açò és un pas de vianants",
-            "cs": "Toto je zebra přechod"
+            "en": "This crossing has no markings",
+            "nl": "Deze oversteekplaats heeft geen markeringen"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/crossing_unmarked.png"
           }
         },
         {
-          "if": "crossing_ref=",
+          "if": "crossing:markings=zebra",
           "then": {
-            "en": "This is not a zebra crossing",
-            "nl": "Dit is geen zebrapad",
-            "de": "Dies ist kein Zebrastreifen",
-            "es": "Esto no es un paso de cebra",
-            "fr": "Ce n'est pas un passage piéton",
-            "ca": "Açò no és un pas de vianants",
-            "cs": "Tohle není zebra přechod"
+            "en": "This crossing has zebra markings",
+            "nl": "Deze oversteekplaats heeft een zebramarkering"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/markings_zebra.png"
+          }
+        },
+        {
+          "hideInAnswer": true,
+          "then": {
+            "en": "This crossing has markings of an unknown type",
+            "nl": "Deze oversteekplaats heeft markeringen van een onbekend type"
+          },
+          "if": "crossing:markings=yes"
+        },
+        {
+          "if": "crossing:markings=lines",
+          "then": {
+            "en": "This crossings has lines on either side of the crossing",
+            "nl": "Deze oversteekplaats heeft lijnen aan beide kanten van de oversteekplaats"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/markings_lines.png"
+          }
+        },
+        {
+          "if": "crossing:markings=ladder",
+          "then": {
+            "en": "This crossing has lines on either side of the crossing, along with bars connecting them",
+            "nl": "Deze oversteekplaats heeft lijnen aan beide kanten van de oversteekplaats, met strepen die ze verbinden"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/markings_ladder.png"
+          }
+        },
+        {
+          "if": "crossing:markings=dashes",
+          "then": {
+            "en": "This crossing has dashed lines on either sides of the crossing",
+            "nl": "Deze oversteekplaats heeft onderbroken lijnen aan beide kanten van de oversteekplaats"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/markings_dashes.png"
+          }
+        },
+        {
+          "if": "crossing:markings=dots",
+          "then": {
+            "en": "This crossing has dotted lines on either sides of the crossing",
+            "nl": "Deze oversteekplaats heeft stippellijnen aan beide kanten van de oversteekplaats"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/markings_dots.png"
+          }
+        },
+        {
+          "if": "crossing:markings=surface",
+          "then": {
+            "en": "This crossing is marked by using a different coloured surface",
+            "nl": "Deze oversteekplaats is gemarkeerd door een anders gekleurd wegdek"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/markings_surface.png"
+          }
+        },
+        {
+          "if": "crossing:markings=ladder:skewed",
+          "then": {
+            "en": "This crossing has lines on either side of the crossing, along with angled bars connecting them",
+            "nl": "Deze oversteekplaats heeft lijnen aan beide kanten van de oversteekplaats, met schuine strepen die ze verbinden"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/markings_ladder_skewed.png"
+          }
+        },
+        {
+          "if": "crossing:markings=zebra:paired",
+          "then": {
+            "en": "This crossing has zebra markings with an interruption in every bar",
+            "nl": "Deze oversteekplaats heeft zebramarkeringen met een onderbreking van elke streep"
+          }
+        },
+        {
+          "if": "crossing:markings=zebra:bicolour",
+          "then": {
+            "en": "This crossing has zebra markings in alternating colours",
+            "nl": "Deze oversteekplaats heeft een zebramarkering in afwisselende kleuren"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/markings_zebra_bicolour.png"
+          }
+        },
+        {
+          "if": "crossing:markings=zebra:double",
+          "then": {
+            "en": "This crossing has double zebra markings",
+            "nl": "Deze oversteekplaats heeft een dubbele zebramarkering"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/markings_zebra_double.png"
+          }
+        },
+        {
+          "if": "crossing:markings=pictograms",
+          "then": {
+            "en": "This crossing has pictograms on the road",
+            "nl": "Deze oversteekplaats heeft pictogrammen op de weg"
+          }
+        },
+        {
+          "if": "crossing:markings=ladder:paired",
+          "then": {
+            "en": "This crossing has lines on either side of the crossing, along with bars connecting them, with an interruption in every bar",
+            "nl": "Deze oversteekplaats heeft lijnen aan beide kanten van de oversteekplaats, met strepen die ze verbinden, met een onderbreking van elke streep"
+          }
+        },
+        {
+          "if": "crossing:markings=lines:paired",
+          "then": {
+            "en": "This crossing has double lines on either side of the crossing",
+            "nl": "Deze oversteekplaats heeft dubbele lijnen aan beide kanten van de oversteekplaats"
+          },
+          "icon": {
+            "class": "large",
+            "path": "./assets/layers/crossings/markings_lines_paired.png"
           }
         }
-      ]
+      ],
+      "render": {
+        "en": "This crossing has {crossing:markings} markings",
+        "nl": "Deze oversteekplaats heeft {crossing:markings} markeringen"
+      },
+      "freeform": {
+        "key": "crossing:markings",
+        "type": "string",
+        "addExtraTags": [
+          "fixme=Free-form value used in MapComplete for crossing:markings"
+        ]
+      },
+      "multiAnswer": true
     },
     {
       "id": "crossing-bicycle-allowed",
@@ -732,4 +865,4 @@
     "enableImproveAccuracy": true,
     "enableRelocation": false
   }
-}
+}
\ No newline at end of file
diff --git a/assets/layers/crossings/license_info.json b/assets/layers/crossings/license_info.json
index 22105ed13..cfed79075 100644
--- a/assets/layers/crossings/license_info.json
+++ b/assets/layers/crossings/license_info.json
@@ -39,6 +39,116 @@
       "https://wiki.openstreetmap.org/wiki/File:Vibrating_button_illustration.jpg"
     ]
   },
+  {
+    "path": "crossing_unmarked.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "StenSoft"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Crossing_without_markings.png"
+    ]
+  },
+  {
+    "path": "markings_dashes.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "Popball"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Markings_dashes.png"
+    ]
+  },
+  {
+    "path": "markings_dots.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "Popball"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Markings_dots.png"
+    ]
+  },
+  {
+    "path": "markings_ladder.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "Popball"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Markings_ladder.png"
+    ]
+  },
+  {
+    "path": "markings_ladder_skewed.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "Popball"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Markings_adder_skewed.png"
+    ]
+  },
+  {
+    "path": "markings_lines.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "Popball"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Markings_lines.png"
+    ]
+  },
+  {
+    "path": "markings_lines_paired.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "Popball"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Markings_lines_paired.png"
+    ]
+  },
+  {
+    "path": "markings_surface.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "Popball"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Surface_crossing_markings.png"
+    ]
+  },
+  {
+    "path": "markings_zebra.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "Popball"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Markings_zebra.png"
+    ]
+  },
+  {
+    "path": "markings_zebra_bicolour.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "Popball"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Markings_zebra_bicolour.png"
+    ]
+  },
+  {
+    "path": "markings_zebra_double.png",
+    "license": "CC0 1.0",
+    "authors": [
+      "Popball"
+    ],
+    "sources": [
+      "https://wiki.openstreetmap.org/wiki/File:Crossing_markings_zebra_double.png"
+    ]
+  },
   {
     "path": "pedestrian_crossing.svg",
     "license": "CC-BY-SA-4.0",
diff --git a/assets/layers/crossings/markings_dashes.png b/assets/layers/crossings/markings_dashes.png
new file mode 100644
index 000000000..e562679c1
Binary files /dev/null and b/assets/layers/crossings/markings_dashes.png differ
diff --git a/assets/layers/crossings/markings_dashes.png.license b/assets/layers/crossings/markings_dashes.png.license
new file mode 100644
index 000000000..09b78e137
--- /dev/null
+++ b/assets/layers/crossings/markings_dashes.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Popball
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/crossings/markings_dots.png b/assets/layers/crossings/markings_dots.png
new file mode 100644
index 000000000..afd399b52
Binary files /dev/null and b/assets/layers/crossings/markings_dots.png differ
diff --git a/assets/layers/crossings/markings_dots.png.license b/assets/layers/crossings/markings_dots.png.license
new file mode 100644
index 000000000..09b78e137
--- /dev/null
+++ b/assets/layers/crossings/markings_dots.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Popball
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/crossings/markings_ladder.png b/assets/layers/crossings/markings_ladder.png
new file mode 100644
index 000000000..0cee129af
Binary files /dev/null and b/assets/layers/crossings/markings_ladder.png differ
diff --git a/assets/layers/crossings/markings_ladder.png.license b/assets/layers/crossings/markings_ladder.png.license
new file mode 100644
index 000000000..09b78e137
--- /dev/null
+++ b/assets/layers/crossings/markings_ladder.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Popball
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/crossings/markings_ladder_skewed.png b/assets/layers/crossings/markings_ladder_skewed.png
new file mode 100644
index 000000000..a9d717d42
Binary files /dev/null and b/assets/layers/crossings/markings_ladder_skewed.png differ
diff --git a/assets/layers/crossings/markings_ladder_skewed.png.license b/assets/layers/crossings/markings_ladder_skewed.png.license
new file mode 100644
index 000000000..09b78e137
--- /dev/null
+++ b/assets/layers/crossings/markings_ladder_skewed.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Popball
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/crossings/markings_lines.png b/assets/layers/crossings/markings_lines.png
new file mode 100644
index 000000000..cbd7a9ec6
Binary files /dev/null and b/assets/layers/crossings/markings_lines.png differ
diff --git a/assets/layers/crossings/markings_lines.png.license b/assets/layers/crossings/markings_lines.png.license
new file mode 100644
index 000000000..09b78e137
--- /dev/null
+++ b/assets/layers/crossings/markings_lines.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Popball
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/crossings/markings_lines_paired.png b/assets/layers/crossings/markings_lines_paired.png
new file mode 100644
index 000000000..f33af47db
Binary files /dev/null and b/assets/layers/crossings/markings_lines_paired.png differ
diff --git a/assets/layers/crossings/markings_lines_paired.png.license b/assets/layers/crossings/markings_lines_paired.png.license
new file mode 100644
index 000000000..09b78e137
--- /dev/null
+++ b/assets/layers/crossings/markings_lines_paired.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Popball
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/crossings/markings_surface.png b/assets/layers/crossings/markings_surface.png
new file mode 100644
index 000000000..f0048c67c
Binary files /dev/null and b/assets/layers/crossings/markings_surface.png differ
diff --git a/assets/layers/crossings/markings_surface.png.license b/assets/layers/crossings/markings_surface.png.license
new file mode 100644
index 000000000..09b78e137
--- /dev/null
+++ b/assets/layers/crossings/markings_surface.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Popball
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/crossings/markings_zebra.png b/assets/layers/crossings/markings_zebra.png
new file mode 100644
index 000000000..6588af96f
Binary files /dev/null and b/assets/layers/crossings/markings_zebra.png differ
diff --git a/assets/layers/crossings/markings_zebra.png.license b/assets/layers/crossings/markings_zebra.png.license
new file mode 100644
index 000000000..09b78e137
--- /dev/null
+++ b/assets/layers/crossings/markings_zebra.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Popball
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/crossings/markings_zebra_bicolour.png b/assets/layers/crossings/markings_zebra_bicolour.png
new file mode 100644
index 000000000..2e77a1996
Binary files /dev/null and b/assets/layers/crossings/markings_zebra_bicolour.png differ
diff --git a/assets/layers/crossings/markings_zebra_bicolour.png.license b/assets/layers/crossings/markings_zebra_bicolour.png.license
new file mode 100644
index 000000000..09b78e137
--- /dev/null
+++ b/assets/layers/crossings/markings_zebra_bicolour.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Popball
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/crossings/markings_zebra_double.png b/assets/layers/crossings/markings_zebra_double.png
new file mode 100644
index 000000000..6ab4c3a0b
Binary files /dev/null and b/assets/layers/crossings/markings_zebra_double.png differ
diff --git a/assets/layers/crossings/markings_zebra_double.png.license b/assets/layers/crossings/markings_zebra_double.png.license
new file mode 100644
index 000000000..09b78e137
--- /dev/null
+++ b/assets/layers/crossings/markings_zebra_double.png.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Popball
+SPDX-License-Identifier: CC0 1.0
\ No newline at end of file
diff --git a/assets/layers/cyclist_waiting_aid/cyclist_waiting_aid.json b/assets/layers/cyclist_waiting_aid/cyclist_waiting_aid.json
new file mode 100644
index 000000000..eb6ab3ea3
--- /dev/null
+++ b/assets/layers/cyclist_waiting_aid/cyclist_waiting_aid.json
@@ -0,0 +1,148 @@
+{
+  "credits": "Robin van der Linde",
+  "pointRendering": [
+    {
+      "location": [
+        "point",
+        "centroid"
+      ],
+      "marker": [
+        {
+          "icon": "pin",
+          "color": "#538EE8"
+        },
+        {
+          "icon": "./assets/layers/cyclist_waiting_aid/waiting_aid.svg"
+        }
+      ],
+      "anchor": "bottom"
+    }
+  ],
+  "tagRenderings": [
+    "images",
+    {
+      "question": {
+        "en": "What kind of components does this waiting aid have?"
+      },
+      "id": "type",
+      "multiAnswer": true,
+      "mappings": [
+        {
+          "if": "footrest=yes",
+          "then": {
+            "en": "There is a board or peg to rest your foot on here"
+          },
+          "ifnot": "footrest="
+        },
+        {
+          "if": "handrest=yes",
+          "then": {
+            "en": "There is a rail or a handle to hold on to here"
+          },
+          "ifnot": "handrest="
+        }
+      ]
+    },
+    {
+      "question": {
+        "en": "On what side of the road is this located?"
+      },
+      "id": "side",
+      "mappings": [
+        {
+          "if": "side=left",
+          "then": {
+            "en": "This waiting aid is located on the left side"
+          }
+        },
+        {
+          "if": "side=right",
+          "then": {
+            "en": "This waiting aid is located on the right side"
+          }
+        },
+        {
+          "if": "side=both",
+          "then": {
+            "en": "There are waiting aids on both sides of the road"
+          }
+        }
+      ]
+    },
+    {
+      "condition": "direction~*",
+      "id": "direction",
+      "mappings": [
+        {
+          "if": "direction=forward",
+          "then": {
+            "en": "This waiting aid can be used when going forward on this way"
+          }
+        },
+        {
+          "if": "direction=backward",
+          "then": {
+            "en": "This waiting aid can be used when going backward on this way"
+          }
+        }
+      ],
+      "render": {
+        "en": "This waiting aid can be used when going in {direction} direction"
+      }
+    }
+  ],
+  "lineRendering": [
+    {
+      "width": 1,
+      "color": "blue"
+    }
+  ],
+  "credits:uid": 5093765,
+  "id": "cyclist_waiting_aid",
+  "description": {
+    "en": "Various pieces of infrastructure that aid cyclists while they wait at a traffic light."
+  },
+  "source": {
+    "osmTags": "highway=cyclist_waiting_aid"
+  },
+  "name": {
+    "en": "Cyclist Waiting Aids"
+  },
+  "title": {
+    "render": {
+      "en": "Cyclist Waiting Aid"
+    }
+  },
+  "deletion": {
+    "softDeletionTags": {
+      "and": [
+        "highway=",
+        "side=",
+        "footrest=",
+        "handrest=",
+        "material=",
+        "height=",
+        "support=",
+        "count=",
+        "capacity="
+      ]
+    }
+  },
+  "allowMove": false,
+  "presets": [
+    {
+      "title": {
+        "en": "a cyclist waiting aid"
+      },
+      "tags": [
+        "highway=cyclist_waiting_aid"
+      ],
+      "description": {
+        "en": "A footrest, handrail or other aid, to improve comfort while waiting at traffic lights"
+      },
+      "snapToLayer": [
+        "cycleways_and_roads"
+      ]
+    }
+  ]
+}
\ No newline at end of file
diff --git a/assets/layers/cyclist_waiting_aid/license_info.json b/assets/layers/cyclist_waiting_aid/license_info.json
new file mode 100644
index 000000000..45b87f4de
--- /dev/null
+++ b/assets/layers/cyclist_waiting_aid/license_info.json
@@ -0,0 +1,10 @@
+[
+  {
+    "path": "waiting_aid.svg",
+    "license": "CC0-1.0",
+    "authors": [
+      "Robin van der Linde"
+    ],
+    "sources": []
+  }
+]
\ No newline at end of file
diff --git a/assets/layers/cyclist_waiting_aid/waiting_aid.svg b/assets/layers/cyclist_waiting_aid/waiting_aid.svg
new file mode 100644
index 000000000..f154e0c64
--- /dev/null
+++ b/assets/layers/cyclist_waiting_aid/waiting_aid.svg
@@ -0,0 +1,21 @@
+
diff --git a/assets/layers/cyclist_waiting_aid/waiting_aid.svg.license b/assets/layers/cyclist_waiting_aid/waiting_aid.svg.license
new file mode 100644
index 000000000..75299f884
--- /dev/null
+++ b/assets/layers/cyclist_waiting_aid/waiting_aid.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Robin van der Linde
+SPDX-License-Identifier: CC0-1.0
\ No newline at end of file
diff --git a/assets/layers/item_with_image/item_with_image.json b/assets/layers/item_with_image/item_with_image.json
index c752b6ec7..193a9eadd 100644
--- a/assets/layers/item_with_image/item_with_image.json
+++ b/assets/layers/item_with_image/item_with_image.json
@@ -69,4 +69,4 @@
     "images"
   ],
   "allowMove": false
-}
+}
\ No newline at end of file
diff --git a/assets/layers/questions/questions.json b/assets/layers/questions/questions.json
index 5c3f92532..63029e2a5 100644
--- a/assets/layers/questions/questions.json
+++ b/assets/layers/questions/questions.json
@@ -2972,7 +2972,30 @@
           }
         }
       ]
+    },
+    {
+      "id": "indoor",
+      "question": {
+        "en": "Is this object located indoors?",
+        "nl": "Bevindt dit object zich binnen?"
+      },
+      "mappings": [
+        {
+          "if": "indoor=yes",
+          "then": {
+            "en": "This object is located indoors",
+            "nl": "Dit object bevindt zich binnen"
+          }
+        },
+        {
+          "if": "indoor=no",
+          "then": {
+            "en": "This object is located outdoors",
+            "nl": "Dit object bevindt zich buiten"
+          }
+        }
+      ]
     }
   ],
   "allowMove": false
-}
+}
\ No newline at end of file
diff --git a/assets/layers/tactile_map/tactile_map.json b/assets/layers/tactile_map/tactile_map.json
new file mode 100644
index 000000000..f8fb216ac
--- /dev/null
+++ b/assets/layers/tactile_map/tactile_map.json
@@ -0,0 +1,146 @@
+{
+  "id": "tactile_map",
+  "name": {
+    "en": "Tactile Maps"
+  },
+  "description": {
+    "en": "Layer showing tactile maps, which can be used by visually impaired people to navigate the city."
+  },
+  "source": {
+    "osmTags": "information=tactile_map"
+  },
+  "title": {
+    "en": "Tactile Map"
+  },
+  "presets": [
+    {
+      "tags": [
+        "tourism=information",
+        "information=tactile_map"
+      ],
+      "title": {
+        "en": "a tactile map"
+      },
+      "description": {
+        "en": "A tactile map that can be read using touch. Unlike a tactile model, this is relatively flat and does not feature three-dimensional buildings and such."
+      }
+    }
+  ],
+  "deletion": true,
+  "allowMove": true,
+  "minzoom": 10,
+  "pointRendering": [
+    {
+      "marker": [
+        {
+          "icon": "circle",
+          "color": "white"
+        },
+        {
+          "icon": "./assets/themes/maps/logo.svg"
+        }
+      ],
+      "location": [
+        "point",
+        "centroid"
+      ]
+    }
+  ],
+  "tagRenderings": [
+    "images",
+    {
+      "id": "description",
+      "question": {
+        "en": "What does this tactile map show?"
+      },
+      "freeform": {
+        "key": "blind:description:en",
+        "placeholder": {
+          "en": "e.g. Tactile map of the city center"
+        }
+      },
+      "render": {
+        "en": "Description: {blind:description:en}."
+      }
+    },
+    {
+      "id": "braille",
+      "question": {
+        "en": "Is there braille text on this tactile map?"
+      },
+      "mappings": [
+        {
+          "if": "braille=yes",
+          "then": {
+            "en": "This tactile map has braille text."
+          }
+        },
+        {
+          "if": "braille=no",
+          "then": {
+            "en": "This tactile map does not have braille text."
+          }
+        }
+      ]
+    },
+    {
+      "id": "braille_languages",
+      "condition": "braille=yes",
+      "render": {
+        "special": {
+          "type": "language_chooser",
+          "key": "tactile_writing:braille",
+          "question": {
+            "en": "In which languages is the braille text on this tactile map?"
+          },
+          "render_list_item": {
+            "en": "This map has braille text in {language}"
+          },
+          "render_single_language": {
+            "en": "This map has braille text in {language}"
+          }
+        }
+      }
+    },
+    {
+      "id": "embossed_letters",
+      "question": {
+        "en": "Are there embossed letters on this tactile map?"
+      },
+      "mappings": [
+        {
+          "if": "embossed_letters=yes",
+          "then": {
+            "en": "This tactile map has embossed letters."
+          }
+        },
+        {
+          "if": "embossed_letters=no",
+          "then": {
+            "en": "This tactile map does not have embossed letters."
+          }
+        }
+      ]
+    },
+    {
+      "id": "embossed_letters_languages",
+      "condition": "embossed_letters=yes",
+      "render": {
+        "special": {
+          "type": "language_chooser",
+          "key": "tactile_writing:embossed",
+          "question": {
+            "en": "In which languages are the embossed letters on this tactile map?"
+          },
+          "render_list_item": {
+            "en": "This map has embossed letters in {language}"
+          },
+          "render_single_language": {
+            "en": "This map has embossed letters in {language}"
+          }
+        }
+      }
+    },
+    "website"
+  ]
+}
\ No newline at end of file
diff --git a/assets/layers/tactile_model/license_info.json b/assets/layers/tactile_model/license_info.json
new file mode 100644
index 000000000..8bf12a33c
--- /dev/null
+++ b/assets/layers/tactile_model/license_info.json
@@ -0,0 +1,10 @@
+[
+  {
+    "path": "tactile_model.svg",
+    "license": "CC0-1.0",
+    "authors": [
+      "Robin van der Linde"
+    ],
+    "sources": []
+  }
+]
\ No newline at end of file
diff --git a/assets/layers/tactile_model/tactile_model.json b/assets/layers/tactile_model/tactile_model.json
new file mode 100644
index 000000000..98d98ead3
--- /dev/null
+++ b/assets/layers/tactile_model/tactile_model.json
@@ -0,0 +1,157 @@
+{
+  "id": "tactile_model",
+  "name": {
+    "en": "Tactile Models"
+  },
+  "description": {
+    "en": "Layer showing tactile models, three-dimensional models of the surrounding area."
+  },
+  "source": {
+    "osmTags": "information=tactile_model"
+  },
+  "title": {
+    "en": "Tactile Model"
+  },
+  "presets": [
+    {
+      "tags": [
+        "tourism=information",
+        "information=tactile_model"
+      ],
+      "title": {
+        "en": "a tactile model"
+      },
+      "description": {
+        "en": "A tactile model is a three-dimensional model of an area, allowing people to explore/see an area by touch."
+      }
+    }
+  ],
+  "deletion": true,
+  "allowMove": true,
+  "minzoom": 10,
+  "pointRendering": [
+    {
+      "marker": [
+        {
+          "icon": "./assets/layers/tactile_model/tactile_model.svg"
+        }
+      ],
+      "location": [
+        "point",
+        "centroid"
+      ]
+    }
+  ],
+  "tagRenderings": [
+    "images",
+    {
+      "id": "description",
+      "question": {
+        "en": "What does this tactile model show?"
+      },
+      "freeform": {
+        "key": "blind:description:en",
+        "placeholder": {
+          "en": "e.g. Tactile model of the city center"
+        }
+      },
+      "render": {
+        "en": "Description: {blind:description:en}."
+      }
+    },
+    {
+      "id": "braille",
+      "question": {
+        "en": "Is there a braille description?"
+      },
+      "mappings": [
+        {
+          "if": "braille=yes",
+          "then": {
+            "en": "There is a braille description."
+          }
+        },
+        {
+          "if": "braille=no",
+          "then": {
+            "en": "There is no braille description."
+          }
+        }
+      ]
+    },
+    {
+      "id": "braille_languages",
+      "condition": "braille=yes",
+      "render": {
+        "special": {
+          "type": "language_chooser",
+          "key": "tactile_writing:braille",
+          "question": {
+            "en": "In which languages is there a braille description?"
+          },
+          "render_list_item": {
+            "en": "This model has a braille description in {language()}"
+          },
+          "render_single_language": {
+            "en": "This model has a braille description in {language}"
+          }
+        }
+      }
+    },
+    {
+      "id": "embossed_letters",
+      "question": {
+        "en": "Are there embossed letters describing the model?"
+      },
+      "mappings": [
+        {
+          "if": "embossed_letters=yes",
+          "then": {
+            "en": "There are embossed letters describing the model."
+          }
+        },
+        {
+          "if": "embossed_letters=no",
+          "then": {
+            "en": "There are no embossed letters describing the model."
+          }
+        }
+      ]
+    },
+    {
+      "id": "embossed_letters_languages",
+      "condition": "embossed_letters=yes",
+      "render": {
+        "special": {
+          "type": "language_chooser",
+          "key": "tactile_writing:embossed_letters",
+          "question": {
+            "en": "In which languages are there embossed letters?"
+          },
+          "render_list_item": {
+            "en": "This model has embossed letters in {language()}"
+          },
+          "render_single_language": {
+            "en": "This model has embossed letters in {language}"
+          }
+        }
+      }
+    },
+    {
+      "id": "scale",
+      "question": {
+        "en": "What scale is the model?"
+      },
+      "freeform": {
+        "key": "scale",
+        "placeholder": {
+          "en": "e.g. 1:1000"
+        }
+      },
+      "render": {
+        "en": "The scale of this model is {scale}."
+      }
+    },
+    "website"
+  ]
+}
\ No newline at end of file
diff --git a/assets/layers/tactile_model/tactile_model.svg b/assets/layers/tactile_model/tactile_model.svg
new file mode 100644
index 000000000..e565a43ec
--- /dev/null
+++ b/assets/layers/tactile_model/tactile_model.svg
@@ -0,0 +1,26 @@
+
diff --git a/assets/layers/tactile_model/tactile_model.svg.license b/assets/layers/tactile_model/tactile_model.svg.license
new file mode 100644
index 000000000..2c50b6981
--- /dev/null
+++ b/assets/layers/tactile_model/tactile_model.svg.license
@@ -0,0 +1,2 @@
+SPDX-FileCopyrightText: Robin van der Linde
+SPDX-License-Identifier: CC0
\ No newline at end of file
diff --git a/assets/themes/blind_osm/blind_osm.json b/assets/themes/blind_osm/blind_osm.json
index ab98fa5da..b45f9a4fc 100644
--- a/assets/themes/blind_osm/blind_osm.json
+++ b/assets/themes/blind_osm/blind_osm.json
@@ -117,6 +117,8 @@
         "minzoom": 17
       }
     },
-    "stairs"
+    "stairs",
+    "tactile_map",
+    "tactile_model"
   ]
-}
+}
\ No newline at end of file
diff --git a/assets/themes/cycle_infra/cycle_infra.json b/assets/themes/cycle_infra/cycle_infra.json
index 638efa2ab..4e50ccfec 100644
--- a/assets/themes/cycle_infra/cycle_infra.json
+++ b/assets/themes/cycle_infra/cycle_infra.json
@@ -56,13 +56,18 @@
   "startLon": 3.75,
   "hideFromOverview": false,
   "layers": [
-    "cycleways_and_roads",
-    "barrier",
-    "crossings",
-    "bicycle_counter"
+    {
+      "builtin": [
+        "cycleways_and_roads",
+        "barrier",
+        "crossings",
+        "bicycle_counter",
+        "cyclist_waiting_aid"
+      ],
+      "override": {
+        "minzoom": 16
+      }
+    }
   ],
-  "overrideAll": {
-    "minzoom": 16
-  },
   "enableDownload": true
-}
+}
\ No newline at end of file
diff --git a/assets/themes/rainbow_crossings/rainbow_crossings.json b/assets/themes/rainbow_crossings/rainbow_crossings.json
index 5c5795e4e..c3ac9effa 100644
--- a/assets/themes/rainbow_crossings/rainbow_crossings.json
+++ b/assets/themes/rainbow_crossings/rainbow_crossings.json
@@ -47,12 +47,18 @@
         }
       }
     },
-    "rainbow_crossings",
+    {
+      "builtin": "rainbow_crossings",
+      "override": {
+        "isCounted": false
+      }
+    },
     {
       "builtin": "cycleways_and_roads",
       "override": {
         "minzoom": 18,
-        "name": null
+        "name": null,
+        "isCounted": false
       }
     }
   ],
diff --git a/langs/layers/ca.json b/langs/layers/ca.json
index e6a5d6c34..dd5b6f42e 100644
--- a/langs/layers/ca.json
+++ b/langs/layers/ca.json
@@ -2398,10 +2398,10 @@
                     "1": {
                         "then": "Aquest rellotge està muntat en una paret"
                     },
-                    "2": {
+                    "3": {
                         "then": "Aquest rellotge està muntat en una tanca publicitària"
                     },
-                    "3": {
+                    "4": {
                         "then": "Aquest rellotge està al sòl"
                     }
                 },
@@ -2512,17 +2512,6 @@
                 },
                 "question": "Aquest creuament té una illa al mig?"
             },
-            "crossing-is-zebra": {
-                "mappings": {
-                    "0": {
-                        "then": "Açò és un pas de vianants"
-                    },
-                    "1": {
-                        "then": "Açò no és un pas de vianants"
-                    }
-                },
-                "question": "Açò és un pas de vianants?"
-            },
             "crossing-minimap": {
                 "mappings": {
                     "0": {
diff --git a/langs/layers/cs.json b/langs/layers/cs.json
index 2d7870173..bfe44f4dc 100644
--- a/langs/layers/cs.json
+++ b/langs/layers/cs.json
@@ -2752,10 +2752,10 @@
                     "1": {
                         "then": "Tyto hodiny jsou namontovány na stěně"
                     },
-                    "2": {
+                    "3": {
                         "then": "Tyto hodiny jsou součástí billboardu"
                     },
-                    "3": {
+                    "4": {
                         "then": "Tyto hodiny jsou na zemi"
                     }
                 },
@@ -10198,4 +10198,4 @@
             "render": "větrná turbína"
         }
     }
-}
+}
\ No newline at end of file
diff --git a/langs/layers/de.json b/langs/layers/de.json
index eb37d7a5f..fbad2cede 100644
--- a/langs/layers/de.json
+++ b/langs/layers/de.json
@@ -3296,10 +3296,10 @@
                     "1": {
                         "then": "Diese Uhr ist an einer Wand montiert"
                     },
-                    "2": {
+                    "3": {
                         "then": "Diese Uhr ist Teil einer Werbetafel"
                     },
-                    "3": {
+                    "4": {
                         "then": "Diese Uhr befindet sich auf dem Boden"
                     }
                 },
@@ -12502,4 +12502,4 @@
             "render": "Windrad"
         }
     }
-}
+}
\ No newline at end of file
diff --git a/langs/layers/en.json b/langs/layers/en.json
index 40a36590c..17e217655 100644
--- a/langs/layers/en.json
+++ b/langs/layers/en.json
@@ -3294,12 +3294,15 @@
                         "then": "This clock is mounted on a pole"
                     },
                     "1": {
-                        "then": "This clock is mounted on a wall"
+                        "then": "This clock is mounted on a wall, usually through a support perpendicular to the wall"
                     },
                     "2": {
-                        "then": "This clock is part of a billboard"
+                        "then": "This clock is mounted directly on a wall"
                     },
                     "3": {
+                        "then": "This clock is part of a billboard"
+                    },
+                    "4": {
                         "then": "This clock is on the ground"
                     }
                 },
diff --git a/langs/layers/fr.json b/langs/layers/fr.json
index 9884fee7b..11acf1a16 100644
--- a/langs/layers/fr.json
+++ b/langs/layers/fr.json
@@ -2272,10 +2272,10 @@
                     "1": {
                         "then": "Cette horloge est fixée sur un mur"
                     },
-                    "2": {
+                    "3": {
                         "then": "Cette horloge fait partie d'un panneau publicitaire"
                     },
-                    "3": {
+                    "4": {
                         "then": "Cette horloge est posée au sol"
                     }
                 },
@@ -7567,4 +7567,4 @@
             "render": "éolienne"
         }
     }
-}
+}
\ No newline at end of file
diff --git a/langs/layers/nl.json b/langs/layers/nl.json
index a385b3b2e..50f911246 100644
--- a/langs/layers/nl.json
+++ b/langs/layers/nl.json
@@ -2748,12 +2748,15 @@
                         "then": "Deze klok is bevestigd aan een paal"
                     },
                     "1": {
-                        "then": "Deze klok is bevestigd aan een muur"
+                        "then": "Deze klok is bevestigd aan een muur, meestal met een steun loodrecht op de muur"
                     },
                     "2": {
-                        "then": "Deze klok is onderdeel van een reclamebord"
+                        "then": "Deze klok is rechtstreeks aan een muur bevestigd"
                     },
                     "3": {
+                        "then": "Deze klok is onderdeel van een reclamebord"
+                    },
+                    "4": {
                         "then": "Deze klok staat op de grond"
                     }
                 },
diff --git a/langs/layers/pl.json b/langs/layers/pl.json
index e7ae159ec..218dd4664 100644
--- a/langs/layers/pl.json
+++ b/langs/layers/pl.json
@@ -1356,10 +1356,10 @@
                     "1": {
                         "then": "Ten zegar jest zamontowany na ścianie"
                     },
-                    "2": {
+                    "3": {
                         "then": "Ten zegar jest częścią bilbordu"
                     },
-                    "3": {
+                    "4": {
                         "then": "Ten zegar jest na ziemi"
                     }
                 },
diff --git a/langs/layers/uk.json b/langs/layers/uk.json
index 3a3482d49..7e1437b5c 100644
--- a/langs/layers/uk.json
+++ b/langs/layers/uk.json
@@ -479,7 +479,7 @@
         "tagRenderings": {
             "support": {
                 "mappings": {
-                    "2": {
+                    "3": {
                         "then": "Цей годинник є частиною білборду"
                     }
                 }
@@ -1338,4 +1338,4 @@
             "render": "Утилізація відходів"
         }
     }
-}
+}
\ No newline at end of file
diff --git a/scripts/moveImage.ts b/scripts/moveImage.ts
new file mode 100644
index 000000000..989883eee
--- /dev/null
+++ b/scripts/moveImage.ts
@@ -0,0 +1,91 @@
+import { existsSync, renameSync, readFileSync, writeFileSync } from "fs"
+import SmallLicense from "../src/Models/smallLicense"
+
+/**
+ * Script to move/rename image files
+ * Useful after downloading images from wikimedia commons
+ * Apart from moving the image files, this will also update the license file
+ *
+ * This will NOT update any images in the theme
+ */
+
+function main(args: string[]) {
+    // Check if the correct number of arguments are passed
+    if (args.length != 2) {
+        console.log("Usage: moveImage.ts oldPath newPath")
+        console.log("You passed in the arguments: " + args.join(","))
+        console.log("Example: npx vite-node scripts/moveImage.ts images/old.jpg images/new.jpg")
+        return
+    }
+    const [oldPath, newPath] = args
+
+    // Check if the oldPath exists
+    if (!existsSync(oldPath)) {
+        console.log("The oldPath does not exist: " + oldPath)
+        return
+    }
+
+    // Move file
+    renameSync(oldPath, newPath)
+
+    // If it exists also move the .license file
+    const oldLicensePath = oldPath + ".license"
+    if (existsSync(oldLicensePath)) {
+        const newLicensePath = newPath + ".license"
+        renameSync(oldLicensePath, newLicensePath)
+    }
+
+    console.log("Moved file from " + oldPath + " to " + newPath)
+
+    // Open license_info.json in the same directory as the old file
+    const licensePath = oldPath.replace(/\/[^/]+$/, "/license_info.json")
+    if (!existsSync(licensePath)) {
+        console.log(
+            "The license file does not exist: " +
+                licensePath +
+                ". Skipping writing to license file."
+        )
+        return
+    }
+
+    // Read license file
+    const licenseFile = readFileSync(licensePath, "utf8")
+    const licenseInfo = JSON.parse(licenseFile) as SmallLicense[]
+
+    // Find correct license item
+    const licenseItem = licenseInfo.find((item) => item.path === oldPath.replace(/.*\//, ""))
+
+    // Filter out license item
+    const newLicenseInfo = licenseInfo.filter((item) => item.path !== oldPath.replace(/.*\//, ""))
+    const newLicenseFile = JSON.stringify(newLicenseInfo, null, 2)
+
+    // Write new license file
+    writeFileSync(licensePath, newLicenseFile)
+
+    // Look for a license_info.json file in the new path
+    const newLicensePath = newPath.replace(/\/[^/]+$/, "/license_info.json")
+    if (!existsSync(newLicensePath) && licenseItem) {
+        console.log("License file doesn't exist yet, creating new one: " + newLicensePath)
+
+        // Create new license item
+        const newLicenseItem = licenseItem
+        newLicenseItem.path = newPath.replace(/.*\//, "")
+
+        // Create file
+        writeFileSync(newLicensePath, JSON.stringify([newLicenseItem], null, 2))
+    } else if (licenseItem) {
+        console.log("Appending to existing license file: " + newLicensePath)
+
+        // Create new license item
+        const newLicenseItem = licenseItem
+        newLicenseItem.path = newPath.replace(/.*\//, "")
+
+        // Append to existing file
+        const newLicenseFile = readFileSync(newLicensePath, "utf8")
+        const newLicenseInfo = JSON.parse(newLicenseFile) as SmallLicense[]
+        newLicenseInfo.push(newLicenseItem)
+        writeFileSync(newLicensePath, JSON.stringify(newLicenseInfo, null, 2))
+    }
+}
+
+main(process.argv.slice(2))