You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@baremaps.apache.org by bc...@apache.org on 2023/04/23 21:07:33 UTC

[incubator-baremaps] branch main updated: Improve the osm simplifications (#625)

This is an automated email from the ASF dual-hosted git repository.

bchapuis pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git


The following commit(s) were added to refs/heads/main by this push:
     new c6110125 Improve the osm simplifications (#625)
c6110125 is described below

commit c61101253fa98b7653b63483a28a15bd2b2e4279
Author: Bertil Chapuis <bc...@gmail.com>
AuthorDate: Sun Apr 23 23:07:29 2023 +0200

    Improve the osm simplifications (#625)
    
    * Improve the osm simplifications
    
    * Fix issues in the workflow
    
    * Fix waterway simplifications
---
 .run/basemap-workflow.run.xml                      |  22 ++
 .run/transformation-workflow.run.xml               |  22 ++
 .../function/RelationGeometryBuilder.java          |   2 +-
 .../openstreetmap/function/WayGeometryBuilder.java |   2 +-
 .../baremaps/storage/postgres/PostgresStore.java   |   6 +-
 .../apache/baremaps/workflow/WorkflowExecutor.java |   9 +-
 basemap/layers/aerialway/tileset.js                |   2 +-
 basemap/layers/aeroway/tileset.js                  |   4 +-
 basemap/layers/amenity/tileset.js                  |   2 +-
 basemap/layers/attraction/tileset.js               |   2 +-
 basemap/layers/barrier/tileset.js                  |   2 +-
 .../boundary}/globaladm0_clean.sql                 |   0
 .../boundary}/globaladm0_index.sql                 |   0
 .../boundary}/globaladm0_simplify.sql              |   0
 .../boundary}/globaladm1_clean.sql                 |   0
 .../boundary}/globaladm1_index.sql                 |   0
 .../boundary}/globaladm1_simplify.sql              |   0
 basemap/layers/boundary/tileset.js                 |   6 +-
 basemap/layers/building/tileset.js                 |   4 +-
 .../highway/clean.sql}                             |   2 +-
 .../highway/index.sql}                             |   0
 basemap/layers/highway/prepare.sql                 |  55 ++++
 .../highway/simplify.sql}                          |  37 ++-
 basemap/layers/highway/tileset.js                  |  28 +-
 basemap/layers/landuse/clean.sql                   |  52 ++++
 .../landuse/index.sql}                             |   0
 basemap/layers/landuse/prepare.sql                 | 139 +++++++++
 basemap/layers/landuse/simplify.sql                | 129 +++++++++
 basemap/layers/landuse/tileset.js                  |  14 +-
 basemap/layers/leisure/tileset.js                  |   4 +-
 .../linestring/clean.sql}                          |   2 +-
 .../linestring/index.sql}                          |   4 +-
 .../linestring/prepare.sql}                        |  11 +-
 basemap/layers/man_made/tileset.js                 |   2 +-
 basemap/layers/member/prepare.sql                  |  11 +
 basemap/layers/natural/clean.sql                   |  53 ++++
 .../natural/index.sql}                             |   0
 basemap/layers/natural/prepare.sql                 | 156 +++++++++++
 .../natural/simplify.sql}                          |  36 +--
 basemap/layers/natural/tileset.js                  |  10 +-
 .../ocean/clean.sql}                               |   5 +-
 .../ocean/index.sql}                               |   5 +-
 .../ocean/prepare.sql}                             |  12 +-
 basemap/layers/ocean/tileset.js                    |   4 +-
 basemap/layers/point/clean.sql                     |  34 +++
 basemap/layers/point/index.sql                     |  22 ++
 basemap/layers/point/simplify.sql                  | 110 ++++++++
 basemap/layers/point/tileset.js                    |   2 +-
 .../polygon/clean.sql}                             |   2 +-
 .../polygon/index.sql}                             |   2 +-
 .../polygon/prepare.sql}                           |   8 +-
 basemap/layers/power/tileset.js                    |   4 +-
 .../railway/clean.sql}                             |   2 +-
 .../railway/index.sql}                             |   0
 .../railway/prepare.sql}                           |   3 -
 .../railway/simplify.sql}                          |   0
 basemap/layers/railway/tileset.js                  |   6 +-
 .../osm_water_index.sql => layers/route/clean.sql} |   2 +-
 basemap/layers/route/index.sql                     |  21 ++
 .../route/prepare.sql}                             |  24 +-
 .../route/simplify.sql}                            |  80 +++---
 basemap/layers/route/tileset.js                    |   8 +-
 .../waterway/clean.sql}                            |   2 +-
 basemap/layers/waterway/index.sql                  |  21 ++
 basemap/layers/waterway/prepare.sql                |  56 ++++
 .../waterway/simplify.sql}                         |  80 +++---
 basemap/layers/waterway/tileset.js                 |   6 +-
 basemap/queries/globaladm2_clean.sql               |  31 ---
 basemap/queries/globaladm2_index.sql               |  23 --
 basemap/queries/globaladm2_simplify.sql            |  71 -----
 basemap/queries/osm_boundary.sql                   | 103 -------
 basemap/queries/osm_boundary_index.sql             |  21 --
 basemap/queries/osm_boundary_prepare.sql           |  22 --
 basemap/queries/osm_highway_prepare.sql            |  33 ---
 basemap/queries/osm_landuse_prepare.sql            | 165 -----------
 basemap/queries/osm_landuse_simplify.sql           |  92 ------
 basemap/queries/osm_natural_prepare.sql            | 310 ---------------------
 .../{osm_nodes_prepare.sql => osm_nodes.sql}       |   3 +-
 basemap/queries/osm_nodes_clean.sql                |  33 ---
 basemap/queries/osm_nodes_index.sql                |  22 --
 basemap/queries/osm_nodes_simplify.sql             |  68 -----
 ...osm_relations_prepare.sql => osm_relations.sql} |   4 +-
 basemap/queries/osm_relations_clean.sql            |  33 ---
 basemap/queries/osm_relations_index.sql            |  21 --
 basemap/queries/osm_relations_simplify.sql         | 152 ----------
 .../{osm_relations_prepare.sql => osm_ways.sql}    |   4 +-
 basemap/queries/osm_ways_clean.sql                 |  35 ---
 basemap/queries/osm_ways_index.sql                 |  23 --
 basemap/queries/osm_ways_simplify.sql              | 152 ----------
 basemap/tileset.js                                 |   4 +-
 basemap/workflow.js                                | 274 +++++++++++-------
 examples/transformation/simplifications.sql        |  38 +++
 examples/transformation/style.json                 |  26 ++
 examples/transformation/tileset.json               |  30 ++
 94 files changed, 1392 insertions(+), 1752 deletions(-)

diff --git a/.run/basemap-workflow.run.xml b/.run/basemap-workflow.run.xml
new file mode 100644
index 00000000..e1303fa5
--- /dev/null
+++ b/.run/basemap-workflow.run.xml
@@ -0,0 +1,22 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="basemap-workflow" type="Application" factoryName="Application">
+    <option name="MAIN_CLASS_NAME" value="org.apache.baremaps.cli.Baremaps" />
+    <module name="baremaps-cli" />
+    <option name="PROGRAM_PARAMETERS" value="workflow execute --file workflow.js" />
+    <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/basemap" />
+    <extension name="coverage">
+      <pattern>
+        <option name="PATTERN" value="org.apache.baremaps.server.ogcapi.*" />
+        <option name="ENABLED" value="true" />
+      </pattern>
+    </extension>
+    <extension name="software.aws.toolkits.jetbrains.core.execution.JavaAwsConnectionExtension">
+      <option name="credential" />
+      <option name="region" />
+      <option name="useCurrentConnection" value="false" />
+    </extension>
+    <method v="2">
+      <option name="Make" enabled="true" />
+    </method>
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/.run/transformation-workflow.run.xml b/.run/transformation-workflow.run.xml
new file mode 100644
index 00000000..46f9b4ac
--- /dev/null
+++ b/.run/transformation-workflow.run.xml
@@ -0,0 +1,22 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="transformation-workflow" type="Application" factoryName="Application">
+    <option name="MAIN_CLASS_NAME" value="org.apache.baremaps.cli.Baremaps" />
+    <module name="baremaps-cli" />
+    <option name="PROGRAM_PARAMETERS" value="workflow execute --file workflow.json" />
+    <option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/examples/transformation" />
+    <extension name="coverage">
+      <pattern>
+        <option name="PATTERN" value="org.apache.baremaps.server.ogcapi.*" />
+        <option name="ENABLED" value="true" />
+      </pattern>
+    </extension>
+    <extension name="software.aws.toolkits.jetbrains.core.execution.JavaAwsConnectionExtension">
+      <option name="credential" />
+      <option name="region" />
+      <option name="useCurrentConnection" value="false" />
+    </extension>
+    <method v="2">
+      <option name="Make" enabled="true" />
+    </method>
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/RelationGeometryBuilder.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/RelationGeometryBuilder.java
index 35370f09..67cb4037 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/RelationGeometryBuilder.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/RelationGeometryBuilder.java
@@ -95,7 +95,7 @@ public class RelationGeometryBuilder implements Consumer<Relation> {
         logger.debug("Relation #{} processed in {} ms", relation.id(), duration);
       }
     } catch (Exception e) {
-      logger.warn("Unable to build the geometry for relation #" + relation.id(), e);
+      logger.debug("Unable to build the geometry for relation #" + relation.id(), e);
       relation.setGeometry(GEOMETRY_FACTORY_WGS84.createEmpty(0));
     }
   }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/WayGeometryBuilder.java b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/WayGeometryBuilder.java
index 9a57fcbf..4e3a4b69 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/WayGeometryBuilder.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/openstreetmap/function/WayGeometryBuilder.java
@@ -61,7 +61,7 @@ public class WayGeometryBuilder implements Consumer<Way> {
         }
       }
     } catch (Exception e) {
-      logger.warn("Unable to build the geometry for way #" + way.id(), e);
+      logger.debug("Unable to build the geometry for way #" + way.id(), e);
       way.setGeometry(GEOMETRY_FACTORY_WGS84.createEmpty(0));
     }
   }
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresStore.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresStore.java
index a07e60f9..f932f5ad 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresStore.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/postgres/PostgresStore.java
@@ -140,14 +140,14 @@ public class PostgresStore implements Store {
 
       // Drop the table if it exists
       var dropQuery = dropTable(schema.name());
-      logger.info(dropQuery);
+      logger.debug(dropQuery);
       try (var dropStatement = connection.prepareStatement(dropQuery)) {
         dropStatement.execute();
       }
 
       // Create the table
       var createQuery = createTable(schema);
-      logger.info(createQuery);
+      logger.debug(createQuery);
       try (var createStatement = connection.prepareStatement(createQuery)) {
         createStatement.execute();
       }
@@ -155,7 +155,7 @@ public class PostgresStore implements Store {
       // Copy the data
       PGConnection pgConnection = connection.unwrap(PGConnection.class);
       var copyQuery = copy(schema);
-      logger.info(copyQuery);
+      logger.debug(copyQuery);
       try (var writer = new CopyWriter(new PGCopyOutputStream(pgConnection, copyQuery))) {
         writer.writeHeader();
         var rowIterator = table.iterator();
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/workflow/WorkflowExecutor.java b/baremaps-core/src/main/java/org/apache/baremaps/workflow/WorkflowExecutor.java
index 59441c33..2b3d3d05 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/workflow/WorkflowExecutor.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/workflow/WorkflowExecutor.java
@@ -138,9 +138,16 @@ public class WorkflowExecutor implements AutoCloseable {
     // Time the execution of the tasks
     var measures = new ArrayList<TaskMeasure>();
 
+    // Get the step from the workflow and skip it if it does not exist.
+    // This allows to comment out steps in the workflow without breaking the execution.
+    var step = steps.get(stepId);
+    if (step == null) {
+      logger.warn("Step {} does not exist and will be skipped", stepId);
+      return future;
+    }
+
     // Chain the tasks of the step to the future so that they are executed
     // sequentially when the previous future step completes.
-    var step = steps.get(stepId);
     var tasks = step.getTasks();
     for (var task : tasks) {
       future = future.thenRunAsync(() -> {
diff --git a/basemap/layers/aerialway/tileset.js b/basemap/layers/aerialway/tileset.js
index 663cc305..86ef9e30 100644
--- a/basemap/layers/aerialway/tileset.js
+++ b/basemap/layers/aerialway/tileset.js
@@ -16,7 +16,7 @@ export default {
             minzoom: 13,
             maxzoom: 20,
             sql:
-                "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'aerialway'",
+                "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'aerialway'",
         },
     ],
 }
diff --git a/basemap/layers/aeroway/tileset.js b/basemap/layers/aeroway/tileset.js
index 1d92475d..d63d2555 100644
--- a/basemap/layers/aeroway/tileset.js
+++ b/basemap/layers/aeroway/tileset.js
@@ -13,10 +13,10 @@ export default {
     id: 'aeroway',
     queries: [
         {
-            minzoom: 12,
+            minzoom: 13,
             maxzoom: 20,
             sql:
-                "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'aeroway'",
+                "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'aeroway'",
         },
     ],
 }
diff --git a/basemap/layers/amenity/tileset.js b/basemap/layers/amenity/tileset.js
index 03271bd1..7afc744e 100644
--- a/basemap/layers/amenity/tileset.js
+++ b/basemap/layers/amenity/tileset.js
@@ -15,7 +15,7 @@ export default {
         {
             minzoom: 13,
             maxzoom: 20,
-            sql: "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'amenity'",
+            sql: "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'amenity'",
         },
     ],
 }
diff --git a/basemap/layers/attraction/tileset.js b/basemap/layers/attraction/tileset.js
index 0a109e03..ce9d3db0 100644
--- a/basemap/layers/attraction/tileset.js
+++ b/basemap/layers/attraction/tileset.js
@@ -15,7 +15,7 @@ export default {
         {
             minzoom: 13,
             maxzoom: 20,
-            sql: "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'attraction'",
+            sql: "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'attraction'",
         },
     ],
 }
diff --git a/basemap/layers/barrier/tileset.js b/basemap/layers/barrier/tileset.js
index 14862282..0bba4d85 100644
--- a/basemap/layers/barrier/tileset.js
+++ b/basemap/layers/barrier/tileset.js
@@ -16,7 +16,7 @@ export default {
             minzoom: 14,
             maxzoom: 20,
             sql:
-                "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'barrier'",
+                "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'barrier'",
         },
     ],
 }
diff --git a/basemap/queries/globaladm0_clean.sql b/basemap/layers/boundary/globaladm0_clean.sql
similarity index 100%
rename from basemap/queries/globaladm0_clean.sql
rename to basemap/layers/boundary/globaladm0_clean.sql
diff --git a/basemap/queries/globaladm0_index.sql b/basemap/layers/boundary/globaladm0_index.sql
similarity index 100%
rename from basemap/queries/globaladm0_index.sql
rename to basemap/layers/boundary/globaladm0_index.sql
diff --git a/basemap/queries/globaladm0_simplify.sql b/basemap/layers/boundary/globaladm0_simplify.sql
similarity index 100%
rename from basemap/queries/globaladm0_simplify.sql
rename to basemap/layers/boundary/globaladm0_simplify.sql
diff --git a/basemap/queries/globaladm1_clean.sql b/basemap/layers/boundary/globaladm1_clean.sql
similarity index 100%
rename from basemap/queries/globaladm1_clean.sql
rename to basemap/layers/boundary/globaladm1_clean.sql
diff --git a/basemap/queries/globaladm1_index.sql b/basemap/layers/boundary/globaladm1_index.sql
similarity index 100%
rename from basemap/queries/globaladm1_index.sql
rename to basemap/layers/boundary/globaladm1_index.sql
diff --git a/basemap/queries/globaladm1_simplify.sql b/basemap/layers/boundary/globaladm1_simplify.sql
similarity index 100%
rename from basemap/queries/globaladm1_simplify.sql
rename to basemap/layers/boundary/globaladm1_simplify.sql
diff --git a/basemap/layers/boundary/tileset.js b/basemap/layers/boundary/tileset.js
index 8bcfc19c..09111907 100644
--- a/basemap/layers/boundary/tileset.js
+++ b/basemap/layers/boundary/tileset.js
@@ -16,19 +16,19 @@ export default {
             minzoom: 1,
             maxzoom: 6,
             sql:
-                "SELECT fid as id, jsonb_build_object('boundary', 'administrative', 'admin_level', '0') as tags, st_setsrid(geom, 3857) FROM globaladm0_z$zoom",
+                "SELECT fid as id, jsonb_build_object('boundary', 'administrative', 'admin_level', '0') as tags, geom FROM globaladm0_z$zoom",
         },
         {
             minzoom: 6,
             maxzoom: 14,
             sql:
-                "SELECT fid as id, jsonb_build_object('boundary', 'administrative', 'admin_level', '1') as tags, st_setsrid(geom, 3857) FROM globaladm1_z$zoom",
+                "SELECT fid as id, jsonb_build_object('boundary', 'administrative', 'admin_level', '1') as tags, geom FROM globaladm1_z$zoom",
         },
         {
             minzoom: 14,
             maxzoom: 20,
             sql:
-                "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'boundary'",
+                "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'boundary'",
         },
     ],
 }
