diff --git a/vtm/src/org/oscim/layers/marker/MarkerRenderer.java b/vtm/src/org/oscim/layers/marker/MarkerRenderer.java
index 594632a1..bcd6e0a7 100644
--- a/vtm/src/org/oscim/layers/marker/MarkerRenderer.java
+++ b/vtm/src/org/oscim/layers/marker/MarkerRenderer.java
@@ -1,5 +1,6 @@
 /*
  * Copyright 2013 Hannes Janetzek
+ * Copyright 2016 Izumi Kawashima
  *
  * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
  *
@@ -161,7 +162,11 @@ public class MarkerRenderer extends BucketRenderer {
                 marker = mDefaultMarker;
 
             SymbolItem s = SymbolItem.pool.get();
-            s.set(it.x, it.y, marker.getBitmap(), true);
+            if (marker.isBitmap()) {
+                s.set(it.x, it.y, marker.getBitmap(), true);
+            } else {
+                s.set(it.x, it.y, marker.getTextureRegion(), true);
+            }
             s.offset = marker.getHotspot();
             s.billboard = marker.isBillboard();
             mSymbolLayer.pushSymbol(s);
diff --git a/vtm/src/org/oscim/layers/marker/MarkerSymbol.java b/vtm/src/org/oscim/layers/marker/MarkerSymbol.java
index 56cc198f..1e713470 100644
--- a/vtm/src/org/oscim/layers/marker/MarkerSymbol.java
+++ b/vtm/src/org/oscim/layers/marker/MarkerSymbol.java
@@ -1,6 +1,7 @@
 /*
  * Copyright 2013 Hannes Janetzek
  * Copyright 2016 devemux86
+ * Copyright 2016 Izumi Kawashima
  *
  * This file is part of the OpenScienceMap project (http://www.opensciencemap.org).
  *
@@ -19,6 +20,7 @@ package org.oscim.layers.marker;
 
 import org.oscim.backend.canvas.Bitmap;
 import org.oscim.core.PointF;
+import org.oscim.renderer.atlas.TextureRegion;
 
 public class MarkerSymbol {
     /**
@@ -34,12 +36,64 @@ public class MarkerSymbol {
     }
 
     final Bitmap mBitmap;
+    final TextureRegion mTextureRegion;
+
     /**
      * Hotspot offset
      */
     final PointF mOffset;
     final boolean mBillboard;
 
+    public MarkerSymbol(TextureRegion textureRegion, float relX, float relY) {
+        this(textureRegion, relX, relY, true);
+    }
+
+    public MarkerSymbol(TextureRegion textureRegion, float relX, float relY, boolean billboard) {
+        mBitmap = null;
+        mTextureRegion = textureRegion;
+        mOffset = new PointF(relX, relY);
+        mBillboard = billboard;
+    }
+
+    public MarkerSymbol(TextureRegion textureRegion, HotspotPlace hotspot) {
+        this(textureRegion, hotspot, true);
+    }
+
+    public MarkerSymbol(TextureRegion textureRegion, HotspotPlace hotspot, boolean billboard) {
+        mBitmap = null;
+        mTextureRegion = textureRegion;
+        switch (hotspot) {
+            case BOTTOM_CENTER:
+                mOffset = new PointF(0.5f, 1);
+                break;
+            case TOP_CENTER:
+                mOffset = new PointF(0.5f, 0);
+                break;
+            case RIGHT_CENTER:
+                mOffset = new PointF(1, 0.5f);
+                break;
+            case LEFT_CENTER:
+                mOffset = new PointF(0, 0.5f);
+                break;
+            case UPPER_RIGHT_CORNER:
+                mOffset = new PointF(1, 0);
+                break;
+            case LOWER_RIGHT_CORNER:
+                mOffset = new PointF(1, 1);
+                break;
+            case UPPER_LEFT_CORNER:
+                mOffset = new PointF(0, 0);
+                break;
+            case LOWER_LEFT_CORNER:
+                mOffset = new PointF(0, 1);
+                break;
+            default:
+                mOffset = new PointF(0.5f, 0.5f);
+        }
+
+        mBillboard = billboard;
+    }
+
     public MarkerSymbol(Bitmap bitmap, float relX, float relY) {
         this(bitmap, relX, relY, true);
     }
@@ -48,6 +102,7 @@ public class MarkerSymbol {
         mBitmap = bitmap;
         mOffset = new PointF(relX, relY);
         mBillboard = billboard;
+        mTextureRegion = null;
     }
 
     public MarkerSymbol(Bitmap bitmap, HotspotPlace hotspot) {
@@ -87,6 +142,7 @@ public class MarkerSymbol {
 
         mBitmap = bitmap;
         mBillboard = billboard;
+        mTextureRegion = null;
     }
 
     public boolean isBillboard() {
@@ -97,14 +153,28 @@ public class MarkerSymbol {
         return mOffset;
     }
 
+    public boolean isBitmap() {
+        return mBitmap != null;
+    }
+
     public Bitmap getBitmap() {
         return mBitmap;
     }
 
+    public TextureRegion getTextureRegion() {
+        return mTextureRegion;
+    }
+
     public boolean isInside(float dx, float dy) {
         /* TODO handle no-billboard */
-        int w = mBitmap.getWidth();
-        int h = mBitmap.getHeight();
+        int w, h;
+        if (isBitmap()) {
+            w = mBitmap.getWidth();
+            h = mBitmap.getHeight();
+        } else {
+            w = mTextureRegion.rect.w;
+            h = mTextureRegion.rect.h;
+        }
         float ox = -w * mOffset.x;
         float oy = -h * (1 - mOffset.y);