diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index cb2a804..cdfe585 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -118,15 +118,6 @@
             </intent-filter>
         </receiver>
 
-        <service
-            android:label="@string/wallpaper_grass"
-            android:name="com.android.wallpaper.grass.GrassWallpaper"
-            android:permission="android.permission.BIND_WALLPAPER">
-            <intent-filter>
-                <action android:name="android.service.wallpaper.WallpaperService" />
-            </intent-filter>
-        </service>
-
         <!-- The settings provider contains Home's data, like the workspace favorites -->
         <provider
             android:name="LauncherProvider"
diff --git a/res/drawable-hdpi/night.jpg b/res/drawable-hdpi/night.jpg
deleted file mode 100644
index 559c7cb..0000000
--- a/res/drawable-hdpi/night.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/sky.jpg b/res/drawable-hdpi/sky.jpg
deleted file mode 100644
index a12fe20..0000000
--- a/res/drawable-hdpi/sky.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/sunrise.jpg b/res/drawable-hdpi/sunrise.jpg
deleted file mode 100644
index db016b2..0000000
--- a/res/drawable-hdpi/sunrise.jpg
+++ /dev/null
Binary files differ
diff --git a/res/drawable-hdpi/sunset.jpg b/res/drawable-hdpi/sunset.jpg
deleted file mode 100644
index 49bb0c6..0000000
--- a/res/drawable-hdpi/sunset.jpg
+++ /dev/null
Binary files differ
diff --git a/res/raw/grass.c b/res/raw/grass.c
deleted file mode 100644
index 2962d0f..0000000
--- a/res/raw/grass.c
+++ /dev/null
@@ -1,212 +0,0 @@
-// Copyright (C) 2009 The Android Open Source Project
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-#pragma version(1)
-#pragma stateVertex(PVBackground)
-#pragma stateFragment(PFBackground)
-#pragma stateFragmentStore(PFSBackground)
-
-#define RSID_STATE 0
-#define RSID_FRAME_COUNT 0
-#define RSID_BLADES_COUNT 1
-#define RSID_WIDTH 2
-#define RSID_HEIGHT 3
-
-#define RSID_BLADES 1
-#define BLADE_STRUCT_FIELDS_COUNT 12
-#define BLADE_STRUCT_ANGLE 0
-#define BLADE_STRUCT_SIZE 1
-#define BLADE_STRUCT_XPOS 2
-#define BLADE_STRUCT_YPOS 3
-#define BLADE_STRUCT_OFFSET 4
-#define BLADE_STRUCT_SCALE 5
-#define BLADE_STRUCT_LENGTHX 6
-#define BLADE_STRUCT_LENGTHY 7
-#define BLADE_STRUCT_HARDNESS 8
-#define BLADE_STRUCT_H 9
-#define BLADE_STRUCT_S 10
-#define BLADE_STRUCT_B 11
-
-#define TESSELATION 2.0f
-
-#define MAX_BEND 0.09f
-
-#define MIDNIGHT 0.0f
-#define MORNING 0.375f
-#define AFTERNOON 0.6f
-#define DUSK 0.8f
-
-#define SECONDS_IN_DAY 24.0f * 3600.0f
-
-#define PI 3.1415926f
-
-#define REAL_TIME 0
-
-float time(int frameCount) {
-    if (REAL_TIME) {
-        return (hour() * 3600.0f + minute() * 60.0f + second()) / SECONDS_IN_DAY;
-    }
-    return (frameCount % 180) / 180.0f;
-}
-
-void alpha(float a) {
-    color(1.0f, 1.0f, 1.0f, a);
-}
-
-void drawNight(int width, int height) {
-    bindProgramFragment(NAMED_PFNight);
-    bindTexture(NAMED_PFNight, 0, NAMED_TNight);
-    drawQuadTexCoords(
-            0.0f, -32.0f, 0.0f,
-            0.0f, 1.0f,
-            width, -32.0f, 0.0f,
-            2.0f, 1.0f,
-            width, 1024.0f - 32.0f, 0.0f,
-            2.0f, 0.0f,
-            0.0f, 1024.0f - 32.0f, 0.0f,
-            0.0f, 0.0f);
-    bindProgramFragment(NAMED_PFBackground);
-}
-
-void drawSunrise(int width, int height) {
-    bindTexture(NAMED_PFBackground, 0, NAMED_TSunrise);
-    drawRect(0.0f, 0.0f, width, height, 0.0f);
-}
-
-void drawNoon(int width, int height) {
-    bindTexture(NAMED_PFBackground, 0, NAMED_TSky);
-    drawRect(0.0f, 0.0f, width, height, 0.0f);
-}
-
-void drawSunset(int width, int height) {
-    bindTexture(NAMED_PFBackground, 0, NAMED_TSunset);
-    drawRect(0.0f, 0.0f, width, height, 0.0f);
-}
-
-void drawBlade(int index, float now, int frameCount) {
-    float *bladeStruct = loadArrayF(RSID_BLADES, index);
-    float offset = bladeStruct[BLADE_STRUCT_OFFSET];
-    float scale = bladeStruct[BLADE_STRUCT_SCALE];
-    float angle = bladeStruct[BLADE_STRUCT_ANGLE];
-    float hardness = bladeStruct[BLADE_STRUCT_HARDNESS];
-    
-    float xpos = bladeStruct[BLADE_STRUCT_XPOS];
-    float ypos = bladeStruct[BLADE_STRUCT_YPOS];
-
-    float lengthX = bladeStruct[BLADE_STRUCT_LENGTHX];
-    float lengthY = bladeStruct[BLADE_STRUCT_LENGTHY];
-
-    int size = bladeStruct[BLADE_STRUCT_SIZE];
-
-    float h = bladeStruct[BLADE_STRUCT_H];
-    float s = bladeStruct[BLADE_STRUCT_S];
-    float b = bladeStruct[BLADE_STRUCT_B];
-
-    float newB = 1.0f;
-    if (now >= MIDNIGHT && now < MORNING) {
-        newB = now / MORNING;
-    }
-
-    if (now >= AFTERNOON && now < DUSK) {
-        newB = 1.0f - normf(AFTERNOON, DUSK, now);
-    }
-
-    if (now >= DUSK) {
-        newB = 0.0f;
-    }
-
-    hsb(h, s, lerpf(0, b, newB), 1.0f);
-
-    float newAngle = turbulencef2(xpos * 0.006f, frameCount * 0.006f, 4.0f) - 0.5f;
-    newAngle /= 2.0f;
-    angle = clampf(angle + (newAngle + offset - angle) * 0.15f, -MAX_BEND, MAX_BEND);
-
-    float currentAngle = PI / 2.0f;
-
-    float bottomX = xpos;
-    float bottomY = ypos;
-
-    int i = size * TESSELATION;
-    float lx = lengthX / TESSELATION;
-    float ly = lengthY / TESSELATION;
-    float ss = 4.0f / i + scale / TESSELATION;
-    float sh = 0.5f / TESSELATION;
-    float d = angle * hardness / TESSELATION;
-
-    for ( ; i > 0; i--) {
-        float topX = bottomX - cosf(currentAngle) * size * lx;
-        float topY = bottomY - sinf(currentAngle) * size * ly;
-        currentAngle += d;
-
-        float spi = (i - 1) * ss;
-        float si = i * ss;
-
-        drawQuad(topX + spi, topY, 0.0f,
-                 topX - spi, topY, 0.0f,
-                 bottomX - si, bottomY + sh, 0.0f,
-                 bottomX + si, bottomY + sh, 0.0f);
-
-        bottomX = topX;
-        bottomY = topY;
-    }
-
-    storeF(RSID_BLADES, index + BLADE_STRUCT_ANGLE, angle);
-}
-
-void drawBlades(float now, int frameCount) {
-    // For anti-aliasing
-    bindTexture(NAMED_PFBackground, 0, NAMED_TAa);
-
-    int bladesCount = loadI32(RSID_STATE, RSID_BLADES_COUNT);
-    int count = bladesCount * BLADE_STRUCT_FIELDS_COUNT;
-
-    int i = 0;
-    for ( ; i < count; i += BLADE_STRUCT_FIELDS_COUNT) {
-        drawBlade(i, now, frameCount);
-    }
-}
-
-int main(int launchID) {
-    int width = loadI32(RSID_STATE, RSID_WIDTH);
-    int height = loadI32(RSID_STATE, RSID_HEIGHT);
-
-    int frameCount = loadI32(RSID_STATE, RSID_FRAME_COUNT);
-    float now = time(frameCount);
-    alpha(1.0f);
-
-    if (now >= MIDNIGHT && now < MORNING) {
-        drawNight(width, height);
-        alpha(normf(MIDNIGHT, MORNING, now));
-        drawSunrise(width, height);
-    } else if (now >= MORNING && now < AFTERNOON) {
-        drawSunrise(width, height);
-        alpha(normf(MORNING, AFTERNOON, now));
-        drawNoon(width, height);
-    } else if (now >= AFTERNOON && now < DUSK) {
-        drawNoon(width, height);
-        alpha(normf(AFTERNOON, DUSK, now));
-        drawSunset(width, height);
-    } else if (now >= DUSK) {
-        drawNight(width, height);
-        alpha(1.0f - normf(DUSK, 1.0f, now));
-        drawSunset(width, height);
-    }
-
-    drawBlades(now, frameCount);
-
-    frameCount++;
-    storeI32(RSID_STATE, RSID_FRAME_COUNT, frameCount);
-
-    return 1;
-}
diff --git a/res/values/strings.xml b/res/values/strings.xml
index b792d36..f286fa1 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -126,10 +126,4 @@
 
     <!-- Text to show user in place of a gadget when we can't display it properly -->
     <string name="gadget_error_text">Problem loading widget</string>