diff --git a/basemap/layers/building/tileset.js b/basemap/layers/building/tileset.js
index b58672b1..60f42607 100644
--- a/basemap/layers/building/tileset.js
+++ b/basemap/layers/building/tileset.js
@@ -16,13 +16,13 @@ export default {
             minzoom: 13,
             maxzoom: 20,
             sql:
-                "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'building'",
+                "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'building'",
         },
         {
             minzoom: 13,
             maxzoom: 20,
             sql:
-                "SELECT id, tags, geom FROM osm_relations_z$zoom WHERE tags ? 'building'",
+                "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'building'",
         },
     ],
 }
diff --git a/basemap/queries/osm_water_index.sql b/basemap/layers/highway/clean.sql
similarity index 85%
copy from basemap/queries/osm_water_index.sql
copy to basemap/layers/highway/clean.sql
index 8e6c537d..fccb606a 100644
--- a/basemap/queries/osm_water_index.sql
+++ b/basemap/layers/highway/clean.sql
@@ -7,4 +7,4 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX water_polygons_geometry_index ON water_polygons_shp USING SPGIST(geometry);
+DROP MATERIALIZED VIEW IF EXISTS osm_highway CASCADE;
diff --git a/basemap/queries/osm_highway_index.sql b/basemap/layers/highway/index.sql
similarity index 100%
rename from basemap/queries/osm_highway_index.sql
rename to basemap/layers/highway/index.sql
diff --git a/basemap/layers/highway/prepare.sql b/basemap/layers/highway/prepare.sql
new file mode 100644
index 00000000..8ec65b5f
--- /dev/null
+++ b/basemap/layers/highway/prepare.sql
@@ -0,0 +1,55 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+DROP MATERIALIZED VIEW IF EXISTS osm_highway CASCADE;
+
+CREATE MATERIALIZED VIEW osm_highway AS
+WITH
+    -- Filter the linestrings
+    filtered AS (
+        SELECT
+                tags -> 'highway' AS highway,
+                geom AS geom
+        FROM osm_linestring
+        WHERE tags ->> 'highway' IN ('motorway', 'motorway_link', 'trunk', 'trunk_link', 'primary', 'primary_link', 'secondary', 'secondary_link', 'tertiary',  'tertiary_link', 'unclassified', 'residential')
+    ),
+    -- Cluster the linestrings by highway type
+    clustered AS (
+        SELECT
+                highway AS highway,
+                geom as geom,
+                ST_ClusterDBSCAN(geom, 0, 1) OVER (PARTITION BY highway) AS cluster
+        FROM
+            filtered
+    ),
+    -- Merge the linestrings into a single geometry per cluster
+    merged AS (
+        SELECT
+            highway AS highway,
+            ST_LineMerge(ST_Collect(geom)) AS geom
+        FROM
+            clustered
+        GROUP BY
+            highway, cluster
+    ),
+    -- Explode the merged linestrings into individual linestrings
+    exploded AS (
+        SELECT
+            highway AS highway,
+            (ST_Dump(geom)).geom AS geom
+        FROM
+            merged
+    )
+SELECT
+    row_number() OVER () AS id,
+    jsonb_build_object('highway', highway) AS tags,
+    geom AS geom
+FROM exploded;
+
+CREATE INDEX IF NOT EXISTS osm_highway_geom_index ON osm_highway USING SPGIST (geom);
diff --git a/basemap/queries/osm_highway_simplify.sql b/basemap/layers/highway/simplify.sql
similarity index 73%
rename from basemap/queries/osm_highway_simplify.sql
rename to basemap/layers/highway/simplify.sql
index cc01b46f..be92cef7 100644
--- a/basemap/queries/osm_highway_simplify.sql
+++ b/basemap/layers/highway/simplify.sql
@@ -7,6 +7,7 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
+
 CREATE VIEW osm_highway_z20 AS
 SELECT id, tags, geom FROM osm_highway;
 
@@ -34,59 +35,71 @@ SELECT id, tags, geom FROM osm_highway;
 CREATE MATERIALIZED VIEW osm_highway_z12 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 12)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 12)), 2))
+  AND tags ->> 'highway' IN ( 'motorway', 'motorway_link',  'trunk', 'trunk_link',  'primary', 'primary_link',  'secondary', 'secondary_link',  'tertiary', 'tertiary_link', 'unclassified', 'residential');
 
 CREATE MATERIALIZED VIEW osm_highway_z11 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 11)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 11)), 2))
+  AND tags ->> 'highway' IN ( 'motorway', 'motorway_link',  'trunk', 'trunk_link',  'primary', 'primary_link',  'secondary', 'secondary_link',  'tertiary', 'tertiary_link', 'unclassified', 'residential');
 
 CREATE MATERIALIZED VIEW osm_highway_z10 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 10)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 10)), 2))
+  AND tags ->> 'highway' IN ( 'motorway', 'motorway_link',  'trunk', 'trunk_link',  'primary', 'primary_link',  'secondary', 'secondary_link',  'tertiary', 'tertiary_link');
 
 CREATE MATERIALIZED VIEW osm_highway_z9 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 9)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 9)), 2))
+  AND tags ->> 'highway' IN ( 'motorway', 'motorway_link',  'trunk', 'trunk_link',  'primary', 'primary_link',  'secondary', 'secondary_link');
 
 CREATE MATERIALIZED VIEW osm_highway_z8 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 8)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 8)), 2))
+  AND tags ->> 'highway' IN ( 'motorway',  'trunk',  'primary');
 
 CREATE MATERIALIZED VIEW osm_highway_z7 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 7)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 7)), 2))
+  AND tags ->> 'highway' IN ( 'motorway',  'trunk',  'primary');
 
 CREATE MATERIALIZED VIEW osm_highway_z6 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 6)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 6)), 2))
+  AND tags ->> 'highway' IN ( 'motorway',  'trunk',  'primary');
 
 CREATE MATERIALIZED VIEW osm_highway_z5 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 5)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 5)), 2))
+  AND tags ->> 'highway' IN ( 'motorway');
 
 CREATE MATERIALIZED VIEW osm_highway_z4 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 4)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 4)), 2))
+  AND tags ->> 'highway' IN ( 'motorway');
 
 CREATE MATERIALIZED VIEW osm_highway_z3 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 3)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 3)), 2))
+  AND tags ->> 'highway' IN ( 'motorway');
 
 CREATE MATERIALIZED VIEW osm_highway_z2 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 2)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 2)), 2))
+  AND tags ->> 'highway' IN ( 'motorway');
 
 CREATE MATERIALIZED VIEW osm_highway_z1 AS
 SELECT id, tags, geom
 FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom FROM osm_highway) AS osm_highway
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 1)), 2));
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 1)), 2))
+  AND tags ->> 'highway' IN ( 'motorway');
diff --git a/basemap/layers/highway/tileset.js b/basemap/layers/highway/tileset.js
index 5982a28e..aca47d06 100644
--- a/basemap/layers/highway/tileset.js
+++ b/basemap/layers/highway/tileset.js
@@ -14,39 +14,15 @@ export default {
     queries: [
         {
             minzoom: 4,
-            maxzoom: 6,
-            sql:
-                "SELECT id, tags, geom FROM osm_highway_z$zoom WHERE tags ->> 'highway' IN ( 'motorway')",
-        },
-        {
-            minzoom: 6,
-            maxzoom: 9,
-            sql:
-                "SELECT id, tags, geom FROM osm_highway_z$zoom WHERE tags ->> 'highway' IN ( 'motorway',  'trunk',  'primary')",
-        },
-        {
-            minzoom: 9,
-            maxzoom: 10,
-            sql:
-                "SELECT id, tags, geom FROM osm_highway_z$zoom WHERE tags ->> 'highway' IN ( 'motorway', 'motorway_link',  'trunk', 'trunk_link',  'primary', 'primary_link',  'secondary', 'secondary_link')",
-        },
-        {
-            minzoom: 10,
-            maxzoom: 11,
-            sql:
-                "SELECT id, tags, geom FROM osm_highway_z$zoom WHERE tags ->> 'highway' IN ( 'motorway', 'motorway_link',  'trunk', 'trunk_link',  'primary', 'primary_link',  'secondary', 'secondary_link',  'tertiary', 'tertiary_link')",
-        },
-        {
-            minzoom: 11,
             maxzoom: 14,
             sql:
-                "SELECT id, tags, geom FROM osm_highway_z$zoom WHERE tags ->> 'highway' IN ( 'motorway', 'motorway_link',  'trunk', 'trunk_link',  'primary', 'primary_link',  'secondary', 'secondary_link',  'tertiary', 'tertiary_link', 'unclassified', 'residential')",
+                "SELECT id, tags, geom FROM osm_highway_z$zoom",
         },
         {
             minzoom: 14,
             maxzoom: 20,
             sql:
-                "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'highway'",
+                "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'highway'",
         },
     ],
 }
diff --git a/basemap/layers/landuse/clean.sql b/basemap/layers/landuse/clean.sql
new file mode 100644
index 00000000..22c4e035
--- /dev/null
+++ b/basemap/layers/landuse/clean.sql
@@ -0,0 +1,52 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_filtered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_clustered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_grouped CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_buffered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_exploded CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse CASCADE;
+
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_medium_filtered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_medium_clustered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_medium_grouped CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_medium_buffered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_medium_exploded CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_medium CASCADE;
+
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_small_filtered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_small_clustered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_small_grouped CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_small_buffered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_small_exploded CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_small CASCADE;
+
+DROP VIEW IF EXISTS osm_landuse_z20 CASCADE;
+DROP VIEW IF EXISTS osm_landuse_z19 CASCADE;
+DROP VIEW IF EXISTS osm_landuse_z18 CASCADE;
+DROP VIEW IF EXISTS osm_landuse_z17 CASCADE;
+DROP VIEW IF EXISTS osm_landuse_z16 CASCADE;
+DROP VIEW IF EXISTS osm_landuse_z15 CASCADE;
+DROP VIEW IF EXISTS osm_landuse_z14 CASCADE;
+DROP VIEW IF EXISTS osm_landuse_z13 CASCADE;
+
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z12 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z11 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z10 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z9 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z8 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z7 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z6 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z5 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z4 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z3 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z2 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_landuse_z1 CASCADE;
+
diff --git a/basemap/queries/osm_landuse_index.sql b/basemap/layers/landuse/index.sql
similarity index 100%
rename from basemap/queries/osm_landuse_index.sql
rename to basemap/layers/landuse/index.sql
diff --git a/basemap/layers/landuse/prepare.sql b/basemap/layers/landuse/prepare.sql
new file mode 100644
index 00000000..563d1d4f
--- /dev/null
+++ b/basemap/layers/landuse/prepare.sql
@@ -0,0 +1,139 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+CREATE MATERIALIZED VIEW osm_landuse_filtered AS
+SELECT
+    tags -> 'landuse' AS landuse,
+    st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom
+FROM osm_polygon
+WHERE geom IS NOT NULL
+  AND st_area(geom) > 78270 / power(2, 12) * 100
+  AND tags ->> 'landuse' IN ('residential', 'farmland', 'forest', 'meadow', 'orchard', 'vineyard', 'salt_pond', 'water');
+CREATE INDEX IF NOT EXISTS osm_landuse_filtered_geom_idx ON osm_landuse_filtered USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_landuse_filtered_tags_idx ON osm_landuse_filtered (landuse);
+
+CREATE MATERIALIZED VIEW osm_landuse_clustered AS
+SELECT
+    landuse,
+    geom,
+    st_clusterdbscan(geom, 0, 0) OVER(PARTITION BY landuse) AS cluster
+FROM osm_landuse_filtered
+WHERE geom IS NOT NULL;
+CREATE INDEX IF NOT EXISTS osm_landuse_clustered_geom_idx ON osm_landuse_clustered USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_landuse_clustered_tags_idx ON osm_landuse_clustered (landuse);
+
+CREATE MATERIALIZED VIEW osm_landuse_grouped AS
+SELECT
+    landuse,
+    st_collect(geom) AS geom
+FROM osm_landuse_clustered
+GROUP BY landuse, cluster;
+
+CREATE MATERIALIZED VIEW osm_landuse_buffered AS
+SELECT
+    landuse,
+    st_buffer(geom, 0, 'join=mitre') AS geom
+FROM osm_landuse_grouped;
+
+CREATE MATERIALIZED VIEW osm_landuse_exploded AS
+SELECT
+    landuse,
+    (st_dump(geom)).geom AS geom
+FROM osm_landuse_buffered;
+
+CREATE MATERIALIZED VIEW osm_landuse AS
+SELECT
+    row_number() OVER () AS id,
+    jsonb_build_object('landuse', landuse) AS tags,
+    geom
+FROM osm_landuse_exploded;
+
+CREATE MATERIALIZED VIEW osm_landuse_medium_filtered AS
+SELECT
+    id,
+    tags -> 'landuse' as landuse,
+    st_buffer(st_simplifypreservetopology(geom, 78270 / power(2, 8)), 78270 / power(2, 8), 'join=mitre') AS geom
+FROM osm_landuse
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 8), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_medium_clustered AS
+SELECT
+    landuse,
+    geom,
+    st_clusterdbscan(geom, 0, 0) OVER(PARTITION BY landuse) AS cluster
+FROM osm_landuse_medium_filtered;
+
+CREATE MATERIALIZED VIEW osm_landuse_medium_grouped AS
+SELECT
+    landuse,
+    cluster,
+    st_collect(geom) AS geom
+FROM osm_landuse_medium_clustered
+GROUP BY landuse, cluster;
+
+CREATE MATERIALIZED VIEW osm_landuse_medium_buffered AS
+SELECT
+    landuse,
+    st_buffer(geom, -78270 / power(2, 8), 'join=mitre') AS geom
+FROM osm_landuse_medium_grouped;
+
+CREATE MATERIALIZED VIEW osm_landuse_medium_exploded AS
+SELECT
+    landuse,
+    (st_dump(geom)).geom AS geom
+FROM osm_landuse_medium_buffered;
+
+CREATE MATERIALIZED VIEW osm_landuse_medium AS
+SELECT
+    row_number() OVER () AS id,
+    jsonb_build_object('landuse', landuse) AS tags,
+    geom AS geom
+FROM osm_landuse_medium_buffered;
+
+CREATE MATERIALIZED VIEW osm_landuse_small_filtered AS
+SELECT
+    id,
+    tags -> 'landuse' as landuse,
+    st_buffer(st_simplifypreservetopology(geom, 78270 / power(2, 4)), 78270 / power(2, 4), 'join=mitre') AS geom
+FROM osm_landuse
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 4), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_small_clustered AS
+SELECT
+    landuse,
+    geom,
+    st_clusterdbscan(geom, 0, 0) OVER(PARTITION BY landuse) AS cluster
+FROM osm_landuse_small_filtered;
+
+CREATE MATERIALIZED VIEW osm_landuse_small_grouped AS
+SELECT
+    landuse,
+    cluster,
+    st_collect(geom) AS geom
+FROM osm_landuse_small_clustered
+GROUP BY landuse, cluster;
+
+CREATE MATERIALIZED VIEW osm_landuse_small_buffered AS
+SELECT
+    landuse,
+    st_buffer(geom, -78270 / power(2, 4), 'join=mitre') AS geom
+FROM osm_landuse_small_grouped;
+
+CREATE MATERIALIZED VIEW osm_landuse_small_exploded AS
+SELECT
+    landuse,
+    (st_dump(geom)).geom AS geom
+FROM osm_landuse_small_buffered;
+
+CREATE MATERIALIZED VIEW osm_landuse_small AS
+SELECT
+            row_number() OVER () AS id,
+            jsonb_build_object('landuse', landuse) AS tags,
+            geom AS geom
+FROM osm_landuse_small_buffered;
diff --git a/basemap/layers/landuse/simplify.sql b/basemap/layers/landuse/simplify.sql
new file mode 100644
index 00000000..bf911761
--- /dev/null
+++ b/basemap/layers/landuse/simplify.sql
@@ -0,0 +1,129 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+
+CREATE VIEW osm_landuse_z20 AS
+SELECT id, tags, geom FROM osm_landuse;
+
+CREATE VIEW osm_landuse_z19 AS
+SELECT id, tags, geom FROM osm_landuse;
+
+CREATE VIEW osm_landuse_z18 AS
+SELECT id, tags, geom FROM osm_landuse;
+
+CREATE VIEW osm_landuse_z17 AS
+SELECT id, tags, geom FROM osm_landuse;
+
+CREATE VIEW osm_landuse_z16 AS
+SELECT id, tags, geom FROM osm_landuse;
+
+CREATE VIEW osm_landuse_z15 AS
+SELECT id, tags, geom FROM osm_landuse;
+
+CREATE VIEW osm_landuse_z14 AS
+SELECT id, tags, geom FROM osm_landuse;
+
+CREATE VIEW osm_landuse_z13 AS
+SELECT id, tags, geom FROM osm_landuse;
+
+CREATE MATERIALIZED VIEW osm_landuse_z12 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom
+FROM osm_landuse
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 12), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z11 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom
+FROM osm_landuse
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 11), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z10 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom
+FROM osm_landuse
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 10), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z9 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom
+FROM osm_landuse
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 9), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z8 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom
+FROM osm_landuse_medium
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 8), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z7 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom
+FROM osm_landuse_medium
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 7), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z6 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom
+FROM osm_landuse_medium
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 6), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z5 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom
+FROM osm_landuse_medium
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 5), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z4 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom
+FROM osm_landuse_small
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 4), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z3 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom
+FROM osm_landuse_small
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 3), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z2 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom
+FROM osm_landuse_small
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 2), 2);
+
+CREATE MATERIALIZED VIEW osm_landuse_z1 AS
+SELECT
+    id,
+    tags,
+    st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom
+FROM osm_landuse_small
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 1), 2);
diff --git a/basemap/layers/landuse/tileset.js b/basemap/layers/landuse/tileset.js
index a3130f97..fe5d088c 100644
--- a/basemap/layers/landuse/tileset.js
+++ b/basemap/layers/landuse/tileset.js
@@ -14,25 +14,25 @@ export default {
     queries: [
         {
             minzoom: 3,
-            maxzoom: 6,
+            maxzoom: 8,
             sql:
                 "SELECT id, tags, geom FROM osm_landuse_z$zoom WHERE tags ->> 'landuse' IN ('farmland', 'forest', 'meadow')",
         },
         {
-            minzoom: 6,
-            maxzoom: 12,
+            minzoom: 8,
+            maxzoom: 13,
             sql:
                 "SELECT id, tags, geom FROM osm_landuse_z$zoom WHERE tags ->> 'landuse' IN ('farmland', 'forest', 'meadow', 'residential', 'vineyard')",
         },
         {
-            minzoom: 12,
+            minzoom: 13,
             maxzoom: 20,
-            sql: "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'landuse'"
+            sql: "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'landuse'"
         },
         {
-            minzoom: 12,
+            minzoom: 13,
             maxzoom: 20,
-            sql: "SELECT id, tags, geom FROM osm_relations_z$zoom WHERE tags ? 'landuse'"
+            sql: "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'landuse'"
         }
     ],
 }
