diff --git a/libs/rs/RenderScript.h b/libs/rs/RenderScript.h
index 43d4291..3ad453f 100644
--- a/libs/rs/RenderScript.h
+++ b/libs/rs/RenderScript.h
@@ -171,7 +171,8 @@
     RS_SAMPLER_LINEAR,
     RS_SAMPLER_LINEAR_MIP_LINEAR,
     RS_SAMPLER_WRAP,
-    RS_SAMPLER_CLAMP
+    RS_SAMPLER_CLAMP,
+    RS_SAMPLER_LINEAR_MIP_NEAREST,
 };
 
 enum RsTextureTarget {
diff --git a/libs/rs/java/Samples/AndroidManifest.xml b/libs/rs/java/Samples/AndroidManifest.xml
index 6f35e2a..9646a77 100644
--- a/libs/rs/java/Samples/AndroidManifest.xml
+++ b/libs/rs/java/Samples/AndroidManifest.xml
@@ -4,7 +4,7 @@
     <application android:label="Samples"
     android:icon="@drawable/test_pattern">
         <activity android:name="RsList"
-                  android:label="RsList"                  
+                  android:label="RsList"
                   android:theme="@android:style/Theme.Black.NoTitleBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -13,7 +13,7 @@
         </activity>
         
         <activity android:name="RsRenderStates"
-                  android:label="RsStates"                  
+                  android:label="RsStates"
                   android:theme="@android:style/Theme.Black.NoTitleBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
@@ -22,7 +22,7 @@
         </activity>
 
         <activity android:name="RsBench"
-                  android:label="RsBenchmark"                  
+                  android:label="RsBenchmark"
                   android:theme="@android:style/Theme.Black.NoTitleBar">
             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
diff --git a/libs/rs/java/Samples/res/raw/shader2movev.glsl b/libs/rs/java/Samples/res/raw/shader2movev.glsl
index 68712e6..a2c807e 100644
--- a/libs/rs/java/Samples/res/raw/shader2movev.glsl
+++ b/libs/rs/java/Samples/res/raw/shader2movev.glsl
@@ -14,7 +14,6 @@
 
    mat3 model3 = mat3(UNI_model[0].xyz, UNI_model[1].xyz, UNI_model[2].xyz);
    vec3 worldNorm = model3 * (ATTRIB_normal + oldPos - objPos.xyz);
-   //vec3 worldNorm = model3 * ATTRIB_normal;
 
    varWorldPos = worldPos.xyz;
    varWorldNormal = worldNorm;
diff --git a/libs/rs/java/Samples/src/com/android/samples/RsBench.java b/libs/rs/java/Samples/src/com/android/samples/RsBench.java
index 5b9af6f..a29dddc 100644
--- a/libs/rs/java/Samples/src/com/android/samples/RsBench.java
+++ b/libs/rs/java/Samples/src/com/android/samples/RsBench.java
@@ -54,7 +54,7 @@
     @Override
     protected void onResume() {
         // Ideally a game should implement onResume() and onPause()
-        // to take appropriate action when the activity looses focus
+        // to take appropriate action when the activity loses focus
         super.onResume();
         mView.resume();
     }
@@ -62,7 +62,7 @@
     @Override
     protected void onPause() {
         // Ideally a game should implement onResume() and onPause()
-        // to take appropriate action when the activity looses focus
+        // to take appropriate action when the activity loses focus
         super.onPause();
         mView.pause();
     }
diff --git a/libs/rs/java/Samples/src/com/android/samples/RsBenchRS.java b/libs/rs/java/Samples/src/com/android/samples/RsBenchRS.java
index a47c308..ddb05b3 100644
--- a/libs/rs/java/Samples/src/com/android/samples/RsBenchRS.java
+++ b/libs/rs/java/Samples/src/com/android/samples/RsBenchRS.java
@@ -216,7 +216,7 @@
         ProgramVertex.ShaderBuilder pvbCustom = new ProgramVertex.ShaderBuilder(mRS);
         // Specify the resource that contains the shader string
         pvbCustom.setShader(mRes, R.raw.shaderv);
-        // Use a script field to spcify the input layout
+        // Use a script field to specify the input layout
         pvbCustom.addInput(ScriptField_VertexShaderInputs_s.createElement(mRS));
         // Define the constant input layout
         pvbCustom.addConstant(mVSConst.getAllocation().getType());
@@ -227,7 +227,7 @@
         ProgramFragment.ShaderBuilder pfbCustom = new ProgramFragment.ShaderBuilder(mRS);
         // Specify the resource that contains the shader string
         pfbCustom.setShader(mRes, R.raw.shaderf);
-        //Tell the builder how many textures we have
+        // Tell the builder how many textures we have
         pfbCustom.addTexture(Program.TextureType.TEXTURE_2D);
         // Define the constant input layout
         pfbCustom.addConstant(mFSConst.getAllocation().getType());
@@ -315,16 +315,22 @@
 
     private void initFonts() {
         // Sans font by family name
-        mFontSans = Font.createFromFamily(mRS, mRes, "sans-serif", Font.Style.NORMAL, 8);
+        mFontSans = Font.createFromFamily(mRS, mRes, "sans-serif",
+                                          Font.Style.NORMAL, 8);
         // Create font by file name
         mFontSerif = Font.create(mRS, mRes, "DroidSerif-Regular.ttf", 8);
         // Create fonts by family and style
-        mFontSerifBold = Font.createFromFamily(mRS, mRes, "serif", Font.Style.BOLD, 8);
-        mFontSerifItalic = Font.createFromFamily(mRS, mRes, "serif", Font.Style.ITALIC, 8);
-        mFontSerifBoldItalic = Font.createFromFamily(mRS, mRes, "serif", Font.Style.BOLD_ITALIC, 8);
-        mFontMono = Font.createFromFamily(mRS, mRes, "mono", Font.Style.NORMAL, 8);
+        mFontSerifBold = Font.createFromFamily(mRS, mRes, "serif",
+                                               Font.Style.BOLD, 8);
+        mFontSerifItalic = Font.createFromFamily(mRS, mRes, "serif",
+                                                 Font.Style.ITALIC, 8);
+        mFontSerifBoldItalic = Font.createFromFamily(mRS, mRes, "serif",
+                                                     Font.Style.BOLD_ITALIC, 8);
+        mFontMono = Font.createFromFamily(mRS, mRes, "mono",
+                                          Font.Style.NORMAL, 8);
 
-        mTextAlloc = Allocation.createFromString(mRS, "String from allocation", Allocation.USAGE_SCRIPT);
+        mTextAlloc = Allocation.createFromString(mRS, "String from allocation",
+                                                 Allocation.USAGE_SCRIPT);
 
         mScript.set_gFontSans(mFontSans);
         mScript.set_gFontSerif(mFontSerif);
diff --git a/libs/rs/java/Samples/src/com/android/samples/RsBenchView.java b/libs/rs/java/Samples/src/com/android/samples/RsBenchView.java
index 4283a42..0a56668 100644
--- a/libs/rs/java/Samples/src/com/android/samples/RsBenchView.java
+++ b/libs/rs/java/Samples/src/com/android/samples/RsBenchView.java
@@ -43,7 +43,6 @@
 
     public RsBenchView(Context context) {
         super(context);
-        //setFocusable(true);
     }
 
     private RenderScriptGL mRS;
@@ -71,17 +70,13 @@
     }
 
     @Override
-    public boolean onKeyDown(int keyCode, KeyEvent event)
-    {
-        // break point at here
-        // this method doesn't work when 'extends View' include 'extends ScrollView'.
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
         return super.onKeyDown(keyCode, event);
     }
 
 
     @Override
-    public boolean onTouchEvent(MotionEvent ev)
-    {
+    public boolean onTouchEvent(MotionEvent ev) {
         boolean ret = false;
         int act = ev.getAction();
         if (act == ev.ACTION_DOWN) {
diff --git a/libs/rs/java/Samples/src/com/android/samples/rsbench.rs b/libs/rs/java/Samples/src/com/android/samples/rsbench.rs
index 87f2f29..905f34b 100644
--- a/libs/rs/java/Samples/src/com/android/samples/rsbench.rs
+++ b/libs/rs/java/Samples/src/com/android/samples/rsbench.rs
@@ -19,7 +19,7 @@
 #include "rs_graphics.rsh"
 #include "shader_def.rsh"
 
-const int gMaxModes = 23;
+const int gMaxModes = 26;
 
 rs_program_vertex gProgVertex;
 rs_program_fragment gProgFragmentColor;
@@ -94,7 +94,14 @@
                              0.5f, 0.6f, 0.7f, 1.0f,
 };
 
-void displayFontSamples(int fillNum) {
+static void displayFontSamples(int fillNum) {
+
+    rs_font fonts[5];
+    rsSetObject(&fonts[0], gFontSans);
+    rsSetObject(&fonts[1], gFontSerif);
+    rsSetObject(&fonts[2], gFontSerifBold);
+    rsSetObject(&fonts[3], gFontSerifBoldItalic);
+    rsSetObject(&fonts[4], gFontSans);
 
     uint width = rsgGetWidth();
     uint height = rsgGetHeight();
@@ -107,9 +114,8 @@
     int yPos = top;
 
     int xOffset = 0, yOffset = 0;
-    rsgBindFont(gFontSans); //rsgBindFont(gFontSerif); rsgBindFont(gFontSerifBold); rsgBindFont(gFontSerifBoldItalic); rsgBindFont(gFontSans);
-
     for(int fillI = 0; fillI < fillNum; fillI ++) {
+        rsgBindFont(fonts[fillI]);
         xOffset = textOffsets[fillI * 2];
         yOffset = textOffsets[fillI * 2 + 1];
         float *colPtr = textColors + fillI * 4;
@@ -122,18 +128,22 @@
             }
         }
     }
+
+    for (int i = 0; i < 5; i ++) {
+        rsClearObject(&fonts[i]);
+    }
 }
 
-void bindProgramVertexOrtho() {
+static void bindProgramVertexOrtho() {
     // Default vertex sahder
     rsgBindProgramVertex(gProgVertex);
-    // Setup the projectioni matrix
+    // Setup the projection matrix
     rs_matrix4x4 proj;
     rsMatrixLoadOrtho(&proj, 0, rsgGetWidth(), rsgGetHeight(), 0, -500, 500);
     rsgProgramVertexLoadProjectionMatrix(&proj);
 }
 
-void displaySingletexFill(bool blend, int quadCount) {
+static void displaySingletexFill(bool blend, int quadCount) {
     bindProgramVertexOrtho();
     rs_matrix4x4 matrix;
     rsMatrixLoadIdentity(&matrix);
@@ -159,7 +169,7 @@
     }
 }
 
-void displayBlendingSamples() {
+static void displayBlendingSamples() {
     int i;
 
     bindProgramVertexOrtho();
@@ -205,7 +215,7 @@
 
 }
 
-void displayMeshSamples(int meshNum) {
+static void displayMeshSamples(int meshNum) {
 
     bindProgramVertexOrtho();
     rs_matrix4x4 matrix;
@@ -227,7 +237,7 @@
     }
 }
 
-void displayTextureSamplers() {
+static void displayTextureSamplers() {
 
     bindProgramVertexOrtho();
     rs_matrix4x4 matrix;
@@ -282,27 +292,34 @@
     rsgDrawText("Filtering: miplinear wrap", 310, 590);
 }
 
-float gTorusRotation = 0;
-static void drawToruses(int numMeshes) {
-    rs_matrix4x4 matrix;
+static float gTorusRotation = 0;
+static void updateModelMatrix(rs_matrix4x4 *matrix, void *buffer) {
+    if (buffer == 0) {
+        rsgProgramVertexLoadModelMatrix(matrix);
+    } else {
+        rsAllocationMarkDirty(rsGetAllocation(buffer));
+    }
+}
+
+static void drawToruses(int numMeshes, rs_matrix4x4 *matrix, void *buffer) {
 
     if (numMeshes == 1) {
-        rsMatrixLoadTranslate(&matrix, 0.0f, 0.0f, -7.5f);
-        rsMatrixRotate(&matrix, gTorusRotation, 1.0f, 0.0f, 0.0f);
-        rsgProgramVertexLoadModelMatrix(&matrix);
+        rsMatrixLoadTranslate(matrix, 0.0f, 0.0f, -7.5f);
+        rsMatrixRotate(matrix, gTorusRotation, 1.0f, 0.0f, 0.0f);
+        updateModelMatrix(matrix, buffer);
         rsgDrawMesh(gTorusMesh);
         return;
     }
 
     if (numMeshes == 2) {
-        rsMatrixLoadTranslate(&matrix, -1.6f, 0.0f, -7.5f);
-        rsMatrixRotate(&matrix, gTorusRotation, 1.0f, 0.0f, 0.0f);
-        rsgProgramVertexLoadModelMatrix(&matrix);
+        rsMatrixLoadTranslate(matrix, -1.6f, 0.0f, -7.5f);
+        rsMatrixRotate(matrix, gTorusRotation, 1.0f, 0.0f, 0.0f);
+        updateModelMatrix(matrix, buffer);
         rsgDrawMesh(gTorusMesh);
 
-        rsMatrixLoadTranslate(&matrix, 1.6f, 0.0f, -7.5f);
-        rsMatrixRotate(&matrix, gTorusRotation, 1.0f, 0.0f, 0.0f);
-        rsgProgramVertexLoadModelMatrix(&matrix);
+        rsMatrixLoadTranslate(matrix, 1.6f, 0.0f, -7.5f);
+        rsMatrixRotate(matrix, gTorusRotation, 1.0f, 0.0f, 0.0f);
+        updateModelMatrix(matrix, buffer);
         rsgDrawMesh(gTorusMesh);
         return;
     }
@@ -315,9 +332,9 @@
     for (int h = 0; h < 4; h ++) {
         for (int v = 0; v < 2; v ++) {
             // Position our model on the screen
-            rsMatrixLoadTranslate(&matrix, startX + dist * h, startY + dist * v, startZ);
-            rsMatrixRotate(&matrix, gTorusRotation, 1.0f, 0.0f, 0.0f);
-            rsgProgramVertexLoadModelMatrix(&matrix);
+            rsMatrixLoadTranslate(matrix, startX + dist * h, startY + dist * v, startZ);
+            rsMatrixRotate(matrix, gTorusRotation, 1.0f, 0.0f, 0.0f);
+            updateModelMatrix(matrix, buffer);
             rsgDrawMesh(gTorusMesh);
         }
     }
@@ -325,10 +342,10 @@
 
 
 // Quick hack to get some geometry numbers
-void displaySimpleGeoSamples(bool useTexture, int numMeshes) {
+static void displaySimpleGeoSamples(bool useTexture, int numMeshes) {
     rsgBindProgramVertex(gProgVertex);
     rsgBindProgramRaster(gCullBack);
-    // Setup the projectioni matrix with 60 degree field of view
+    // Setup the projection matrix with 30 degree field of view
     rs_matrix4x4 proj;
     float aspect = (float)rsgGetWidth() / (float)rsgGetHeight();
     rsMatrixLoadPerspective(&proj, 30.0f, aspect, 0.1f, 100.0f);
@@ -345,19 +362,20 @@
     rsgBindSampler(gProgFragmentTexture, 0, gLinearClamp);
     rsgBindTexture(gProgFragmentTexture, 0, gTexTorus);
 
-    // Aplly a rotation to our mesh
+    // Apply a rotation to our mesh
     gTorusRotation += 50.0f * gDt;
     if (gTorusRotation > 360.0f) {
         gTorusRotation -= 360.0f;
     }
 
-    drawToruses(numMeshes);
+    rs_matrix4x4 matrix;
+    drawToruses(numMeshes, &matrix, 0);
 }
 
 float gLight0Rotation = 0;
 float gLight1Rotation = 0;
 
-void setupCustomShaderLights() {
+static void setupCustomShaderLights() {
     float4 light0Pos = {-5.0f, 5.0f, -10.0f, 1.0f};
     float4 light1Pos = {2.0f, 5.0f, 15.0f, 1.0f};
     float4 light0DiffCol = {0.9f, 0.7f, 0.7f, 1.0f};
@@ -393,7 +411,7 @@
     gVSConstants->light1_CosinePower = 25.0f;
     rsAllocationMarkDirty(rsGetAllocation(gVSConstants));
 
-    // Update fragmetn shader constants
+    // Update fragment shader constants
     // Set light 0 colors
     gFSConstants->light0_DiffuseColor = light0DiffCol;
     gFSConstants->light0_SpecularColor = light0SpecCol;
@@ -419,17 +437,17 @@
     rsAllocationMarkDirty(rsGetAllocation(gFSConstPixel));
 }
 
-void displayCustomShaderSamples(int numMeshes) {
+static void displayCustomShaderSamples(int numMeshes) {
 
     // Update vertex shader constants
     // Load model matrix
-    // Aplly a rotation to our mesh
+    // Apply a rotation to our mesh
     gTorusRotation += 50.0f * gDt;
     if (gTorusRotation > 360.0f) {
         gTorusRotation -= 360.0f;
     }
 
-    // Setup the projectioni matrix
+    // Setup the projection matrix
     float aspect = (float)rsgGetWidth() / (float)rsgGetHeight();
     rsMatrixLoadPerspective(&gVSConstants->proj, 30.0f, aspect, 0.1f, 100.0f);
     setupCustomShaderLights();
@@ -445,70 +463,31 @@
     // Use back face culling
     rsgBindProgramRaster(gCullBack);
 
-    rs_matrix4x4 matrix;
-
-    if (numMeshes == 1) {
-        rsMatrixLoadTranslate(&gVSConstants->model, 0.0f, 0.0f, -7.5f);
-        rsMatrixRotate(&gVSConstants->model, gTorusRotation, 1.0f, 0.0f, 0.0f);
-        rsMatrixRotate(&gVSConstants->model, gTorusRotation, 0.0f, 0.0f, 1.0f);
-        rsAllocationMarkDirty(rsGetAllocation(gVSConstants));
-
-        rsgDrawMesh(gTorusMesh);
-        return;
-    }
-
-    if (numMeshes == 2) {
-        rsMatrixLoadTranslate(&gVSConstants->model, -1.6f, 0.0f, -7.5f);
-        rsMatrixRotate(&gVSConstants->model, gTorusRotation, 1.0f, 0.0f, 0.0f);
-        rsMatrixRotate(&gVSConstants->model, gTorusRotation, 0.0f, 0.0f, 1.0f);
-        rsAllocationMarkDirty(rsGetAllocation(gVSConstants));
-        rsgDrawMesh(gTorusMesh);
-
-        rsMatrixLoadTranslate(&gVSConstants->model, 1.6f, 0.0f, -7.5f);
-        rsMatrixRotate(&gVSConstants->model, gTorusRotation, 1.0f, 0.0f, 0.0f);
-        rsMatrixRotate(&gVSConstants->model, gTorusRotation, 0.0f, 0.0f, 1.0f);
-        rsAllocationMarkDirty(rsGetAllocation(gVSConstants));
-        rsgDrawMesh(gTorusMesh);
-        return;
-    }
-
-    float startX = -5.0f;
-    float startY = -1.5f;
-    float startZ = -15.0f;
-    float dist = 3.2f;
-
-    for (int h = 0; h < 4; h ++) {
-        for (int v = 0; v < 2; v ++) {
-            // Position our model on the screen
-            rsMatrixLoadTranslate(&gVSConstants->model, startX + dist * h, startY + dist * v, startZ);
-            rsMatrixRotate(&gVSConstants->model, gTorusRotation, 1.0f, 0.0f, 0.0f);
-            rsMatrixRotate(&gVSConstants->model, gTorusRotation, 0.0f, 0.0f, 1.0f);
-            rsAllocationMarkDirty(rsGetAllocation(gVSConstants));
-            rsgDrawMesh(gTorusMesh);
-        }
-    }
+    drawToruses(numMeshes, &gVSConstants->model, gVSConstants);
 }
 
-void displayPixelLightSamples(int numMeshes) {
+static void displayPixelLightSamples(int numMeshes, bool heavyVertex) {
 
     // Update vertex shader constants
     // Load model matrix
-    // Aplly a rotation to our mesh
-    gTorusRotation += 20.0f * gDt;
+    // Apply a rotation to our mesh
+    gTorusRotation += 30.0f * gDt;
     if (gTorusRotation > 360.0f) {
         gTorusRotation -= 360.0f;
     }
 
-    //gTorusRotation = 45.0f;
-
     gVSConstPixel->time = rsUptimeMillis()*0.005;
 
-    // Setup the projectioni matrix
+    // Setup the projection matrix
     float aspect = (float)rsgGetWidth() / (float)rsgGetHeight();
     rsMatrixLoadPerspective(&gVSConstPixel->proj, 30.0f, aspect, 0.1f, 100.0f);
     setupCustomShaderLights();
 
-    rsgBindProgramVertex(gProgVertexPixelLight);
+    if (heavyVertex) {
+        rsgBindProgramVertex(gProgVertexPixelLightMove);
+    } else {
+        rsgBindProgramVertex(gProgVertexPixelLight);
+    }
 
     // Fragment shader with texture
     rsgBindProgramStore(gProgStoreBlendNoneDepth);
@@ -519,51 +498,10 @@
     // Use back face culling
     rsgBindProgramRaster(gCullBack);
 
-    rs_matrix4x4 matrix;
-
-    if (numMeshes == 1) {
-        rsMatrixLoadTranslate(&gVSConstPixel->model, 0.0f, 0.0f, -7.5f);
-        rsMatrixRotate(&gVSConstPixel->model, gTorusRotation, 1.0f, 0.0f, 0.0f);
-        rsMatrixRotate(&gVSConstPixel->model, gTorusRotation, 0.0f, 0.0f, 1.0f);
-        rsAllocationMarkDirty(rsGetAllocation(gVSConstPixel));
-
-        rsgDrawMesh(gTorusMesh);
-        return;
-    }
-
-    if (numMeshes == 2) {
-        rsMatrixLoadTranslate(&gVSConstPixel->model, -1.6f, 0.0f, -7.5f);
-        rsMatrixRotate(&gVSConstPixel->model, gTorusRotation, 1.0f, 0.0f, 0.0f);
-        rsMatrixRotate(&gVSConstPixel->model, gTorusRotation, 0.0f, 0.0f, 1.0f);
-        rsAllocationMarkDirty(rsGetAllocation(gVSConstPixel));
-        rsgDrawMesh(gTorusMesh);
-
-        rsMatrixLoadTranslate(&gVSConstPixel->model, 1.6f, 0.0f, -7.5f);
-        rsMatrixRotate(&gVSConstPixel->model, gTorusRotation, 1.0f, 0.0f, 0.0f);
-        rsMatrixRotate(&gVSConstPixel->model, gTorusRotation, 0.0f, 0.0f, 1.0f);
-        rsAllocationMarkDirty(rsGetAllocation(gVSConstPixel));
-        rsgDrawMesh(gTorusMesh);
-        return;
-    }
-
-    float startX = -5.0f;
-    float startY = -1.5f;
-    float startZ = -15.0f;
-    float dist = 3.2f;
-
-    for (int h = 0; h < 4; h ++) {
-        for (int v = 0; v < 2; v ++) {
-            // Position our model on the screen
-            rsMatrixLoadTranslate(&gVSConstPixel->model, startX + dist * h, startY + dist * v, startZ);
-            rsMatrixRotate(&gVSConstPixel->model, gTorusRotation, 1.0f, 0.0f, 0.0f);
-            rsMatrixRotate(&gVSConstPixel->model, gTorusRotation, 0.0f, 0.0f, 1.0f);
-            rsAllocationMarkDirty(rsGetAllocation(gVSConstPixel));
-            rsgDrawMesh(gTorusMesh);
-        }
-    }
+    drawToruses(numMeshes, &gVSConstPixel->model, gVSConstPixel);
 }
 
-void displayMultitextureSample(bool blend, int quadCount) {
+static void displayMultitextureSample(bool blend, int quadCount) {
     bindProgramVertexOrtho();
     rs_matrix4x4 matrix;
     rsMatrixLoadIdentity(&matrix);
@@ -593,9 +531,9 @@
     }
 }
 
-float gAnisoTime = 0.0f;
-uint anisoMode = 0;
-void displayAnisoSample() {
+static float gAnisoTime = 0.0f;
+static uint anisoMode = 0;
+static void displayAnisoSample() {
 
     gAnisoTime += gDt;
 
@@ -672,6 +610,8 @@
         displayTextureSamplers();
         displayMultitextureSample(true, 5);
         displayAnisoSample();
+        displayPixelLightSamples(1, false);
+        displayPixelLightSamples(1, true);
         countdown --;
         rsgClearColor(0.2f, 0.2f, 0.2f, 0.0f);
 
@@ -699,7 +639,7 @@
 static int totalFramesRendered = 0;
 static int benchMode = 0;
 
-#define testTime 10.0f
+#define testTime 5.0f
 static float curTestTime = testTime;
 
 static const char *testNames[] = {
@@ -727,12 +667,9 @@
     "Finished 25.6k geo heavy fragment",
     "Finished 51.2k geo heavy fragment",
     "Finished 204.8k geo raster load heavy fragment",
-    "Finished simpleGeo",
-    "Finished simpleGeo",
-    "Finished simpleGeo",
-    "Finished simpleGeo",
-    "Finished simpleGeo",
-    "Finished simpleGeo",
+    "Finished 25.6k geo heavy fragment, heavy vertex",
+    "Finished 51.2k geo heavy fragment, heavy vertex",
+    "Finished 204.8k geo raster load heavy fragment, heavy vertex",
 };
 
 int root(int launchID) {
@@ -746,9 +683,6 @@
         return 1;
     }
 
-    /*displayPixelLightSamples(1);
-    return 1;*/
-
     curTestTime -= gDt;
     if(curTestTime < 0.0f) {
         float fps = (float)(frameCount) / (testTime - curTestTime);
@@ -829,14 +763,24 @@
         displayMultitextureSample(true, 5);
         break;
     case 21:
-        displayPixelLightSamples(1);
+        displayPixelLightSamples(1, false);
         break;
     case 22:
-        displayPixelLightSamples(2);
+        displayPixelLightSamples(2, false);
         break;
     case 23:
-        displayPixelLightSamples(8);
+        displayPixelLightSamples(8, false);
         break;
+    case 24:
+        displayPixelLightSamples(1, true);
+        break;
+    case 25:
+        displayPixelLightSamples(2, true);
+        break;
+    case 26:
+        displayPixelLightSamples(8, true);
+        break;
+
     }
 
     frameCount ++;
diff --git a/libs/rs/java/Samples/src/com/android/samples/rsrenderstates.rs b/libs/rs/java/Samples/src/com/android/samples/rsrenderstates.rs
index 39b0834..a973167 100644
--- a/libs/rs/java/Samples/src/com/android/samples/rsrenderstates.rs
+++ b/libs/rs/java/Samples/src/com/android/samples/rsrenderstates.rs
@@ -81,7 +81,7 @@
 void init() {
 }
 
-void displayFontSamples() {
+static void displayFontSamples() {
     rsgFontColor(1.0f, 1.0f, 1.0f, 1.0f);
     int yPos = 100;
     rsgBindFont(gFontSans);
@@ -148,7 +148,7 @@
 
 }
 
-void bindProgramVertexOrtho() {
+static void bindProgramVertexOrtho() {
     // Default vertex sahder
     rsgBindProgramVertex(gProgVertex);
     // Setup the projectioni matrix
@@ -157,7 +157,7 @@
     rsgProgramVertexLoadProjectionMatrix(&proj);
 }
 
-void displayShaderSamples() {
+static void displayShaderSamples() {
     bindProgramVertexOrtho();
     rs_matrix4x4 matrix;
     rsMatrixLoadIdentity(&matrix);
@@ -206,7 +206,7 @@
     rsgDrawText("Flat color shader", 100, 450);
 }
 
-void displayBlendingSamples() {
+static void displayBlendingSamples() {
     int i;
 
     bindProgramVertexOrtho();
@@ -252,7 +252,7 @@
 
 }
 
-void displayMeshSamples() {
+static void displayMeshSamples() {
 
     bindProgramVertexOrtho();
     rs_matrix4x4 matrix;
@@ -272,7 +272,7 @@
     rsgDrawText("User gen 10 by 10 grid mesh", 10, 250);
 }
 
-void displayTextureSamplers() {
+static void displayTextureSamplers() {
 
     bindProgramVertexOrtho();
     rs_matrix4x4 matrix;
@@ -327,9 +327,9 @@
     rsgDrawText("Filtering: miplinear wrap", 310, 590);
 }
 
-float gTorusRotation = 0;
+static float gTorusRotation = 0;
 
-void displayCullingSamples() {
+static void displayCullingSamples() {
     rsgBindProgramVertex(gProgVertex);
     // Setup the projectioni matrix with 60 degree field of view
     rs_matrix4x4 proj;
@@ -370,10 +370,10 @@
     rsgDrawText("Displaying mesh front/back face culling", 10, rsgGetHeight() - 10);
 }
 
-float gLight0Rotation = 0;
-float gLight1Rotation = 0;
+static float gLight0Rotation = 0;
+static float gLight1Rotation = 0;
 
-void setupCustomShaderLights() {
+static void setupCustomShaderLights() {
     float4 light0Pos = {-5.0f, 5.0f, -10.0f, 1.0f};
     float4 light1Pos = {2.0f, 5.0f, 15.0f, 1.0f};
     float4 light0DiffCol = {0.9f, 0.7f, 0.7f, 1.0f};
@@ -436,7 +436,7 @@
     rsAllocationMarkDirty(rsGetAllocation(gFSConstants2));
 }
 
-void displayCustomShaderSamples() {
+static void displayCustomShaderSamples() {
 
     // Update vertex shader constants
     // Load model matrix
@@ -472,7 +472,7 @@
     rsgDrawText("Custom shader sample", 10, rsgGetHeight() - 10);
 }
 
-void displayCustomShaderSamples2() {
+static void displayCustomShaderSamples2() {
 
     // Update vertex shader constants
     // Load model matrix
@@ -509,7 +509,7 @@
     rsgDrawText("Custom shader sample with array uniforms", 10, rsgGetHeight() - 10);
 }
 
-void displayCubemapShaderSample() {
+static void displayCubemapShaderSample() {
     // Update vertex shader constants
     // Load model matrix
     // Aplly a rotation to our mesh
@@ -545,7 +545,7 @@
     rsgDrawText("Cubemap shader sample", 10, rsgGetHeight() - 10);
 }
 
-void displayMultitextureSample() {
+static void displayMultitextureSample() {
     bindProgramVertexOrtho();
     rs_matrix4x4 matrix;
     rsMatrixLoadIdentity(&matrix);
@@ -573,9 +573,9 @@
     rsgDrawText("Custom shader with multitexturing", 10, 280);
 }
 
-float gAnisoTime = 0.0f;
-uint anisoMode = 0;
-void displayAnisoSample() {
+static float gAnisoTime = 0.0f;
+static uint anisoMode = 0;
+static void displayAnisoSample() {
 
     gAnisoTime += gDt;
 
diff --git a/libs/rs/rsAllocation.cpp b/libs/rs/rsAllocation.cpp
index cb00223..77e80320 100644
--- a/libs/rs/rsAllocation.cpp
+++ b/libs/rs/rsAllocation.cpp
@@ -31,10 +31,13 @@
 using namespace android;
 using namespace android::renderscript;
 
-Allocation::Allocation(Context *rsc, const Type *type, uint32_t usages) : ObjectBase(rsc) {
+Allocation::Allocation(Context *rsc, const Type *type, uint32_t usages,
+                       RsAllocationMipmapControl mc)
+    : ObjectBase(rsc) {
     init(rsc, type);
 
     mUsageFlags = usages;
+    mMipmapControl = mc;
 
     allocScriptMemory();
     if (mType->getElement()->getHasReferences()) {
@@ -795,7 +798,7 @@
                                       RsAllocationMipmapControl mips,
                                       uint32_t usages) {
     Context *rsc = static_cast<Context *>(con);
-    Allocation * alloc = new Allocation(rsc, static_cast<Type *>(vtype), usages);
+    Allocation * alloc = new Allocation(rsc, static_cast<Type *>(vtype), usages, mips);
     alloc->incUserRef();
     return alloc;
 }
diff --git a/libs/rs/rsAllocation.h b/libs/rs/rsAllocation.h
index 4a5f3da..44dce0d 100644
--- a/libs/rs/rsAllocation.h
+++ b/libs/rs/rsAllocation.h
@@ -29,7 +29,8 @@
     // The graphics equilivent of malloc.  The allocation contains a structure of elements.
 
 public:
-    Allocation(Context *rsc, const Type *, uint32_t usages);
+    Allocation(Context *rsc, const Type *, uint32_t usages,
+               RsAllocationMipmapControl mc = RS_ALLOCATION_MIPMAP_NONE);
 
     virtual ~Allocation();
 
diff --git a/libs/rs/rsSampler.cpp b/libs/rs/rsSampler.cpp
index 54282a8..e2757df 100644
--- a/libs/rs/rsSampler.cpp
+++ b/libs/rs/rsSampler.cpp
@@ -61,6 +61,7 @@
         GL_LINEAR_MIPMAP_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
         GL_REPEAT, //RS_SAMPLER_WRAP,
         GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP
+        GL_LINEAR_MIPMAP_NEAREST, //RS_SAMPLER_LINEAR_MIP_NEAREST
     };
 
     GLenum transNP[] = {
@@ -69,6 +70,7 @@
         GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_LINEAR,
         GL_CLAMP_TO_EDGE, //RS_SAMPLER_WRAP,
         GL_CLAMP_TO_EDGE, //RS_SAMPLER_CLAMP
+        GL_LINEAR, //RS_SAMPLER_LINEAR_MIP_NEAREST,
     };
 
     // This tells us the correct texture type
