diff --git a/vtm-desktop/src/org/oscim/awt/AwtBitmap.java b/vtm-desktop/src/org/oscim/awt/AwtBitmap.java
index ec67cc24..177efcbe 100644
--- a/vtm-desktop/src/org/oscim/awt/AwtBitmap.java
+++ b/vtm-desktop/src/org/oscim/awt/AwtBitmap.java
@@ -25,7 +25,7 @@ import java.nio.IntBuffer;
 import javax.imageio.ImageIO;
 
 import org.oscim.backend.canvas.Bitmap;
-import org.oscim.renderer.elements.TextureLayer;
+import org.oscim.renderer.bucket.TextureBucket;
 
 import com.badlogic.gdx.Gdx;
 import com.badlogic.gdx.graphics.GL20;
@@ -77,10 +77,10 @@ public class AwtBitmap implements Bitmap {
 	public void eraseColor(int transparent) {
 	}
 
-	private final static IntBuffer tmpBuffer = BufferUtils.newIntBuffer(TextureLayer.TEXTURE_HEIGHT
-	        * TextureLayer.TEXTURE_WIDTH);
-	private final static int[] tmpPixel = new int[TextureLayer.TEXTURE_HEIGHT
-	        * TextureLayer.TEXTURE_WIDTH];
+	private final static IntBuffer tmpBuffer = BufferUtils.newIntBuffer(TextureBucket.TEXTURE_HEIGHT
+	        * TextureBucket.TEXTURE_WIDTH);
+	private final static int[] tmpPixel = new int[TextureBucket.TEXTURE_HEIGHT
+	        * TextureBucket.TEXTURE_WIDTH];
 
 	private final static boolean WRITE_TEX = false;
 	private int dbgCnt;
@@ -90,7 +90,7 @@ public class AwtBitmap implements Bitmap {
 		int[] pixels;
 		IntBuffer buffer;
 
-		if (width * height < TextureLayer.TEXTURE_HEIGHT * TextureLayer.TEXTURE_WIDTH) {
+		if (width * height < TextureBucket.TEXTURE_HEIGHT * TextureBucket.TEXTURE_WIDTH) {
 			pixels = tmpPixel;
 			buffer = tmpBuffer;
 			buffer.clear();
diff --git a/vtm-jeo/src/org/oscim/layers/JeoVectorLayer.java b/vtm-jeo/src/org/oscim/layers/JeoVectorLayer.java
index 60a41530..d78447df 100644
--- a/vtm-jeo/src/org/oscim/layers/JeoVectorLayer.java
+++ b/vtm-jeo/src/org/oscim/layers/JeoVectorLayer.java
@@ -13,8 +13,8 @@ import org.jeo.map.RuleList;
 import org.jeo.map.Style;
 import org.oscim.jeo.JeoUtils;
 import org.oscim.map.Map;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.MeshLayer;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.MeshBucket;
 import org.oscim.theme.styles.AreaStyle;
 import org.oscim.theme.styles.LineStyle;
 import org.slf4j.Logger;
@@ -113,7 +113,7 @@ public class JeoVectorLayer extends JtsLayer {
 			return;
 		}
 
-		LineLayer ll = t.layers.getLineLayer(2);
+		LineBucket ll = t.buckets.getLineBucket(2);
 		if (ll.line == null) {
 			RGB color = rule.color(f, CartoCSS.LINE_COLOR, RGB.black);
 			float width = rule.number(f, CartoCSS.LINE_WIDTH, 1.2f);
@@ -126,7 +126,7 @@ public class JeoVectorLayer extends JtsLayer {
 
 	protected void addPolygon(Task t, Feature f, Rule rule, Geometry g) {
 
-		LineLayer ll = t.layers.getLineLayer(1);
+		LineBucket ll = t.buckets.getLineBucket(1);
 
 		if (ll.line == null) {
 			float width = rule.number(f, CartoCSS.LINE_WIDTH, 1.2f);
@@ -135,7 +135,7 @@ public class JeoVectorLayer extends JtsLayer {
 			ll.setDropDistance(0.5f);
 		}
 
-		MeshLayer mesh = t.layers.getMeshLayer(0);
+		MeshBucket mesh = t.buckets.getMeshBucket(0);
 		if (mesh.area == null) {
 			int color = JeoUtils.color(rule.color(f, CartoCSS.POLYGON_FILL, RGB.red));
 			mesh.area = new AreaStyle(color);
diff --git a/vtm-jeo/src/org/oscim/layers/JtsLayer.java b/vtm-jeo/src/org/oscim/layers/JtsLayer.java
index 6a1cf5e3..6430e6e1 100644
--- a/vtm-jeo/src/org/oscim/layers/JtsLayer.java
+++ b/vtm-jeo/src/org/oscim/layers/JtsLayer.java
@@ -8,8 +8,8 @@ import org.oscim.core.MercatorProjection;
 import org.oscim.core.Tile;
 import org.oscim.layers.vector.AbstractVectorLayer;
 import org.oscim.map.Map;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.MeshLayer;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.MeshBucket;
 import org.oscim.utils.geom.SimplifyDP;
 import org.oscim.utils.geom.SimplifyVW;
 
@@ -69,7 +69,7 @@ public abstract class JtsLayer extends AbstractVectorLayer<Geometry> {
 	SimplifyDP mSimpDP = new SimplifyDP();
 	SimplifyVW mSimpVW = new SimplifyVW();
 
-	protected void addPolygon(Task t, Geometry g, MeshLayer ml, LineLayer ll) {
+	protected void addPolygon(Task t, Geometry g, MeshBucket ml, LineBucket ll) {
 		mGeom.clear();
 		mGeom.startPolygon();
 
@@ -90,7 +90,7 @@ public abstract class JtsLayer extends AbstractVectorLayer<Geometry> {
 		ml.addMesh(mGeom);
 	}
 
-	protected void addLine(Task t, Geometry g, LineLayer ll) {
+	protected void addLine(Task t, Geometry g, LineBucket ll) {
 		mGeom.clear();
 		mGeom.startLine();
 
diff --git a/vtm-jeo/src/org/oscim/layers/OSMIndoorLayer.java b/vtm-jeo/src/org/oscim/layers/OSMIndoorLayer.java
index 688145cb..3aae9036 100644
--- a/vtm-jeo/src/org/oscim/layers/OSMIndoorLayer.java
+++ b/vtm-jeo/src/org/oscim/layers/OSMIndoorLayer.java
@@ -11,10 +11,10 @@ import org.jeo.map.Style;
 import org.oscim.backend.canvas.Color;
 import org.oscim.jeo.JeoUtils;
 import org.oscim.map.Map;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.MeshLayer;
-import org.oscim.renderer.elements.TextItem;
-import org.oscim.renderer.elements.TextLayer;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.MeshBucket;
+import org.oscim.renderer.bucket.TextBucket;
+import org.oscim.renderer.bucket.TextItem;
 import org.oscim.theme.styles.AreaStyle;
 import org.oscim.theme.styles.LineStyle;
 import org.oscim.theme.styles.TextStyle;
@@ -26,7 +26,7 @@ import com.vividsolutions.jts.geom.LineString;
 
 public class OSMIndoorLayer extends JeoVectorLayer {
 
-	protected TextLayer mTextLayer;
+	protected TextBucket mTextLayer;
 	protected TextStyle mText = new TextBuilder()
 	    .setFontSize(16).setColor(Color.BLACK)
 	    .setStrokeWidth(2.2f).setStroke(Color.WHITE)
@@ -40,7 +40,9 @@ public class OSMIndoorLayer extends JeoVectorLayer {
 
 	@Override
 	protected void processFeatures(Task t, Envelope b) {
-		mTextLayer = t.layers.addTextLayer(new TextLayer());
+		mTextLayer = new TextBucket();
+
+		t.buckets.set(mTextLayer);
 
 		super.processFeatures(t, b);
 
@@ -58,7 +60,7 @@ public class OSMIndoorLayer extends JeoVectorLayer {
 
 		int level = getLevel(f);
 
-		LineLayer ll = t.layers.getLineLayer(level * 3 + 2);
+		LineBucket ll = t.buckets.getLineBucket(level * 3 + 2);
 		if (ll.line == null) {
 			RGB color = rule.color(f, CartoCSS.LINE_COLOR, RGB.black);
 			float width = rule.number(f, CartoCSS.LINE_WIDTH, 1.2f);
@@ -73,7 +75,7 @@ public class OSMIndoorLayer extends JeoVectorLayer {
 	protected void addPolygon(Task t, Feature f, Rule rule, Geometry g) {
 		int level = getLevel(f);
 
-		LineLayer ll = t.layers.getLineLayer(level * 3 + 1);
+		LineBucket ll = t.buckets.getLineBucket(level * 3 + 1);
 
 		boolean active = activeLevels[level + 1];
 
@@ -89,7 +91,7 @@ public class OSMIndoorLayer extends JeoVectorLayer {
 			ll.setDropDistance(0);
 		}
 
-		MeshLayer mesh = t.layers.getMeshLayer(level * 3);
+		MeshBucket mesh = t.buckets.getMeshBucket(level * 3);
 		if (mesh.area == null) {
 			int color = JeoUtils.color(rule.color(f, CartoCSS.POLYGON_FILL, RGB.red));
 			if (level > -2 && !active)
diff --git a/vtm-playground/src/org/oscim/test/HairLineTest.java b/vtm-playground/src/org/oscim/test/HairLineTest.java
index bd39d7a5..7cfdcc96 100644
--- a/vtm-playground/src/org/oscim/test/HairLineTest.java
+++ b/vtm-playground/src/org/oscim/test/HairLineTest.java
@@ -6,12 +6,12 @@ import org.oscim.core.GeometryBuffer;
 import org.oscim.gdx.GdxMap;
 import org.oscim.gdx.GdxMapApp;
 import org.oscim.layers.GenericLayer;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.MapRenderer;
-import org.oscim.renderer.elements.HairLineLayer;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.PolygonLayer;
+import org.oscim.renderer.bucket.HairLineBucket;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.PolygonBucket;
 import org.oscim.theme.styles.AreaStyle;
 import org.oscim.theme.styles.LineStyle;
 import org.oscim.theme.styles.LineStyle.LineBuilder;
@@ -31,24 +31,24 @@ public class HairLineTest extends GdxMap {
 		return in;
 	}
 
-	static class Renderer extends ElementRenderer {
+	static class Renderer extends BucketRenderer {
 		boolean init;
 		LineBuilder l = new LineStyle.LineBuilder()
 		    .color(Color.WHITE)
 		    .width(1.5f)
 		    .cap(Cap.ROUND);
 
-		HairLineLayer ll = layers.addHairLineLayer(1, l.build());
+		HairLineBucket ll = buckets.addHairLineBucket(1, l.build());
 
 		//LineLayer ll = layers.addLineLayer(1, new LineStyle(Color.fade(Color.CYAN, 0.6f), 2.5f));
 		LineStyle style = new LineStyle(Color.fade(Color.MAGENTA, 0.6f), 2.5f);
 
-		HairLineLayer l1 = layers.addHairLineLayer(2, style);
+		HairLineBucket l1 = buckets.addHairLineBucket(2, style);
 
 		//style = new LineStyle(Color.fade(Color.LTGRAY, 0.8f), 1.5f);
-		LineLayer l2 = layers.addLineLayer(3, style);
+		LineBucket l2 = buckets.addLineBucket(3, style);
 
-		PolygonLayer pl = layers.addPolygonLayer(4, new AreaStyle.AreaBuilder()
+		PolygonBucket pl = buckets.addPolygonBucket(4, new AreaStyle.AreaBuilder()
 		    .color(Color.BLUE)
 		    //.outline(Color.CYAN, 1)
 		    .build());
diff --git a/vtm-playground/src/org/oscim/test/LineRenderTest.java b/vtm-playground/src/org/oscim/test/LineRenderTest.java
index 26f06ecd..5011e5a1 100644
--- a/vtm-playground/src/org/oscim/test/LineRenderTest.java
+++ b/vtm-playground/src/org/oscim/test/LineRenderTest.java
@@ -6,11 +6,11 @@ import org.oscim.core.GeometryBuffer;
 import org.oscim.gdx.GdxMap;
 import org.oscim.gdx.GdxMapApp;
 import org.oscim.layers.GenericLayer;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.MapRenderer;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.LineTexLayer;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.LineTexBucket;
 import org.oscim.theme.styles.LineStyle;
 
 import com.badlogic.gdx.Input;
@@ -75,10 +75,10 @@ public class LineRenderTest extends GdxMap {
 		LineStyle outline2 = new LineStyle(0, null, Color.RED, 2.0f, Cap.ROUND, false, 0,
 		                                   0, 0, 0, 0, true);
 
-		LineLayer ol = l.layers.addLineLayer(0, outline);
-		LineLayer ol2 = l.layers.addLineLayer(5, outline2);
+		LineBucket ol = l.buckets.addLineBucket(0, outline);
+		LineBucket ol2 = l.buckets.addLineBucket(5, outline2);
 
-		LineLayer ll = l.layers.addLineLayer(10, line1);
+		LineBucket ll = l.buckets.addLineBucket(10, line1);
 		ll.addLine(g.translate(0, -20));
 		ll.addLine(g.translate(0, 10.5f));
 		addCircle(-200, -200, 100, ll);
@@ -86,7 +86,7 @@ public class LineRenderTest extends GdxMap {
 		if (addOutline)
 			ol.addOutline(ll);
 
-		ll = l.layers.addLineLayer(20, line2);
+		ll = l.buckets.addLineBucket(20, line2);
 		ll.addLine(g.translate(0, 10.5f));
 		ll.addLine(g.translate(0, 10.5f));
 		addCircle(200, -200, 100, ll);
@@ -94,7 +94,7 @@ public class LineRenderTest extends GdxMap {
 		if (addOutline)
 			ol.addOutline(ll);
 
-		LineTexLayer lt = l.layers.getLineTexLayer(30);
+		LineTexBucket lt = l.buckets.getLineTexBucket(30);
 		lt.line = line3;
 		lt.addLine(g.translate(0, 10.5f));
 		lt.addLine(g.translate(0, 10.5f));
@@ -103,7 +103,7 @@ public class LineRenderTest extends GdxMap {
 		// if (addOutline)
 		// ol2.addOutline(ll);
 
-		ll = l.layers.addLineLayer(40, line4);
+		ll = l.buckets.addLineBucket(40, line4);
 		ll.addLine(g.translate(0, 10.5f));
 		ll.addLine(g.translate(0, 10.5f));
 		addCircle(-200, 200, 100, ll);
@@ -112,7 +112,7 @@ public class LineRenderTest extends GdxMap {
 			ol2.addOutline(ll);
 	}
 
-	void addCircle(float cx, float cy, float radius, LineLayer ll) {
+	void addCircle(float cx, float cy, float radius, LineBucket ll) {
 		GeometryBuffer g = mGeom;
 
 		g.clear();
@@ -128,7 +128,7 @@ public class LineRenderTest extends GdxMap {
 		}
 	}
 
-	void addCircle(float cx, float cy, float radius, LineTexLayer ll) {
+	void addCircle(float cx, float cy, float radius, LineTexBucket ll) {
 		GeometryBuffer g = mGeom;
 
 		g.clear();
@@ -173,14 +173,14 @@ public class LineRenderTest extends GdxMap {
 		return true;
 	}
 
-	class LineTest extends ElementRenderer {
+	class LineTest extends BucketRenderer {
 
 		public LineTest() {
 			mMapPosition.scale = 0;
 		}
 
 		public synchronized void clear() {
-			layers.clear();
+			buckets.clear();
 			setReady(false);
 		}
 
diff --git a/vtm-playground/src/org/oscim/test/LineTest.java b/vtm-playground/src/org/oscim/test/LineTest.java
index fd7c8680..d7e7a6a5 100644
--- a/vtm-playground/src/org/oscim/test/LineTest.java
+++ b/vtm-playground/src/org/oscim/test/LineTest.java
@@ -5,10 +5,10 @@ import org.oscim.core.GeometryBuffer;
 import org.oscim.gdx.GdxMap;
 import org.oscim.gdx.GdxMapApp;
 import org.oscim.layers.GenericLayer;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.MapRenderer;
-import org.oscim.renderer.elements.LineLayer;
+import org.oscim.renderer.bucket.LineBucket;
 import org.oscim.theme.styles.LineStyle;
 
 import com.badlogic.gdx.Gdx;
@@ -38,10 +38,10 @@ public class LineTest extends GdxMap {
 
 	@Override
 	protected void createLayers() {
-		mMap.layers().add(new GenericLayer(mMap, new ElementRenderer() {
+		mMap.layers().add(new GenericLayer(mMap, new BucketRenderer() {
 			boolean init;
 
-			LineLayer ll = layers.addLineLayer(0,
+			LineBucket ll = buckets.addLineBucket(0,
 			                                   new LineStyle(Color.fade(Color.CYAN, 0.5f), 1.5f));
 
 			GeometryBuffer g = new GeometryBuffer(10, 1);
@@ -79,8 +79,8 @@ public class LineTest extends GdxMap {
 					// compile();
 				}
 
-				layers.clear();
-				layers.setBaseLayers(ll);
+				buckets.clear();
+				buckets.setBaseBuckets(ll);
 				g.clear();
 				for (int i = 0; i < 60; i++) {
 					g.startLine();
diff --git a/vtm-playground/src/org/oscim/test/SpriteManager.java b/vtm-playground/src/org/oscim/test/SpriteManager.java
index 47224595..34a12c13 100644
--- a/vtm-playground/src/org/oscim/test/SpriteManager.java
+++ b/vtm-playground/src/org/oscim/test/SpriteManager.java
@@ -20,8 +20,8 @@ import org.oscim.backend.CanvasAdapter;
 import org.oscim.backend.canvas.Canvas;
 import org.oscim.renderer.atlas.TextureAtlas;
 import org.oscim.renderer.atlas.TextureAtlas.Rect;
-import org.oscim.renderer.elements.TextureItem;
-import org.oscim.renderer.elements.TextureItem.TexturePool;
+import org.oscim.renderer.bucket.TextureItem;
+import org.oscim.renderer.bucket.TextureItem.TexturePool;
 import org.oscim.utils.pool.Inlist;
 
 /**
diff --git a/vtm-playground/src/org/oscim/test/gdx/poi3d/Poi3DLayer.java b/vtm-playground/src/org/oscim/test/gdx/poi3d/Poi3DLayer.java
index 35967955..9f021f48 100644
--- a/vtm-playground/src/org/oscim/test/gdx/poi3d/Poi3DLayer.java
+++ b/vtm-playground/src/org/oscim/test/gdx/poi3d/Poi3DLayer.java
@@ -16,8 +16,8 @@ import org.oscim.layers.tile.TileSet;
 import org.oscim.layers.tile.vector.VectorTileLayer;
 import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderProcessHook;
 import org.oscim.map.Map;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.SymbolItem;
+import org.oscim.renderer.bucket.RenderBuckets;
+import org.oscim.renderer.bucket.SymbolItem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -59,7 +59,7 @@ public class Poi3DLayer extends Layer implements Map.UpdateListener {
 		tileLayer.addHook(new TileLoaderProcessHook() {
 
 			@Override
-			public boolean process(MapTile tile, ElementLayers layers, MapElement element) {
+			public boolean process(MapTile tile, RenderBuckets buckets, MapElement element) {
 
 				if (!element.tags.contains(TREE_TAG))
 					return false;
diff --git a/vtm-playground/src/org/oscim/test/renderer/AtlasTest.java b/vtm-playground/src/org/oscim/test/renderer/AtlasTest.java
index 10dd48aa..398fef7a 100644
--- a/vtm-playground/src/org/oscim/test/renderer/AtlasTest.java
+++ b/vtm-playground/src/org/oscim/test/renderer/AtlasTest.java
@@ -7,14 +7,14 @@ import org.oscim.backend.canvas.Paint.Cap;
 import org.oscim.gdx.GdxMap;
 import org.oscim.gdx.GdxMapApp;
 import org.oscim.layers.GenericLayer;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.atlas.TextureAtlas;
 import org.oscim.renderer.atlas.TextureAtlas.Rect;
 import org.oscim.renderer.atlas.TextureAtlas.Slot;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.TextItem;
-import org.oscim.renderer.elements.TextLayer;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.TextBucket;
+import org.oscim.renderer.bucket.TextItem;
 import org.oscim.theme.styles.LineStyle;
 import org.oscim.theme.styles.TextStyle;
 import org.oscim.theme.styles.TextStyle.TextBuilder;
@@ -34,7 +34,7 @@ public class AtlasTest extends GdxMap {
 		GdxMapApp.run(new AtlasTest(), null, 400);
 	}
 
-	static class AtlasRenderLayer extends ElementRenderer {
+	static class AtlasRenderLayer extends BucketRenderer {
 
 		Logger log = LoggerFactory.getLogger(AtlasRenderLayer.class);
 
@@ -42,21 +42,21 @@ public class AtlasTest extends GdxMap {
 
 			TextureAtlas mAtlas = TextureAtlas.create(2048, 2048, 1);
 
-			LineLayer ll = layers.getLineLayer(0);
+			LineBucket ll = buckets.getLineBucket(0);
 			ll.line = new LineStyle(Color.BLUE, 3, Cap.BUTT);
 			ll.scale = 1f;
 
-			LineLayer ll2 = layers.getLineLayer(1);
+			LineBucket ll2 = buckets.getLineBucket(1);
 			ll2.line = new LineStyle(Color.RED, 3, Cap.BUTT);
 			ll2.scale = 1f;
 
-			LineLayer ll3 = layers.getLineLayer(2);
+			LineBucket ll3 = buckets.getLineBucket(2);
 			ll3.line = new LineStyle(Color.GREEN, 3, Cap.BUTT);
 			ll3.scale = 1f;
 
-			TextLayer tl = new TextLayer();
+			TextBucket tl = new TextBucket();
 			TextStyle t = new TextBuilder().setFontSize(20).setColor(Color.BLACK).build();
-			layers.setTextureLayers(tl);
+			buckets.setTextureBuckets(tl);
 
 			float[] points = new float[10];
 
diff --git a/vtm-playground/src/org/oscim/test/renderer/BezierTest.java b/vtm-playground/src/org/oscim/test/renderer/BezierTest.java
index 373e76b0..d475854f 100644
--- a/vtm-playground/src/org/oscim/test/renderer/BezierTest.java
+++ b/vtm-playground/src/org/oscim/test/renderer/BezierTest.java
@@ -8,9 +8,9 @@ import org.oscim.core.Point;
 import org.oscim.gdx.GdxMap;
 import org.oscim.gdx.GdxMapApp;
 import org.oscim.layers.GenericLayer;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLViewport;
-import org.oscim.renderer.elements.LineLayer;
+import org.oscim.renderer.bucket.LineBucket;
 import org.oscim.theme.styles.LineStyle;
 import org.oscim.utils.geom.BezierPath;
 
@@ -26,7 +26,7 @@ public class BezierTest extends GdxMap {
 		GdxMapApp.run(new BezierTest(), null, 400);
 	}
 
-	static class BezierPathLayer extends ElementRenderer {
+	static class BezierPathLayer extends BucketRenderer {
 
 		public BezierPathLayer() {
 			mMapPosition.scale = 0;
@@ -42,7 +42,7 @@ public class BezierTest extends GdxMap {
 				// System.out.println(pts[i]);
 				g.addPoint(pts[i]);
 			}
-			LineLayer ll = layers.addLineLayer(0, new LineStyle(Color.BLUE, 2f));
+			LineBucket ll = buckets.addLineBucket(0, new LineStyle(Color.BLUE, 2f));
 			ll.addLine(g);
 
 			List<Point> ctrl = BezierPath.cubicSplineControlPoints(pts, 0.1f);
@@ -64,13 +64,13 @@ public class BezierTest extends GdxMap {
 				}
 				p0 = p3;
 			}
-			ll = layers.addLineLayer(1, new LineStyle(Color.CYAN, 2f));
+			ll = buckets.addLineBucket(1, new LineStyle(Color.CYAN, 2f));
 			ll.addLine(g);
 
 		}
 
 		public synchronized void clear() {
-			layers.clear();
+			buckets.clear();
 			setReady(false);
 		}
 
diff --git a/vtm-playground/src/org/oscim/test/renderer/HexagonRenderTest.java b/vtm-playground/src/org/oscim/test/renderer/HexagonRenderTest.java
index b348d61c..603a685b 100644
--- a/vtm-playground/src/org/oscim/test/renderer/HexagonRenderTest.java
+++ b/vtm-playground/src/org/oscim/test/renderer/HexagonRenderTest.java
@@ -8,7 +8,7 @@ import org.oscim.gdx.GdxMap;
 import org.oscim.gdx.GdxMapApp;
 import org.oscim.layers.GenericLayer;
 import org.oscim.renderer.BufferObject;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLShader;
 import org.oscim.renderer.GLState;
 import org.oscim.renderer.GLUtils;
@@ -35,7 +35,7 @@ public class HexagonRenderTest extends GdxMap {
 	 * based on chapter 2 from:
 	 * https://github.com/dalinaum/opengl-es-book-samples/tree/master/Android */
 
-	static class HexagonRenderer extends ElementRenderer {
+	static class HexagonRenderer extends BucketRenderer {
 
 		private int mProgramObject;
 		private int hVertexPosition;
diff --git a/vtm-playground/src/org/oscim/test/renderer/SymbolRenderLayer.java b/vtm-playground/src/org/oscim/test/renderer/SymbolRenderLayer.java
index e736cb5f..8288ce68 100644
--- a/vtm-playground/src/org/oscim/test/renderer/SymbolRenderLayer.java
+++ b/vtm-playground/src/org/oscim/test/renderer/SymbolRenderLayer.java
@@ -17,17 +17,17 @@
 package org.oscim.test.renderer;
 
 import org.oscim.backend.CanvasAdapter;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLViewport;
-import org.oscim.renderer.elements.SymbolItem;
-import org.oscim.renderer.elements.SymbolLayer;
+import org.oscim.renderer.bucket.SymbolBucket;
+import org.oscim.renderer.bucket.SymbolItem;
 
-public class SymbolRenderLayer extends ElementRenderer {
+public class SymbolRenderLayer extends BucketRenderer {
 	boolean initialize = true;
 
 	public SymbolRenderLayer() {
-		SymbolLayer l = new SymbolLayer();
-		layers.setTextureLayers(l);
+		SymbolBucket l = new SymbolBucket();
+		buckets.setTextureBuckets(l);
 
 		SymbolItem it = SymbolItem.pool.get();
 		it.billboard = false;
diff --git a/vtm-web/src/org/oscim/gdx/emu/org/oscim/utils/Tessellator.java b/vtm-web/src/org/oscim/gdx/emu/org/oscim/utils/Tessellator.java
index 4c4edcb1..fac67faa 100644
--- a/vtm-web/src/org/oscim/gdx/emu/org/oscim/utils/Tessellator.java
+++ b/vtm-web/src/org/oscim/gdx/emu/org/oscim/utils/Tessellator.java
@@ -1,7 +1,7 @@
 package org.oscim.utils;
 
 import org.oscim.core.GeometryBuffer;
-import org.oscim.renderer.elements.VertexData;
+import org.oscim.renderer.bucket.VertexData;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/vtm/src/org/oscim/layers/PathLayer.java b/vtm/src/org/oscim/layers/PathLayer.java
index bfc3a203..ca09804c 100644
--- a/vtm/src/org/oscim/layers/PathLayer.java
+++ b/vtm/src/org/oscim/layers/PathLayer.java
@@ -28,10 +28,10 @@ import org.oscim.core.MapPosition;
 import org.oscim.core.MercatorProjection;
 import org.oscim.core.Tile;
 import org.oscim.map.Map;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLViewport;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.LineLayer;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.oscim.theme.styles.LineStyle;
 import org.oscim.utils.FastMath;
 import org.oscim.utils.async.SimpleWorker;
@@ -188,11 +188,11 @@ public class PathLayer extends Layer {
 	/***
 	 * everything below runs on GL- and Worker-Thread
 	 ***/
-	final class RenderPath extends ElementRenderer {
+	final class RenderPath extends BucketRenderer {
 
 		public RenderPath() {
 
-			layers.addLineLayer(0, mLineStyle);
+			buckets.addLineBucket(0, mLineStyle);
 		}
 
 		private int mCurX = -1;
@@ -221,13 +221,13 @@ public class PathLayer extends Layer {
 			mMapPosition.copy(t.pos);
 
 			// compile new layers
-			layers.setBaseLayers(t.layer.getBaseLayers());
+			buckets.setBaseBuckets(t.bucket.getBaseBuckets());
 			compile();
 		}
 	}
 
 	final static class Task {
-		ElementLayers layer = new ElementLayers();
+		RenderBuckets bucket = new RenderBuckets();
 		MapPosition pos = new MapPosition();
 	}
 
@@ -294,16 +294,16 @@ public class PathLayer extends Layer {
 
 			}
 			if (size == 0) {
-				if (task.layer.getBaseLayers() != null) {
-					task.layer.clear();
+				if (task.bucket.getBaseBuckets() != null) {
+					task.bucket.clear();
 					mMap.render();
 				}
 				return true;
 			}
 
-			ElementLayers layers = task.layer;
+			RenderBuckets layers = task.bucket;
 
-			LineLayer ll = layers.getLineLayer(0);
+			LineBucket ll = layers.getLineBucket(0);
 			ll.line = mLineStyle;
 			ll.scale = ll.line.width;
 
@@ -398,7 +398,7 @@ public class PathLayer extends Layer {
 
 		@Override
 		public void cleanup(Task task) {
-			task.layer.clear();
+			task.bucket.clear();
 		}
 
 		private int addPoint(float[] points, int i, int x, int y) {
diff --git a/vtm/src/org/oscim/layers/marker/MarkerRenderer.java b/vtm/src/org/oscim/layers/marker/MarkerRenderer.java
index eab5bcd6..6ce3e712 100644
--- a/vtm/src/org/oscim/layers/marker/MarkerRenderer.java
+++ b/vtm/src/org/oscim/layers/marker/MarkerRenderer.java
@@ -22,18 +22,18 @@ import java.util.Comparator;
 import org.oscim.core.MercatorProjection;
 import org.oscim.core.Point;
 import org.oscim.core.Tile;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLViewport;
-import org.oscim.renderer.elements.SymbolItem;
-import org.oscim.renderer.elements.SymbolLayer;
+import org.oscim.renderer.bucket.SymbolBucket;
+import org.oscim.renderer.bucket.SymbolItem;
 import org.oscim.utils.TimSort;
 import org.oscim.utils.geom.GeometryUtils;
 
-public class MarkerRenderer extends ElementRenderer {
+public class MarkerRenderer extends BucketRenderer {
 
 	protected final MarkerSymbol mDefaultMarker;
 
-	private final SymbolLayer mSymbolLayer;
+	private final SymbolBucket mSymbolLayer;
 	private final float[] mBox = new float[8];
 	private final MarkerLayer<MarkerItem> mMarkerLayer;
 	private final Point mMapPoint = new Point();
@@ -61,7 +61,7 @@ public class MarkerRenderer extends ElementRenderer {
 	}
 
 	public MarkerRenderer(MarkerLayer<MarkerItem> markerLayer, MarkerSymbol defaultSymbol) {
-		mSymbolLayer = new SymbolLayer();
+		mSymbolLayer = new SymbolBucket();
 		mMarkerLayer = markerLayer;
 		mDefaultMarker = defaultSymbol;
 	}
@@ -86,8 +86,8 @@ public class MarkerRenderer extends ElementRenderer {
 		long flip = (long) (Tile.SIZE * v.pos.scale) >> 1;
 
 		if (mItems == null) {
-			if (layers.getTextureLayers() != null) {
-				layers.clear();
+			if (buckets.getTextureBuckets() != null) {
+				buckets.clear();
 				compile();
 			}
 			return;
@@ -131,7 +131,7 @@ public class MarkerRenderer extends ElementRenderer {
 		 * or more than 10 of the current items became invisible */
 		//if ((numVisible == 0) && (changedVisible == 0 && changesInvisible < 10))
 		//	return;
-		layers.clear();
+		buckets.clear();
 
 		if (numVisible == 0) {
 			compile();
@@ -162,8 +162,8 @@ public class MarkerRenderer extends ElementRenderer {
 			mSymbolLayer.pushSymbol(s);
 		}
 
-		layers.setTextureLayers(mSymbolLayer);
-		layers.prepare();
+		buckets.setTextureBuckets(mSymbolLayer);
+		buckets.prepare();
 
 		compile();
 	}
diff --git a/vtm/src/org/oscim/layers/tile/MapTile.java b/vtm/src/org/oscim/layers/tile/MapTile.java
index 00f56d2c..25a182e0 100644
--- a/vtm/src/org/oscim/layers/tile/MapTile.java
+++ b/vtm/src/org/oscim/layers/tile/MapTile.java
@@ -23,7 +23,7 @@ import static org.oscim.layers.tile.MapTile.State.READY;
 import org.oscim.core.Tile;
 import org.oscim.layers.tile.vector.VectorTileLoader;
 import org.oscim.layers.tile.vector.labeling.LabelTileLoaderHook;
-import org.oscim.renderer.elements.ElementLayers;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.oscim.utils.pool.Inlist;
 import org.oscim.utils.quadtree.TileIndex;
 import org.oscim.utils.quadtree.TreeNode;
@@ -266,11 +266,11 @@ public class MapTile extends Tile {
 	 * Get the default ElementLayers which are added
 	 * by {@link VectorTileLoader}
 	 */
-	public ElementLayers getLayers() {
-		if (!(data instanceof ElementLayers))
+	public RenderBuckets getLayers() {
+		if (!(data instanceof RenderBuckets))
 			return null;
 
-		return (ElementLayers) data;
+		return (RenderBuckets) data;
 	}
 
 	public TileData getData(Object id) {
diff --git a/vtm/src/org/oscim/layers/tile/TileRenderer.java b/vtm/src/org/oscim/layers/tile/TileRenderer.java
index b3a7c156..ab0e0b78 100644
--- a/vtm/src/org/oscim/layers/tile/TileRenderer.java
+++ b/vtm/src/org/oscim/layers/tile/TileRenderer.java
@@ -26,7 +26,7 @@ import org.oscim.renderer.BufferObject;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.LayerRenderer;
 import org.oscim.renderer.MapRenderer;
-import org.oscim.renderer.elements.ElementLayers;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.oscim.utils.ScanBox;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -175,7 +175,7 @@ public abstract class TileRenderer extends LayerRenderer {
 
 	private static int uploadTileData(MapTile tile) {
 		tile.state = READY;
-		ElementLayers layers = tile.getLayers();
+		RenderBuckets layers = tile.getLayers();
 
 		/* tile might only contain label layers */
 		if (layers == null)
diff --git a/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java b/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java
index cda638b9..b3805a0c 100644
--- a/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java
+++ b/vtm/src/org/oscim/layers/tile/VectorTileRenderer.java
@@ -5,12 +5,12 @@ import static org.oscim.layers.tile.MapTile.PROXY_GRAMPA;
 import static org.oscim.layers.tile.MapTile.PROXY_PARENT;
 import static org.oscim.layers.tile.MapTile.State.READY;
 import static org.oscim.renderer.MapRenderer.COORD_SCALE;
-import static org.oscim.renderer.elements.RenderElement.BITMAP;
-import static org.oscim.renderer.elements.RenderElement.HAIRLINE;
-import static org.oscim.renderer.elements.RenderElement.LINE;
-import static org.oscim.renderer.elements.RenderElement.MESH;
-import static org.oscim.renderer.elements.RenderElement.POLYGON;
-import static org.oscim.renderer.elements.RenderElement.TEXLINE;
+import static org.oscim.renderer.bucket.RenderBucket.BITMAP;
+import static org.oscim.renderer.bucket.RenderBucket.HAIRLINE;
+import static org.oscim.renderer.bucket.RenderBucket.LINE;
+import static org.oscim.renderer.bucket.RenderBucket.MESH;
+import static org.oscim.renderer.bucket.RenderBucket.POLYGON;
+import static org.oscim.renderer.bucket.RenderBucket.TEXLINE;
 
 import org.oscim.backend.GL20;
 import org.oscim.backend.canvas.Color;
@@ -19,14 +19,14 @@ import org.oscim.core.Tile;
 import org.oscim.renderer.GLMatrix;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.MapRenderer;
-import org.oscim.renderer.elements.BitmapLayer;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.HairLineLayer;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.LineTexLayer;
-import org.oscim.renderer.elements.MeshLayer;
-import org.oscim.renderer.elements.PolygonLayer;
-import org.oscim.renderer.elements.RenderElement;
+import org.oscim.renderer.bucket.BitmapBucket;
+import org.oscim.renderer.bucket.HairLineBucket;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.LineTexBucket;
+import org.oscim.renderer.bucket.MeshBucket;
+import org.oscim.renderer.bucket.PolygonBucket;
+import org.oscim.renderer.bucket.RenderBucket;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.oscim.utils.FastMath;
 
 public class VectorTileRenderer extends TileRenderer {
@@ -55,7 +55,7 @@ public class VectorTileRenderer extends TileRenderer {
 		mClipProj.setValue(14, 0);
 		mClipProj.multiplyRhs(v.view);
 
-		mClipMode = PolygonLayer.CLIP_STENCIL;
+		mClipMode = PolygonBucket.CLIP_STENCIL;
 
 		int tileCnt = mDrawTiles.cnt + mProxyTileCnt;
 
@@ -77,7 +77,7 @@ public class VectorTileRenderer extends TileRenderer {
 				 * draw where tiles were already drawn */
 				GL.glDepthFunc(GL20.GL_ALWAYS);
 
-				mClipMode = PolygonLayer.CLIP_DEPTH;
+				mClipMode = PolygonBucket.CLIP_DEPTH;
 				drawProxies = true;
 
 				break;
@@ -150,11 +150,11 @@ public class VectorTileRenderer extends TileRenderer {
 		tile.lastDraw = mDrawSerial;
 
 		/* use holder proxy when it is set */
-		ElementLayers layers = (tile.holder == null)
+		RenderBuckets buckets = (tile.holder == null)
 		        ? tile.getLayers()
 		        : tile.holder.getLayers();
 
-		if (layers == null || layers.vbo == null)
+		if (buckets == null || buckets.vbo == null)
 			return;
 
 		MapPosition pos = v.pos;
@@ -174,63 +174,63 @@ public class VectorTileRenderer extends TileRenderer {
 		mClipMVP.setTransScale(x, y, scale / COORD_SCALE);
 		mClipMVP.multiplyLhs(mClipProj);
 
-		layers.bind();
+		buckets.bind();
 
-		RenderElement l = layers.getBaseLayers();
-		PolygonLayer.Renderer.clip(mClipMVP, mClipMode);
+		PolygonBucket.Renderer.clip(mClipMVP, mClipMode);
+
+		RenderBucket b = buckets.getBaseBuckets();
 
 		boolean first = true;
-		while (l != null) {
-			if (l.type == POLYGON) {
-				l = PolygonLayer.Renderer.draw(l, v, div, first);
+		while (b != null) {
+			if (b.type == POLYGON) {
+				b = PolygonBucket.Renderer.draw(b, v, div, first);
 				first = false;
 
 				/* set test for clip to tile region */
 				GL.glStencilFunc(GL_EQUAL, 0x80, 0x80);
 				continue;
 			}
-			if (l.type == LINE) {
-				l = LineLayer.Renderer.draw(l, v, scale, layers);
+			if (b.type == LINE) {
+				b = LineBucket.Renderer.draw(b, v, scale, buckets);
 				continue;
 			}
-			if (l.type == TEXLINE) {
-				l = LineTexLayer.Renderer.draw(l, v, div, layers);
-				if (layers.ibo != null)
-					layers.ibo.bind();
+			if (b.type == TEXLINE) {
+				b = LineTexBucket.Renderer.draw(b, v, div, buckets);
+				if (buckets.ibo != null)
+					buckets.ibo.bind();
 				continue;
 			}
-			if (l.type == MESH) {
-				l = MeshLayer.Renderer.draw(l, v);
+			if (b.type == MESH) {
+				b = MeshBucket.Renderer.draw(b, v);
 				continue;
 			}
-			if (l.type == HAIRLINE) {
-				l = HairLineLayer.Renderer.draw(l, v);
+			if (b.type == HAIRLINE) {
+				b = HairLineBucket.Renderer.draw(b, v);
 				continue;
 			}
 
 			/* just in case */
-			log.error("unknown layer {}", l.type);
-			l = l.next;
+			log.error("unknown layer {}", b.type);
+			b = b.next;
 		}
 
-		l = layers.getTextureLayers();
-		while (l != null) {
-			if (l.type == BITMAP) {
-				l = BitmapLayer.Renderer.draw(l, v, 1, mLayerAlpha);
+		b = buckets.getTextureBuckets();
+		while (b != null) {
+			if (b.type == BITMAP) {
+				b = BitmapBucket.Renderer.draw(b, v, 1, mLayerAlpha);
 				continue;
 			}
-			log.error("unknown layer {}", l.type);
-			l = l.next;
+			log.error("unknown layer {}", b.type);
+			b = b.next;
 		}
 
 		if (debugOverdraw) {
-
 			if (tile.zoomLevel > pos.zoomLevel)
-				PolygonLayer.Renderer.drawOver(mClipMVP, Color.BLUE, 0.5f);
+				PolygonBucket.Renderer.drawOver(mClipMVP, Color.BLUE, 0.5f);
 			else if (tile.zoomLevel < pos.zoomLevel)
-				PolygonLayer.Renderer.drawOver(mClipMVP, Color.RED, 0.5f);
+				PolygonBucket.Renderer.drawOver(mClipMVP, Color.RED, 0.5f);
 			else
-				PolygonLayer.Renderer.drawOver(mClipMVP, Color.GREEN, 0.5f);
+				PolygonBucket.Renderer.drawOver(mClipMVP, Color.GREEN, 0.5f);
 
 			return;
 		}
@@ -244,12 +244,12 @@ public class VectorTileRenderer extends TileRenderer {
 		long dTime = MapRenderer.frametime - tile.fadeTime;
 
 		if (mOverdrawColor == 0 || dTime > FADE_TIME) {
-			PolygonLayer.Renderer.drawOver(mClipMVP, 0, 1);
+			PolygonBucket.Renderer.drawOver(mClipMVP, 0, 1);
 			return;
 		}
 
 		float fade = 1 - dTime / FADE_TIME;
-		PolygonLayer.Renderer.drawOver(mClipMVP, mOverdrawColor, fade * fade);
+		PolygonBucket.Renderer.drawOver(mClipMVP, mOverdrawColor, fade * fade);
 
 		MapRenderer.animate();
 	}
diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java
index 18523309..e80ea636 100644
--- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java
+++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLayer.java
@@ -23,7 +23,7 @@ import org.oscim.layers.tile.TileLoader;
 import org.oscim.layers.tile.TileManager;
 import org.oscim.layers.tile.VectorTileRenderer;
 import org.oscim.map.Map;
-import org.oscim.renderer.elements.TextureItem.TexturePool;
+import org.oscim.renderer.bucket.TextureItem.TexturePool;
 import org.oscim.tiling.TileSource;
 import org.oscim.utils.FastMath;
 import org.slf4j.Logger;
diff --git a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java
index 7035585e..d65839b4 100644
--- a/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java
+++ b/vtm/src/org/oscim/layers/tile/bitmap/BitmapTileLoader.java
@@ -22,8 +22,8 @@ import org.oscim.backend.canvas.Bitmap;
 import org.oscim.core.Tile;
 import org.oscim.layers.tile.MapTile;
 import org.oscim.layers.tile.TileLoader;
-import org.oscim.renderer.elements.BitmapLayer;
-import org.oscim.renderer.elements.ElementLayers;
+import org.oscim.renderer.bucket.BitmapBucket;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.oscim.tiling.ITileDataSource;
 import org.oscim.tiling.TileSource;
 import org.slf4j.Logger;
@@ -58,11 +58,11 @@ public class BitmapTileLoader extends TileLoader {
 		if (isCanceled() || mTile.state(CANCEL))
 			return;
 
-		BitmapLayer l = new BitmapLayer(false);
+		BitmapBucket l = new BitmapBucket(false);
 		l.setBitmap(bitmap, Tile.SIZE, Tile.SIZE, mLayer.pool);
 
-		ElementLayers layers = new ElementLayers();
-		layers.setTextureLayers(l);
+		RenderBuckets layers = new RenderBuckets();
+		layers.setTextureBuckets(l);
 		mTile.data = layers;
 	}
 
diff --git a/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java b/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java
index 2113e4f7..8350f003 100644
--- a/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java
+++ b/vtm/src/org/oscim/layers/tile/buildings/BuildingLayer.java
@@ -27,9 +27,9 @@ import org.oscim.map.Map;
 import org.oscim.renderer.ExtrusionRenderer;
 import org.oscim.renderer.OffscreenRenderer;
 import org.oscim.renderer.OffscreenRenderer.Mode;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.ExtrusionLayer;
-import org.oscim.renderer.elements.ExtrusionLayers;
+import org.oscim.renderer.bucket.ExtrusionBucket;
+import org.oscim.renderer.bucket.ExtrusionBuckets;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.oscim.theme.styles.ExtrusionStyle;
 import org.oscim.theme.styles.RenderStyle;
 import org.slf4j.Logger;
@@ -77,7 +77,7 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
 
 	/** TileLoaderThemeHook */
 	@Override
-	public boolean render(MapTile tile, ElementLayers layers, MapElement element,
+	public boolean render(MapTile tile, RenderBuckets buckets, MapElement element,
 	        RenderStyle style, int level) {
 
 		if (!(style instanceof ExtrusionStyle))
@@ -95,14 +95,14 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
 		if (v != null)
 			minHeight = Integer.parseInt(v);
 
-		ExtrusionLayers el = get(tile);
+		ExtrusionBuckets el = get(tile);
 
 		if (el.layers == null) {
 			double lat = MercatorProjection.toLatitude(tile.y);
 			float groundScale = (float) MercatorProjection
 			    .groundResolution(lat, 1 << tile.zoomLevel);
 
-			el.layers = new ExtrusionLayer(0, groundScale, extrusion.colors);
+			el.layers = new ExtrusionBucket(0, groundScale, extrusion.colors);
 		}
 
 		/* 12m default */
@@ -114,10 +114,10 @@ public class BuildingLayer extends Layer implements TileLoaderThemeHook {
 		return true;
 	}
 
-	public static ExtrusionLayers get(MapTile tile) {
-		ExtrusionLayers el = (ExtrusionLayers) tile.getData(BUILDING_DATA);
+	public static ExtrusionBuckets get(MapTile tile) {
+		ExtrusionBuckets el = (ExtrusionBuckets) tile.getData(BUILDING_DATA);
 		if (el == null) {
-			el = new ExtrusionLayers(tile);
+			el = new ExtrusionBuckets(tile);
 			tile.addData(BUILDING_DATA, el);
 		}
 		return el;
diff --git a/vtm/src/org/oscim/layers/tile/buildings/BuildingRenderer.java b/vtm/src/org/oscim/layers/tile/buildings/BuildingRenderer.java
index 92b9c1af..b2b2edea 100644
--- a/vtm/src/org/oscim/layers/tile/buildings/BuildingRenderer.java
+++ b/vtm/src/org/oscim/layers/tile/buildings/BuildingRenderer.java
@@ -12,8 +12,8 @@ import org.oscim.layers.tile.TileSet;
 import org.oscim.renderer.ExtrusionRenderer;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.MapRenderer;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.ExtrusionLayers;
+import org.oscim.renderer.bucket.ExtrusionBuckets;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -102,7 +102,7 @@ public class BuildingRenderer extends ExtrusionRenderer {
 
 		/* keep a list of tiles available for rendering */
 		if (mExtrusionLayerSet == null || mExtrusionLayerSet.length < mTileSet.cnt * 4)
-			mExtrusionLayerSet = new ExtrusionLayers[mTileSet.cnt * 4];
+			mExtrusionLayerSet = new ExtrusionBuckets[mTileSet.cnt * 4];
 
 		/* compile one tile max per frame */
 		boolean compiled = false;
@@ -114,7 +114,7 @@ public class BuildingRenderer extends ExtrusionRenderer {
 			/* TODO - if tile is not available try parent or children */
 
 			for (int i = 0; i < mTileSet.cnt; i++) {
-				ExtrusionLayers els = getLayer(tiles[i]);
+				ExtrusionBuckets els = getLayer(tiles[i]);
 				if (els == null)
 					continue;
 
@@ -137,7 +137,7 @@ public class BuildingRenderer extends ExtrusionRenderer {
 				//		if (c == t)
 				//			continue O;
 
-				ExtrusionLayers els = getLayer(t);
+				ExtrusionBuckets els = getLayer(t);
 				if (els == null)
 					continue;
 
@@ -158,7 +158,7 @@ public class BuildingRenderer extends ExtrusionRenderer {
 						continue;
 
 					MapTile c = t.node.child(j);
-					ExtrusionLayers el = getLayer(c);
+					ExtrusionBuckets el = getLayer(c);
 
 					if (el == null || !el.compiled)
 						continue;
@@ -192,8 +192,8 @@ public class BuildingRenderer extends ExtrusionRenderer {
 		mTileLayer.releaseTiles(mTileSet);
 	}
 
-	private static ExtrusionLayers getLayer(MapTile t) {
-		ElementLayers layers = t.getLayers();
+	private static ExtrusionBuckets getLayer(MapTile t) {
+		RenderBuckets layers = t.getLayers();
 		if (layers != null && !t.state(READY | NEW_DATA))
 			return null;
 
diff --git a/vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java b/vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java
index b05db8f6..1dabccb6 100644
--- a/vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java
+++ b/vtm/src/org/oscim/layers/tile/buildings/S3DBTileLoader.java
@@ -11,8 +11,8 @@ import org.oscim.core.Tag;
 import org.oscim.layers.tile.MapTile;
 import org.oscim.layers.tile.TileLoader;
 import org.oscim.layers.tile.TileManager;
-import org.oscim.renderer.elements.ExtrusionLayer;
-import org.oscim.renderer.elements.ExtrusionLayers;
+import org.oscim.renderer.bucket.ExtrusionBucket;
+import org.oscim.renderer.bucket.ExtrusionBuckets;
 import org.oscim.tiling.ITileDataSource;
 import org.oscim.tiling.TileSource;
 import org.slf4j.Logger;
@@ -24,8 +24,8 @@ class S3DBTileLoader extends TileLoader {
 	/** current TileDataSource used by this MapTileLoader */
 	private final ITileDataSource mTileDataSource;
 
-	private ExtrusionLayer mLayers;
-	private ExtrusionLayer mRoofs;
+	private ExtrusionBucket mLayers;
+	private ExtrusionBucket mRoofs;
 
 	private float mGroundScale;
 
@@ -75,13 +75,13 @@ class S3DBTileLoader extends TileLoader {
 		mGroundScale = (float) MercatorProjection
 		    .groundResolution(lat, 1 << mTile.zoomLevel);
 
-		mRoofs = new ExtrusionLayer(0, mGroundScale, Color.get(247, 249, 250));
+		mRoofs = new ExtrusionBucket(0, mGroundScale, Color.get(247, 249, 250));
 
-		mLayers = new ExtrusionLayer(0, mGroundScale, Color.get(255, 254, 252));
+		mLayers = new ExtrusionBucket(0, mGroundScale, Color.get(255, 254, 252));
 		//mRoofs = new ExtrusionLayer(0, mGroundScale, Color.get(207, 209, 210));
 		mRoofs.next = mLayers;
 
-		ExtrusionLayers layers = BuildingLayer.get(tile);
+		ExtrusionBuckets layers = BuildingLayer.get(tile);
 
 		layers.setLayers(mRoofs);
 
@@ -127,13 +127,13 @@ class S3DBTileLoader extends TileLoader {
 			return;
 		}
 
-		for (ExtrusionLayer l = mLayers; l != null; l = l.next()) {
+		for (ExtrusionBucket l = mLayers; l != null; l = l.next()) {
 			if (l.color == c) {
 				l.add(element);
 				return;
 			}
 		}
-		ExtrusionLayer l = new ExtrusionLayer(0, mGroundScale, c);
+		ExtrusionBucket l = new ExtrusionBucket(0, mGroundScale, c);
 
 		l.next = mLayers.next;
 		mLayers.next = l;
diff --git a/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java b/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java
index a20ebc6b..a3b057dd 100644
--- a/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java
+++ b/vtm/src/org/oscim/layers/tile/example/TestTileLayer.java
@@ -26,8 +26,8 @@ import org.oscim.layers.tile.TileLoader;
 import org.oscim.layers.tile.TileManager;
 import org.oscim.layers.tile.VectorTileRenderer;
 import org.oscim.map.Map;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.LineLayer;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.oscim.theme.styles.LineStyle;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -58,10 +58,10 @@ public class TestTileLayer extends TileLayer {
 		@Override
 		public boolean loadTile(MapTile tile) {
 			log.debug("load tile " + tile);
-			ElementLayers layers = new ElementLayers();
+			RenderBuckets layers = new RenderBuckets();
 			tile.data = layers;
 
-			LineLayer ll = layers.getLineLayer(0);
+			LineBucket ll = layers.getLineBucket(0);
 			ll.line = mLineStyle;
 			ll.scale = 2;
 
diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java
index f406cf3c..db3277a5 100644
--- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java
+++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLayer.java
@@ -23,7 +23,7 @@ import org.oscim.layers.tile.TileLoader;
 import org.oscim.layers.tile.TileManager;
 import org.oscim.layers.tile.VectorTileRenderer;
 import org.oscim.map.Map;
-import org.oscim.renderer.elements.ElementLayers;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.oscim.theme.IRenderTheme;
 import org.oscim.theme.styles.RenderStyle;
 import org.oscim.tiling.TileSource;
@@ -132,7 +132,7 @@ public class VectorTileLayer extends TileLayer {
 	 * loader threads, so dont keep tile specific state.
 	 */
 	public interface TileLoaderProcessHook {
-		public boolean process(MapTile tile, ElementLayers layers, MapElement element);
+		public boolean process(MapTile tile, RenderBuckets layers, MapElement element);
 
 		/** Called on loader thread when tile loading is completed */
 		public void complete(MapTile tile, boolean success);
@@ -145,7 +145,7 @@ public class VectorTileLayer extends TileLayer {
 	 */
 	public interface TileLoaderThemeHook {
 		/** Called for each RenderStyle found for a MapElement. */
-		public boolean render(MapTile tile, ElementLayers layers,
+		public boolean render(MapTile tile, RenderBuckets buckets,
 		        MapElement element, RenderStyle style, int level);
 
 		/** Called on loader thread when tile loading is completed */
@@ -172,7 +172,7 @@ public class VectorTileLayer extends TileLayer {
 		mTileSource.close();
 	}
 
-	public void callThemeHooks(MapTile tile, ElementLayers layers, MapElement element,
+	public void callThemeHooks(MapTile tile, RenderBuckets layers, MapElement element,
 	        RenderStyle style, int level) {
 
 		LList<TileLoaderThemeHook> th = mLoaderThemeHooks.head();
@@ -184,7 +184,7 @@ public class VectorTileLayer extends TileLayer {
 		}
 	}
 
-	public boolean callProcessHooks(MapTile tile, ElementLayers layers, MapElement element) {
+	public boolean callProcessHooks(MapTile tile, RenderBuckets layers, MapElement element) {
 
 		LList<TileLoaderProcessHook> ph = mLoaderProcessHooks.head();
 		while (ph != null) {
diff --git a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java
index 6b5462b1..4ac13450 100644
--- a/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java
+++ b/vtm/src/org/oscim/layers/tile/vector/VectorTileLoader.java
@@ -26,11 +26,11 @@ import org.oscim.core.TagSet;
 import org.oscim.core.Tile;
 import org.oscim.layers.tile.MapTile;
 import org.oscim.layers.tile.TileLoader;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.LineTexLayer;
-import org.oscim.renderer.elements.MeshLayer;
-import org.oscim.renderer.elements.PolygonLayer;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.LineTexBucket;
+import org.oscim.renderer.bucket.MeshBucket;
+import org.oscim.renderer.bucket.PolygonBucket;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.oscim.theme.IRenderTheme;
 import org.oscim.theme.RenderTheme;
 import org.oscim.theme.styles.AreaStyle;
@@ -63,7 +63,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
 	protected MapElement mElement;
 
 	/** current line layer (will be used for outline layers) */
-	protected LineLayer mCurLineLayer;
+	protected LineBucket mCurLineLayer;
 
 	/** Current layer for adding elements */
 	protected int mCurLayer;
@@ -71,7 +71,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
 	/** Line-scale-factor depending on zoom and latitude */
 	protected float mLineScale = 1.0f;
 
-	protected ElementLayers mLayers;
+	protected RenderBuckets mLayers;
 
 	private final VectorTileLayer mTileLayer;
 
@@ -109,7 +109,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
 
 		/* scale line width relative to latitude + PI * thumb */
 		mLineScale *= 0.4f + 0.6f * ((float) Math.sin(Math.abs(lat) * (Math.PI / 180)));
-		mLayers = new ElementLayers();
+		mLayers = new RenderBuckets();
 		tile.data = mLayers;
 
 		try {
@@ -244,7 +244,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
 				return;
 			}
 
-			LineLayer ll = mLayers.getLineLayer(numLayer);
+			LineBucket ll = mLayers.getLineBucket(numLayer);
 
 			if (ll.line == null) {
 				ll.line = line;
@@ -263,7 +263,7 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
 			mCurLineLayer = ll;
 
 		} else {
-			LineTexLayer ll = mLayers.getLineTexLayer(numLayer);
+			LineTexBucket ll = mLayers.getLineTexBucket(numLayer);
 
 			if (ll.line == null) {
 				ll.line = line;
@@ -287,11 +287,11 @@ public class VectorTileLoader extends TileLoader implements IRenderTheme.Callbac
 	public void renderArea(AreaStyle area, int level) {
 		int numLayer = mCurLayer + level;
 		if (USE_MESH_POLY) {
-			MeshLayer l = mLayers.getMeshLayer(numLayer);
+			MeshBucket l = mLayers.getMeshBucket(numLayer);
 			l.area = area;
 			l.addMesh(mElement);
 		} else {
-			PolygonLayer l = mLayers.getPolygonLayer(numLayer);
+			PolygonBucket l = mLayers.getPolygonBucket(numLayer);
 			l.area = area;
 			l.addPolygon(mElement.points, mElement.index);
 		}
diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/Debug.java b/vtm/src/org/oscim/layers/tile/vector/labeling/Debug.java
index fa8c69ca..1c86eb5c 100644
--- a/vtm/src/org/oscim/layers/tile/vector/labeling/Debug.java
+++ b/vtm/src/org/oscim/layers/tile/vector/labeling/Debug.java
@@ -19,38 +19,38 @@ package org.oscim.layers.tile.vector.labeling;
 import org.oscim.backend.canvas.Color;
 import org.oscim.core.MapPosition;
 import org.oscim.renderer.GLViewport;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.TextItem;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.RenderBuckets;
+import org.oscim.renderer.bucket.TextItem;
 import org.oscim.theme.styles.LineStyle;
 
 class Debug {
 
 	private final static float[] mDebugPoints = new float[8];
 	// TODO Auto-generated method stub
-	static ElementLayers dbg;
+	static RenderBuckets dbg;
 
 	static void addDebugBox(Label l, TextItem ti, int overlaps, boolean prev,
 	        float scale) {
 
-		LineLayer ll;
+		LineBucket ll;
 		if (prev) {
 			if (overlaps == 1)
-				ll = dbg.getLineLayer(4);
+				ll = dbg.getLineBucket(4);
 			else
-				ll = dbg.getLineLayer(5);
+				ll = dbg.getLineBucket(5);
 
 		} else {
 			if (ti.width > ti.length * scale) {
-				ll = dbg.getLineLayer(1);
+				ll = dbg.getLineBucket(1);
 				overlaps = 3;
 			}
 			else if (overlaps == 1)
-				ll = dbg.getLineLayer(0);
+				ll = dbg.getLineBucket(0);
 			else if (overlaps == 2)
-				ll = dbg.getLineLayer(3);
+				ll = dbg.getLineBucket(3);
 			else
-				ll = dbg.getLineLayer(2);
+				ll = dbg.getLineBucket(2);
 		}
 		float[] points = mDebugPoints;
 		float width = (ti.x2 - ti.x1) / 2f;
@@ -67,19 +67,19 @@ class Debug {
 		}
 	}
 
-	static void addDebugLayers(ElementLayers dbg) {
+	static void addDebugLayers(RenderBuckets dbg) {
 		int alpha = 0xaaffffff;
 
 		dbg.clear();
-		dbg.addLineLayer(0, new LineStyle((Color.BLUE & alpha), 2));
-		dbg.addLineLayer(1, new LineStyle((Color.RED & alpha), 2));
-		dbg.addLineLayer(3, new LineStyle((Color.YELLOW & alpha), 2));
-		dbg.addLineLayer(2, new LineStyle((Color.GREEN & alpha), 2));
-		dbg.addLineLayer(4, new LineStyle((Color.CYAN & alpha), 2));
-		dbg.addLineLayer(5, new LineStyle((Color.MAGENTA & alpha), 2));
+		dbg.addLineBucket(0, new LineStyle((Color.BLUE & alpha), 2));
+		dbg.addLineBucket(1, new LineStyle((Color.RED & alpha), 2));
+		dbg.addLineBucket(3, new LineStyle((Color.YELLOW & alpha), 2));
+		dbg.addLineBucket(2, new LineStyle((Color.GREEN & alpha), 2));
+		dbg.addLineBucket(4, new LineStyle((Color.CYAN & alpha), 2));
+		dbg.addLineBucket(5, new LineStyle((Color.MAGENTA & alpha), 2));
 	}
 
-	public static void draw(MapPosition pos, GLViewport m, ElementLayers layers) {
+	public static void draw(MapPosition pos, GLViewport m, RenderBuckets layers) {
 		//		if (layers.baseLayers != null) {
 		//			//setMatrix(pos, m, true);
 		//
diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/Label.java b/vtm/src/org/oscim/layers/tile/vector/labeling/Label.java
index 93feb93d..00efeda1 100644
--- a/vtm/src/org/oscim/layers/tile/vector/labeling/Label.java
+++ b/vtm/src/org/oscim/layers/tile/vector/labeling/Label.java
@@ -16,7 +16,7 @@
  */
 package org.oscim.layers.tile.vector.labeling;
 
-import org.oscim.renderer.elements.TextItem;
+import org.oscim.renderer.bucket.TextItem;
 import org.oscim.utils.geom.OBB2D;
 
 final class Label extends TextItem {
diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPlacement.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPlacement.java
index 9bcc3e3e..5bd1c48c 100644
--- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPlacement.java
+++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPlacement.java
@@ -9,9 +9,9 @@ import org.oscim.layers.tile.MapTile;
 import org.oscim.layers.tile.TileRenderer;
 import org.oscim.layers.tile.TileSet;
 import org.oscim.map.Map;
-import org.oscim.renderer.elements.SymbolItem;
-import org.oscim.renderer.elements.SymbolLayer;
-import org.oscim.renderer.elements.TextItem;
+import org.oscim.renderer.bucket.SymbolBucket;
+import org.oscim.renderer.bucket.SymbolItem;
+import org.oscim.renderer.bucket.TextItem;
 import org.oscim.utils.FastMath;
 import org.oscim.utils.geom.OBB2D;
 
@@ -322,7 +322,7 @@ public class LabelPlacement {
 		int maxx = Tile.SIZE << (zoom - 1);
 
 		// FIXME ???
-		SymbolLayer sl = work.symbolLayer;
+		SymbolBucket sl = work.symbolLayer;
 		sl.clearItems();
 
 		double tileX = (pos.x * (Tile.SIZE << zoom));
diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPool.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPool.java
index b81d8505..179e1afc 100644
--- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPool.java
+++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelPool.java
@@ -1,6 +1,6 @@
 package org.oscim.layers.tile.vector.labeling;
 
-import org.oscim.renderer.elements.TextItem;
+import org.oscim.renderer.bucket.TextItem;
 import org.oscim.utils.pool.Pool;
 
 final class LabelPool extends Pool<TextItem> {
diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTask.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTask.java
index 19a5596f..3bc51be6 100644
--- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTask.java
+++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTask.java
@@ -1,23 +1,23 @@
 package org.oscim.layers.tile.vector.labeling;
 
 import org.oscim.core.MapPosition;
-import org.oscim.renderer.elements.SymbolLayer;
-import org.oscim.renderer.elements.TextLayer;
-import org.oscim.renderer.elements.TextureLayer;
+import org.oscim.renderer.bucket.SymbolBucket;
+import org.oscim.renderer.bucket.TextBucket;
+import org.oscim.renderer.bucket.TextureBucket;
 
 final class LabelTask {
 
-	final TextureLayer layers;
-	final TextLayer textLayer;
-	final SymbolLayer symbolLayer;
+	final TextureBucket layers;
+	final TextBucket textLayer;
+	final SymbolBucket symbolLayer;
 
 	final MapPosition pos;
 
 	LabelTask() {
 		pos = new MapPosition();
 
-		symbolLayer = new SymbolLayer();
-		textLayer = new TextLayer();
+		symbolLayer = new SymbolBucket();
+		textLayer = new TextBucket();
 
 		layers = symbolLayer;
 		symbolLayer.next = textLayer;
diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileData.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileData.java
index 6d8fd1bb..37dcecf9 100644
--- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileData.java
+++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileData.java
@@ -1,8 +1,8 @@
 package org.oscim.layers.tile.vector.labeling;
 
 import org.oscim.layers.tile.MapTile.TileData;
-import org.oscim.renderer.elements.SymbolItem;
-import org.oscim.renderer.elements.TextItem;
+import org.oscim.renderer.bucket.SymbolItem;
+import org.oscim.renderer.bucket.TextItem;
 
 public class LabelTileData extends TileData {
 	public final List<SymbolItem> symbols = new List<SymbolItem>();
diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java
index 72322187..b30b8e31 100644
--- a/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java
+++ b/vtm/src/org/oscim/layers/tile/vector/labeling/LabelTileLoaderHook.java
@@ -9,9 +9,9 @@ import org.oscim.core.MapElement;
 import org.oscim.core.PointF;
 import org.oscim.layers.tile.MapTile;
 import org.oscim.layers.tile.vector.VectorTileLayer.TileLoaderThemeHook;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.SymbolItem;
-import org.oscim.renderer.elements.TextItem;
+import org.oscim.renderer.bucket.RenderBuckets;
+import org.oscim.renderer.bucket.SymbolItem;
+import org.oscim.renderer.bucket.TextItem;
 import org.oscim.theme.styles.RenderStyle;
 import org.oscim.theme.styles.SymbolStyle;
 import org.oscim.theme.styles.TextStyle;
@@ -31,7 +31,7 @@ public class LabelTileLoaderHook implements TileLoaderThemeHook {
 	}
 
 	@Override
-	public boolean render(MapTile tile, ElementLayers layers, MapElement element,
+	public boolean render(MapTile tile, RenderBuckets buckets, MapElement element,
 	        RenderStyle style, int level) {
 
 		if (style instanceof TextStyle) {
diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java
index 072587ef..ad565852 100644
--- a/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java
+++ b/vtm/src/org/oscim/layers/tile/vector/labeling/TextRenderer.java
@@ -31,15 +31,15 @@ package org.oscim.layers.tile.vector.labeling;
 //
 
 import org.oscim.layers.tile.vector.labeling.LabelLayer.Worker;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLState;
 import org.oscim.renderer.GLViewport;
-import org.oscim.renderer.elements.RenderElement;
-import org.oscim.renderer.elements.TextureLayer;
+import org.oscim.renderer.bucket.RenderBucket;
+import org.oscim.renderer.bucket.TextureBucket;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-class TextRenderer extends ElementRenderer {
+class TextRenderer extends BucketRenderer {
 	static final Logger log = LoggerFactory.getLogger(TextRenderer.class);
 	static final boolean dbg = false;
 
@@ -63,11 +63,11 @@ class TextRenderer extends ElementRenderer {
 				}
 				return;
 			}
-			layers.clear();
+			buckets.clear();
 		}
 
 		// set new TextLayer to be uploaded and rendered
-		layers.setTextureLayers(t.layers);
+		buckets.setTextureBuckets(t.layers);
 		mMapPosition = t.pos;
 		compile();
 	}
@@ -77,14 +77,14 @@ class TextRenderer extends ElementRenderer {
 		GLState.test(false, false);
 		//Debug.draw(pos, layers);
 
-		layers.vbo.bind();
+		buckets.vbo.bind();
 
 		float scale = (float) (v.pos.scale / mMapPosition.scale);
 
 		setMatrix(v, false);
 
-		for (RenderElement l = layers.getTextureLayers(); l != null;)
-			l = TextureLayer.Renderer.draw(layers, l, v, scale);
+		for (RenderBucket l = buckets.getTextureBuckets(); l != null;)
+			l = TextureBucket.Renderer.draw(buckets, l, v, scale);
 	}
 
 }
diff --git a/vtm/src/org/oscim/layers/tile/vector/labeling/WayDecorator.java b/vtm/src/org/oscim/layers/tile/vector/labeling/WayDecorator.java
index f0802bff..23268503 100644
--- a/vtm/src/org/oscim/layers/tile/vector/labeling/WayDecorator.java
+++ b/vtm/src/org/oscim/layers/tile/vector/labeling/WayDecorator.java
@@ -18,7 +18,7 @@
 package org.oscim.layers.tile.vector.labeling;
 
 import org.oscim.core.Tile;
-import org.oscim.renderer.elements.TextItem;
+import org.oscim.renderer.bucket.TextItem;
 import org.oscim.theme.styles.TextStyle;
 import org.oscim.utils.geom.GeometryUtils;
 import org.oscim.utils.geom.LineClipper;
diff --git a/vtm/src/org/oscim/layers/vector/AbstractVectorLayer.java b/vtm/src/org/oscim/layers/vector/AbstractVectorLayer.java
index 26260434..0eecc25e 100644
--- a/vtm/src/org/oscim/layers/vector/AbstractVectorLayer.java
+++ b/vtm/src/org/oscim/layers/vector/AbstractVectorLayer.java
@@ -9,9 +9,9 @@ import org.oscim.layers.Layer;
 import org.oscim.map.Map;
 import org.oscim.map.Map.UpdateListener;
 import org.oscim.map.Viewport;
-import org.oscim.renderer.ElementRenderer;
+import org.oscim.renderer.BucketRenderer;
 import org.oscim.renderer.GLViewport;
-import org.oscim.renderer.elements.ElementLayers;
+import org.oscim.renderer.bucket.RenderBuckets;
 import org.oscim.utils.async.SimpleWorker;
 import org.oscim.utils.geom.TileClipper;
 import org.slf4j.Logger;
@@ -64,7 +64,7 @@ public abstract class AbstractVectorLayer<T> extends Layer implements UpdateList
 	abstract protected void processFeatures(Task t, BoundingBox b);
 
 	protected static class Task {
-		public final ElementLayers layers = new ElementLayers();
+		public final RenderBuckets buckets = new RenderBuckets();
 		public final MapPosition position = new MapPosition();
 	}
 
@@ -77,8 +77,8 @@ public abstract class AbstractVectorLayer<T> extends Layer implements UpdateList
 		/** automatically in sync with worker thread */
 		@Override
 		public void cleanup(Task t) {
-			if (t.layers != null)
-				t.layers.clear();
+			if (t.buckets != null)
+				t.buckets.clear();
 		}
 
 		/** running on worker thread */
@@ -103,7 +103,7 @@ public abstract class AbstractVectorLayer<T> extends Layer implements UpdateList
 
 	}
 
-	public class Renderer extends ElementRenderer {
+	public class Renderer extends BucketRenderer {
 		MapPosition mTmpPos = new MapPosition();
 
 		@Override
@@ -117,7 +117,7 @@ public abstract class AbstractVectorLayer<T> extends Layer implements UpdateList
 			mMapPosition.copy(t.position);
 			mMapPosition.setScale(mMapPosition.scale / UNSCALE_COORD);
 
-			layers.setFrom(t.layers);
+			buckets.setFrom(t.buckets);
 
 			compile();
 			//log.debug("is ready " + isReady() + " " + layers.getSize());
diff --git a/vtm/src/org/oscim/renderer/BitmapRenderer.java b/vtm/src/org/oscim/renderer/BitmapRenderer.java
index 76e46399..238cfb71 100644
--- a/vtm/src/org/oscim/renderer/BitmapRenderer.java
+++ b/vtm/src/org/oscim/renderer/BitmapRenderer.java
@@ -17,14 +17,14 @@
 package org.oscim.renderer;
 
 import org.oscim.backend.canvas.Bitmap;
-import org.oscim.renderer.elements.BitmapLayer;
+import org.oscim.renderer.bucket.BitmapBucket;
 
 /**
  * RenderLayer to draw a custom Bitmap.
  * NOTE: Only modify the Bitmap within a synchronized block!
  * synchronized(bitmap){} Then call updateBitmap().
  */
-public class BitmapRenderer extends ElementRenderer {
+public class BitmapRenderer extends BucketRenderer {
 
 	private Bitmap mBitmap;
 	private int mWidth;
@@ -56,11 +56,11 @@ public class BitmapRenderer extends ElementRenderer {
 	@Override
 	protected synchronized void update(GLViewport v) {
 		if (!initialized) {
-			layers.clear();
+			buckets.clear();
 
-			BitmapLayer l = new BitmapLayer(true);
+			BitmapBucket l = new BitmapBucket(true);
 			l.setBitmap(mBitmap, mWidth, mHeight);
-			layers.setTextureLayers(l);
+			buckets.setTextureBuckets(l);
 
 			mUpdateBitmap = true;
 		}
@@ -84,6 +84,6 @@ public class BitmapRenderer extends ElementRenderer {
 	@Override
 	protected synchronized void render(GLViewport v) {
 		v.useScreenCoordinates(false, 8);
-		BitmapLayer.Renderer.draw(layers.getTextureLayers(), v, 1, 1);
+		BitmapBucket.Renderer.draw(buckets.getTextureBuckets(), v, 1, 1);
 	}
 }
diff --git a/vtm/src/org/oscim/renderer/ElementRenderer.java b/vtm/src/org/oscim/renderer/BucketRenderer.java
similarity index 58%
rename from vtm/src/org/oscim/renderer/ElementRenderer.java
rename to vtm/src/org/oscim/renderer/BucketRenderer.java
index a337a441..63bd7dfb 100644
--- a/vtm/src/org/oscim/renderer/ElementRenderer.java
+++ b/vtm/src/org/oscim/renderer/BucketRenderer.java
@@ -16,35 +16,35 @@
  */
 package org.oscim.renderer;
 
-import static org.oscim.renderer.elements.RenderElement.BITMAP;
-import static org.oscim.renderer.elements.RenderElement.LINE;
-import static org.oscim.renderer.elements.RenderElement.MESH;
-import static org.oscim.renderer.elements.RenderElement.POLYGON;
-import static org.oscim.renderer.elements.RenderElement.SYMBOL;
-import static org.oscim.renderer.elements.RenderElement.TEXLINE;
+import static org.oscim.renderer.bucket.RenderBucket.BITMAP;
+import static org.oscim.renderer.bucket.RenderBucket.LINE;
+import static org.oscim.renderer.bucket.RenderBucket.MESH;
+import static org.oscim.renderer.bucket.RenderBucket.POLYGON;
+import static org.oscim.renderer.bucket.RenderBucket.SYMBOL;
+import static org.oscim.renderer.bucket.RenderBucket.TEXLINE;
 
 import org.oscim.core.MapPosition;
 import org.oscim.core.Tile;
-import org.oscim.renderer.elements.BitmapLayer;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.HairLineLayer;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.LineTexLayer;
-import org.oscim.renderer.elements.MeshLayer;
-import org.oscim.renderer.elements.PolygonLayer;
-import org.oscim.renderer.elements.RenderElement;
-import org.oscim.renderer.elements.TextureLayer;
+import org.oscim.renderer.bucket.BitmapBucket;
+import org.oscim.renderer.bucket.HairLineBucket;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.LineTexBucket;
+import org.oscim.renderer.bucket.MeshBucket;
+import org.oscim.renderer.bucket.PolygonBucket;
+import org.oscim.renderer.bucket.RenderBucket;
+import org.oscim.renderer.bucket.RenderBuckets;
+import org.oscim.renderer.bucket.TextureBucket;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
  * Base class to use the renderer.elements for drawing.
  * 
- * All methods that modify 'layers' MUST be synchronized!
+ * All methods that modify 'buckets' MUST be synchronized!
  */
-public abstract class ElementRenderer extends LayerRenderer {
+public abstract class BucketRenderer extends LayerRenderer {
 
-	public static final Logger log = LoggerFactory.getLogger(ElementRenderer.class);
+	public static final Logger log = LoggerFactory.getLogger(BucketRenderer.class);
 
 	/**
 	 * Use mMapPosition.copy(position) to keep the position for which
@@ -56,11 +56,11 @@ public abstract class ElementRenderer extends LayerRenderer {
 	/** Wrap around dateline */
 	protected boolean mFlipOnDateLine = true;
 
-	/** Layer data for rendering */
-	public final ElementLayers layers;
+	/** Buckets for rendering */
+	public final RenderBuckets buckets;
 
-	public ElementRenderer() {
-		layers = new ElementLayers();
+	public BucketRenderer() {
+		buckets = new RenderBuckets();
 		mMapPosition = new MapPosition();
 	}
 
@@ -71,70 +71,70 @@ public abstract class ElementRenderer extends LayerRenderer {
 	protected synchronized void render(GLViewport v) {
 		MapPosition layerPos = mMapPosition;
 
-		layers.bind();
+		buckets.bind();
 
 		GLState.test(false, false);
 		GLState.blend(true);
 
 		float div = (float) (v.pos.scale / layerPos.scale);
 
-		RenderElement l = layers.getBaseLayers();
+		RenderBucket b = buckets.getBaseBuckets();
 
-		if (l != null)
+		if (b != null)
 			setMatrix(v, true);
 
-		while (l != null) {
-			if (l.type == POLYGON) {
-				l = PolygonLayer.Renderer.draw(l, v, 1, true);
+		while (b != null) {
+			if (b.type == POLYGON) {
+				b = PolygonBucket.Renderer.draw(b, v, 1, true);
 				continue;
 			}
-			if (l.type == LINE) {
-				l = LineLayer.Renderer.draw(l, v, div, layers);
+			if (b.type == LINE) {
+				b = LineBucket.Renderer.draw(b, v, div, buckets);
 				continue;
 			}
-			if (l.type == TEXLINE) {
-				l = LineTexLayer.Renderer.draw(l, v, div, layers);
+			if (b.type == TEXLINE) {
+				b = LineTexBucket.Renderer.draw(b, v, div, buckets);
 				// rebind
-				layers.ibo.bind();
+				buckets.ibo.bind();
 				continue;
 			}
-			if (l.type == MESH) {
-				l = MeshLayer.Renderer.draw(l, v);
+			if (b.type == MESH) {
+				b = MeshBucket.Renderer.draw(b, v);
 				continue;
 			}
-			if (l.type == RenderElement.HAIRLINE) {
-				l = HairLineLayer.Renderer.draw(l, v);
+			if (b.type == RenderBucket.HAIRLINE) {
+				b = HairLineBucket.Renderer.draw(b, v);
 				continue;
 			}
 
-			log.error("invalid layer {}", l.type);
+			log.error("invalid bucket {}", b.type);
 			break;
 		}
 
-		l = layers.getTextureLayers();
-		if (l != null)
+		b = buckets.getTextureBuckets();
+		if (b != null)
 			setMatrix(v, false);
-		while (l != null) {
-			if (l.type == BITMAP) {
-				l = BitmapLayer.Renderer.draw(l, v, 1, 1);
+		while (b != null) {
+			if (b.type == BITMAP) {
+				b = BitmapBucket.Renderer.draw(b, v, 1, 1);
 				continue;
 			}
-			if (l.type == SYMBOL) {
-				l = TextureLayer.Renderer.draw(layers, l, v, div);
+			if (b.type == SYMBOL) {
+				b = TextureBucket.Renderer.draw(buckets, b, v, div);
 				continue;
 			}
-			log.error("invalid layer {}", l.type);
+			log.error("invalid bucket {}", b.type);
 			break;
 		}
 	}
 
 	/**
-	 * Compile all layers into one BufferObject. Sets renderer to be ready
-	 * when successful. When no data is available (layer.countVboSize() == 0)
-	 * then BufferObject will be released and layers will not be rendered.
+	 * Compile all buckets into one BufferObject. Sets renderer to be ready
+	 * when successful. When no data is available (buckets.countVboSize() == 0)
+	 * then BufferObject will be released and buckets will not be rendered.
 	 */
 	protected synchronized void compile() {
-		boolean ok = layers.compile(true);
+		boolean ok = buckets.compile(true);
 		setReady(ok);
 	}
 
diff --git a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java
index d9a35a1b..2ba33ba3 100644
--- a/vtm/src/org/oscim/renderer/ExtrusionRenderer.java
+++ b/vtm/src/org/oscim/renderer/ExtrusionRenderer.java
@@ -18,8 +18,8 @@ package org.oscim.renderer;
 
 import org.oscim.backend.GL20;
 import org.oscim.core.Tile;
-import org.oscim.renderer.elements.ExtrusionLayer;
-import org.oscim.renderer.elements.ExtrusionLayers;
+import org.oscim.renderer.bucket.ExtrusionBucket;
+import org.oscim.renderer.bucket.ExtrusionBuckets;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -30,7 +30,7 @@ public abstract class ExtrusionRenderer extends LayerRenderer {
 	private final int mMode;
 	private Shader mShader;
 
-	protected ExtrusionLayers[] mExtrusionLayerSet;
+	protected ExtrusionBuckets[] mExtrusionLayerSet;
 	protected int mExtrusionLayerCnt;
 	protected float mAlpha = 1;
 
@@ -65,9 +65,9 @@ public abstract class ExtrusionRenderer extends LayerRenderer {
 		return true;
 	}
 
-	private void renderCombined(int vertexPointer, ExtrusionLayers els) {
+	private void renderCombined(int vertexPointer, ExtrusionBuckets els) {
 
-		for (ExtrusionLayer el = els.layers; el != null; el = el.next()) {
+		for (ExtrusionBucket el = els.layers; el != null; el = el.next()) {
 
 			GL.glVertexAttribPointer(vertexPointer, 3,
 			                         GL20.GL_SHORT, false, 8, 0);
@@ -105,7 +105,7 @@ public abstract class ExtrusionRenderer extends LayerRenderer {
 		GL.glDepthFunc(GL20.GL_LESS);
 		GL.glUniform1f(s.uAlpha, mAlpha);
 
-		ExtrusionLayers[] els = mExtrusionLayerSet;
+		ExtrusionBuckets[] els = mExtrusionLayerSet;
 
 		if (mTranslucent) {
 			/* only draw to depth buffer */
@@ -150,7 +150,7 @@ public abstract class ExtrusionRenderer extends LayerRenderer {
 				v.mvp.setAsUniform(s.uMVP);
 			}
 
-			ExtrusionLayer el = els[i].getLayers();
+			ExtrusionBucket el = els[i].getLayers();
 			for (; el != null; el = el.next()) {
 
 				if (el.colors != currentColor) {
@@ -243,7 +243,7 @@ public abstract class ExtrusionRenderer extends LayerRenderer {
 		GL.glBindBuffer(GL20.GL_ELEMENT_ARRAY_BUFFER, 0);
 	}
 
-	private static void setMatrix(GLViewport v, ExtrusionLayers l, boolean offset) {
+	private static void setMatrix(GLViewport v, ExtrusionBuckets l, boolean offset) {
 
 		int z = l.zoomLevel;
 		double curScale = Tile.SIZE * v.pos.scale;
diff --git a/vtm/src/org/oscim/renderer/GridRenderer.java b/vtm/src/org/oscim/renderer/GridRenderer.java
index 12853c6c..0feb8979 100644
--- a/vtm/src/org/oscim/renderer/GridRenderer.java
+++ b/vtm/src/org/oscim/renderer/GridRenderer.java
@@ -20,17 +20,17 @@ import org.oscim.backend.canvas.Color;
 import org.oscim.backend.canvas.Paint.Cap;
 import org.oscim.core.GeometryBuffer;
 import org.oscim.core.Tile;
-import org.oscim.renderer.elements.LineLayer;
-import org.oscim.renderer.elements.TextItem;
-import org.oscim.renderer.elements.TextLayer;
+import org.oscim.renderer.bucket.LineBucket;
+import org.oscim.renderer.bucket.TextBucket;
+import org.oscim.renderer.bucket.TextItem;
 import org.oscim.theme.styles.LineStyle;
 import org.oscim.theme.styles.TextStyle;
 import org.oscim.theme.styles.TextStyle.TextBuilder;
 
-public class GridRenderer extends ElementRenderer {
-	private final TextLayer mTextLayer;
+public class GridRenderer extends BucketRenderer {
+	private final TextBucket mTextBucket;
 	private final TextStyle mText;
-	private final LineLayer mLineLayer;
+	private final LineBucket mLineBucket;
 	private final GeometryBuffer mLines;
 	private final StringBuilder mStringBuffer;
 
@@ -67,14 +67,13 @@ public class GridRenderer extends ElementRenderer {
 
 		mText = textStyle;
 
-		if (mText != null) {
-			mTextLayer = layers.addTextLayer(new TextLayer());
-		} else {
-			mTextLayer = null;
-		}
+		if (mText != null)
+			mTextBucket = buckets.addTextBucket(new TextBucket());
+		else
+			mTextBucket = null;
 
-		mLineLayer = layers.addLineLayer(0, lineStyle);
-		mLineLayer.addLine(mLines);
+		mLineBucket = buckets.addLineBucket(0, lineStyle);
+		mLineBucket.addLine(mLines);
 
 		mStringBuffer = new StringBuilder(32);
 	}
@@ -82,7 +81,7 @@ public class GridRenderer extends ElementRenderer {
 	private void addLabels(int x, int y, int z) {
 		int s = Tile.SIZE;
 
-		TextLayer tl = mTextLayer;
+		TextBucket tl = mTextBucket;
 		tl.clear();
 
 		StringBuilder sb = mStringBuffer;
@@ -133,11 +132,11 @@ public class GridRenderer extends ElementRenderer {
 
 		if (mText != null) {
 			addLabels(x, y, v.pos.zoomLevel);
-			layers.setBaseLayers(mLineLayer);
-			mLineLayer.addLine(mLines);
+			buckets.setBaseBuckets(mLineBucket);
+			mLineBucket.addLine(mLines);
 			compile();
 
-		} else if (layers.vbo == null) {
+		} else if (buckets.vbo == null) {
 			compile();
 		}
 	}
diff --git a/vtm/src/org/oscim/renderer/MapRenderer.java b/vtm/src/org/oscim/renderer/MapRenderer.java
index dba15975..120b5714 100644
--- a/vtm/src/org/oscim/renderer/MapRenderer.java
+++ b/vtm/src/org/oscim/renderer/MapRenderer.java
@@ -24,9 +24,9 @@ import org.oscim.backend.GL20;
 import org.oscim.backend.GLAdapter;
 import org.oscim.backend.canvas.Color;
 import org.oscim.map.Map;
-import org.oscim.renderer.elements.ElementLayers;
-import org.oscim.renderer.elements.TextureItem;
-import org.oscim.renderer.elements.TextureLayer;
+import org.oscim.renderer.bucket.RenderBuckets;
+import org.oscim.renderer.bucket.TextureBucket;
+import org.oscim.renderer.bucket.TextureItem;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -165,7 +165,7 @@ public class MapRenderer {
 		int[] vboIds = GLUtils.glGenBuffers(2);
 
 		mQuadIndicesID = vboIds[0];
-		int maxIndices = maxQuads * TextureLayer.INDICES_PER_SPRITE;
+		int maxIndices = maxQuads * TextureBucket.INDICES_PER_SPRITE;
 		short[] indices = new short[maxIndices];
 		for (int i = 0, j = 0; i < maxIndices; i += 6, j += 4) {
 			indices[i + 0] = (short) (j + 0);
@@ -225,7 +225,7 @@ public class MapRenderer {
 		BufferObject.init(GL, 200);
 
 		// classes that require GL context for initialization
-		ElementLayers.initRenderer(GL);
+		RenderBuckets.initRenderer(GL);
 		LayerRenderer.init(GL);
 
 		mNewSurface = true;
diff --git a/vtm/src/org/oscim/renderer/atlas/TextureAtlas.java b/vtm/src/org/oscim/renderer/atlas/TextureAtlas.java
index b81e95eb..482f7320 100644
--- a/vtm/src/org/oscim/renderer/atlas/TextureAtlas.java
+++ b/vtm/src/org/oscim/renderer/atlas/TextureAtlas.java
@@ -64,7 +64,7 @@ package org.oscim.renderer.atlas;
 import java.util.HashMap;
 
 import org.oscim.backend.canvas.Bitmap;
-import org.oscim.renderer.elements.TextureItem;
+import org.oscim.renderer.bucket.TextureItem;
 import org.oscim.utils.pool.Inlist;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/vtm/src/org/oscim/renderer/atlas/TextureRegion.java b/vtm/src/org/oscim/renderer/atlas/TextureRegion.java
index fd37f7f2..ed5fcb9d 100644
--- a/vtm/src/org/oscim/renderer/atlas/TextureRegion.java
+++ b/vtm/src/org/oscim/renderer/atlas/TextureRegion.java
@@ -17,7 +17,7 @@
 package org.oscim.renderer.atlas;
 
 import org.oscim.renderer.atlas.TextureAtlas.Rect;
-import org.oscim.renderer.elements.TextureItem;
+import org.oscim.renderer.bucket.TextureItem;
 
 public class TextureRegion {
 
diff --git a/vtm/src/org/oscim/renderer/elements/BitmapLayer.java b/vtm/src/org/oscim/renderer/bucket/BitmapBucket.java
similarity index 93%
rename from vtm/src/org/oscim/renderer/elements/BitmapLayer.java
rename to vtm/src/org/oscim/renderer/bucket/BitmapBucket.java
index 7fe49ca7..53134b39 100644
--- a/vtm/src/org/oscim/renderer/elements/BitmapLayer.java
+++ b/vtm/src/org/oscim/renderer/bucket/BitmapBucket.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import java.nio.ShortBuffer;
 
@@ -24,12 +24,12 @@ import org.oscim.renderer.GLShader;
 import org.oscim.renderer.GLState;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.MapRenderer;
-import org.oscim.renderer.elements.TextureItem.TexturePool;
+import org.oscim.renderer.bucket.TextureItem.TexturePool;
 
 /**
  * Renderer for a single bitmap, width and height must be power of 2.
  */
-public class BitmapLayer extends TextureLayer {
+public class BitmapBucket extends TextureBucket {
 	// TODO share layers.vbo() between BitmapTileLayers
 
 	//	static final Logger log = LoggerFactory.getLogger(BitmapLayer.class);
@@ -42,8 +42,8 @@ public class BitmapLayer extends TextureLayer {
 	 * @param reuseBitmap false if the Bitmap should be disposed
 	 *            after loading to texture.
 	 */
-	public BitmapLayer(boolean reuseBitmap) {
-		super(RenderElement.BITMAP);
+	public BitmapBucket(boolean reuseBitmap) {
+		super(RenderBucket.BITMAP);
 
 		mReuseBitmap = reuseBitmap;
 		mVertices = new short[24];
@@ -75,7 +75,7 @@ public class BitmapLayer extends TextureLayer {
 		}
 
 		TextureItem t = textures;
-		t.indices = TextureLayer.INDICES_PER_SPRITE;
+		t.indices = TextureBucket.INDICES_PER_SPRITE;
 	}
 
 	private void setVertices(ShortBuffer vboData) {
@@ -192,14 +192,14 @@ public class BitmapLayer extends TextureLayer {
 			shader = new Shader("texture_alpha");
 		}
 
-		public static RenderElement draw(RenderElement renderElement, GLViewport v,
+		public static RenderBucket draw(RenderBucket renderElement, GLViewport v,
 		        float scale, float alpha) {
 
 			GLState.blend(true);
 			Shader s = shader;
 			s.useProgram();
 
-			TextureLayer tl = (TextureLayer) renderElement;
+			TextureBucket tl = (TextureBucket) renderElement;
 
 			GL.glUniform1f(s.uAlpha, alpha);
 			v.mvp.setAsUniform(s.uMVP);
diff --git a/vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java b/vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java
similarity index 97%
rename from vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java
rename to vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java
index 7cb38cf0..760d9955 100644
--- a/vtm/src/org/oscim/renderer/elements/ExtrusionLayer.java
+++ b/vtm/src/org/oscim/renderer/bucket/ExtrusionBucket.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import java.nio.ShortBuffer;
 
@@ -33,8 +33,8 @@ import org.oscim.utils.pool.Pool;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ExtrusionLayer extends RenderElement {
-	static final Logger log = LoggerFactory.getLogger(ExtrusionLayer.class);
+public class ExtrusionBucket extends RenderBucket {
+	static final Logger log = LoggerFactory.getLogger(ExtrusionBucket.class);
 
 	private static final float S = MapRenderer.COORD_SCALE;
 
@@ -68,8 +68,8 @@ public class ExtrusionLayer extends RenderElement {
 	/**
 	 * ExtrusionLayer for polygon geometries.
 	 */
-	public ExtrusionLayer(int level, float groundResolution, float[] colors) {
-		super(RenderElement.EXTRUSION);
+	public ExtrusionBucket(int level, float groundResolution, float[] colors) {
+		super(RenderBucket.EXTRUSION);
 		this.level = level;
 		this.colors = colors;
 		this.color = 0;
@@ -87,8 +87,8 @@ public class ExtrusionLayer extends RenderElement {
 	/**
 	 * ExtrusionLayer for triangle geometries.
 	 */
-	public ExtrusionLayer(int level, float groundResolution, int color) {
-		super(RenderElement.EXTRUSION);
+	public ExtrusionBucket(int level, float groundResolution, int color) {
+		super(RenderBucket.EXTRUSION);
 		this.level = level;
 		this.color = color;
 
@@ -620,7 +620,7 @@ public class ExtrusionLayer extends RenderElement {
 		}
 	}
 
-	public ExtrusionLayer next() {
-		return (ExtrusionLayer) next;
+	public ExtrusionBucket next() {
+		return (ExtrusionBucket) next;
 	}
 }
diff --git a/vtm/src/org/oscim/renderer/elements/ExtrusionLayers.java b/vtm/src/org/oscim/renderer/bucket/ExtrusionBuckets.java
similarity index 77%
rename from vtm/src/org/oscim/renderer/elements/ExtrusionLayers.java
rename to vtm/src/org/oscim/renderer/bucket/ExtrusionBuckets.java
index 59298801..cbf35981 100644
--- a/vtm/src/org/oscim/renderer/elements/ExtrusionLayers.java
+++ b/vtm/src/org/oscim/renderer/bucket/ExtrusionBuckets.java
@@ -1,4 +1,4 @@
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import java.nio.ShortBuffer;
 
@@ -10,10 +10,10 @@ import org.oscim.renderer.MapRenderer;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class ExtrusionLayers extends TileData {
-	static final Logger log = LoggerFactory.getLogger(ExtrusionLayers.class);
+public class ExtrusionBuckets extends TileData {
+	static final Logger log = LoggerFactory.getLogger(ExtrusionBuckets.class);
 
-	public ExtrusionLayer layers;
+	public ExtrusionBucket layers;
 
 	public boolean compiled;
 
@@ -25,7 +25,7 @@ public class ExtrusionLayers extends TileData {
 	public BufferObject ibo;
 	public BufferObject vbo;
 
-	public ExtrusionLayers(MapTile tile) {
+	public ExtrusionBuckets(MapTile tile) {
 		zoomLevel = tile.zoomLevel;
 		x = tile.x;
 		y = tile.y;
@@ -34,14 +34,14 @@ public class ExtrusionLayers extends TileData {
 	/**
 	 * Set new ExtrusionLayers and clear previous.
 	 */
-	public void setLayers(ExtrusionLayer el) {
-		for (RenderElement l = layers; l != null; l = l.next)
+	public void setLayers(ExtrusionBucket el) {
+		for (RenderBucket l = layers; l != null; l = l.next)
 			l.clear();
 
 		layers = el;
 	}
 
-	public ExtrusionLayer getLayers() {
+	public ExtrusionBucket getLayers() {
 		return layers;
 	}
 
@@ -57,7 +57,7 @@ public class ExtrusionLayers extends TileData {
 	}
 
 	public void prepare() {
-		for (RenderElement l = layers; l != null; l = l.next)
+		for (RenderBucket l = layers; l != null; l = l.next)
 			l.prepare();
 	}
 
@@ -69,7 +69,7 @@ public class ExtrusionLayers extends TileData {
 		int sumIndices = 0;
 		int sumVertices = 0;
 
-		for (ExtrusionLayer l = layers; l != null; l = l.next()) {
+		for (ExtrusionBucket l = layers; l != null; l = l.next()) {
 			sumIndices += l.numIndices;
 			sumVertices += l.numVertices;
 		}
@@ -79,7 +79,7 @@ public class ExtrusionLayers extends TileData {
 		ShortBuffer vboData = MapRenderer.getShortBuffer(sumVertices * 4);
 		ShortBuffer iboData = MapRenderer.getShortBuffer(sumIndices);
 
-		for (ExtrusionLayer l = layers; l != null; l = l.next()) {
+		for (ExtrusionBucket l = layers; l != null; l = l.next()) {
 			l.compile(vboData, iboData);
 		}
 		int size = sumIndices * 2;
diff --git a/vtm/src/org/oscim/renderer/elements/HairLineLayer.java b/vtm/src/org/oscim/renderer/bucket/HairLineBucket.java
similarity index 89%
rename from vtm/src/org/oscim/renderer/elements/HairLineLayer.java
rename to vtm/src/org/oscim/renderer/bucket/HairLineBucket.java
index b2be922a..26361105 100644
--- a/vtm/src/org/oscim/renderer/elements/HairLineLayer.java
+++ b/vtm/src/org/oscim/renderer/bucket/HairLineBucket.java
@@ -1,4 +1,4 @@
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import static org.oscim.backend.GL20.GL_LINES;
 import static org.oscim.backend.GL20.GL_SHORT;
@@ -14,13 +14,13 @@ import org.oscim.theme.styles.LineStyle;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class HairLineLayer extends RenderElement {
-	static final Logger log = LoggerFactory.getLogger(HairLineLayer.class);
+public class HairLineBucket extends RenderBucket {
+	static final Logger log = LoggerFactory.getLogger(HairLineBucket.class);
 
 	public LineStyle line;
 
-	public HairLineLayer(int level) {
-		super(RenderElement.HAIRLINE);
+	public HairLineBucket(int level) {
+		super(RenderBucket.HAIRLINE);
 		this.level = level;
 	}
 
@@ -112,7 +112,7 @@ public class HairLineLayer extends RenderElement {
 			}
 		}
 
-		public static RenderElement draw(RenderElement l, GLViewport v) {
+		public static RenderBucket draw(RenderBucket l, GLViewport v) {
 			GLState.blend(true);
 
 			Shader s = shader;
@@ -120,7 +120,7 @@ public class HairLineLayer extends RenderElement {
 			s.set(v);
 
 			for (; l != null && l.type == HAIRLINE; l = l.next) {
-				HairLineLayer ll = (HairLineLayer) l;
+				HairLineBucket ll = (HairLineBucket) l;
 
 				GLUtils.setColor(s.uColor, ll.line.color, 1);
 
diff --git a/vtm/src/org/oscim/renderer/elements/LineLayer.java b/vtm/src/org/oscim/renderer/bucket/LineBucket.java
similarity index 95%
rename from vtm/src/org/oscim/renderer/elements/LineLayer.java
rename to vtm/src/org/oscim/renderer/bucket/LineBucket.java
index 0ac90fea..0f0baf35 100644
--- a/vtm/src/org/oscim/renderer/elements/LineLayer.java
+++ b/vtm/src/org/oscim/renderer/bucket/LineBucket.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import org.oscim.backend.GL20;
 import org.oscim.backend.GLAdapter;
@@ -36,8 +36,8 @@ import org.slf4j.LoggerFactory;
  * resolution for coordinates is 0.25 as points will be converted
  * to fixed point values.
  */
-public final class LineLayer extends RenderElement {
-	static final Logger log = LoggerFactory.getLogger(LineLayer.class);
+public final class LineBucket extends RenderBucket {
+	static final Logger log = LoggerFactory.getLogger(LineBucket.class);
 
 	private static final float COORD_SCALE = MapRenderer.COORD_SCALE;
 	/** scale factor mapping extrusion vector to short values */
@@ -59,7 +59,7 @@ public final class LineLayer extends RenderElement {
 	private static final int DIR_MASK = 0xFFFFFFFC;
 
 	/* lines referenced by this outline layer */
-	public LineLayer outlines;
+	public LineBucket outlines;
 	public LineStyle line;
 	public float scale = 1;
 
@@ -70,13 +70,13 @@ public final class LineLayer extends RenderElement {
 
 	private int tmin = Integer.MIN_VALUE, tmax = Integer.MAX_VALUE;
 
-	LineLayer(int layer) {
-		super(RenderElement.LINE);
+	public LineBucket(int layer) {
+		super(RenderBucket.LINE);
 		this.level = layer;
 	}
 
-	public void addOutline(LineLayer link) {
-		for (LineLayer l = outlines; l != null; l = l.outlines)
+	public void addOutline(LineBucket link) {
+		for (LineBucket l = outlines; l != null; l = l.outlines)
 			if (link == l)
 				return;
 
@@ -526,7 +526,7 @@ public final class LineLayer extends RenderElement {
 
 		/* factor to normalize extrusion vector and scale to coord scale */
 		private final static float COORD_SCALE_BY_DIR_SCALE =
-		        MapRenderer.COORD_SCALE / LineLayer.DIR_SCALE;
+		        MapRenderer.COORD_SCALE / LineBucket.DIR_SCALE;
 
 		private final static int CAP_THIN = 0;
 		private final static int CAP_BUTT = 1;
@@ -565,8 +565,8 @@ public final class LineLayer extends RenderElement {
 			return true;
 		}
 
-		public static RenderElement draw(RenderElement curLayer, GLViewport v,
-		        float scale, ElementLayers layers) {
+		public static RenderBucket draw(RenderBucket curLayer, GLViewport v,
+		        float scale, RenderBuckets buckets) {
 
 			if (curLayer == null)
 				return null;
@@ -578,7 +578,6 @@ public final class LineLayer extends RenderElement {
 			Shader s = shaders[mode];
 			s.useProgram();
 
-			//GLState.useProgram(lineProgram[mode]);
 			GLState.blend(true);
 
 			/* Somehow we loose the texture after an indefinite
@@ -595,7 +594,7 @@ public final class LineLayer extends RenderElement {
 			int uLineHeight = s.uHeight;
 
 			GL.glVertexAttribPointer(s.aPos, 4, GL20.GL_SHORT,
-			                         false, 0, layers.offset[LINE]);
+			                         false, 0, buckets.offset[LINE]);
 
 			v.mvp.setAsUniform(s.uMVP);
 
@@ -620,9 +619,9 @@ public final class LineLayer extends RenderElement {
 			float heightOffset = 0;
 			GL.glUniform1f(uLineHeight, heightOffset);
 
-			RenderElement l = curLayer;
-			for (; l != null && l.type == RenderElement.LINE; l = l.next) {
-				LineLayer ll = (LineLayer) l;
+			RenderBucket l = curLayer;
+			for (; l != null && l.type == RenderBucket.LINE; l = l.next) {
+				LineBucket ll = (LineBucket) l;
 				LineStyle line = ll.line.current();
 
 				if (ll.heightOffset != heightOffset) {
@@ -693,7 +692,7 @@ public final class LineLayer extends RenderElement {
 
 				/* draw LineLayers references by this outline */
 
-				for (LineLayer ref = ll.outlines; ref != null; ref = ref.outlines) {
+				for (LineBucket ref = ll.outlines; ref != null; ref = ref.outlines) {
 					LineStyle core = ref.line.current();
 
 					// core width
diff --git a/vtm/src/org/oscim/renderer/elements/LineTexLayer.java b/vtm/src/org/oscim/renderer/bucket/LineTexBucket.java
similarity index 96%
rename from vtm/src/org/oscim/renderer/elements/LineTexLayer.java
rename to vtm/src/org/oscim/renderer/bucket/LineTexBucket.java
index 9d021052..2c0277d0 100644
--- a/vtm/src/org/oscim/renderer/elements/LineTexLayer.java
+++ b/vtm/src/org/oscim/renderer/bucket/LineTexBucket.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -76,9 +76,9 @@ import org.slf4j.LoggerFactory;
  * - in our case there is always the polygon fill array at start
  * - see addLine hack otherwise.
  */
-public final class LineTexLayer extends RenderElement {
+public final class LineTexBucket extends RenderBucket {
 
-	static final Logger log = LoggerFactory.getLogger(LineTexLayer.class);
+	static final Logger log = LoggerFactory.getLogger(LineTexBucket.class);
 
 	private static final float COORD_SCALE = MapRenderer.COORD_SCALE;
 	/* scale factor mapping extrusion vector to short values */
@@ -94,7 +94,7 @@ public final class LineTexLayer extends RenderElement {
 
 	protected boolean mRandomizeOffset = true;
 
-	LineTexLayer(int layer) {
+	LineTexBucket(int layer) {
 		super(TEXLINE);
 
 		this.level = layer;
@@ -261,7 +261,7 @@ public final class LineTexLayer extends RenderElement {
 
 		/* factor to normalize extrusion vector and scale to coord scale */
 		private final static float COORD_SCALE_BY_DIR_SCALE =
-		        MapRenderer.COORD_SCALE / LineLayer.DIR_SCALE;
+		        MapRenderer.COORD_SCALE / LineBucket.DIR_SCALE;
 
 		private static int mVertexFlipID;
 
@@ -299,8 +299,8 @@ public final class LineTexLayer extends RenderElement {
 		private final static int STRIDE = 12;
 		private final static int LEN_OFFSET = 8;
 
-		public static RenderElement draw(RenderElement curLayer, GLViewport v,
-		        float div, ElementLayers layers) {
+		public static RenderBucket draw(RenderBucket curLayer, GLViewport v,
+		        float div, RenderBuckets layers) {
 
 			//if (shader == 0)
 			//	return curLayer.next;
@@ -341,9 +341,9 @@ public final class LineTexLayer extends RenderElement {
 
 			//GL.glBindTexture(GL20.GL_TEXTURE_2D, mTexID[0]);
 
-			RenderElement l = curLayer;
+			RenderBucket l = curLayer;
 			for (; l != null && l.type == TEXLINE; l = l.next) {
-				LineTexLayer ll = (LineTexLayer) l;
+				LineTexBucket ll = (LineTexBucket) l;
 				LineStyle line = ll.line.current();
 
 				GLUtils.setColor(shader.uColor, line.stippleColor, 1);
diff --git a/vtm/src/org/oscim/renderer/elements/MeshLayer.java b/vtm/src/org/oscim/renderer/bucket/MeshBucket.java
similarity index 92%
rename from vtm/src/org/oscim/renderer/elements/MeshLayer.java
rename to vtm/src/org/oscim/renderer/bucket/MeshBucket.java
index c4300315..e82345dc 100644
--- a/vtm/src/org/oscim/renderer/elements/MeshLayer.java
+++ b/vtm/src/org/oscim/renderer/bucket/MeshBucket.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import static org.oscim.backend.GL20.GL_LINES;
 import static org.oscim.backend.GL20.GL_SHORT;
@@ -29,15 +29,15 @@ import org.oscim.renderer.GLState;
 import org.oscim.renderer.GLUtils;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.MapRenderer;
-import org.oscim.renderer.elements.VertexData.Chunk;
+import org.oscim.renderer.bucket.VertexData.Chunk;
 import org.oscim.theme.styles.AreaStyle;
 import org.oscim.utils.ColorUtil;
 import org.oscim.utils.TessJNI;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class MeshLayer extends RenderElement {
-	static final Logger log = LoggerFactory.getLogger(MeshLayer.class);
+public class MeshBucket extends RenderBucket {
+	static final Logger log = LoggerFactory.getLogger(MeshBucket.class);
 	static final boolean dbgRender = false;
 
 	public AreaStyle area;
@@ -45,8 +45,8 @@ public class MeshLayer extends RenderElement {
 
 	TessJNI tess = new TessJNI(8);
 
-	public MeshLayer(int level) {
-		super(RenderElement.MESH);
+	public MeshBucket(int level) {
+		super(RenderBucket.MESH);
 		this.level = level;
 
 	}
@@ -127,7 +127,7 @@ public class MeshLayer extends RenderElement {
 			}
 		}
 
-		public static RenderElement draw(RenderElement l, GLViewport v) {
+		public static RenderBucket draw(RenderBucket l, GLViewport v) {
 			GLState.blend(true);
 
 			Shader s = shader;
@@ -141,7 +141,7 @@ public class MeshLayer extends RenderElement {
 			GL.glUniform1f(s.uHeight, heightOffset);
 
 			for (; l != null && l.type == MESH; l = l.next) {
-				MeshLayer ml = (MeshLayer) l;
+				MeshBucket ml = (MeshBucket) l;
 
 				//if (ml.indicesVbo == null)
 				//	continue;
diff --git a/vtm/src/org/oscim/renderer/elements/PolygonLayer.java b/vtm/src/org/oscim/renderer/bucket/PolygonBucket.java
similarity index 94%
rename from vtm/src/org/oscim/renderer/elements/PolygonLayer.java
rename to vtm/src/org/oscim/renderer/bucket/PolygonBucket.java
index 4f22d504..170eb3bc 100644
--- a/vtm/src/org/oscim/renderer/elements/PolygonLayer.java
+++ b/vtm/src/org/oscim/renderer/bucket/PolygonBucket.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import static org.oscim.backend.GL20.GL_ALWAYS;
 import static org.oscim.backend.GL20.GL_EQUAL;
@@ -48,9 +48,9 @@ import org.slf4j.LoggerFactory;
 /**
  * Special Renderer for drawing tile polygons using the stencil buffer method
  */
-public final class PolygonLayer extends RenderElement {
+public final class PolygonBucket extends RenderBucket {
 
-	static final Logger log = LoggerFactory.getLogger(PolygonLayer.class);
+	static final Logger log = LoggerFactory.getLogger(PolygonBucket.class);
 
 	public final static int CLIP_STENCIL = 1;
 	public final static int CLIP_DEPTH = 2;
@@ -62,8 +62,8 @@ public final class PolygonLayer extends RenderElement {
 
 	public AreaStyle area;
 
-	PolygonLayer(int layer) {
-		super(RenderElement.POLYGON);
+	PolygonBucket(int layer) {
+		super(RenderBucket.POLYGON);
 		level = layer;
 	}
 
@@ -183,7 +183,7 @@ public final class PolygonLayer extends RenderElement {
 
 		private static final float FADE_START = 1.3f;
 
-		private static PolygonLayer[] mAreaLayer;
+		private static PolygonBucket[] mAreaLayer;
 
 		private static Shader polyShader;
 		private static Shader texShader;
@@ -192,7 +192,7 @@ public final class PolygonLayer extends RenderElement {
 			polyShader = new Shader("base_shader");
 			texShader = new Shader("polygon_layer_tex");
 
-			mAreaLayer = new PolygonLayer[STENCIL_BITS];
+			mAreaLayer = new PolygonBucket[STENCIL_BITS];
 
 			return true;
 		}
@@ -208,7 +208,7 @@ public final class PolygonLayer extends RenderElement {
 			Shader s;
 
 			for (int i = start; i < end; i++) {
-				PolygonLayer l = mAreaLayer[i];
+				PolygonBucket l = mAreaLayer[i];
 				AreaStyle a = l.area.current();
 
 				boolean useTexture = enableTexture && a.texture != null;
@@ -271,17 +271,17 @@ public final class PolygonLayer extends RenderElement {
 
 				GLState.blend(true);
 
-				HairLineLayer.Renderer.shader.set(v);
+				HairLineBucket.Renderer.shader.set(v);
 
-				GLUtils.setColor(HairLineLayer.Renderer.shader.uColor,
+				GLUtils.setColor(HairLineBucket.Renderer.shader.uColor,
 				                 l.area.strokeColor, 1);
 
-				GL.glVertexAttribPointer(HairLineLayer.Renderer.shader.aPos,
+				GL.glVertexAttribPointer(HairLineBucket.Renderer.shader.aPos,
 				                         2, GL_SHORT, false, 0,
 				                         // 4 bytes per vertex
 				                         l.vertexOffset << 2);
 
-				GL.glUniform1f(HairLineLayer.Renderer.shader.uWidth,
+				GL.glUniform1f(HairLineBucket.Renderer.shader.uWidth,
 				               a.strokeWidth);
 
 				GL.glDrawElements(GL_LINES,
@@ -304,8 +304,10 @@ public final class PolygonLayer extends RenderElement {
 		private static Shader setShader(Shader shader, GLMatrix mvp, boolean first) {
 			if (shader.useProgram() || first) {
 				GLState.enableVertexArrays(shader.aPos, -1);
+
 				GL.glVertexAttribPointer(shader.aPos, 2,
 				                         GL_SHORT, false, 0, 0);
+
 				mvp.setAsUniform(shader.uMVP);
 			}
 			return shader;
@@ -336,7 +338,7 @@ public final class PolygonLayer extends RenderElement {
 		 * @return
 		 *         next layer
 		 */
-		public static RenderElement draw(RenderElement renderElement, GLViewport v,
+		public static RenderBucket draw(RenderBucket renderElement, GLViewport v,
 		        float div, boolean first) {
 
 			GLState.test(false, true);
@@ -359,9 +361,9 @@ public final class PolygonLayer extends RenderElement {
 
 			byte stencilMask = 0;
 
-			RenderElement l = renderElement;
+			RenderBucket l = renderElement;
 			for (; l != null && l.type == POLYGON; l = l.next) {
-				PolygonLayer pl = (PolygonLayer) l;
+				PolygonBucket pl = (PolygonBucket) l;
 				AreaStyle area = pl.area.current();
 
 				/* fade out polygon layers (set in RenderTheme) */
@@ -503,7 +505,6 @@ public final class PolygonLayer extends RenderElement {
 		}
 
 		static void clearStencilRegion() {
-			//log.debug("clear stencil");
 
 			mCount = 0;
 			mClear = false;
@@ -516,7 +517,6 @@ public final class PolygonLayer extends RenderElement {
 
 			/* use clip bit from stencil buffer to clear stencil
 			 * 'layer-bits' (0x7f) */
-			//GL.glStencilFunc(GL_EQUAL, CLIP_BIT, CLIP_BIT);
 			GL.glStencilFunc(GL_EQUAL, CLIP_BIT, CLIP_BIT);
 
 			/* set clip bit (0x80) for draw region */
@@ -532,7 +532,7 @@ public final class PolygonLayer extends RenderElement {
 		 * and 'alpha' to fake a fade effect.
 		 */
 		public static void drawOver(GLMatrix mvp, int color, float alpha) {
-			// TODO true could be avoided when same shader and vbo
+			/* TODO true could be avoided when same shader and vbo */
 			setShader(polyShader, mvp, true);
 
 			if (color == 0) {
diff --git a/vtm/src/org/oscim/renderer/elements/RenderElement.java b/vtm/src/org/oscim/renderer/bucket/RenderBucket.java
similarity index 95%
rename from vtm/src/org/oscim/renderer/elements/RenderElement.java
rename to vtm/src/org/oscim/renderer/bucket/RenderBucket.java
index 8ccc5c26..f20defc2 100644
--- a/vtm/src/org/oscim/renderer/elements/RenderElement.java
+++ b/vtm/src/org/oscim/renderer/bucket/RenderBucket.java
@@ -14,14 +14,14 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import java.nio.ShortBuffer;
 
 import org.oscim.backend.GL20;
 import org.oscim.utils.pool.Inlist;
 
-public abstract class RenderElement extends Inlist<RenderElement> {
+public abstract class RenderBucket extends Inlist<RenderBucket> {
 	protected static GL20 GL;
 
 	public static final int LINE = 0;
@@ -46,7 +46,7 @@ public abstract class RenderElement extends Inlist<RenderElement> {
 	protected final VertexData vertexItems = new VertexData();
 	protected final VertexData indiceItems = new VertexData();
 
-	protected RenderElement(int type) {
+	protected RenderBucket(int type) {
 		this.type = type;
 	}
 
diff --git a/vtm/src/org/oscim/renderer/elements/ElementLayers.java b/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java
similarity index 54%
rename from vtm/src/org/oscim/renderer/elements/ElementLayers.java
rename to vtm/src/org/oscim/renderer/bucket/RenderBuckets.java
index 5a671911..3857ace0 100644
--- a/vtm/src/org/oscim/renderer/elements/ElementLayers.java
+++ b/vtm/src/org/oscim/renderer/bucket/RenderBuckets.java
@@ -14,13 +14,13 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
-import static org.oscim.renderer.elements.RenderElement.HAIRLINE;
-import static org.oscim.renderer.elements.RenderElement.LINE;
-import static org.oscim.renderer.elements.RenderElement.MESH;
-import static org.oscim.renderer.elements.RenderElement.POLYGON;
-import static org.oscim.renderer.elements.RenderElement.TEXLINE;
+import static org.oscim.renderer.bucket.RenderBucket.HAIRLINE;
+import static org.oscim.renderer.bucket.RenderBucket.LINE;
+import static org.oscim.renderer.bucket.RenderBucket.MESH;
+import static org.oscim.renderer.bucket.RenderBucket.POLYGON;
+import static org.oscim.renderer.bucket.RenderBucket.TEXLINE;
 
 import java.nio.ShortBuffer;
 
@@ -39,9 +39,9 @@ import org.slf4j.LoggerFactory;
  * MapTile. It can be used for other purposes as well but some optimizations
  * (and limitations) probably wont make sense in different contexts.
  */
-public class ElementLayers extends TileData {
+public class RenderBuckets extends TileData {
 
-	static final Logger log = LoggerFactory.getLogger(ElementLayers.class);
+	static final Logger log = LoggerFactory.getLogger(RenderBuckets.class);
 
 	public final static int[] VERTEX_SHORT_CNT = {
 	        4, // LINE_VERTEX
@@ -55,11 +55,11 @@ public class ElementLayers extends TileData {
 	private final static int TEXTURE_VERTEX_SHORTS = 6;
 	private final static int SHORT_BYTES = 2;
 
-	/** mixed Polygon- and LineLayer */
-	private RenderElement baseLayers;
+	/** mixed Polygon- and LineBuckets */
+	private RenderBucket baseBuckets;
 
-	/** Text- and SymbolLayer */
-	private RenderElement textureLayers;
+	/** Text- and SymbolBuckets */
+	private RenderBucket textureBuckets;
 
 	/**
 	 * VBO holds all vertex data to draw lines and polygons after compilation.
@@ -76,18 +76,18 @@ public class ElementLayers extends TileData {
 	 * To not need to switch VertexAttribPointer positions all the time:
 	 * 1. polygons are packed in VBO at offset 0
 	 * 2. lines afterwards at lineOffset
-	 * 3. other layers keep their byte offset in offset
+	 * 3. other buckets keep their byte offset in offset
 	 */
 	public int[] offset = { 0, 0 };
 
-	private RenderElement mCurLayer;
+	private RenderBucket mCurBucket;
 
 	/**
-	 * add the LineLayer for a level with a given Line style. Levels are
+	 * add the LineBucket for a level with a given Line style. Levels are
 	 * ordered from bottom (0) to top
 	 */
-	public LineLayer addLineLayer(int level, LineStyle style) {
-		LineLayer l = (LineLayer) getLayer(level, LINE);
+	public LineBucket addLineBucket(int level, LineStyle style) {
+		LineBucket l = (LineBucket) getBucket(level, LINE);
 		if (l == null)
 			return null;
 		// FIXME l.scale = style.width;
@@ -96,24 +96,24 @@ public class ElementLayers extends TileData {
 		return l;
 	}
 
-	public PolygonLayer addPolygonLayer(int level, AreaStyle style) {
-		PolygonLayer l = (PolygonLayer) getLayer(level, POLYGON);
+	public PolygonBucket addPolygonBucket(int level, AreaStyle style) {
+		PolygonBucket l = (PolygonBucket) getBucket(level, POLYGON);
 		if (l == null)
 			return null;
 		l.area = style;
 		return l;
 	}
 
-	public MeshLayer addMeshLayer(int level, AreaStyle style) {
-		MeshLayer l = (MeshLayer) getLayer(level, MESH);
+	public MeshBucket addMeshBucket(int level, AreaStyle style) {
+		MeshBucket l = (MeshBucket) getBucket(level, MESH);
 		if (l == null)
 			return null;
 		l.area = style;
 		return l;
 	}
 
-	public HairLineLayer addHairLineLayer(int level, LineStyle style) {
-		HairLineLayer ll = getHairLineLayer(level);
+	public HairLineBucket addHairLineBucket(int level, LineStyle style) {
+		HairLineBucket ll = getHairLineBucket(level);
 		if (ll == null)
 			return null;
 		ll.line = style;
@@ -122,162 +122,162 @@ public class ElementLayers extends TileData {
 	}
 
 	/**
-	 * Get or add the LineLayer for a level. Levels are ordered from
+	 * Get or add the LineBucket for a level. Levels are ordered from
 	 * bottom (0) to top
 	 */
-	public LineLayer getLineLayer(int level) {
-		return (LineLayer) getLayer(level, LINE);
+	public LineBucket getLineBucket(int level) {
+		return (LineBucket) getBucket(level, LINE);
 	}
 
 	/**
-	 * Get or add the MeshLayer for a level. Levels are ordered from
+	 * Get or add the MeshBucket for a level. Levels are ordered from
 	 * bottom (0) to top
 	 */
-	public MeshLayer getMeshLayer(int level) {
-		return (MeshLayer) getLayer(level, MESH);
+	public MeshBucket getMeshBucket(int level) {
+		return (MeshBucket) getBucket(level, MESH);
 	}
 
 	/**
-	 * Get or add the PolygonLayer for a level. Levels are ordered from
+	 * Get or add the PolygonBucket for a level. Levels are ordered from
 	 * bottom (0) to top
 	 */
-	public PolygonLayer getPolygonLayer(int level) {
-		return (PolygonLayer) getLayer(level, POLYGON);
+	public PolygonBucket getPolygonBucket(int level) {
+		return (PolygonBucket) getBucket(level, POLYGON);
 	}
 
 	/**
-	 * Get or add the TexLineLayer for a level. Levels are ordered from
+	 * Get or add the TexLineBucket for a level. Levels are ordered from
 	 * bottom (0) to top
 	 */
-	public LineTexLayer getLineTexLayer(int level) {
-		return (LineTexLayer) getLayer(level, TEXLINE);
+	public LineTexBucket getLineTexBucket(int level) {
+		return (LineTexBucket) getBucket(level, TEXLINE);
 	}
 
 	/**
-	 * Get or add the TexLineLayer for a level. Levels are ordered from
+	 * Get or add the TexLineBucket for a level. Levels are ordered from
 	 * bottom (0) to top
 	 */
-	public HairLineLayer getHairLineLayer(int level) {
-		return (HairLineLayer) getLayer(level, HAIRLINE);
+	public HairLineBucket getHairLineBucket(int level) {
+		return (HairLineBucket) getBucket(level, HAIRLINE);
 	}
 
-	public TextLayer addTextLayer(TextLayer textLayer) {
-		textLayer.next = textureLayers;
-		textureLayers = textLayer;
-		return textLayer;
+	public TextBucket addTextBucket(TextBucket textBucket) {
+		textBucket.next = textureBuckets;
+		textureBuckets = textBucket;
+		return textBucket;
 	}
 
 	/**
-	 * Set new Base-Layers and clear previous.
+	 * Set new Base-Buckets and clear previous.
 	 */
-	public void setBaseLayers(RenderElement layers) {
-		for (RenderElement l = baseLayers; l != null; l = l.next)
+	public void setBaseBuckets(RenderBucket buckets) {
+		for (RenderBucket l = baseBuckets; l != null; l = l.next)
 			l.clear();
 
-		baseLayers = layers;
+		baseBuckets = buckets;
 	}
 
-	public RenderElement getBaseLayers() {
-		return baseLayers;
+	public RenderBucket getBaseBuckets() {
+		return baseBuckets;
 	}
 
 	/**
-	 * Set new TextureLayers and clear previous.
+	 * Set new TextureBuckets and clear previous.
 	 */
-	public void setTextureLayers(TextureLayer tl) {
-		for (RenderElement l = textureLayers; l != null; l = l.next)
+	public void setTextureBuckets(TextureBucket tl) {
+		for (RenderBucket l = textureBuckets; l != null; l = l.next)
 			l.clear();
 
-		textureLayers = tl;
+		textureBuckets = tl;
 	}
 
-	public RenderElement getTextureLayers() {
-		return textureLayers;
+	public RenderBucket getTextureBuckets() {
+		return textureBuckets;
 	}
 
-	private RenderElement getLayer(int level, int type) {
-		RenderElement layer = null;
+	private RenderBucket getBucket(int level, int type) {
+		RenderBucket bucket = null;
 
-		if (mCurLayer != null && mCurLayer.level == level) {
-			layer = mCurLayer;
-			if (layer.type != type) {
-				log.error("BUG wrong layer {} {} on layer {}",
-				          Integer.valueOf(layer.type),
+		if (mCurBucket != null && mCurBucket.level == level) {
+			bucket = mCurBucket;
+			if (bucket.type != type) {
+				log.error("BUG wrong bucket {} {} on level {}",
+				          Integer.valueOf(bucket.type),
 				          Integer.valueOf(type),
 				          Integer.valueOf(level));
 
 				throw new IllegalArgumentException();
 			}
-			return layer;
+			return bucket;
 		}
 
-		RenderElement l = baseLayers;
-		if (l == null || l.level > level) {
-			/* insert new layer at start */
-			l = null;
+		RenderBucket b = baseBuckets;
+		if (b == null || b.level > level) {
+			/* insert new bucket at start */
+			b = null;
 		} else {
 			while (true) {
-				/* found layer */
-				if (l.level == level) {
-					layer = l;
+				/* found bucket */
+				if (b.level == level) {
+					bucket = b;
 					break;
 				}
-				/* insert layer between current and next layer */
-				if (l.next == null || l.next.level > level)
+				/* insert bucket between current and next bucket */
+				if (b.next == null || b.next.level > level)
 					break;
 
-				l = l.next;
+				b = b.next;
 			}
 		}
 
-		if (layer == null) {
+		if (bucket == null) {
 			/* add a new RenderElement */
 			if (type == LINE)
-				layer = new LineLayer(level);
+				bucket = new LineBucket(level);
 			else if (type == POLYGON)
-				layer = new PolygonLayer(level);
+				bucket = new PolygonBucket(level);
 			else if (type == TEXLINE)
-				layer = new LineTexLayer(level);
+				bucket = new LineTexBucket(level);
 			else if (type == MESH)
-				layer = new MeshLayer(level);
+				bucket = new MeshBucket(level);
 			else if (type == HAIRLINE)
-				layer = new HairLineLayer(level);
+				bucket = new HairLineBucket(level);
 
-			if (layer == null)
+			if (bucket == null)
 				throw new IllegalArgumentException();
 
-			if (l == null) {
+			if (b == null) {
 				/** insert at start */
-				layer.next = baseLayers;
-				baseLayers = layer;
+				bucket.next = baseBuckets;
+				baseBuckets = bucket;
 			} else {
-				layer.next = l.next;
-				l.next = layer;
+				bucket.next = b.next;
+				b.next = bucket;
 			}
 		}
 
-		/* check if found layer matches requested type */
-		if (layer.type != type) {
-			log.error("BUG wrong layer {} {} on layer {}",
-			          Integer.valueOf(layer.type),
+		/* check if found buckets matches requested type */
+		if (bucket.type != type) {
+			log.error("BUG wrong bucket {} {} on level {}",
+			          Integer.valueOf(bucket.type),
 			          Integer.valueOf(type),
 			          Integer.valueOf(level));
 
 			throw new IllegalArgumentException();
 		}
 
-		mCurLayer = layer;
+		mCurBucket = bucket;
 
-		return layer;
+		return bucket;
 	}
 
 	private int countVboSize() {
 		int vboShorts = 0;
 
-		for (RenderElement l = baseLayers; l != null; l = l.next)
+		for (RenderBucket l = baseBuckets; l != null; l = l.next)
 			vboShorts += l.numVertices * VERTEX_SHORT_CNT[l.type];
 
-		for (RenderElement l = textureLayers; l != null; l = l.next)
+		for (RenderBucket l = textureBuckets; l != null; l = l.next)
 			vboShorts += l.numVertices * TEXTURE_VERTEX_SHORTS;
 
 		return vboShorts;
@@ -286,31 +286,31 @@ public class ElementLayers extends TileData {
 	private int countIboSize() {
 		int numIndices = 0;
 
-		for (RenderElement l = baseLayers; l != null; l = l.next)
+		for (RenderBucket l = baseBuckets; l != null; l = l.next)
 			numIndices += l.numIndices;
 
-		for (RenderElement l = textureLayers; l != null; l = l.next)
+		for (RenderBucket l = textureBuckets; l != null; l = l.next)
 			numIndices += l.numIndices;
 
 		return numIndices;
 	}
 
-	public void setFrom(ElementLayers layers) {
-		setBaseLayers(layers.baseLayers);
-		setTextureLayers((TextureLayer) layers.textureLayers);
+	public void setFrom(RenderBuckets buckets) {
+		setBaseBuckets(buckets.baseBuckets);
+		setTextureBuckets((TextureBucket) buckets.textureBuckets);
 
-		mCurLayer = null;
-		layers.baseLayers = null;
-		layers.textureLayers = null;
-		layers.mCurLayer = null;
+		mCurBucket = null;
+		buckets.baseBuckets = null;
+		buckets.textureBuckets = null;
+		buckets.mCurBucket = null;
 	}
 
-	/** cleanup only when layers are not used by tile or layer anymore! */
+	/** cleanup only when buckets are not used by tile or bucket anymore! */
 	public void clear() {
-		/* NB: set null calls clear() on each layer! */
-		setBaseLayers(null);
-		setTextureLayers(null);
-		mCurLayer = null;
+		/* NB: set null calls clear() on each bucket! */
+		setBaseBuckets(null);
+		setTextureBuckets(null);
+		mCurBucket = null;
 
 		vbo = BufferObject.release(vbo);
 		ibo = BufferObject.release(ibo);
@@ -322,10 +322,10 @@ public class ElementLayers extends TileData {
 	}
 
 	public void prepare() {
-		for (RenderElement l = baseLayers; l != null; l = l.next)
+		for (RenderBucket l = baseBuckets; l != null; l = l.next)
 			l.prepare();
 
-		for (RenderElement l = textureLayers; l != null; l = l.next)
+		for (RenderBucket l = textureBuckets; l != null; l = l.next)
 			l.prepare();
 	}
 
@@ -367,7 +367,7 @@ public class ElementLayers extends TileData {
 		//>>compile(vboData, iboData, addFill);
 		int pos = addFill ? 4 : 0;
 
-		for (RenderElement l = baseLayers; l != null; l = l.next) {
+		for (RenderBucket l = baseBuckets; l != null; l = l.next) {
 			if (l.type == POLYGON) {
 				l.compile(vboData, iboData);
 
@@ -379,7 +379,7 @@ public class ElementLayers extends TileData {
 
 		offset[LINE] = vboData.position() * SHORT_BYTES;
 		pos = 0;
-		for (RenderElement l = baseLayers; l != null; l = l.next) {
+		for (RenderBucket l = baseBuckets; l != null; l = l.next) {
 			if (l.type == LINE) {
 				l.compile(vboData, iboData);
 
@@ -390,13 +390,13 @@ public class ElementLayers extends TileData {
 
 		//offset[TEXLINE] = size * SHORT_BYTES;
 
-		for (RenderElement l = baseLayers; l != null; l = l.next) {
+		for (RenderBucket l = baseBuckets; l != null; l = l.next) {
 			if (l.type == TEXLINE || l.type == MESH || l.type == HAIRLINE) {
 				l.compile(vboData, iboData);
 			}
 		}
 
-		for (RenderElement l = textureLayers; l != null; l = l.next) {
+		for (RenderBucket l = textureBuckets; l != null; l = l.next) {
 			l.compile(vboData, iboData);
 		}
 		//<<
@@ -441,15 +441,15 @@ public class ElementLayers extends TileData {
 	}
 
 	public static void initRenderer(GL20 gl) {
-		RenderElement.GL = gl;
+		RenderBucket.GL = gl;
 
-		LineLayer.Renderer.init();
-		LineTexLayer.Renderer.init();
-		PolygonLayer.Renderer.init();
-		TextureLayer.Renderer.init();
-		BitmapLayer.Renderer.init();
-		MeshLayer.Renderer.init();
-		HairLineLayer.Renderer.init();
+		LineBucket.Renderer.init();
+		LineTexBucket.Renderer.init();
+		PolygonBucket.Renderer.init();
+		TextureBucket.Renderer.init();
+		BitmapBucket.Renderer.init();
+		MeshBucket.Renderer.init();
+		HairLineBucket.Renderer.init();
 
 		TextureItem.init(gl);
 	}
diff --git a/vtm/src/org/oscim/renderer/elements/SymbolLayer.java b/vtm/src/org/oscim/renderer/bucket/SymbolBucket.java
similarity index 94%
rename from vtm/src/org/oscim/renderer/elements/SymbolLayer.java
rename to vtm/src/org/oscim/renderer/bucket/SymbolBucket.java
index 18246381..e25e64eb 100644
--- a/vtm/src/org/oscim/renderer/elements/SymbolLayer.java
+++ b/vtm/src/org/oscim/renderer/bucket/SymbolBucket.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import java.nio.ShortBuffer;
 
@@ -25,8 +25,8 @@ import org.oscim.utils.pool.Inlist;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public final class SymbolLayer extends TextureLayer {
-	static final Logger log = LoggerFactory.getLogger(SymbolLayer.class);
+public final class SymbolBucket extends TextureBucket {
+	static final Logger log = LoggerFactory.getLogger(SymbolBucket.class);
 
 	private final static float SCALE = 8.0f;
 	private final static int VERTICES_PER_SPRITE = 4;
@@ -35,8 +35,8 @@ public final class SymbolLayer extends TextureLayer {
 	private TextureItem prevTextures;
 	private List<SymbolItem> mSymbols = new List<SymbolItem>();
 
-	public SymbolLayer() {
-		super(RenderElement.SYMBOL);
+	public SymbolBucket() {
+		super(RenderBucket.SYMBOL);
 		fixed = true;
 	}
 
@@ -160,7 +160,7 @@ public final class SymbolLayer extends TextureLayer {
 				vertexItems.add(tx, ty, x2, y2, u2, v1);
 
 				/* six elements used to draw the four vertices */
-				t.indices += TextureLayer.INDICES_PER_SPRITE;
+				t.indices += TextureBucket.INDICES_PER_SPRITE;
 			}
 			numIndices += t.indices;
 		}
diff --git a/vtm/src/org/oscim/renderer/elements/SymbolItem.java b/vtm/src/org/oscim/renderer/bucket/SymbolItem.java
similarity index 98%
rename from vtm/src/org/oscim/renderer/elements/SymbolItem.java
rename to vtm/src/org/oscim/renderer/bucket/SymbolItem.java
index 375ad886..42ae1508 100644
--- a/vtm/src/org/oscim/renderer/elements/SymbolItem.java
+++ b/vtm/src/org/oscim/renderer/bucket/SymbolItem.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import org.oscim.backend.canvas.Bitmap;
 import org.oscim.core.PointF;
diff --git a/vtm/src/org/oscim/renderer/elements/TextLayer.java b/vtm/src/org/oscim/renderer/bucket/TextBucket.java
similarity index 96%
rename from vtm/src/org/oscim/renderer/elements/TextLayer.java
rename to vtm/src/org/oscim/renderer/bucket/TextBucket.java
index 71b4d281..178c11c4 100644
--- a/vtm/src/org/oscim/renderer/elements/TextLayer.java
+++ b/vtm/src/org/oscim/renderer/bucket/TextBucket.java
@@ -14,14 +14,14 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import static org.oscim.renderer.MapRenderer.COORD_SCALE;
 
 import org.oscim.backend.CanvasAdapter;
 import org.oscim.backend.canvas.Canvas;
 
-public class TextLayer extends TextureLayer {
+public class TextBucket extends TextureBucket {
 	//static final Logger log = LoggerFactory.getLogger(TextureLayer.class);
 
 	protected final static int LBIT_MASK = 0xfffffffe;
@@ -40,8 +40,8 @@ public class TextLayer extends TextureLayer {
 		this.labels = labels;
 	}
 
-	public TextLayer() {
-		super(RenderElement.SYMBOL);
+	public TextBucket() {
+		super(RenderBucket.SYMBOL);
 		mCanvas = CanvasAdapter.newCanvas();
 		fixed = true;
 	}
@@ -141,7 +141,7 @@ public class TextLayer extends TextureLayer {
 				addItem(it, width, height, x, y);
 
 				/* six indices to draw the four vertices */
-				numIndices += TextureLayer.INDICES_PER_SPRITE;
+				numIndices += TextureBucket.INDICES_PER_SPRITE;
 				numVertices += 4;
 
 				if (it.next == null
diff --git a/vtm/src/org/oscim/renderer/elements/TextItem.java b/vtm/src/org/oscim/renderer/bucket/TextItem.java
similarity index 98%
rename from vtm/src/org/oscim/renderer/elements/TextItem.java
rename to vtm/src/org/oscim/renderer/bucket/TextItem.java
index 6185d6e2..30da7e21 100644
--- a/vtm/src/org/oscim/renderer/elements/TextItem.java
+++ b/vtm/src/org/oscim/renderer/bucket/TextItem.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import org.oscim.theme.styles.TextStyle;
 import org.oscim.utils.pool.Inlist;
diff --git a/vtm/src/org/oscim/renderer/elements/TextureLayer.java b/vtm/src/org/oscim/renderer/bucket/TextureBucket.java
similarity index 91%
rename from vtm/src/org/oscim/renderer/elements/TextureLayer.java
rename to vtm/src/org/oscim/renderer/bucket/TextureBucket.java
index 91eb6faa..47578e67 100644
--- a/vtm/src/org/oscim/renderer/elements/TextureLayer.java
+++ b/vtm/src/org/oscim/renderer/bucket/TextureBucket.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import static org.oscim.renderer.MapRenderer.COORD_SCALE;
 
@@ -25,13 +25,13 @@ import org.oscim.renderer.GLShader;
 import org.oscim.renderer.GLState;
 import org.oscim.renderer.GLViewport;
 import org.oscim.renderer.MapRenderer;
-import org.oscim.renderer.elements.TextureItem.TexturePool;
+import org.oscim.renderer.bucket.TextureItem.TexturePool;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public abstract class TextureLayer extends RenderElement {
+public abstract class TextureBucket extends RenderBucket {
 
-	static final Logger log = LoggerFactory.getLogger(TextureLayer.class);
+	static final Logger log = LoggerFactory.getLogger(TextureBucket.class);
 
 	public final static int INDICES_PER_SPRITE = 6;
 	final static int VERTICES_PER_SPRITE = 4;
@@ -46,7 +46,7 @@ public abstract class TextureLayer extends RenderElement {
 	                                                       TEXTURE_WIDTH,
 	                                                       TEXTURE_HEIGHT);
 
-	protected TextureLayer(int type) {
+	protected TextureBucket(int type) {
 		super(type);
 	}
 
@@ -111,7 +111,7 @@ public abstract class TextureLayer extends RenderElement {
 			pool.init(0);
 		}
 
-		public static RenderElement draw(ElementLayers layers, RenderElement l,
+		public static RenderBucket draw(RenderBuckets layers, RenderBucket l,
 		        GLViewport v, float scale) {
 
 			GLState.test(false, false);
@@ -119,7 +119,7 @@ public abstract class TextureLayer extends RenderElement {
 
 			shader.useProgram();
 
-			TextureLayer tl = (TextureLayer) l;
+			TextureBucket tl = (TextureBucket) l;
 			GL.glUniform1f(shader.uScale, tl.fixed ? 1 / scale : 1);
 
 			v.proj.setAsUniform(shader.uProj);
diff --git a/vtm/src/org/oscim/renderer/elements/TextureItem.java b/vtm/src/org/oscim/renderer/bucket/TextureItem.java
similarity index 99%
rename from vtm/src/org/oscim/renderer/elements/TextureItem.java
rename to vtm/src/org/oscim/renderer/bucket/TextureItem.java
index d565b40d..4218c0ce 100644
--- a/vtm/src/org/oscim/renderer/elements/TextureItem.java
+++ b/vtm/src/org/oscim/renderer/bucket/TextureItem.java
@@ -14,7 +14,7 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import java.util.ArrayList;
 
diff --git a/vtm/src/org/oscim/renderer/elements/VertexData.java b/vtm/src/org/oscim/renderer/bucket/VertexData.java
similarity index 97%
rename from vtm/src/org/oscim/renderer/elements/VertexData.java
rename to vtm/src/org/oscim/renderer/bucket/VertexData.java
index a9c8aef7..936ffe37 100644
--- a/vtm/src/org/oscim/renderer/elements/VertexData.java
+++ b/vtm/src/org/oscim/renderer/bucket/VertexData.java
@@ -14,11 +14,11 @@
  * You should have received a copy of the GNU Lesser General Public License along with
  * this program. If not, see <http://www.gnu.org/licenses/>.
  */
-package org.oscim.renderer.elements;
+package org.oscim.renderer.bucket;
 
 import java.nio.ShortBuffer;
 
-import org.oscim.renderer.elements.VertexData.Chunk;
+import org.oscim.renderer.bucket.VertexData.Chunk;
 import org.oscim.utils.pool.Inlist;
 import org.oscim.utils.pool.SyncPool;
 import org.slf4j.Logger;
@@ -102,6 +102,9 @@ public class VertexData extends Inlist.List<Chunk> {
 		vertices = null;
 	}
 
+	/**
+	 * @return sum of elements added
+	 */
 	public int compile(ShortBuffer sbuf) {
 		if (cur == null)
 			return 0;
@@ -114,7 +117,6 @@ public class VertexData extends Inlist.List<Chunk> {
 			sbuf.put(it.vertices, 0, it.used);
 		}
 		dispose();
-		//log.debug("compiled {}", size);
 		return size;
 	}
 
diff --git a/vtm/src/org/oscim/theme/XmlThemeBuilder.java b/vtm/src/org/oscim/theme/XmlThemeBuilder.java
index 3c7bff0a..a2e24141 100644
--- a/vtm/src/org/oscim/theme/XmlThemeBuilder.java
+++ b/vtm/src/org/oscim/theme/XmlThemeBuilder.java
@@ -37,7 +37,7 @@ import org.oscim.backend.canvas.Paint.FontStyle;
 import org.oscim.renderer.atlas.TextureAtlas;
 import org.oscim.renderer.atlas.TextureAtlas.Rect;
 import org.oscim.renderer.atlas.TextureRegion;
-import org.oscim.renderer.elements.TextureItem;
+import org.oscim.renderer.bucket.TextureItem;
 import org.oscim.theme.IRenderTheme.ThemeException;
 import org.oscim.theme.rule.Rule;
 import org.oscim.theme.rule.Rule.Closed;
diff --git a/vtm/src/org/oscim/theme/styles/AreaStyle.java b/vtm/src/org/oscim/theme/styles/AreaStyle.java
index d13ecbbf..1d61c833 100644
--- a/vtm/src/org/oscim/theme/styles/AreaStyle.java
+++ b/vtm/src/org/oscim/theme/styles/AreaStyle.java
@@ -19,7 +19,7 @@ package org.oscim.theme.styles;
 import static org.oscim.backend.canvas.Color.parseColor;
 
 import org.oscim.backend.canvas.Color;
-import org.oscim.renderer.elements.TextureItem;
+import org.oscim.renderer.bucket.TextureItem;
 import org.oscim.theme.IRenderTheme.Callback;
 
 /*TODO 
diff --git a/vtm/src/org/oscim/utils/Tessellator.java b/vtm/src/org/oscim/utils/Tessellator.java
index 84ece4b6..af0a9d3c 100644
--- a/vtm/src/org/oscim/utils/Tessellator.java
+++ b/vtm/src/org/oscim/utils/Tessellator.java
@@ -18,7 +18,7 @@ package org.oscim.utils;
 
 import java.util.Arrays;
 
-import org.oscim.renderer.elements.VertexData;
+import org.oscim.renderer.bucket.VertexData;
 import org.oscim.utils.math.MathUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;