diff --git a/basemap/layers/leisure/tileset.js b/basemap/layers/leisure/tileset.js
index 771d1fe9..e5a443b6 100644
--- a/basemap/layers/leisure/tileset.js
+++ b/basemap/layers/leisure/tileset.js
@@ -16,13 +16,13 @@ export default {
             minzoom: 13,
             maxzoom: 20,
             sql:
-                "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'leisure'",
+                "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'leisure'",
         },
         {
             minzoom: 13,
             maxzoom: 20,
             sql:
-                "SELECT id, tags, geom FROM osm_relations_z$zoom WHERE tags ? 'leisure'",
+                "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'leisure'",
         },
     ],
 }
diff --git a/basemap/queries/osm_simplified_water_index.sql b/basemap/layers/linestring/clean.sql
similarity index 82%
rename from basemap/queries/osm_simplified_water_index.sql
rename to basemap/layers/linestring/clean.sql
index bbf7aa0e..bf2cc6e1 100644
--- a/basemap/queries/osm_simplified_water_index.sql
+++ b/basemap/layers/linestring/clean.sql
@@ -7,4 +7,4 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX simplified_water_polygons_geometry_index ON simplified_water_polygons_shp USING SPGIST(geometry);
+DROP MATERIALIZED VIEW IF EXISTS osm_linestring CASCADE;
diff --git a/basemap/queries/osm_relations_prepare.sql b/basemap/layers/linestring/index.sql
similarity index 75%
copy from basemap/queries/osm_relations_prepare.sql
copy to basemap/layers/linestring/index.sql
index 25225087..1b8515f5 100644
--- a/basemap/queries/osm_relations_prepare.sql
+++ b/basemap/layers/linestring/index.sql
@@ -7,5 +7,5 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX osm_relations_tags_index ON osm_relations USING gin (tags);
-CREATE INDEX osm_relations_geom_index ON osm_relations USING spgist (geom);
+CREATE INDEX IF NOT EXISTS osm_linestring_tags_index ON osm_linestring USING gin (tags);
+CREATE INDEX IF NOT EXISTS osm_linestring_geom_index ON osm_linestring USING gist (geom);
\ No newline at end of file
diff --git a/basemap/queries/osm_linestring.sql b/basemap/layers/linestring/prepare.sql
similarity index 66%
copy from basemap/queries/osm_linestring.sql
copy to basemap/layers/linestring/prepare.sql
index 230797ab..24683658 100644
--- a/basemap/queries/osm_linestring.sql
+++ b/basemap/layers/linestring/prepare.sql
@@ -7,12 +7,15 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-DROP VIEW IF EXISTS osm_linestring CASCADE;
+DROP TABLE IF EXISTS osm_linestring CASCADE;
 
-CREATE VIEW osm_linestring AS
+CREATE MATERIALIZED VIEW osm_linestring AS
 SELECT id, tags, geom
 FROM osm_ways
-LEFT JOIN osm_ways_member ON id = way_id
+LEFT JOIN osm_member ON id = member_ref
 WHERE ST_GeometryType(osm_ways.geom) = 'ST_LineString'
   AND tags != '{}'
-  AND way_id IS NULL;
+  AND member_ref IS NULL;
+
+CREATE INDEX IF NOT EXISTS osm_linestring_tags_index ON osm_linestring USING gin (tags);
+CREATE INDEX IF NOT EXISTS osm_linestring_geom_index ON osm_linestring USING gist (geom);
diff --git a/basemap/layers/man_made/tileset.js b/basemap/layers/man_made/tileset.js
index e2539de0..4a9a12b0 100644
--- a/basemap/layers/man_made/tileset.js
+++ b/basemap/layers/man_made/tileset.js
@@ -15,7 +15,7 @@ export default {
         {
             "minzoom": 14,
             "maxzoom": 20,
-            "sql": "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'man_made'"
+            "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'man_made'"
         }
     ]
 }
diff --git a/basemap/layers/member/prepare.sql b/basemap/layers/member/prepare.sql
new file mode 100644
index 00000000..7d54f9af
--- /dev/null
+++ b/basemap/layers/member/prepare.sql
@@ -0,0 +1,11 @@
+DROP MATERIALIZED VIEW IF EXISTS osm_member CASCADE;
+
+CREATE MATERIALIZED VIEW osm_member AS
+SELECT DISTINCT member_ref as member_ref
+FROM osm_relations, unnest(member_types, member_refs) AS way(member_type, member_ref)
+WHERE geom IS NOT NULL
+  AND member_type = 1
+  AND tags ->> 'type' = 'multipolygon'
+  AND NOT tags ->> 'natural' = 'coastline';
+
+CREATE INDEX osm_member_index ON osm_member(member_ref);
\ No newline at end of file
diff --git a/basemap/layers/natural/clean.sql b/basemap/layers/natural/clean.sql
new file mode 100644
index 00000000..52e8ae76
--- /dev/null
+++ b/basemap/layers/natural/clean.sql
@@ -0,0 +1,53 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_filtered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_clustered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_grouped CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_buffered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_exploded CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural CASCADE;
+
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_medium_filtered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_medium_clustered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_medium_grouped CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_medium_buffered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_medium_exploded CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_medium CASCADE;
+
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_small_filtered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_small_clustered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_small_grouped CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_small_buffered CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_small_exploded CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_small CASCADE;
+
+DROP VIEW IF EXISTS osm_natural_z20 CASCADE;
+DROP VIEW IF EXISTS osm_natural_z19 CASCADE;
+DROP VIEW IF EXISTS osm_natural_z18 CASCADE;
+DROP VIEW IF EXISTS osm_natural_z17 CASCADE;
+DROP VIEW IF EXISTS osm_natural_z16 CASCADE;
+DROP VIEW IF EXISTS osm_natural_z15 CASCADE;
+DROP VIEW IF EXISTS osm_natural_z14 CASCADE;
+DROP VIEW IF EXISTS osm_natural_z13 CASCADE;
+
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z12 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z11 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z10 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z9 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z8 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z7 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z6 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z5 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z4 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z3 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z2 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_natural_z1 CASCADE;
+
diff --git a/basemap/queries/osm_natural_index.sql b/basemap/layers/natural/index.sql
similarity index 100%
rename from basemap/queries/osm_natural_index.sql
rename to basemap/layers/natural/index.sql
diff --git a/basemap/layers/natural/prepare.sql b/basemap/layers/natural/prepare.sql
new file mode 100644
index 00000000..911c6af6
--- /dev/null
+++ b/basemap/layers/natural/prepare.sql
@@ -0,0 +1,156 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+
+-- ('grassland', 'heath', 'scrub', 'wood', 'bay', 'beach', 'glacier', 'mud', 'shingle', 'shoal', 'strait', 'water', 'wetland', 'bare_rock', 'sand', 'scree');
+
+CREATE MATERIALIZED VIEW osm_natural_filtered AS
+SELECT
+    tags -> 'natural' AS natural_value,
+    st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom
+FROM osm_polygon
+WHERE geom IS NOT NULL
+  AND st_area(geom) > 78270 / power(2, 12) * 100
+  AND tags ->> 'natural' IN ('grassland', 'heath', 'scrub', 'wood', 'bay', 'beach', 'glacier', 'mud', 'shingle', 'shoal', 'strait', 'water', 'wetland', 'bare_rock', 'sand', 'scree');
+CREATE INDEX IF NOT EXISTS osm_natural_filtered_geom_idx ON osm_natural_filtered USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_natural_filtered_tags_idx ON osm_natural_filtered (natural_value);
+
+CREATE MATERIALIZED VIEW osm_natural_clustered AS
+SELECT
+    natural_value,
+    geom,
+    st_clusterdbscan(geom, 0, 0) OVER(PARTITION BY natural_value) AS cluster
+FROM osm_natural_filtered
+WHERE geom IS NOT NULL;
+CREATE INDEX IF NOT EXISTS osm_natural_clustered_geom_idx ON osm_natural_clustered USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_natural_clustered_tags_idx ON osm_natural_clustered (natural_value);
+
+CREATE MATERIALIZED VIEW osm_natural_grouped AS
+SELECT
+    natural_value,
+    st_collect(geom) AS geom
+FROM osm_natural_clustered
+GROUP BY natural_value, cluster;
+
+CREATE MATERIALIZED VIEW osm_natural_buffered AS
+SELECT
+    natural_value,
+    st_buffer(geom, 0, 'join=mitre') AS geom
+FROM osm_natural_grouped;
+
+CREATE MATERIALIZED VIEW osm_natural_exploded AS
+SELECT
+    natural_value,
+    (st_dump(geom)).geom AS geom
+FROM osm_natural_buffered;
+
+CREATE MATERIALIZED VIEW osm_natural AS
+SELECT
+    row_number() OVER () AS id,
+    jsonb_build_object('natural', natural_value) AS tags,
+    geom
+FROM osm_natural_exploded;
+CREATE INDEX IF NOT EXISTS osm_natural_geom_idx ON osm_natural_filtered USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_natural_tags_idx ON osm_natural_filtered USING GIN (natural_value);
+
+CREATE MATERIALIZED VIEW osm_natural_medium_filtered AS
+SELECT
+    id,
+    tags -> 'natural' as natural_value,
+    st_buffer(st_simplifypreservetopology(geom, 78270 / power(2, 8)), 78270 / power(2, 8), 'join=mitre') AS geom
+FROM osm_natural
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 8), 2);
+CREATE INDEX IF NOT EXISTS osm_natural_medium_filtered_geom_idx ON osm_natural_medium_filtered USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_natural_medium_filtered_tags_idx ON osm_natural_medium_filtered (natural_value);
+
+CREATE MATERIALIZED VIEW osm_natural_medium_clustered AS
+SELECT
+    natural_value,
+    geom,
+    st_clusterdbscan(geom, 0, 0) OVER(PARTITION BY natural_value) AS cluster
+FROM osm_natural_medium_filtered;
+CREATE INDEX IF NOT EXISTS osm_natural_medium_clustered_geom_idx ON osm_natural_medium_clustered USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_natural_medium_clustered_tags_idx ON osm_natural_medium_clustered (natural_value);
+
+CREATE MATERIALIZED VIEW osm_natural_medium_grouped AS
+SELECT
+    natural_value,
+    cluster,
+    st_collect(geom) AS geom
+FROM osm_natural_medium_clustered
+GROUP BY natural_value, cluster;
+
+CREATE MATERIALIZED VIEW osm_natural_medium_buffered AS
+SELECT
+    natural_value,
+    st_buffer(geom, -78270 / power(2, 8), 'join=mitre') AS geom
+FROM osm_natural_medium_grouped;
+
+CREATE MATERIALIZED VIEW osm_natural_medium_exploded AS
+SELECT
+    natural_value,
+    (st_dump(geom)).geom AS geom
+FROM osm_natural_medium_buffered;
+
+CREATE MATERIALIZED VIEW osm_natural_medium AS
+SELECT
+    row_number() OVER () AS id,
+    jsonb_build_object('natural', natural_value) AS tags,
+    geom AS geom
+FROM osm_natural_medium_buffered;
+CREATE INDEX IF NOT EXISTS osm_natural_medium_geom_idx ON osm_natural_medium USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_natural_medium_tags_idx ON osm_natural_medium USING GIN (tags);
+
+CREATE MATERIALIZED VIEW osm_natural_small_filtered AS
+SELECT
+    id,
+    tags -> 'natural' as natural_value,
+    st_buffer(st_simplifypreservetopology(geom, 78270 / power(2, 4)), 78270 / power(2, 4), 'join=mitre') AS geom
+FROM osm_natural
+WHERE st_area(st_envelope(geom)) > 25 * power(78270 / power(2, 4), 2);
+CREATE INDEX IF NOT EXISTS osm_natural_small_filtered_geom_idx ON osm_natural_small_filtered USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_natural_small_filtered_tags_idx ON osm_natural_small_filtered (natural_value);
+
+CREATE MATERIALIZED VIEW osm_natural_small_clustered AS
+SELECT
+    natural_value,
+    geom,
+    st_clusterdbscan(geom, 0, 0) OVER(PARTITION BY natural_value) AS cluster
+FROM osm_natural_small_filtered;
+CREATE INDEX IF NOT EXISTS osm_natural_small_clustered_geom_idx ON osm_natural_small_clustered USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_natural_small_clustered_tags_idx ON osm_natural_small_clustered (natural_value);
+
+CREATE MATERIALIZED VIEW osm_natural_small_grouped AS
+SELECT
+    natural_value,
+    cluster,
+    st_collect(geom) AS geom
+FROM osm_natural_small_clustered
+GROUP BY natural_value, cluster;
+
+CREATE MATERIALIZED VIEW osm_natural_small_buffered AS
+SELECT
+    natural_value,
+    st_buffer(geom, -78270 / power(2, 4), 'join=mitre') AS geom
+FROM osm_natural_small_grouped;
+
+CREATE MATERIALIZED VIEW osm_natural_small_exploded AS
+SELECT
+    natural_value,
+    (st_dump(geom)).geom AS geom
+FROM osm_natural_small_buffered;
+
+CREATE MATERIALIZED VIEW osm_natural_small AS
+SELECT
+            row_number() OVER () AS id,
+            jsonb_build_object('natural', natural_value) AS tags,
+            geom AS geom
+FROM osm_natural_small_buffered;
+CREATE INDEX IF NOT EXISTS osm_natural_small_geom_idx ON osm_natural_small USING GIST (geom);
+CREATE INDEX IF NOT EXISTS osm_natural_small_tags_idx ON osm_natural_small USING GIN (tags);
diff --git a/basemap/queries/osm_natural_simplify.sql b/basemap/layers/natural/simplify.sql
similarity index 77%
rename from basemap/queries/osm_natural_simplify.sql
rename to basemap/layers/natural/simplify.sql
index b9f31b27..b66fc3fb 100644
--- a/basemap/queries/osm_natural_simplify.sql
+++ b/basemap/layers/natural/simplify.sql
@@ -31,74 +31,62 @@ SELECT id, tags, geom FROM osm_natural;
 CREATE VIEW osm_natural_z13 AS
 SELECT id, tags, geom FROM osm_natural;
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z12 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z12 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 12), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z11 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z11 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 11), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z10 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z10 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 10), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z9 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z9 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 9), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z8 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z8 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural_medium
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 8), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z7 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z7 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural_medium
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 7), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z6 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z6 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural_medium
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 6), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z5 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z5 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural_medium
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 5), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z4 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z4 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural_small
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 4), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z3 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z3 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural_small
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 3), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z2 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z2 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural_small
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 2), 2);
 
