diff --git a/vtm/src/org/oscim/renderer/MapRenderer.java b/vtm/src/org/oscim/renderer/MapRenderer.java
index 7723a15f..dba15975 100644
--- a/vtm/src/org/oscim/renderer/MapRenderer.java
+++ b/vtm/src/org/oscim/renderer/MapRenderer.java
@@ -16,8 +16,6 @@
  */
 package org.oscim.renderer;
 
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
 import java.nio.FloatBuffer;
 import java.nio.IntBuffer;
 import java.nio.ShortBuffer;
@@ -29,8 +27,6 @@ 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.utils.pool.Inlist;
-import org.oscim.utils.pool.Pool;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -54,61 +50,15 @@ public class MapRenderer {
 	public static long frametime;
 	private static boolean rerender;
 
-	/**
-	 * Pool to retrieve temporary native buffer on GL-Thread:
-	 * This pool ensures to not use the same buffer to upload data twice
-	 * within a frame.
-	 * - Contrary to what the OpenGL doc says data seems *not* to be
-	 * always* copied after glBufferData returns...
-	 * - Somehow it does always copy when using Android GL bindings
-	 * but not when using libgdx bindings (LWJGL or AndroidGL20)
-	 */
-	static class BufferPool extends Pool<BufferItem> {
-		private BufferItem mUsedBuffers;
+	private static NativeBufferPool mBufferPool;
 
-		@Override
-		protected BufferItem createItem() {
-			// unused;
-			return null;
-		}
-
-		public BufferItem get(int size) {
-			BufferItem b = mPool;
-
-			if (b == null) {
-				b = new BufferItem();
-			} else {
-				mPool = b.next;
-				b.next = null;
-			}
-			if (b.tmpBufferSize < size)
-				b.growBuffer(size);
-
-			mUsedBuffers = Inlist.push(mUsedBuffers, b);
-
-			return b;
-		}
-
-		public void releaseBuffers() {
-			mUsedBuffers = releaseAll(mUsedBuffers);
-		}
-	}
-
-	private static BufferPool mBufferPool;
-
-	/**
-	 * @param map
-	 *            the MapView
-	 */
 	public MapRenderer(Map map) {
-
 		mMap = map;
-
 		mViewport = new GLViewport();
-		mBufferPool = new BufferPool();
+		mBufferPool = new NativeBufferPool();
 
-		// FIXME should be done in 'destroy' method
-		// clear all previous vbo refs
+		/* FIXME should be done in 'destroy' method
+		 * clear all previous vbo refs */
 		BufferObject.clear();
 		setBackgroundColor(Color.DKGRAY);
 	}
@@ -117,57 +67,6 @@ public class MapRenderer {
 		mClearColor = GLUtils.colorToFloat(color);
 	}
 
-	static class BufferItem extends Inlist<BufferItem> {
-
-		ShortBuffer shortBuffer;
-		FloatBuffer floatBuffer;
-		IntBuffer intBuffer;
-		int tmpBufferSize;
-
-		void growBuffer(int size) {
-			//log.debug("grow buffer " + size);
-			// 32kb min size
-			if (size < (1 << 15))
-				size = (1 << 15);
-
-			ByteBuffer buf = ByteBuffer
-			    .allocateDirect(size)
-			    .order(ByteOrder.nativeOrder());
-
-			this.floatBuffer = buf.asFloatBuffer();
-			this.shortBuffer = buf.asShortBuffer();
-			this.intBuffer = buf.asIntBuffer();
-			this.tmpBufferSize = size;
-		}
-	}
-
-	/**
-	 * Only use on GL Thread! Get a native ShortBuffer for temporary use.
-	 */
-	public static ShortBuffer getShortBuffer(int size) {
-		BufferItem b = mBufferPool.get(size * 2);
-		b.shortBuffer.clear();
-		return b.shortBuffer;
-	}
-
-	/**
-	 * Only use on GL Thread! Get a native FloatBuffer for temporary use.
-	 */
-	public static FloatBuffer getFloatBuffer(int size) {
-		BufferItem b = mBufferPool.get(size * 4);
-		b.floatBuffer.clear();
-		return b.floatBuffer;
-	}
-
-	/**
-	 * Only use on GL Thread! Get a native IntBuffer for temporary use.
-	 */
-	public static IntBuffer getIntBuffer(int size) {
-		BufferItem b = mBufferPool.get(size * 4);
-		b.intBuffer.clear();
-		return b.intBuffer;
-	}
-
 	public void onDrawFrame() {
 		frametime = System.currentTimeMillis();
 		draw();
@@ -197,8 +96,8 @@ public class MapRenderer {
 		mViewport.setFrom(mMap.viewport());
 
 		if (GLAdapter.debugView) {
-			// modify this to scale only the view, to see
-			// which tiles are rendered
+			/* modify this to scale only the view, to see
+			 * which tiles are rendered */
 			mViewport.mvp.setScale(0.5f, 0.5f, 1);
 			mViewport.viewproj.multiplyLhs(mViewport.mvp);
 			mViewport.proj.multiplyLhs(mViewport.mvp);
@@ -365,4 +264,17 @@ public class MapRenderer {
 	public static void animate() {
 		rerender = true;
 	}
+
+	public static FloatBuffer getFloatBuffer(int size) {
+		return mBufferPool.getFloatBuffer(size);
+	}
+
+	public static ShortBuffer getShortBuffer(int size) {
+		return mBufferPool.getShortBuffer(size);
+	}
+
+	public static IntBuffer getIntBuffer(int size) {
+		return mBufferPool.getIntBuffer(size);
+	}
+
 }
diff --git a/vtm/src/org/oscim/renderer/NativeBufferPool.java b/vtm/src/org/oscim/renderer/NativeBufferPool.java
new file mode 100644
index 00000000..5f2d72ab
--- /dev/null
+++ b/vtm/src/org/oscim/renderer/NativeBufferPool.java
@@ -0,0 +1,123 @@
+package org.oscim.renderer;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.nio.FloatBuffer;
+import java.nio.IntBuffer;
+import java.nio.ShortBuffer;
+
+import org.oscim.renderer.NativeBufferPool.BufferItem;
+import org.oscim.utils.pool.Inlist;
+import org.oscim.utils.pool.Pool;
+
+/**
+ * Pool to retrieve temporary native buffer on GL-Thread:
+ * This pool ensures to not use the same buffer to upload data twice
+ * within a frame.
+ * - Contrary to what the OpenGL doc says data seems *not* to be
+ * always* copied after glBufferData returns...
+ * - Somehow it does always copy when using Android GL bindings
+ * but not when using libgdx bindings (LWJGL or AndroidGL20)
+ */
+public class NativeBufferPool extends Pool<BufferItem> {
+
+	static final class BufferItem extends Inlist<BufferItem> {
+		ByteBuffer byteBuffer;
+		ShortBuffer sBuffer;
+		FloatBuffer fBuffer;
+		IntBuffer iBuffer;
+
+		int size;
+
+		void growBuffer(int size) {
+			//log.debug("grow buffer " + size);
+			// 32kb min size
+			if (size < (1 << 15))
+				size = (1 << 15);
+
+			byteBuffer = ByteBuffer
+			    .allocateDirect(size)
+			    .order(ByteOrder.nativeOrder());
+			this.size = size;
+
+			sBuffer = null;
+			iBuffer = null;
+			fBuffer = null;
+		}
+	}
+
+	private BufferItem mUsedBuffers;
+
+	@Override
+	protected BufferItem createItem() {
+		// unused;
+		return null;
+	}
+
+	public BufferItem get(int size) {
+		BufferItem b = mPool;
+
+		if (b == null) {
+			b = new BufferItem();
+		} else {
+			mPool = b.next;
+			b.next = null;
+		}
+		if (b.size < size)
+			b.growBuffer(size);
+
+		mUsedBuffers = Inlist.push(mUsedBuffers, b);
+
+		return b;
+	}
+
+	public void releaseBuffers() {
+		mUsedBuffers = releaseAll(mUsedBuffers);
+	}
+
+	/**
+	 * Only use on GL Thread! Get a native ShortBuffer for temporary use.
+	 */
+	public ShortBuffer getShortBuffer(int size) {
+		BufferItem b = get(size * 2);
+
+		if (b.sBuffer == null) {
+			b.byteBuffer.clear();
+			b.sBuffer = b.byteBuffer.asShortBuffer();
+		} else {
+			b.sBuffer.clear();
+		}
+		return b.sBuffer;
+	}
+
+	/**
+	 * Only use on GL Thread! Get a native FloatBuffer for temporary use.
+	 */
+	public FloatBuffer getFloatBuffer(int size) {
+		BufferItem b = get(size * 4);
+		if (b.fBuffer == null) {
+			b.byteBuffer.clear();
+			b.fBuffer = b.byteBuffer.asFloatBuffer();
+		} else {
+			b.fBuffer.clear();
+		}
+		b.fBuffer.clear();
+
+		return b.fBuffer;
+	}
+
+	/**
+	 * Only use on GL Thread! Get a native IntBuffer for temporary use.
+	 */
+	public IntBuffer getIntBuffer(int size) {
+		BufferItem b = get(size * 4);
+		if (b.iBuffer == null) {
+			b.byteBuffer.clear();
+			b.iBuffer = b.byteBuffer.asIntBuffer();
+		} else {
+			b.iBuffer.clear();
+		}
+		return b.iBuffer;
+	}
+
+}