-    
-    <!-- Wallpapers: -->
-    <skip />    
-    
-    <!-- Wallpaper showing grass and the sky -->
-    <string name="wallpaper_grass">Grass</string>
 </resources>
diff --git a/src/com/android/wallpaper/grass/GrassRS.java b/src/com/android/wallpaper/grass/GrassRS.java
deleted file mode 100644
index 722685b..0000000
--- a/src/com/android/wallpaper/grass/GrassRS.java
+++ /dev/null
@@ -1,262 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.wallpaper.grass;
-
-import android.content.res.Resources;
-import android.renderscript.Sampler;
-import static android.renderscript.ProgramFragment.EnvMode.*;
-import static android.renderscript.ProgramStore.DepthFunc.*;
-import static android.renderscript.ProgramStore.BlendSrcFunc;
-import static android.renderscript.ProgramStore.BlendDstFunc;
-import android.renderscript.RenderScript;
-import android.renderscript.ProgramFragment;
-import android.renderscript.ProgramStore;
-import android.renderscript.Allocation;
-import android.renderscript.ProgramVertex;
-import static android.renderscript.Element.*;
-import static android.util.MathUtils.*;
-import android.renderscript.ScriptC;
-import android.renderscript.Type;
-import android.renderscript.Dimension;
-import static android.renderscript.Sampler.Value.*;
-import com.android.launcher2.R;
-
-import java.util.TimeZone;
-
-class GrassRS {
-    private static final int RSID_STATE = 0;
-    private static final int RSID_STATE_FRAMECOUNT = 0;
-    private static final int RSID_STATE_BLADES_COUNT = 1;
-    private static final int RSID_STATE_WIDTH = 2;
-    private static final int RSID_STATE_HEIGHT = 3;
-
-    private static final int TEXTURES_COUNT = 5;
-
-    private static final int RSID_BLADES = 1;
-    private static final int BLADES_COUNT = 200;
-    private static final int BLADE_STRUCT_FIELDS_COUNT = 12;
-    private static final int BLADE_STRUCT_ANGLE = 0;
-    private static final int BLADE_STRUCT_SIZE = 1;
-    private static final int BLADE_STRUCT_XPOS = 2;
-    private static final int BLADE_STRUCT_YPOS = 3;
-    private static final int BLADE_STRUCT_OFFSET = 4;
-    private static final int BLADE_STRUCT_SCALE = 5;
-    private static final int BLADE_STRUCT_LENGTHX = 6;
-    private static final int BLADE_STRUCT_LENGTHY = 7;
-    private static final int BLADE_STRUCT_HARDNESS = 8;
-    private static final int BLADE_STRUCT_H = 9;
-    private static final int BLADE_STRUCT_S = 10;
-    private static final int BLADE_STRUCT_B = 11;
-
-    private Resources mResources;
-    private RenderScript mRS;
-
-    private final int mWidth;
-    private final int mHeight;
-
-    private ScriptC mScript;
-    private Sampler mSampler;
-    private Sampler mNightSampler;
-    private ProgramFragment mPfBackground;
-    private ProgramFragment mPfNight;
-    private ProgramStore mPfsBackground;
-    private ProgramVertex mPvBackground;
-    private ProgramVertex.MatrixAllocation mPvOrthoAlloc;
-
-    private Allocation[] mTextures;
-
-    private Allocation mState;
-    private Allocation mBlades;
-
-    public GrassRS(int width, int height) {
-        mWidth = width;
-        mHeight = height;
-    }
-
-    public void init(RenderScript rs, Resources res) {
-        mRS = rs;
-        mResources = res;
-        initRS();
-    }
-
-    public void destroy() {
-        mScript.destroy();
-        mSampler.destroy();
-        mPfBackground.destroy();
-        mPfsBackground.destroy();
-        mPvBackground.destroy();
-        mPvOrthoAlloc.mAlloc.destroy();
-        for (Allocation a : mTextures) {
-            a.destroy();
-        }
-        mState.destroy();
-        mBlades.destroy();
-        mNightSampler.destroy();
-        mPfNight.destroy();
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        try {
-            destroy();
-        } finally {
-            super.finalize();
-        }
-    }
-
-    private void initRS() {
-        createProgramVertex();
-        createProgramFragmentStore();
-        createProgramFragment();
-        createScriptStructures();
-        loadTextures();
-
-        ScriptC.Builder sb = new ScriptC.Builder(mRS);
-        sb.setScript(mResources, R.raw.grass);
-        sb.setRoot(true);
-        mScript = sb.create();
-        mScript.setClearColor(0.0f, 0.0f, 0.0f, 1.0f);
-        mScript.setTimeZone(TimeZone.getDefault().getID());
-
-        mScript.bindAllocation(mState, RSID_STATE);
-        mScript.bindAllocation(mBlades, RSID_BLADES);
-
-        mRS.contextBindRootScript(mScript);
-    }
-
-    private void createScriptStructures() {
-        final int[] data = new int[4];
-        mState = Allocation.createSized(mRS, USER_I32, data.length);
-        data[RSID_STATE_FRAMECOUNT] = 0;
-        data[RSID_STATE_BLADES_COUNT] = BLADES_COUNT;
-        data[RSID_STATE_WIDTH] = mWidth;
-        data[RSID_STATE_HEIGHT] = mHeight;
-        mState.data(data);
-
-        final float[] blades = new float[BLADES_COUNT * BLADE_STRUCT_FIELDS_COUNT];
-        mBlades = Allocation.createSized(mRS, USER_FLOAT, blades.length);
-        for (int i = 0; i < blades.length; i+= BLADE_STRUCT_FIELDS_COUNT) {
-            createBlade(blades, i);
-        }
-        mBlades.data(blades);
-    }
-
-    private void createBlade(float[] blades, int index) {
-        //noinspection PointlessArithmeticExpression
-        blades[index + BLADE_STRUCT_ANGLE] = 0.0f;
-        blades[index + BLADE_STRUCT_SIZE] = random(4.0f) + 4.0f;
-        blades[index + BLADE_STRUCT_XPOS] = random(mWidth);
-        blades[index + BLADE_STRUCT_YPOS] = mHeight;
-        blades[index + BLADE_STRUCT_OFFSET] = random(0.2f) - 0.1f;
-        blades[index + BLADE_STRUCT_SCALE] = random(0.6f) + 0.2f;
-        blades[index + BLADE_STRUCT_LENGTHX] = random(4.5f) + 3.0f;
-        blades[index + BLADE_STRUCT_LENGTHY] = random(5.5f) + 2.0f;
-        blades[index + BLADE_STRUCT_HARDNESS] = random(1.0f) + 0.2f;
-        blades[index + BLADE_STRUCT_H] = random(0.02f) + 0.2f;
-        blades[index + BLADE_STRUCT_S] = random(0.22f) + 0.78f;
-        blades[index + BLADE_STRUCT_B] = random(0.65f) + 0.35f;
-    }
-
-    private void loadTextures() {
-        mTextures = new Allocation[TEXTURES_COUNT];
-
-        final Allocation[] textures = mTextures;
-        textures[0] = loadTexture(R.drawable.night, "TNight");
-        textures[1] = loadTexture(R.drawable.sunrise, "TSunrise");
-        textures[2] = loadTexture(R.drawable.sky, "TSky");
-        textures[3] = loadTexture(R.drawable.sunset, "TSunset");
-        textures[4] = generateTextureAlpha(4, 1, new int[] { 0x00FFFF00 }, "TAa");
-
-        final int count = textures.length;
-        for (int i = 0; i < count; i++) {
-            final Allocation texture = textures[i];
-            texture.uploadToTexture(0);
-        }
-    }
-
-    private Allocation generateTextureAlpha(int width, int height, int[] data, String name) {
-        final Type.Builder builder = new Type.Builder(mRS, A_8);
-        builder.add(Dimension.X, width);
-        builder.add(Dimension.Y, height);
-        
-        final Allocation allocation = Allocation.createTyped(mRS, builder.create());
-        allocation.data(data);
-        allocation.setName(name);
-        return allocation;
-    }
-
-    private Allocation loadTexture(int id, String name) {
-        final Allocation allocation = Allocation.createFromBitmapResource(mRS, mResources,
-                id, RGB_565, false);
-        allocation.setName(name);
-        return allocation;
-    }
-
-    private void createProgramFragment() {
-        Sampler.Builder bs = new Sampler.Builder(mRS);
-        bs.setMin(LINEAR);
-        bs.setMag(LINEAR);
-        bs.setWrapS(CLAMP);
-        bs.setWrapT(CLAMP);
-        mSampler = bs.create();
-
-        ProgramFragment.Builder b;
-        b = new ProgramFragment.Builder(mRS, null, null);
-        b.setTexEnable(true, 0);
-        b.setTexEnvMode(REPLACE, 0);
-        mPfBackground = b.create();
-        mPfBackground.setName("PFBackground");
-        mPfBackground.bindSampler(mSampler, 0);
-
-        bs = new Sampler.Builder(mRS);
-        bs.setMin(LINEAR);
-        bs.setMag(LINEAR);
-        bs.setWrapS(WRAP);
-        bs.setWrapT(WRAP);
-        mNightSampler = bs.create();
-
-        b = new ProgramFragment.Builder(mRS, null, null);
-        b.setTexEnable(true, 0);
-        b.setTexEnvMode(REPLACE, 0);
-        mPfNight = b.create();
-        mPfNight.setName("PFNight");
-        mPfNight.bindSampler(mNightSampler, 0);
-    }
-
-    private void createProgramFragmentStore() {
-        ProgramStore.Builder b;
-        b = new ProgramStore.Builder(mRS, null, null);
-
-        b.setDepthFunc(ALWAYS);
-        b.setBlendFunc(BlendSrcFunc.SRC_ALPHA, BlendDstFunc.ONE_MINUS_SRC_ALPHA);
-        b.setDitherEnable(true);
-        b.setDepthMask(false);
-        mPfsBackground = b.create();
-        mPfsBackground.setName("PFSBackground");
-    }
-
-    private void createProgramVertex() {
-        mPvOrthoAlloc = new ProgramVertex.MatrixAllocation(mRS);
-        mPvOrthoAlloc.setupOrthoWindow(mWidth, mHeight);
-
-        ProgramVertex.Builder pvb = new ProgramVertex.Builder(mRS, null, null);
-        pvb.setTextureMatrixEnable(true);
-        mPvBackground = pvb.create();
-        mPvBackground.bindAllocation(mPvOrthoAlloc);
-        mPvBackground.setName("PVBackground");
-    }
-}
diff --git a/src/com/android/wallpaper/grass/GrassWallpaper.java b/src/com/android/wallpaper/grass/GrassWallpaper.java
deleted file mode 100644
index d374424..0000000
--- a/src/com/android/wallpaper/grass/GrassWallpaper.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2009 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.wallpaper.grass;
-
-import android.service.wallpaper.WallpaperService;
-import android.view.SurfaceHolder;
-import android.view.Surface;
-import android.renderscript.RenderScript;
-
-public class GrassWallpaper extends WallpaperService {
-    public Engine onCreateEngine() {
-        return new RenderScriptEngine();
-    }
-
-    private class RenderScriptEngine extends Engine {
-        private RenderScript mRs;
-        private GrassRS mRenderer;
-
-        @Override
-        public void onCreate(SurfaceHolder surfaceHolder) {
-            super.onCreate(surfaceHolder);
-            surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_GPU);
-        }
-
-        @Override
-        public void onDestroy() {
-            super.onDestroy();
-        }
-
-        @Override
-        public void onVisibilityChanged(boolean visible) {
-            super.onVisibilityChanged(visible);
-        }
-
-        @Override
-        public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
-            super.onSurfaceChanged(holder, format, width, height);
-            mRenderer = new GrassRS(width, height);
-            mRenderer.init(mRs, getResources());
-        }
-
-        @Override
-        public void onSurfaceCreated(SurfaceHolder holder) {
-            super.onSurfaceCreated(holder);
-
-            Surface surface = null;
-            while (surface == null) {
-                surface = holder.getSurface();
-            }
-            mRs = new RenderScript(surface);
-        }
-
-        @Override
-        public void onSurfaceDestroyed(SurfaceHolder holder) {
-            super.onSurfaceDestroyed(holder);
-            mRenderer.destroy();
-        }
-    }
-}