-DROP MATERIALIZED VIEW IF EXISTS osm_natural_z1 CASCADE;
 CREATE MATERIALIZED VIEW osm_natural_z1 AS
 SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom
-FROM osm_natural_grouped
+FROM osm_natural_small
 WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 1), 2);
diff --git a/basemap/layers/natural/tileset.js b/basemap/layers/natural/tileset.js
index 691b3458..86126464 100644
--- a/basemap/layers/natural/tileset.js
+++ b/basemap/layers/natural/tileset.js
@@ -19,18 +19,18 @@ export default {
         },
         {
             "minzoom": 6,
-            "maxzoom": 12,
+            "maxzoom": 13,
             "sql": "SELECT id, tags, geom FROM osm_natural_z$zoom WHERE tags ->> 'natural' IN ('wood', 'scrub', 'heath', 'grassland', 'bare_rock', 'scree', 'shingle', 'sand', 'mud', 'water', 'wetland', 'glacier', 'beach')"
         },
         {
-            "minzoom": 12,
+            "minzoom": 13,
             "maxzoom": 20,
-            "sql": "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'natural' AND tags ->> 'natural' NOT IN ('coastline')"
+            "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'natural' AND tags ->> 'natural' NOT IN ('coastline')"
         },
         {
-            "minzoom": 12,
+            "minzoom": 13,
             "maxzoom": 20,
-            "sql": "SELECT id, tags, geom FROM osm_relations_z$zoom WHERE tags ? 'natural' AND tags ->> 'natural' NOT IN ('coastline')"
+            "sql": "SELECT id, tags, geom FROM osm_relations WHERE tags ? 'natural' AND tags ->> 'natural' NOT IN ('coastline')"
         }
     ]
 }
diff --git a/basemap/queries/osm_relations_prepare.sql b/basemap/layers/ocean/clean.sql
similarity index 78%
copy from basemap/queries/osm_relations_prepare.sql
copy to basemap/layers/ocean/clean.sql
index 25225087..c4c3fe43 100644
--- a/basemap/queries/osm_relations_prepare.sql
+++ b/basemap/layers/ocean/clean.sql
@@ -7,5 +7,6 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX osm_relations_tags_index ON osm_relations USING gin (tags);
-CREATE INDEX osm_relations_geom_index ON osm_relations USING spgist (geom);
+DROP MATERIALIZED VIEW IF EXISTS osm_ocean CASCADE;
+
+DROP MATERIALIZED VIEW IF EXISTS osm_ocean_simplified CASCADE;
diff --git a/basemap/queries/osm_relations_prepare.sql b/basemap/layers/ocean/index.sql
similarity index 74%
copy from basemap/queries/osm_relations_prepare.sql
copy to basemap/layers/ocean/index.sql
index 25225087..6a7b0b24 100644
--- a/basemap/queries/osm_relations_prepare.sql
+++ b/basemap/layers/ocean/index.sql
@@ -7,5 +7,6 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX osm_relations_tags_index ON osm_relations USING gin (tags);
-CREATE INDEX osm_relations_geom_index ON osm_relations USING spgist (geom);
+CREATE INDEX IF NOT EXISTS osm_ocean_geometry_index ON osm_ocean USING gist(geom);
+
+CREATE INDEX IF NOT EXISTS osm_ocean_simplified_geometry_index ON osm_ocean_simplified USING gist(geom);
diff --git a/basemap/queries/osm_linestring.sql b/basemap/layers/ocean/prepare.sql
similarity index 60%
rename from basemap/queries/osm_linestring.sql
rename to basemap/layers/ocean/prepare.sql
index 230797ab..4e984254 100644
--- a/basemap/queries/osm_linestring.sql
+++ b/basemap/layers/ocean/prepare.sql
@@ -7,12 +7,8 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-DROP VIEW IF EXISTS osm_linestring CASCADE;
+CREATE MATERIALIZED VIEW osm_ocean AS
+SELECT row_number() OVER () as id, '{"ocean":"water"}'::jsonb as tags, st_setsrid(geometry, 3857) AS geom FROM water_polygons_shp;
 
-CREATE VIEW osm_linestring AS
-SELECT id, tags, geom
-FROM osm_ways
-LEFT JOIN osm_ways_member ON id = way_id
-WHERE ST_GeometryType(osm_ways.geom) = 'ST_LineString'
-  AND tags != '{}'
-  AND way_id IS NULL;
+CREATE MATERIALIZED VIEW osm_ocean_simplified AS
+SELECT row_number() OVER () as id, '{"ocean":"water"}'::jsonb as tags, st_setsrid(geometry, 3857) AS geom FROM simplified_water_polygons_shp;
diff --git a/basemap/layers/ocean/tileset.js b/basemap/layers/ocean/tileset.js
index 72491420..9f470e41 100644
--- a/basemap/layers/ocean/tileset.js
+++ b/basemap/layers/ocean/tileset.js
@@ -15,12 +15,12 @@ export default {
         {
             "minzoom": 0,
             "maxzoom": 10,
-            "sql": "SELECT row_number() OVER () as id, '{\"ocean\":\"water\"}'::jsonb, st_setsrid(geometry, 3857) FROM simplified_water_polygons_shp"
+            "sql": "SELECT id, tags, geom FROM osm_ocean_simplified"
         },
         {
             "minzoom": 10,
             "maxzoom": 20,
-            "sql": "SELECT row_number() OVER () as id, '{\"ocean\":\"water\"}'::jsonb, st_setsrid(geometry, 3857) FROM water_polygons_shp"
+            "sql": "SELECT id, tags, geom FROM osm_ocean"
         }
     ]
 }
diff --git a/basemap/layers/point/clean.sql b/basemap/layers/point/clean.sql
new file mode 100644
index 00000000..872f5e9c
--- /dev/null
+++ b/basemap/layers/point/clean.sql
@@ -0,0 +1,34 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+
+DROP INDEX IF EXISTS osm_point_tags_index;
+DROP INDEX IF EXISTS osm_point_geom_index;
+
+DROP VIEW IF EXISTS osm_point_z20 CASCADE;
+DROP VIEW IF EXISTS osm_point_z19 CASCADE;
+DROP VIEW IF EXISTS osm_point_z18 CASCADE;
+DROP VIEW IF EXISTS osm_point_z17 CASCADE;
+DROP VIEW IF EXISTS osm_point_z16 CASCADE;
+DROP VIEW IF EXISTS osm_point_z15 CASCADE;
+DROP VIEW IF EXISTS osm_point_z14 CASCADE;
+
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z13 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z12 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z11 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z10 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z9 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z8 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z7 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z6 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z5 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z4 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z3 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z2 CASCADE;
+DROP MATERIALIZED VIEW IF EXISTS osm_point_z1 CASCADE;
\ No newline at end of file
diff --git a/basemap/layers/point/index.sql b/basemap/layers/point/index.sql
new file mode 100644
index 00000000..0a0918da
--- /dev/null
+++ b/basemap/layers/point/index.sql
@@ -0,0 +1,22 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+CREATE INDEX IF NOT EXISTS osm_point_geom_z13_index ON osm_point_z13 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z12_index ON osm_point_z12 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z11_index ON osm_point_z11 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z10_index ON osm_point_z10 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z9_index ON osm_point_z9 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z8_index ON osm_point_z8 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z7_index ON osm_point_z7 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z6_index ON osm_point_z6 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z5_index ON osm_point_z5 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z4_index ON osm_point_z4 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z3_index ON osm_point_z3 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z2_index ON osm_point_z2 USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_point_geom_z1_index ON osm_point_z1 USING gist (geom);
\ No newline at end of file
diff --git a/basemap/layers/point/simplify.sql b/basemap/layers/point/simplify.sql
new file mode 100644
index 00000000..fadd0983
--- /dev/null
+++ b/basemap/layers/point/simplify.sql
@@ -0,0 +1,110 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+
+CREATE VIEW osm_point_z20 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}';
+
+CREATE VIEW osm_point_z19 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}';
+
+CREATE VIEW osm_point_z18 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}';
+
+CREATE VIEW osm_point_z17 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}';
+
+CREATE VIEW osm_point_z16 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}';
+
+CREATE VIEW osm_point_z15 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}';
+
+CREATE VIEW osm_point_z14 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}';
+
+CREATE MATERIALIZED VIEW osm_point_z13 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}'
+AND (tags ->> 'place' IN ('region', 'province', 'district', 'county', 'municipality', 'city', 'town', 'village', 'quarter', 'hamlet')) OR (tags ->> 'natural' IN ('peak', 'volcano')) OR (tags ->> 'highway' IN ('motorway_junction')) OR (tags ->> 'tourism' IN ('wilderness_hut')) OR (tags ->> 'waterway' IN ('waterfall')) OR (tags ->> 'natural' IN ('spring')) OR (tags ->> 'railway' IN ('level_crossing'));
+
+CREATE MATERIALIZED VIEW osm_point_z12 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND (tags ->> 'place' IN ('region', 'province', 'district', 'county', 'municipality', 'city', 'town', 'village')) OR (tags ->> 'natural' IN ('peak', 'volcano')) OR (tags ->> 'highway' IN ('motorway_junction')) OR (tags ->> 'tourism' IN ('wilderness_hut')) OR (tags ->> 'waterway' IN ('waterfall'));
+
+CREATE MATERIALIZED VIEW osm_point_z11 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND (tags ->> 'place' IN ('country', 'state', 'region', 'province', 'district', 'county', 'municipality', 'city', 'town', 'village')) OR (tags ->> 'natural' IN ('peak', 'volcano')) OR (tags ->> 'highway' IN ('motorway_junction'));
+
+CREATE MATERIALIZED VIEW osm_point_z10 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND (tags ->> 'place' IN ('country', 'state', 'region', 'province', 'district', 'county', 'municipality', 'city', 'town')) OR (tags ->> 'natural' IN ('peak', 'volcano')) OR (tags ->> 'highway' IN ('motorway_junction'));
+
+CREATE MATERIALIZED VIEW osm_point_z9 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'state', 'region', 'province', 'district', 'county', 'municipality', 'city', 'town');
+
+CREATE MATERIALIZED VIEW osm_point_z8 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'state', 'region', 'province', 'district', 'county', 'municipality', 'city', 'town');
+
+CREATE MATERIALIZED VIEW osm_point_z7 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'city', 'sea', 'state', 'county');
+
+CREATE MATERIALIZED VIEW osm_point_z6 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'city', 'sea', 'state', 'county');
+
+CREATE MATERIALIZED VIEW osm_point_z5 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'city', 'sea', 'state', 'county');
+
+CREATE MATERIALIZED VIEW osm_point_z4 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'city', 'sea');
+
+CREATE MATERIALIZED VIEW osm_point_z3 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'city', 'sea');
+
+CREATE MATERIALIZED VIEW osm_point_z2 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND tags ->> 'place' IN ('country');
+
+CREATE MATERIALIZED VIEW osm_point_z1 AS
+SELECT id, tags, geom
+FROM osm_nodes
+WHERE tags != '{}' AND tags ->> 'place' IN ('country');
\ No newline at end of file
diff --git a/basemap/layers/point/tileset.js b/basemap/layers/point/tileset.js
index 33b8c878..4c41735d 100644
--- a/basemap/layers/point/tileset.js
+++ b/basemap/layers/point/tileset.js
@@ -15,7 +15,7 @@ export default {
         {
             "minzoom": 1,
             "maxzoom": 20,
-            "sql": "SELECT id, tags, geom FROM osm_nodes_z$zoom WHERE tags != '{}'"
+            "sql": "SELECT id, tags, geom FROM osm_point_z$zoom WHERE tags != '{}'"
         }
     ]
 }
diff --git a/basemap/queries/osm_water_index.sql b/basemap/layers/polygon/clean.sql
similarity index 85%
copy from basemap/queries/osm_water_index.sql
copy to basemap/layers/polygon/clean.sql
index 8e6c537d..645f44f8 100644
--- a/basemap/queries/osm_water_index.sql
+++ b/basemap/layers/polygon/clean.sql
@@ -7,4 +7,4 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX water_polygons_geometry_index ON water_polygons_shp USING SPGIST(geometry);
+DROP MATERIALIZED VIEW IF EXISTS osm_polygon CASCADE;
diff --git a/basemap/queries/osm_polygon_index.sql b/basemap/layers/polygon/index.sql
similarity index 99%
rename from basemap/queries/osm_polygon_index.sql
rename to basemap/layers/polygon/index.sql
index 701aff42..1abd04f3 100644
--- a/basemap/queries/osm_polygon_index.sql
+++ b/basemap/layers/polygon/index.sql
@@ -8,4 +8,4 @@
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
 CREATE INDEX osm_polygon_geom_idx ON osm_polygon USING GIST (geom);
-CREATE INDEX osm_polygon_tags_idx ON osm_polygon USING GIN (tags);
+CREATE INDEX osm_polygon_tags_idx ON osm_polygon USING GIN (tags);
\ No newline at end of file
diff --git a/basemap/queries/osm_polygon_prepare.sql b/basemap/layers/polygon/prepare.sql
similarity index 86%
rename from basemap/queries/osm_polygon_prepare.sql
rename to basemap/layers/polygon/prepare.sql
index 906fa562..76c79886 100644
--- a/basemap/queries/osm_polygon_prepare.sql
+++ b/basemap/layers/polygon/prepare.sql
@@ -7,14 +7,12 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-DROP MATERIALIZED VIEW IF EXISTS osm_polygon CASCADE;
-
 CREATE MATERIALIZED VIEW osm_polygon AS
 SELECT id, tags, geom
-FROM osm_ways LEFT JOIN osm_ways_member ON id = way_id
+FROM osm_ways LEFT JOIN osm_member ON id = member_ref
 WHERE ST_GeometryType(osm_ways.geom) = 'ST_Polygon'
   AND tags != '{}'
-  AND way_id IS NULL
+  AND member_ref IS NULL
 UNION
 SELECT id, tags, geom
 FROM osm_relations
@@ -24,4 +22,4 @@ UNION
 SELECT id, tags, (st_dump(geom)).geom as geom
 FROM osm_relations
 WHERE ST_GeometryType(osm_relations.geom) = 'ST_MultiPolygon'
-  AND tags != '{}';
+  AND tags != '{}';
\ No newline at end of file
diff --git a/basemap/layers/power/tileset.js b/basemap/layers/power/tileset.js
index b5b7932b..d0e442a9 100644
--- a/basemap/layers/power/tileset.js
+++ b/basemap/layers/power/tileset.js
@@ -13,9 +13,9 @@ export default {
     "id": "power",
     "queries": [
         {
-            "minzoom": 12,
+            "minzoom": 13,
             "maxzoom": 20,
-            "sql": "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ->> 'power' IN ('cable', 'line', 'minor_line', 'plant', 'substation')"
+            "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ->> 'power' IN ('cable', 'line', 'minor_line', 'plant', 'substation')"
         }
     ]
 }
diff --git a/basemap/queries/osm_water_index.sql b/basemap/layers/railway/clean.sql
similarity index 85%
copy from basemap/queries/osm_water_index.sql
copy to basemap/layers/railway/clean.sql
index 8e6c537d..565177af 100644
--- a/basemap/queries/osm_water_index.sql
+++ b/basemap/layers/railway/clean.sql
@@ -7,4 +7,4 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX water_polygons_geometry_index ON water_polygons_shp USING SPGIST(geometry);
+DROP MATERIALIZED VIEW IF EXISTS osm_railway CASCADE;
diff --git a/basemap/queries/osm_railway_index.sql b/basemap/layers/railway/index.sql
similarity index 100%
rename from basemap/queries/osm_railway_index.sql
rename to basemap/layers/railway/index.sql
diff --git a/basemap/queries/osm_railway_prepare.sql b/basemap/layers/railway/prepare.sql
similarity index 91%
rename from basemap/queries/osm_railway_prepare.sql
rename to basemap/layers/railway/prepare.sql
index b17a25dc..67837912 100644
--- a/basemap/queries/osm_railway_prepare.sql
+++ b/basemap/layers/railway/prepare.sql
@@ -8,7 +8,6 @@
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
 DROP MATERIALIZED VIEW IF EXISTS osm_railway CASCADE;
-
 CREATE MATERIALIZED VIEW osm_railway AS
 SELECT id, tags, geom
 FROM (
@@ -21,5 +20,3 @@ FROM (
    AND NOT tags ? 'service'
    GROUP BY tags -> 'railway'
 ) AS merge;
-
-CREATE INDEX IF NOT EXISTS osm_railway_geom_index ON osm_railway USING SPGIST (geom);
diff --git a/basemap/queries/osm_railway_simplify.sql b/basemap/layers/railway/simplify.sql
similarity index 100%
rename from basemap/queries/osm_railway_simplify.sql
rename to basemap/layers/railway/simplify.sql
diff --git a/basemap/layers/railway/tileset.js b/basemap/layers/railway/tileset.js
index 0f2f2422..3eb49008 100644
--- a/basemap/layers/railway/tileset.js
+++ b/basemap/layers/railway/tileset.js
@@ -14,13 +14,13 @@ export default {
     "queries": [
         {
             "minzoom": 9,
-            "maxzoom": 12,
+            "maxzoom": 13,
             "sql": "SELECT id, tags, geom FROM osm_railway_z$zoom"
         },
         {
-            "minzoom": 12,
+            "minzoom": 13,
             "maxzoom": 20,
-            "sql": "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'railway'"
+            "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'railway'"
         }
     ]
 }
diff --git a/basemap/queries/osm_water_index.sql b/basemap/layers/route/clean.sql
similarity index 85%
copy from basemap/queries/osm_water_index.sql
copy to basemap/layers/route/clean.sql
index 8e6c537d..760797b3 100644
--- a/basemap/queries/osm_water_index.sql
+++ b/basemap/layers/route/clean.sql
@@ -7,4 +7,4 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX water_polygons_geometry_index ON water_polygons_shp USING SPGIST(geometry);
+DROP MATERIALIZED VIEW IF EXISTS osm_route CASCADE;
diff --git a/basemap/layers/route/index.sql b/basemap/layers/route/index.sql
new file mode 100644
index 00000000..d8c321b5
--- /dev/null
+++ b/basemap/layers/route/index.sql
@@ -0,0 +1,21 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+CREATE INDEX IF NOT EXISTS osm_route_geom_z12_index ON osm_route_z12 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z11_index ON osm_route_z11 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z10_index ON osm_route_z10 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z9_index ON osm_route_z9 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z8_index ON osm_route_z8 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z7_index ON osm_route_z7 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z6_index ON osm_route_z6 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z5_index ON osm_route_z5 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z4_index ON osm_route_z4 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z3_index ON osm_route_z3 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z2_index ON osm_route_z2 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_route_geom_z1_index ON osm_route_z1 USING SPGIST (geom);
diff --git a/basemap/queries/osm_ways_prepare.sql b/basemap/layers/route/prepare.sql
similarity index 50%
rename from basemap/queries/osm_ways_prepare.sql
rename to basemap/layers/route/prepare.sql
index 21f3408b..d0831abe 100644
--- a/basemap/queries/osm_ways_prepare.sql
+++ b/basemap/layers/route/prepare.sql
@@ -7,13 +7,19 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX osm_ways_geom_index ON osm_ways USING spgist (geom);
-CREATE INDEX osm_ways_tags_index ON osm_ways USING gin (tags);
+DROP MATERIALIZED VIEW IF EXISTS osm_route CASCADE;
 
-CREATE MATERIALIZED VIEW osm_ways_member AS
-SELECT DISTINCT member_ref as way_id
-FROM osm_relations, unnest(member_types, member_refs) AS way(member_type, member_ref)
-WHERE geom IS NOT NULL
-  AND member_type = 1
-  AND tags ->> 'type' = 'multipolygon'
-  AND NOT tags ->> 'natural' = 'coastline';
+CREATE MATERIALIZED VIEW osm_route AS
+SELECT id, tags, geom
+FROM (
+   SELECT
+       min(id) as id,
+       jsonb_build_object('route', tags -> 'route') as tags,
+       (st_dump(st_linemerge(st_collect(geom)))).geom as geom
+   FROM osm_ways
+   WHERE tags ->> 'route' IN ('light_rail', 'monorail', 'rail', 'subway', 'tram')
+   AND NOT tags ? 'service'
+   GROUP BY tags -> 'route'
+) AS merge;
+
+CREATE INDEX IF NOT EXISTS osm_route_geom_index ON osm_route USING SPGIST (geom);
diff --git a/basemap/queries/osm_boundary_simplify.sql b/basemap/layers/route/simplify.sql
similarity index 59%
copy from basemap/queries/osm_boundary_simplify.sql
copy to basemap/layers/route/simplify.sql
index 8f114193..130fff57 100644
--- a/basemap/queries/osm_boundary_simplify.sql
+++ b/basemap/layers/route/simplify.sql
@@ -7,86 +7,86 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE VIEW osm_boundary_z20 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_route_z20 AS
+SELECT id, tags, geom FROM osm_route;
 
-CREATE VIEW osm_boundary_z19 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_route_z19 AS
+SELECT id, tags, geom FROM osm_route;
 
-CREATE VIEW osm_boundary_z18 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_route_z18 AS
+SELECT id, tags, geom FROM osm_route;
 
-CREATE VIEW osm_boundary_z17 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_route_z17 AS
+SELECT id, tags, geom FROM osm_route;
 
-CREATE VIEW osm_boundary_z16 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_route_z16 AS
+SELECT id, tags, geom FROM osm_route;
 
-CREATE VIEW osm_boundary_z15 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_route_z15 AS
+SELECT id, tags, geom FROM osm_route;
 
-CREATE VIEW osm_boundary_z14 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_route_z14 AS
+SELECT id, tags, geom FROM osm_route;
 
-CREATE VIEW osm_boundary_z13 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_route_z13 AS
+SELECT id, tags, geom FROM osm_route;
 
-CREATE MATERIALIZED VIEW osm_boundary_z12 AS
+CREATE MATERIALIZED VIEW osm_route_z12 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 12)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z11 AS
+CREATE MATERIALIZED VIEW osm_route_z11 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 11)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z10 AS
+CREATE MATERIALIZED VIEW osm_route_z10 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 10)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z9 AS
+CREATE MATERIALIZED VIEW osm_route_z9 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 9)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z8 AS
+CREATE MATERIALIZED VIEW osm_route_z8 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 8)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z7 AS
+CREATE MATERIALIZED VIEW osm_route_z7 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 7)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z6 AS
+CREATE MATERIALIZED VIEW osm_route_z6 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 6)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z5 AS
+CREATE MATERIALIZED VIEW osm_route_z5 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 5)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z4 AS
+CREATE MATERIALIZED VIEW osm_route_z4 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 4)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z3 AS
+CREATE MATERIALIZED VIEW osm_route_z3 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 3)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z2 AS
+CREATE MATERIALIZED VIEW osm_route_z2 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 2)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z1 AS
+CREATE MATERIALIZED VIEW osm_route_z1 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom FROM osm_route) AS osm_route
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 1)), 2));
diff --git a/basemap/layers/route/tileset.js b/basemap/layers/route/tileset.js
index d165ed81..83891d33 100644
--- a/basemap/layers/route/tileset.js
+++ b/basemap/layers/route/tileset.js
@@ -14,13 +14,13 @@ export default {
     "queries": [
         {
             "minzoom": 9,
-            "maxzoom": 12,
-            "sql": "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'route'"
+            "maxzoom": 13,
+            "sql": "SELECT id, tags, geom FROM osm_route_z$zoom WHERE tags ? 'route'"
         },
         {
-            "minzoom": 12,
+            "minzoom": 13,
             "maxzoom": 20,
-            "sql": "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'route'"
+            "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'route'"
         }
     ]
 }
diff --git a/basemap/queries/osm_water_index.sql b/basemap/layers/waterway/clean.sql
similarity index 85%
rename from basemap/queries/osm_water_index.sql
rename to basemap/layers/waterway/clean.sql
index 8e6c537d..8bd0bab0 100644
--- a/basemap/queries/osm_water_index.sql
+++ b/basemap/layers/waterway/clean.sql
@@ -7,4 +7,4 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX water_polygons_geometry_index ON water_polygons_shp USING SPGIST(geometry);
+DROP MATERIALIZED VIEW IF EXISTS osm_waterway CASCADE;
diff --git a/basemap/layers/waterway/index.sql b/basemap/layers/waterway/index.sql
new file mode 100644
index 00000000..e3493d14
--- /dev/null
+++ b/basemap/layers/waterway/index.sql
@@ -0,0 +1,21 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z12_index ON osm_waterway_z12 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z11_index ON osm_waterway_z11 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z10_index ON osm_waterway_z10 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z9_index ON osm_waterway_z9 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z8_index ON osm_waterway_z8 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z7_index ON osm_waterway_z7 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z6_index ON osm_waterway_z6 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z5_index ON osm_waterway_z5 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z4_index ON osm_waterway_z4 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z3_index ON osm_waterway_z3 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z2_index ON osm_waterway_z2 USING SPGIST (geom);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_z1_index ON osm_waterway_z1 USING SPGIST (geom);
diff --git a/basemap/layers/waterway/prepare.sql b/basemap/layers/waterway/prepare.sql
new file mode 100644
index 00000000..e3701b86
--- /dev/null
+++ b/basemap/layers/waterway/prepare.sql
@@ -0,0 +1,56 @@
+-- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
+-- in compliance with the License. You may obtain a copy of the License at
+--
+-- http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing, software distributed under the License
+-- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+-- or implied. See the License for the specific language governing permissions and limitations under
+-- the License.
+DROP MATERIALIZED VIEW IF EXISTS osm_waterway CASCADE;
+
+CREATE MATERIALIZED VIEW osm_waterway AS
+WITH
+    -- Filter the linestrings
+    filtered AS (
+        SELECT
+                tags -> 'waterway' AS waterway,
+                geom AS geom
+        FROM osm_linestring
+        WHERE tags ->> 'waterway' IN ('river', 'stream', 'canal', 'drain', 'ditch')
+    ),
+    -- Cluster the linestrings
+    clustered AS (
+        SELECT
+            waterway AS waterway,
+            geom as geom,
+            ST_ClusterDBSCAN(geom, 0, 1) OVER (PARTITION BY waterway) AS cluster
+        FROM
+            filtered
+    ),
+    -- Merge the linestrings into a single geometry per cluster
+    merged AS (
+        SELECT
+            waterway AS waterway,
+            ST_LineMerge(ST_Collect(geom)) AS geom
+        FROM
+            clustered
+        GROUP BY
+            waterway, cluster
+    ),
+    -- Explode the merged linestrings into individual linestrings
+    exploded AS (
+        SELECT
+            waterway AS waterway,
+            (ST_Dump(geom)).geom AS geom
+        FROM
+            merged
+    )
+SELECT
+            row_number() OVER () AS id,
+            jsonb_build_object('waterway', waterway) AS tags,
+            geom AS geom
+FROM exploded;
+
+CREATE INDEX IF NOT EXISTS osm_waterway_tags_index ON osm_waterway USING gin (tags);
+CREATE INDEX IF NOT EXISTS osm_waterway_geom_index ON osm_waterway USING gist (geom);
diff --git a/basemap/queries/osm_boundary_simplify.sql b/basemap/layers/waterway/simplify.sql
similarity index 59%
rename from basemap/queries/osm_boundary_simplify.sql
rename to basemap/layers/waterway/simplify.sql
index 8f114193..3e97f260 100644
--- a/basemap/queries/osm_boundary_simplify.sql
+++ b/basemap/layers/waterway/simplify.sql
@@ -7,86 +7,86 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE VIEW osm_boundary_z20 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_waterway_z20 AS
+SELECT id, tags, geom FROM osm_waterway;
 
-CREATE VIEW osm_boundary_z19 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_waterway_z19 AS
+SELECT id, tags, geom FROM osm_waterway;
 
-CREATE VIEW osm_boundary_z18 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_waterway_z18 AS
+SELECT id, tags, geom FROM osm_waterway;
 
-CREATE VIEW osm_boundary_z17 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_waterway_z17 AS
+SELECT id, tags, geom FROM osm_waterway;
 
-CREATE VIEW osm_boundary_z16 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_waterway_z16 AS
+SELECT id, tags, geom FROM osm_waterway;
 
-CREATE VIEW osm_boundary_z15 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_waterway_z15 AS
+SELECT id, tags, geom FROM osm_waterway;
 
-CREATE VIEW osm_boundary_z14 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_waterway_z14 AS
+SELECT id, tags, geom FROM osm_waterway;
 
-CREATE VIEW osm_boundary_z13 AS
-SELECT id, tags, geom FROM osm_boundary;
+CREATE VIEW osm_waterway_z13 AS
+SELECT id, tags, geom FROM osm_waterway;
 
-CREATE MATERIALIZED VIEW osm_boundary_z12 AS
+CREATE MATERIALIZED VIEW osm_waterway_z12 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 12)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z11 AS
+CREATE MATERIALIZED VIEW osm_waterway_z11 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 11)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z10 AS
+CREATE MATERIALIZED VIEW osm_waterway_z10 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 10)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z9 AS
+CREATE MATERIALIZED VIEW osm_waterway_z9 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 9)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z8 AS
+CREATE MATERIALIZED VIEW osm_waterway_z8 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 8)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z7 AS
+CREATE MATERIALIZED VIEW osm_waterway_z7 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 7)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z6 AS
+CREATE MATERIALIZED VIEW osm_waterway_z6 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 6)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z5 AS
+CREATE MATERIALIZED VIEW osm_waterway_z5 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 5)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z4 AS
+CREATE MATERIALIZED VIEW osm_waterway_z4 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 4)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z3 AS
+CREATE MATERIALIZED VIEW osm_waterway_z3 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 3)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z2 AS
+CREATE MATERIALIZED VIEW osm_waterway_z2 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 2)), 2));
 
-CREATE MATERIALIZED VIEW osm_boundary_z1 AS
+CREATE MATERIALIZED VIEW osm_waterway_z1 AS
 SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom FROM osm_boundary) AS osm_boundary
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom FROM osm_waterway) AS osm_waterway
 WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 1)), 2));
diff --git a/basemap/layers/waterway/tileset.js b/basemap/layers/waterway/tileset.js
index 23cda847..177c4a37 100644
--- a/basemap/layers/waterway/tileset.js
+++ b/basemap/layers/waterway/tileset.js
@@ -15,17 +15,17 @@ export default {
         {
             "minzoom": 6,
             "maxzoom": 10,
-            "sql": "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ->> 'waterway' IN ('river')"
+            "sql": "SELECT id, tags, geom FROM osm_waterway_z$zoom WHERE tags ->> 'waterway' IN ('river')"
         },
         {
             "minzoom": 10,
             "maxzoom": 12,
-            "sql": "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ->> 'waterway' IN ('river', 'stream')"
+            "sql": "SELECT id, tags, geom FROM osm_waterway_z$zoom WHERE tags ->> 'waterway' IN ('river', 'stream')"
         },
         {
             "minzoom": 12,
             "maxzoom": 20,
-            "sql": "SELECT id, tags, geom FROM osm_ways_z$zoom WHERE tags ? 'waterway'"
+            "sql": "SELECT id, tags, geom FROM osm_ways WHERE tags ? 'waterway'"
         }
     ]
 }
diff --git a/basemap/queries/globaladm2_clean.sql b/basemap/queries/globaladm2_clean.sql
deleted file mode 100644
index ddde6a0a..00000000
--- a/basemap/queries/globaladm2_clean.sql
+++ /dev/null
@@ -1,31 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-DROP VIEW IF EXISTS globaladm2_z20 CASCADE;
-DROP VIEW IF EXISTS globaladm2_z19 CASCADE;
-DROP VIEW IF EXISTS globaladm2_z18 CASCADE;
-DROP VIEW IF EXISTS globaladm2_z17 CASCADE;
-DROP VIEW IF EXISTS globaladm2_z16 CASCADE;
-DROP VIEW IF EXISTS globaladm2_z15 CASCADE;
-DROP VIEW IF EXISTS globaladm2_z14 CASCADE;
-DROP VIEW IF EXISTS globaladm2_z13 CASCADE;
-
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z12 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z11 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z10 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z9 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z8 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z7 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z6 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z5 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z4 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z3 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z2 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z1 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS globaladm2_z0 CASCADE;
diff --git a/basemap/queries/globaladm2_index.sql b/basemap/queries/globaladm2_index.sql
deleted file mode 100644
index 5b0f1561..00000000
--- a/basemap/queries/globaladm2_index.sql
+++ /dev/null
@@ -1,23 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-CREATE INDEX IF NOT EXISTS globaladm2_index ON "globalADM2" USING SPGIST(geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z12_index ON globaladm2_z12 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z11_index ON globaladm2_z11 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z10_index ON globaladm2_z10 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z9_index ON globaladm2_z9 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z8_index ON globaladm2_z8 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z7_index ON globaladm2_z7 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z6_index ON globaladm2_z6 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z5_index ON globaladm2_z5 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z4_index ON globaladm2_z4 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z3_index ON globaladm2_z3 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z2_index ON globaladm2_z2 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z1_index ON globaladm2_z1 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS globaladm2_z0_index ON globaladm2_z0 USING SPGIST (geom);
diff --git a/basemap/queries/globaladm2_simplify.sql b/basemap/queries/globaladm2_simplify.sql
deleted file mode 100644
index ba763cc4..00000000
--- a/basemap/queries/globaladm2_simplify.sql
+++ /dev/null
@@ -1,71 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-CREATE VIEW globaladm2_z20 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, geom FROM "globalADM2";
-
-CREATE VIEW globaladm2_z19 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, geom FROM "globalADM2";
-
-CREATE VIEW globaladm2_z18 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, geom FROM "globalADM2";
-
-CREATE VIEW globaladm2_z17 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, geom FROM "globalADM2";
-
-CREATE VIEW globaladm2_z16 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, geom FROM "globalADM2";
-
-CREATE VIEW globaladm2_z15 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, geom FROM "globalADM2";
-
-CREATE VIEW globaladm2_z14 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, geom FROM "globalADM2";
-
-CREATE VIEW globaladm2_z13 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z12 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z11 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z10 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z9 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z8 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z7 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z6 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z5 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z4 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z3 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z2 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z1 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom FROM "globalADM2";
-
-CREATE MATERIALIZED VIEW globaladm2_z0 AS
-SELECT fid, "shapeGroup" as shapegroup, "shapeType" as shapetype, st_simplifypreservetopology(geom, 78270 / power(2, 0)) AS geom FROM "globalADM2";
diff --git a/basemap/queries/osm_boundary.sql b/basemap/queries/osm_boundary.sql
deleted file mode 100644
index 5dfe7d62..00000000
--- a/basemap/queries/osm_boundary.sql
+++ /dev/null
@@ -1,103 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-DROP MATERIALIZED VIEW IF EXISTS osm_boundary CASCADE;
-
-CREATE MATERIALIZED VIEW osm_boundary AS
-SELECT ROW_NUMBER() OVER () as id, tags, geom
-FROM (
-   SELECT jsonb_build_object('boundary', 'administrative', 'admin_level', tags -> 'admin_level', 'name', tags -> 'name') as tags, (st_dump(st_linemerge(st_collect(geom)))).geom as geom
-   FROM osm_linestring
-   WHERE tags ->> 'boundary' IN ('administrative')
-     AND tags ->> 'admin_level' IN ('1', '2', '3', '4')
-   GROUP BY tags -> 'admin_level', tags -> 'name'
-) AS merge;
-
-CREATE MATERIALIZED VIEW osm_boundary_z1 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 1)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z2 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 2)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z3 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 3)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z4 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 4)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z5 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 5)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z6 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 6)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z7 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 7)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z8 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 8)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z9 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 9)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z10 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 10)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z11 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 11)), 2));
-
-CREATE MATERIALIZED VIEW osm_boundary_z12 AS
-SELECT id, tags, geom
-FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom FROM osm_boundary) AS osm_boundary
-WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 12)), 2));
-
-CREATE VIEW osm_boundary_z13 AS SELECT id, tags, geom FROM osm_boundary;
-CREATE VIEW osm_boundary_z14 AS SELECT id, tags, geom FROM osm_boundary;
-CREATE VIEW osm_boundary_z15 AS SELECT id, tags, geom FROM osm_boundary;
-CREATE VIEW osm_boundary_z16 AS SELECT id, tags, geom FROM osm_boundary;
-CREATE VIEW osm_boundary_z17 AS SELECT id, tags, geom FROM osm_boundary;
-CREATE VIEW osm_boundary_z18 AS SELECT id, tags, geom FROM osm_boundary;
-CREATE VIEW osm_boundary_z19 AS SELECT id, tags, geom FROM osm_boundary;
-CREATE VIEW osm_boundary_z20 AS SELECT id, tags, geom FROM osm_boundary;
-
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_index ON osm_boundary USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z1_index ON osm_boundary_z1 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z2_index ON osm_boundary_z2 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z3_index ON osm_boundary_z3 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z4_index ON osm_boundary_z4 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z5_index ON osm_boundary_z5 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z6_index ON osm_boundary_z6 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z7_index ON osm_boundary_z7 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z8_index ON osm_boundary_z8 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z9_index ON osm_boundary_z9 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z10_index ON osm_boundary_z10 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z11_index ON osm_boundary_z11 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_point_geom_z12_index ON osm_boundary_z12 USING SPGIST (geom);
diff --git a/basemap/queries/osm_boundary_index.sql b/basemap/queries/osm_boundary_index.sql
deleted file mode 100644
index e4d4b229..00000000
--- a/basemap/queries/osm_boundary_index.sql
+++ /dev/null
@@ -1,21 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z1_index ON osm_boundary_z1 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z2_index ON osm_boundary_z2 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z3_index ON osm_boundary_z3 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z4_index ON osm_boundary_z4 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z5_index ON osm_boundary_z5 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z6_index ON osm_boundary_z6 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z7_index ON osm_boundary_z7 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z8_index ON osm_boundary_z8 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z9_index ON osm_boundary_z9 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z10_index ON osm_boundary_z10 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z11_index ON osm_boundary_z11 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_z12_index ON osm_boundary_z12 USING SPGIST (geom);
diff --git a/basemap/queries/osm_boundary_prepare.sql b/basemap/queries/osm_boundary_prepare.sql
deleted file mode 100644
index 37ab074d..00000000
--- a/basemap/queries/osm_boundary_prepare.sql
+++ /dev/null
@@ -1,22 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-DROP MATERIALIZED VIEW IF EXISTS osm_boundary CASCADE;
-
-CREATE MATERIALIZED VIEW osm_boundary AS
-SELECT ROW_NUMBER() OVER () as id, tags, geom
-FROM (
-   SELECT jsonb_build_object('boundary', 'administrative', 'admin_level', tags -> 'admin_level', 'name', tags -> 'name') as tags, (st_dump(st_linemerge(st_collect(geom)))).geom as geom
-   FROM osm_linestring
-   WHERE tags ->> 'boundary' IN ('administrative')
-     AND tags ->> 'admin_level' IN ('1', '2', '3', '4')
-   GROUP BY tags -> 'admin_level', tags -> 'name'
-) AS merge;
-
-CREATE INDEX IF NOT EXISTS osm_boundary_geom_index ON osm_boundary USING SPGIST (geom);
diff --git a/basemap/queries/osm_highway_prepare.sql b/basemap/queries/osm_highway_prepare.sql
deleted file mode 100644
index 508ea5dc..00000000
--- a/basemap/queries/osm_highway_prepare.sql
+++ /dev/null
@@ -1,33 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-DROP MATERIALIZED VIEW IF EXISTS osm_highway CASCADE;
-
-CREATE MATERIALIZED VIEW osm_highway AS
-SELECT id, tags, geom
-FROM (
-    SELECT
-        min(id) as id,
-        jsonb_build_object('highway', tags -> 'highway', 'ref', tags -> 'ref') as tags,
-        (st_dump(st_linemerge(st_collect(geom)))).geom as geom
-    FROM osm_linestring
-    WHERE tags ->> 'highway' IN ('motorway', 'motorway_link', 'trunk', 'trunk_link', 'primary', 'primary_link', 'secondary', 'secondary_link', 'tertiary',  'tertiary_link', 'unclassified', 'residential')
-    AND tags ? 'ref'
-    GROUP BY tags -> 'highway', tags -> 'ref'
-    UNION ALL
-    SELECT
-        id,
-        jsonb_build_object('highway', tags -> 'highway') as tags,
-        geom
-    FROM osm_linestring
-    WHERE tags ->> 'highway' IN ('motorway', 'motorway_link', 'trunk', 'trunk_link', 'primary', 'primary_link', 'secondary', 'secondary_link', 'tertiary',  'tertiary_link', 'unclassified', 'residential')
-    AND NOT (tags ? 'ref')
-) AS merge;
-
-CREATE INDEX IF NOT EXISTS osm_highway_geom_index ON osm_highway USING SPGIST (geom);
diff --git a/basemap/queries/osm_landuse_prepare.sql b/basemap/queries/osm_landuse_prepare.sql
deleted file mode 100644
index 74f6fb7e..00000000
--- a/basemap/queries/osm_landuse_prepare.sql
+++ /dev/null
@@ -1,165 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-DROP VIEW IF EXISTS osm_landuse CASCADE;
-DROP VIEW IF EXISTS osm_landuse_residential;
-DROP VIEW IF EXISTS osm_landuse_farmland;
-DROP VIEW IF EXISTS osm_landuse_forest;
-DROP VIEW IF EXISTS osm_landuse_meadow;
-DROP VIEW IF EXISTS osm_landuse_orchard;
-DROP VIEW IF EXISTS osm_landuse_vineyard;
-DROP VIEW IF EXISTS osm_landuse_salt_pond;
-DROP VIEW IF EXISTS osm_landuse_water;
-
-CREATE VIEW osm_landuse AS
-SELECT
-    id as id,
-    jsonb_build_object('landuse', tags -> 'landuse') as tags,
-    st_buildarea(st_exteriorring(geom)) as geom
-FROM osm_polygon
-WHERE geom IS NOT NULL AND tags ? 'landuse';
-
-CREATE VIEW osm_landuse_residential AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('landuse', 'residential') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_landuse
-         WHERE tags ->> 'landuse' = 'residential'
-     ) osm_landuse
-GROUP BY cluster;
-
-CREATE VIEW osm_landuse_farmland AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('landuse', 'farmland') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_landuse
-         WHERE tags ->> 'landuse' = 'farmland'
-     ) osm_landuse
-GROUP BY cluster;
-
-CREATE VIEW osm_landuse_forest AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('landuse', 'forest') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_landuse
-         WHERE tags ->> 'landuse' = 'forest'
-     ) osm_landuse
-GROUP BY cluster;
-
-CREATE VIEW osm_landuse_meadow AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('landuse', 'meadow') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_landuse
-         WHERE tags ->> 'landuse' = 'meadow'
-     ) osm_landuse
-GROUP BY cluster;
-
-CREATE VIEW osm_landuse_orchard AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('landuse', 'orchard') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_landuse
-         WHERE tags ->> 'landuse' = 'orchard'
-     ) osm_landuse
-GROUP BY cluster;
-
-CREATE VIEW osm_landuse_vineyard AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('landuse', 'vineyard') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_landuse
-         WHERE tags ->> 'landuse' = 'vineyard'
-     ) osm_landuse
-GROUP BY cluster;
-
-CREATE VIEW osm_landuse_salt_pond AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('landuse', 'salt_pond') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_landuse
-         WHERE tags ->> 'landuse' = 'salt_pond'
-     ) osm_landuse
-GROUP BY cluster;
-
-CREATE VIEW osm_landuse_water AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('landuse', 'water') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_landuse
-         WHERE tags ->> 'landuse' = 'water'
-     ) osm_landuse
-GROUP BY cluster;
-
-CREATE MATERIALIZED VIEW osm_landuse_grouped AS
-SELECT id, tags, geom FROM osm_landuse_residential
-UNION ALL
-SELECT id, tags, geom FROM osm_landuse_farmland
-UNION ALL
-SELECT id, tags, geom FROM osm_landuse_forest
-UNION ALL
-SELECT id, tags, geom FROM osm_landuse_meadow
-UNION ALL
-SELECT id, tags, geom FROM osm_landuse_orchard
-UNION ALL
-SELECT id, tags, geom FROM osm_landuse_vineyard
-UNION ALL
-SELECT id, tags, geom FROM osm_landuse_salt_pond
-UNION ALL
-SELECT id, tags, geom FROM osm_landuse_water;
-
-CREATE INDEX osm_landuse_grouped_geom_idx ON osm_landuse_grouped USING GIST (geom);
diff --git a/basemap/queries/osm_landuse_simplify.sql b/basemap/queries/osm_landuse_simplify.sql
deleted file mode 100644
index 620c0dfa..00000000
--- a/basemap/queries/osm_landuse_simplify.sql
+++ /dev/null
@@ -1,92 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-CREATE VIEW osm_landuse_z20 AS
-SELECT id, tags, geom FROM osm_landuse;
-
-CREATE VIEW osm_landuse_z19 AS
-SELECT id, tags, geom FROM osm_landuse;
-
-CREATE VIEW osm_landuse_z18 AS
-SELECT id, tags, geom FROM osm_landuse;
-
-CREATE VIEW osm_landuse_z17 AS
-SELECT id, tags, geom FROM osm_landuse;
-
-CREATE VIEW osm_landuse_z16 AS
-SELECT id, tags, geom FROM osm_landuse;
-
-CREATE VIEW osm_landuse_z15 AS
-SELECT id, tags, geom FROM osm_landuse;
-
-CREATE VIEW osm_landuse_z14 AS
-SELECT id, tags, geom FROM osm_landuse;
-
-CREATE VIEW osm_landuse_z13 AS
-SELECT id, tags, geom FROM osm_landuse;
-
-CREATE MATERIALIZED VIEW osm_landuse_z12 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 12), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z11 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 11), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z10 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 10), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z9 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 9), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z8 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 8), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z7 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 7), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z6 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 6), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z5 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 5), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z4 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 4), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z3 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 3), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z2 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 2), 2);
-
-CREATE MATERIALIZED VIEW osm_landuse_z1 AS
-SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom
-FROM osm_landuse_grouped
-WHERE st_area(st_envelope(geom)) > 10 * power(78270 / power(2, 1), 2);
diff --git a/basemap/queries/osm_natural_prepare.sql b/basemap/queries/osm_natural_prepare.sql
deleted file mode 100644
index 498dab76..00000000
--- a/basemap/queries/osm_natural_prepare.sql
+++ /dev/null
@@ -1,310 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
--- ('grassland', 'heath', 'scrub', 'wood', 'bay', 'beach', 'glacier', 'mud', 'shingle', 'shoal', 'strait', 'water', 'wetland', 'bare_rock', 'sand', 'scree');
-DROP VIEW IF EXISTS osm_natural CASCADE;
-
-DROP VIEW IF EXISTS osm_natural_mud;
-DROP VIEW IF EXISTS osm_natural_grassland;
-DROP VIEW IF EXISTS osm_natural_heath;
-DROP VIEW IF EXISTS osm_natural_scrub;
-DROP VIEW IF EXISTS osm_natural_wood;
-DROP VIEW IF EXISTS osm_natural_bay;
-DROP VIEW IF EXISTS osm_natural_beach;
-DROP VIEW IF EXISTS osm_natural_glacier;
-DROP VIEW IF EXISTS osm_natural_mud;
-DROP VIEW IF EXISTS osm_natural_shingle;
-DROP VIEW IF EXISTS osm_natural_shoal;
-DROP VIEW IF EXISTS osm_natural_strait;
-DROP VIEW IF EXISTS osm_natural_water;
-DROP VIEW IF EXISTS osm_natural_wetland;
-DROP VIEW IF EXISTS osm_natural_bare_rock;
-DROP VIEW IF EXISTS osm_natural_sand;
-DROP VIEW IF EXISTS osm_natural_scree;
-
-CREATE VIEW osm_natural AS
-SELECT
-    id as id,
-    jsonb_build_object('natural', tags -> 'natural') as tags,
-    st_buildarea(st_exteriorring(geom)) as geom
-FROM osm_polygon
-WHERE geom IS NOT NULL AND tags ? 'natural';
-
-CREATE VIEW osm_natural_grassland AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'grassland') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'grassland'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_heath AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'heath') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'heath'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_scrub AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'scrub') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'scrub'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_wood AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'wood') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'wood'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_bay AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'bay') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'bay'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_beach AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'beach') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'beach'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_glacier AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'glacier') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'glacier'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_mud AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'mud') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'mud'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_shingle AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'shingle') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'shingle'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_shoal AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'shoal') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'shoal'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_strait AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'strait') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'strait'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_water AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'water') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'water'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_wetland AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'wetland') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'wetland'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_bare_rock AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'bare_rock') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'bare_rock'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_sand AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'sand') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'sand'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE VIEW osm_natural_scree AS
-SELECT
-    min(id) as id,
-    jsonb_build_object('natural', 'scree') as tags,
-    (st_dump(st_union(st_makevalid(geom)))).geom AS geom
-FROM (
-         SELECT
-             id as id,
-             geom as geom,
-             st_clusterdbscan(geom, 0, 1) OVER() AS cluster
-         FROM osm_natural
-         WHERE tags ->> 'natural' = 'scree'
-     ) osm_natural
-GROUP BY cluster;
-
-CREATE MATERIALIZED VIEW osm_natural_grouped AS
-SELECT id, tags, geom FROM osm_natural_grassland
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_heath
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_scrub
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_wood
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_bay
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_beach
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_glacier
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_mud
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_shingle
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_shoal
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_strait
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_water
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_wetland
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_bare_rock
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_sand
-UNION ALL
-SELECT id, tags, geom FROM osm_natural_scree;
diff --git a/basemap/queries/osm_nodes_prepare.sql b/basemap/queries/osm_nodes.sql
similarity index 97%
rename from basemap/queries/osm_nodes_prepare.sql
rename to basemap/queries/osm_nodes.sql
index f37b51dd..f3797c08 100644
--- a/basemap/queries/osm_nodes_prepare.sql
+++ b/basemap/queries/osm_nodes.sql
@@ -7,5 +7,6 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
+
 CREATE INDEX IF NOT EXISTS osm_nodes_tags_index ON osm_nodes USING gin (tags);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_index ON osm_nodes USING spgist (geom);
+CREATE INDEX IF NOT EXISTS osm_nodes_geom_index ON osm_nodes USING gist (geom);
diff --git a/basemap/queries/osm_nodes_clean.sql b/basemap/queries/osm_nodes_clean.sql
deleted file mode 100644
index 626b87a3..00000000
--- a/basemap/queries/osm_nodes_clean.sql
+++ /dev/null
@@ -1,33 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-DROP INDEX IF EXISTS osm_nodes_tags_index;
-DROP INDEX IF EXISTS osm_nodes_geom_index;
-
-DROP VIEW IF EXISTS osm_nodes_z20 CASCADE;
-DROP VIEW IF EXISTS osm_nodes_z19 CASCADE;
-DROP VIEW IF EXISTS osm_nodes_z18 CASCADE;
-DROP VIEW IF EXISTS osm_nodes_z17 CASCADE;
-DROP VIEW IF EXISTS osm_nodes_z16 CASCADE;
-DROP VIEW IF EXISTS osm_nodes_z15 CASCADE;
-DROP VIEW IF EXISTS osm_nodes_z14 CASCADE;
-
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z13 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z12 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z11 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z10 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z9 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z8 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z7 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z6 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z5 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z4 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z3 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z2 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_nodes_z1 CASCADE;
diff --git a/basemap/queries/osm_nodes_index.sql b/basemap/queries/osm_nodes_index.sql
deleted file mode 100644
index 930979bd..00000000
--- a/basemap/queries/osm_nodes_index.sql
+++ /dev/null
@@ -1,22 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z13_index ON osm_nodes_z13 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z12_index ON osm_nodes_z12 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z11_index ON osm_nodes_z11 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z10_index ON osm_nodes_z10 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z9_index ON osm_nodes_z9 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z8_index ON osm_nodes_z8 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z7_index ON osm_nodes_z7 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z6_index ON osm_nodes_z6 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z5_index ON osm_nodes_z5 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z4_index ON osm_nodes_z4 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z3_index ON osm_nodes_z3 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z2_index ON osm_nodes_z2 USING gist (geom);
-CREATE INDEX IF NOT EXISTS osm_nodes_geom_z1_index ON osm_nodes_z1 USING gist (geom);
diff --git a/basemap/queries/osm_nodes_simplify.sql b/basemap/queries/osm_nodes_simplify.sql
deleted file mode 100644
index 5784ae8e..00000000
--- a/basemap/queries/osm_nodes_simplify.sql
+++ /dev/null
@@ -1,68 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-CREATE VIEW osm_nodes_z20 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}';
-
-CREATE VIEW osm_nodes_z19 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}';
-
-CREATE VIEW osm_nodes_z18 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}';
-
-CREATE VIEW osm_nodes_z17 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}';
-
-CREATE VIEW osm_nodes_z16 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}';
-
-CREATE VIEW osm_nodes_z15 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}';
-
-CREATE VIEW osm_nodes_z14 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}';
-
-CREATE MATERIALIZED VIEW osm_nodes_z13 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND (tags ->> 'place' IN ('region', 'province', 'district', 'county', 'municipality', 'city', 'town', 'village', 'quarter', 'hamlet')) OR (tags ->> 'natural' IN ('peak', 'volcano')) OR (tags ->> 'highway' IN ('motorway_junction')) OR (tags ->> 'tourism' IN ('wilderness_hut')) OR (tags ->> 'waterway' IN ('waterfall')) OR (tags ->> 'natural' IN ('spring')) OR (tags ->> 'railway' IN ('level_crossing'));
-
-CREATE MATERIALIZED VIEW osm_nodes_z12 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND (tags ->> 'place' IN ('region', 'province', 'district', 'county', 'municipality', 'city', 'town', 'village')) OR (tags ->> 'natural' IN ('peak', 'volcano')) OR (tags ->> 'highway' IN ('motorway_junction')) OR (tags ->> 'tourism' IN ('wilderness_hut')) OR (tags ->> 'waterway' IN ('waterfall'));
-
-CREATE MATERIALIZED VIEW osm_nodes_z11 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND (tags ->> 'place' IN ('country', 'state', 'region', 'province', 'district', 'county', 'municipality', 'city', 'town', 'village')) OR (tags ->> 'natural' IN ('peak', 'volcano')) OR (tags ->> 'highway' IN ('motorway_junction'));
-
-CREATE MATERIALIZED VIEW osm_nodes_z10 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND (tags ->> 'place' IN ('country', 'state', 'region', 'province', 'district', 'county', 'municipality', 'city', 'town')) OR (tags ->> 'natural' IN ('peak', 'volcano')) OR (tags ->> 'highway' IN ('motorway_junction'));
-
-CREATE MATERIALIZED VIEW osm_nodes_z9 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'state', 'region', 'province', 'district', 'county', 'municipality', 'city', 'town');
-
-CREATE MATERIALIZED VIEW osm_nodes_z8 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'state', 'region', 'province', 'district', 'county', 'municipality', 'city', 'town');
-
-CREATE MATERIALIZED VIEW osm_nodes_z7 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'city', 'sea', 'state', 'county');
-
-CREATE MATERIALIZED VIEW osm_nodes_z6 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'city', 'sea', 'state', 'county');
-
-CREATE MATERIALIZED VIEW osm_nodes_z5 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'city', 'sea', 'state', 'county');
-
-CREATE MATERIALIZED VIEW osm_nodes_z4 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'city', 'sea');
-
-CREATE MATERIALIZED VIEW osm_nodes_z3 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND tags ->> 'place' IN ('country', 'city', 'sea');
-
-CREATE MATERIALIZED VIEW osm_nodes_z2 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND tags ->> 'place' IN ('country');
-
-CREATE MATERIALIZED VIEW osm_nodes_z1 AS
-SELECT id, tags, geom FROM osm_nodes WHERE tags != '{}' AND tags ->> 'place' IN ('country');
diff --git a/basemap/queries/osm_relations_prepare.sql b/basemap/queries/osm_relations.sql
similarity index 75%
copy from basemap/queries/osm_relations_prepare.sql
copy to basemap/queries/osm_relations.sql
index 25225087..fa0bfd7f 100644
--- a/basemap/queries/osm_relations_prepare.sql
+++ b/basemap/queries/osm_relations.sql
@@ -7,5 +7,5 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX osm_relations_tags_index ON osm_relations USING gin (tags);
-CREATE INDEX osm_relations_geom_index ON osm_relations USING spgist (geom);
+CREATE INDEX IF NOT EXISTS osm_relations_tags_index ON osm_relations USING gin (tags);
+CREATE INDEX IF NOT EXISTS osm_relations_geom_index ON osm_relations USING gist (geom);
diff --git a/basemap/queries/osm_relations_clean.sql b/basemap/queries/osm_relations_clean.sql
deleted file mode 100644
index 5fc040bb..00000000
--- a/basemap/queries/osm_relations_clean.sql
+++ /dev/null
@@ -1,33 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-DROP INDEX IF EXISTS osm_relations_tags_index;
-DROP INDEX IF EXISTS osm_relations_geom_index;
-
-DROP VIEW IF EXISTS osm_relations_z20 CASCADE;
-DROP VIEW IF EXISTS osm_relations_z19 CASCADE;
-DROP VIEW IF EXISTS osm_relations_z18 CASCADE;
-DROP VIEW IF EXISTS osm_relations_z17 CASCADE;
-DROP VIEW IF EXISTS osm_relations_z16 CASCADE;
-DROP VIEW IF EXISTS osm_relations_z15 CASCADE;
-DROP VIEW IF EXISTS osm_relations_z14 CASCADE;
-DROP VIEW IF EXISTS osm_relations_z13 CASCADE;
-
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z12 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z11 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z10 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z9 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z8 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z7 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z6 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z5 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z4 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z3 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z2 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_relations_z1 CASCADE;
diff --git a/basemap/queries/osm_relations_index.sql b/basemap/queries/osm_relations_index.sql
deleted file mode 100644
index 39fd8521..00000000
--- a/basemap/queries/osm_relations_index.sql
+++ /dev/null
@@ -1,21 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z12_index ON osm_relations_z12 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z11_index ON osm_relations_z11 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z10_index ON osm_relations_z10 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z9_index ON osm_relations_z9 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z8_index ON osm_relations_z8 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z7_index ON osm_relations_z7 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z6_index ON osm_relations_z6 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z5_index ON osm_relations_z5 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z4_index ON osm_relations_z4 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z3_index ON osm_relations_z3 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z2_index ON osm_relations_z2 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_relations_geom_z1_index ON osm_relations_z1 USING SPGIST (geom);
diff --git a/basemap/queries/osm_relations_simplify.sql b/basemap/queries/osm_relations_simplify.sql
deleted file mode 100644
index 2f2507a6..00000000
--- a/basemap/queries/osm_relations_simplify.sql
+++ /dev/null
@@ -1,152 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-CREATE VIEW osm_relations_z20 AS
-SELECT id, tags, geom FROM osm_relations;
-
-CREATE VIEW osm_relations_z19 AS
-SELECT id, tags, geom FROM osm_relations;
-
-CREATE VIEW osm_relations_z18 AS
-SELECT id, tags, geom FROM osm_relations;
-
-CREATE VIEW osm_relations_z17 AS
-SELECT id, tags, geom FROM osm_relations;
-
-CREATE VIEW osm_relations_z16 AS
-SELECT id, tags, geom FROM osm_relations;
-
-CREATE VIEW osm_relations_z15 AS
-SELECT id, tags, geom FROM osm_relations;
-
-CREATE VIEW osm_relations_z14 AS
-SELECT id, tags, geom FROM osm_relations;
-
-CREATE VIEW osm_relations_z13 AS
-SELECT id, tags, geom FROM osm_relations;
-
-CREATE MATERIALIZED VIEW osm_relations_z12 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'power', 'railway', 'route', 'waterway']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 12)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z11 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 11)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z10 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 10)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z9 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 9)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z8 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 8)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z7 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 7)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z6 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 6)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z5 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 5)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z4 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 4)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z3 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 3)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z2 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 2)), 2));
-
-CREATE MATERIALIZED VIEW osm_relations_z1 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom
-         FROM osm_relations
-         WHERE tags ?| ARRAY ['landuse', 'natural']
-     ) AS osm_relations
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 1)), 2));
diff --git a/basemap/queries/osm_relations_prepare.sql b/basemap/queries/osm_ways.sql
similarity index 77%
rename from basemap/queries/osm_relations_prepare.sql
rename to basemap/queries/osm_ways.sql
index 25225087..b2628daa 100644
--- a/basemap/queries/osm_relations_prepare.sql
+++ b/basemap/queries/osm_ways.sql
@@ -7,5 +7,5 @@
 -- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 -- or implied. See the License for the specific language governing permissions and limitations under
 -- the License.
-CREATE INDEX osm_relations_tags_index ON osm_relations USING gin (tags);
-CREATE INDEX osm_relations_geom_index ON osm_relations USING spgist (geom);
+CREATE INDEX IF NOT EXISTS osm_ways_geom_index ON osm_ways USING gist (geom);
+CREATE INDEX IF NOT EXISTS osm_ways_tags_index ON osm_ways USING gin (tags);
\ No newline at end of file
diff --git a/basemap/queries/osm_ways_clean.sql b/basemap/queries/osm_ways_clean.sql
deleted file mode 100644
index 3114e365..00000000
--- a/basemap/queries/osm_ways_clean.sql
+++ /dev/null
@@ -1,35 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-DROP INDEX IF EXISTS osm_ways_tags_index;
-DROP INDEX IF EXISTS osm_ways_geom_index;
-
-DROP VIEW IF EXISTS osm_ways_z20 CASCADE;
-DROP VIEW IF EXISTS osm_ways_z19 CASCADE;
-DROP VIEW IF EXISTS osm_ways_z18 CASCADE;
-DROP VIEW IF EXISTS osm_ways_z17 CASCADE;
-DROP VIEW IF EXISTS osm_ways_z16 CASCADE;
-DROP VIEW IF EXISTS osm_ways_z15 CASCADE;
-DROP VIEW IF EXISTS osm_ways_z14 CASCADE;
-DROP VIEW IF EXISTS osm_ways_z13 CASCADE;
-
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z12 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z11 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z10 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z9 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z8 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z7 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z6 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z5 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z4 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z3 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z2 CASCADE;
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_z1 CASCADE;
-
-DROP MATERIALIZED VIEW IF EXISTS osm_ways_member CASCADE;
diff --git a/basemap/queries/osm_ways_index.sql b/basemap/queries/osm_ways_index.sql
deleted file mode 100644
index 96904811..00000000
--- a/basemap/queries/osm_ways_index.sql
+++ /dev/null
@@ -1,23 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-CREATE INDEX IF NOT EXISTS osm_ways_z12_index ON osm_ways_z12 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z11_index ON osm_ways_z11 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z10_index ON osm_ways_z10 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z9_index ON osm_ways_z9 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z8_index ON osm_ways_z8 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z7_index ON osm_ways_z7 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z6_index ON osm_ways_z6 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z5_index ON osm_ways_z5 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z4_index ON osm_ways_z4 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z3_index ON osm_ways_z3 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z2_index ON osm_ways_z2 USING SPGIST (geom);
-CREATE INDEX IF NOT EXISTS osm_ways_z1_index ON osm_ways_z1 USING SPGIST (geom);
-
-CREATE INDEX osm_ways_member_index ON osm_ways_member(way_id);
diff --git a/basemap/queries/osm_ways_simplify.sql b/basemap/queries/osm_ways_simplify.sql
deleted file mode 100644
index e8c98548..00000000
--- a/basemap/queries/osm_ways_simplify.sql
+++ /dev/null
@@ -1,152 +0,0 @@
--- Licensed under the Apache License, Version 2.0 (the License); you may not use this file except
--- in compliance with the License. You may obtain a copy of the License at
---
--- http://www.apache.org/licenses/LICENSE-2.0
---
--- Unless required by applicable law or agreed to in writing, software distributed under the License
--- is distributed on an AS IS BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
--- or implied. See the License for the specific language governing permissions and limitations under
--- the License.
-CREATE VIEW osm_ways_z20
-AS SELECT id, tags, geom FROM osm_ways;
-
-CREATE VIEW osm_ways_z19 AS
-SELECT id, tags, geom FROM osm_ways;
-
-CREATE VIEW osm_ways_z18 AS
-SELECT id, tags, geom FROM osm_ways;
-
-CREATE VIEW osm_ways_z17 AS
-SELECT id, tags, geom FROM osm_ways;
-
-CREATE VIEW osm_ways_z16 AS
-SELECT id, tags, geom FROM osm_ways;
-
-CREATE VIEW osm_ways_z15 AS
-SELECT id, tags, geom FROM osm_ways;
-
-CREATE VIEW osm_ways_z14 AS
-SELECT id, tags, geom FROM osm_ways;
-
-CREATE VIEW osm_ways_z13 AS
-SELECT id, tags, geom FROM osm_ways;
-
-CREATE MATERIALIZED VIEW osm_ways_z12 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 12)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY [ 'landuse', 'natural', 'power', 'railway', 'route', 'waterway' ]
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 12)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z11 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 11)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway' ]
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 11)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z10 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway' ]
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 10)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z9 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 9)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway' ]
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 9)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z8 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 8)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway' ]
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 8)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z7 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 7)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway' ]
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 7)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z6 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 6)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural', 'waterway' ]
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 6)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z5 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 5)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural']
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 5)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z4 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 4)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural']
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 4)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z3 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 3)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural']
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 3)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z2 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 2)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural']
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 2)), 2));
-
-CREATE MATERIALIZED VIEW osm_ways_z1 AS
-SELECT id, tags, geom
-FROM (
-         SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 1)) AS geom
-         FROM osm_ways
-         WHERE tags ?| ARRAY ['landuse', 'natural']
-     ) AS osm_ways
-WHERE geom IS NOT NULL
-  AND (st_area(st_envelope(geom)) > power((78270 / power(2, 1)), 2));
diff --git a/basemap/tileset.js b/basemap/tileset.js
index 658a4edc..a5d7a1a5 100644
--- a/basemap/tileset.js
+++ b/basemap/tileset.js
@@ -33,7 +33,7 @@ import waterway from "./layers/waterway/tileset.js";
 export default {
   "tilejson": "2.2.0",
   "center": [...config.center, config.zoom],
-  "minzoom": 1.0,
+  "minzoom": 0.0,
   "maxzoom": 14.0,
   "tiles": [
     `${config.host}/tiles/{z}/{x}/{y}.mvt`
@@ -45,7 +45,7 @@ export default {
     amenity,
     attraction,
     barrier,
-    boundary,
+    // boundary,
     building,
     highway,
     landuse,
diff --git a/basemap/workflow.js b/basemap/workflow.js
index ea7e5f56..5dafaddf 100644
--- a/basemap/workflow.js
+++ b/basemap/workflow.js
@@ -60,19 +60,19 @@ export default {
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/globaladm0_clean.sql",
+          "file": "layers/boundary/globaladm0_clean.sql",
           "database": config.database,
           "parallel": true,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/globaladm0_simplify.sql",
+          "file": "layers/boundary/globaladm0_simplify.sql",
           "database": config.database,
           "parallel": true,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/globaladm0_index.sql",
+          "file": "layers/boundary/globaladm0_index.sql",
           "database": config.database,
           "parallel": true,
         }
@@ -96,55 +96,19 @@ export default {
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/globaladm1_clean.sql",
+          "file": "layers/boundary/globaladm1_clean.sql",
           "database": config.database,
           "parallel": true,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/globaladm1_simplify.sql",
+          "file": "layers/boundary/globaladm1_simplify.sql",
           "database": config.database,
           "parallel": true,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/globaladm1_index.sql",
-          "database": config.database,
-          "parallel": true,
-        }
-      ]
-    },
-    {
-      "id": "globaladm2",
-      "needs": [],
-      "tasks": [
-        {
-          "type": "DownloadUrl",
-          "url": "https://github.com/wmgeolab/geoBoundaries/raw/main/releaseData/CGAZ/geoBoundariesCGAZ_ADM2.gpkg",
-          "path": "data/geoBoundariesCGAZ_ADM2.gpkg"
-        },
-        {
-          "type": "ImportGeoPackage",
-          "file": "data/geoBoundariesCGAZ_ADM2.gpkg",
-          "database": config.database,
-          "sourceSRID": 4326,
-          "targetSRID": 3857
-        },
-        {
-          "type": "ExecuteSql",
-          "file": "queries/globaladm2_clean.sql",
-          "database": config.database,
-          "parallel": true,
-        },
-        {
-          "type": "ExecuteSql",
-          "file": "queries/globaladm2_simplify.sql",
-          "database": config.database,
-          "parallel": true,
-        },
-        {
-          "type": "ExecuteSql",
-          "file": "queries/globaladm2_index.sql",
+          "file": "layers/boundary/globaladm1_index.sql",
           "database": config.database,
           "parallel": true,
         }
@@ -171,11 +135,6 @@ export default {
           "sourceSRID": 3857,
           "targetSRID": 3857
         },
-        {
-          "type": "ExecuteSql",
-          "file": "queries/osm_water_index.sql",
-          "database": config.database
-        }
       ]
     },
     {
@@ -199,9 +158,28 @@ export default {
           "sourceSRID": 3857,
           "targetSRID": 3857
         },
+      ]
+    },
+    {
+      "id": "openstreetmap-ocean",
+      "needs": [
+        "water-polygons",
+        "simplified-water-polygons",
+      ],
+      "tasks": [
+        {
+          "type": "ExecuteSql",
+          "file": "layers/ocean/clean.sql",
+          "database": config.database,
+        },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_simplified_water_index.sql",
+          "file": "layers/ocean/prepare.sql",
+          "database": config.database,
+        },
+        {
+          "type": "ExecuteSql",
+          "file": "layers/ocean/index.sql",
           "database": config.database,
         },
       ]
@@ -225,215 +203,303 @@ export default {
     },
     {
       "id": "openstreetmap-nodes",
-      "needs": ["openstreetmap-data"],
+      "needs": [
+          "openstreetmap-data"
+      ],
       "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_nodes_clean.sql",
-          "database": config.database,
-        },
-        {
-          "type": "ExecuteSql",
-          "file": "queries/osm_nodes_prepare.sql",
+          "file": "queries/osm_nodes.sql",
           "database": config.database,
+          "parallel": true,
         },
+      ]
+    },
+    {
+      "id": "openstreetmap-ways",
+      "needs": [
+          "openstreetmap-data"
+      ],
+      "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_nodes_simplify.sql",
+          "file": "queries/osm_ways.sql",
           "database": config.database,
+          "parallel": true,
         },
+      ]
+    },
+    {
+      "id": "openstreetmap-relations",
+      "needs": [
+          "openstreetmap-data"
+      ],
+      "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_nodes_index.sql",
+          "file": "queries/osm_relations.sql",
           "database": config.database,
+          "parallel": true,
         },
       ]
     },
     {
-      "id": "openstreetmap-ways",
-      "needs": ["openstreetmap-data"],
+      "id": "openstreetmap-member",
+      "needs": [
+        "openstreetmap-data"
+      ],
       "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_ways_clean.sql",
+          "file": "layers/member/prepare.sql",
           "database": config.database,
         },
+      ]
+    },
+    {
+      "id": "openstreetmap-point",
+      "needs": [
+        "openstreetmap-nodes"
+      ],
+      "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_ways_prepare.sql",
+          "file": "layers/point/clean.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_ways_simplify.sql",
+          "file": "layers/point/simplify.sql",
           "database": config.database,
+          "parallel": true,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_ways_index.sql",
+          "file": "layers/point/index.sql",
           "database": config.database,
+          "parallel": true,
         },
       ]
     },
     {
-      "id": "openstreetmap-relations",
-      "needs": ["openstreetmap-data"],
+      "id": "openstreetmap-linestring",
+      "needs": [
+          "openstreetmap-member"
+      ],
       "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_relations_clean.sql",
+          "file": "layers/linestring/clean.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_relations_prepare.sql",
+          "file": "layers/linestring/prepare.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_relations_simplify.sql",
-          "database": config.database,
-        },
-        {
-          "type": "ExecuteSql",
-          "file": "queries/osm_relations_index.sql",
+          "file": "layers/linestring/index.sql",
           "database": config.database,
         },
       ]
     },
     {
-      "id": "openstreetmap-linestring",
-      "needs": ["openstreetmap-ways"],
+      "id": "openstreetmap-polygon",
+      "needs": [
+          "openstreetmap-member",
+      ],
       "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_linestring.sql",
+          "file": "layers/polygon/clean.sql",
+          "database": config.database,
+        },
+        {
+          "type": "ExecuteSql",
+          "file": "layers/polygon/prepare.sql",
+          "database": config.database,
+        },
+        {
+          "type": "ExecuteSql",
+          "file": "layers/polygon/index.sql",
           "database": config.database,
         },
       ]
     },
     {
-      "id": "openstreetmap-polygon",
-      "needs": ["openstreetmap-ways", "openstreetmap-relations"],
+      "id": "openstreetmap-highway",
+      "needs": [
+          "openstreetmap-linestring"
+      ],
       "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_polygon_prepare.sql",
+          "file": "layers/highway/clean.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_polygon_index.sql",
+          "file": "layers/highway/prepare.sql",
           "database": config.database,
         },
+        {
+          "type": "ExecuteSql",
+          "file": "layers/highway/simplify.sql",
+          "database": config.database,
+          "parallel": true,
+        },
+        {
+          "type": "ExecuteSql",
+          "file": "layers/highway/index.sql",
+          "database": config.database,
+          "parallel": true,
+        },
       ]
     },
     {
-      "id": "openstreetmap-boundary",
+      "id": "openstreetmap-railway",
       "needs": ["openstreetmap-linestring"],
       "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_boundary_prepare.sql",
+          "file": "layers/railway/clean.sql",
+          "database": config.database,
+        },
+        {
+          "type": "ExecuteSql",
+          "file": "layers/railway/prepare.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_boundary_simplify.sql",
+          "file": "layers/railway/simplify.sql",
           "database": config.database,
+          "parallel": true,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_boundary_index.sql",
+          "file": "layers/railway/index.sql",
           "database": config.database,
+          "parallel": true,
         },
       ]
     },
     {
-      "id": "openstreetmap-highway",
+      "id": "openstreetmap-route",
       "needs": ["openstreetmap-linestring"],
       "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_highway_prepare.sql",
+          "file": "layers/route/clean.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_highway_simplify.sql",
+          "file": "layers/route/prepare.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_highway_index.sql",
+          "file": "layers/route/simplify.sql",
           "database": config.database,
+          "parallel": true,
+        },
+        {
+          "type": "ExecuteSql",
+          "file": "layers/route/index.sql",
+          "database": config.database,
+          "parallel": true,
         },
       ]
     },
     {
-      "id": "openstreetmap-railway",
-      "needs": ["openstreetmap-linestring"],
+      "id": "openstreetmap-natural",
+      "needs": ["openstreetmap-polygon"],
       "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_railway_prepare.sql",
+          "file": "layers/natural/clean.sql",
+          "database": config.database,
+        },
+        {
+          "type": "ExecuteSql",
+          "file": "layers/natural/prepare.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_railway_simplify.sql",
+          "file": "layers/natural/simplify.sql",
           "database": config.database,
+          "parallel": true,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_railway_index.sql",
+          "file": "layers/natural/index.sql",
           "database": config.database,
+          "parallel": true
         },
       ]
     },
     {
-      "id": "openstreetmap-natural",
-      "needs": ["openstreetmap-polygon"],
+      "id": "openstreetmap-landuse",
+      "needs": [
+          "openstreetmap-polygon"
+      ],
       "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_natural_prepare.sql",
+          "file": "layers/landuse/clean.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_natural_simplify.sql",
+          "file": "layers/landuse/prepare.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_natural_index.sql",
+          "file": "layers/landuse/simplify.sql",
+          "database": config.database,
+          "parallel": true,
+        },
+        {
+          "type": "ExecuteSql",
+          "file": "layers/landuse/index.sql",
           "database": config.database,
           "parallel": true
         },
       ]
     },
     {
-      "id": "openstreetmap-landuse",
-      "needs": ["openstreetmap-polygon"],
+      "id": "openstreetmap-waterway",
+      "needs": [
+          "openstreetmap-linestring"
+      ],
       "tasks": [
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_landuse_prepare.sql",
+          "file": "layers/waterway/clean.sql",
+          "database": config.database,
+        },
+        {
+          "type": "ExecuteSql",
+          "file": "layers/waterway/prepare.sql",
           "database": config.database,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_landuse_simplify.sql",
+          "file": "layers/waterway/simplify.sql",
           "database": config.database,
+          "parallel": true,
         },
         {
           "type": "ExecuteSql",
-          "file": "queries/osm_landuse_index.sql",
+          "file": "layers/waterway/index.sql",
           "database": config.database,
           "parallel": true
         },
       ]
-    }
+    },
   ]
 }
diff --git a/examples/transformation/simplifications.sql b/examples/transformation/simplifications.sql
new file mode 100644
index 00000000..da4d5afc
--- /dev/null
+++ b/examples/transformation/simplifications.sql
@@ -0,0 +1,38 @@
+
+CREATE MATERIALIZED VIEW osm_highway_z10 AS
+SELECT id, tags, geom
+FROM (SELECT id, tags, st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom FROM osm_highway) AS osm_highway
+WHERE geom IS NOT NULL AND (st_area(st_envelope(geom)) > power((78270 / power(2, 10)), 2));
+
+CREATE MATERIALIZED VIEW landuse_z10 AS
+    WITH
+    -- Set the size of 1 pixel at z10
+    pixel_size AS (
+        SELECT 78270 / power(2, 10) AS pixel_size
+    ),
+    -- Set the minimum area to 10 pixels at z10
+    min_area AS (
+        SELECT power(pixel_size * 10 AS min_area
+        FROM pixel_size
+    ),
+    -- Filter out polygons smaller than the minimum area
+    landuse_filtered AS (
+        SELECT id, tags, geom
+        FROM osm_landuse
+        WHERE st_area(geom) > min_area
+    ),
+    -- Buffer the landuse polygons
+    landuse_buffered AS (
+        SELECT id, tags, st_buffer(geom, buffer_distance) AS geom
+        FROM landuse_filtered, buffer_distance
+    ),
+    -- Union the buffered polygons
+    landuse_buffered_union AS (
+        SELECT st_union(geom) AS geom
+        FROM landuse_buffered
+    ),
+    -- Simplify the unioned polygon
+    landuse_simplified AS (
+        SELECT st_simplifypreservetopology(geom, 78270 / power(2, 10)) AS geom
+        FROM landuse_buffered_union
+    )
\ No newline at end of file
diff --git a/examples/transformation/style.json b/examples/transformation/style.json
new file mode 100644
index 00000000..094b492e
--- /dev/null
+++ b/examples/transformation/style.json
@@ -0,0 +1,26 @@
+{
+  "version" : 8,
+  "sources" : {
+    "baremaps" : {
+      "type" : "vector",
+      "url" : "http://localhost:9000/tiles.json"
+    }
+  },
+  "layers" : [ {
+    "id" : "landuse",
+    "type" : "fill",
+    "source" : "baremaps",
+    "source-layer" : "landuse",
+    "layout" : {
+      "visibility" : "visible"
+    },
+    "paint" : {
+      "fill-color" : "rgba(255, 0, 0, 1)"
+    }
+  } ],
+  "center" : [ 9.5554, 47.166 ],
+  "metadata" : {
+    "maputnik:renderer" : "mbgljs"
+  },
+  "zoom" : 14
+}
\ No newline at end of file
diff --git a/examples/transformation/tileset.json b/examples/transformation/tileset.json
new file mode 100644
index 00000000..35c8d6a2
--- /dev/null
+++ b/examples/transformation/tileset.json
@@ -0,0 +1,30 @@
+{
+  "tilejson": "2.2.0",
+  "minzoom": 0,
+  "maxzoom": 20,
+  "tiles": [
+    "http://localhost:9000/tiles/{z}/{x}/{y}.mvt"
+  ],
+  "vector_layers": [
+    {
+      "id": "landuse",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 20,
+          "sql": "SELECT 0 as id, null as tags, ST_SetSRID(geometry, 3857) as geom FROM landuse WHERE landuse = 'forest'"
+        }
+      ]
+    },
+    {
+      "id": "landuse_z10",
+      "queries": [
+        {
+          "minzoom": 0,
+          "maxzoom": 20,
+          "sql": "SELECT 0 as id, null as tags, ST_SetSRID(geometry, 3857) as geom FROM landuse_z10 WHERE landuse = 'forest'"
+        }
+      ]
+    }
+  ]
+}
\ No newline at end of file