diff --git a/core/java/android/provider/Settings.java b/core/java/android/provider/Settings.java
index cf26b1b..e1b8e99 100644
--- a/core/java/android/provider/Settings.java
+++ b/core/java/android/provider/Settings.java
@@ -2947,6 +2947,11 @@
         public static final String DATA_MESSAGE_GET_APP_TOKEN_URL =
                 "data_messaging_get_app_token_url";
 
+	/**
+	 * Use android://&lt;it&gt; routing infos for Google Sync Server subcriptions.
+	 */
+	public static final String GSYNC_USE_RMQ2_ROUTING_INFO = "gsync_use_rmq2_routing_info";
+
         /**
          * Enable use of ssl session caching.
          * 'db' - save each session in a (per process) database
diff --git a/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java b/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java
index b9b07a8..6d50840 100644
--- a/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java
+++ b/core/java/com/android/internal/service/wallpaper/ImageWallpaper.java
@@ -18,73 +18,68 @@
 
 import android.app.WallpaperManager;
 import android.graphics.Canvas;
-import android.graphics.Paint;
 import android.graphics.Rect;
 import android.graphics.drawable.Drawable;
-import android.os.Handler;
-import android.os.Message;
-import android.os.SystemClock;
 import android.service.wallpaper.WallpaperService;
 import android.view.SurfaceHolder;
+import android.content.Context;
+import android.content.IntentFilter;
+import android.content.Intent;
+import android.content.BroadcastReceiver;
 
 /**
  * Default built-in wallpaper that simply shows a static image.
  */
 public class ImageWallpaper extends WallpaperService {
-    public WallpaperManager mWallpaperManager;
-    
-    static final int MSG_DRAW = 1;
-    
-    class MyEngine extends Engine {
-        final Paint mTextPaint = new Paint();
-        float mDensity;
-        Drawable mBackground;
-        long mAnimStartTime;
-        boolean mAnimLarger;
-        
-        final Handler mHandler = new Handler() {
+    WallpaperManager mWallpaperManager;
+    ImageWallpaper.DrawableEngine mEngine;
+    private WallpaperObserver mReceiver;
 
-            @Override
-            public void handleMessage(Message msg) {
-                switch (msg.what) {
-                    case MSG_DRAW:
-                        drawFrame(true);
-                        mHandler.sendEmptyMessage(MSG_DRAW);
-                        break;
-                    default:
-                        super.handleMessage(msg);
-                }
-            }
-        };
-        
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        mWallpaperManager = (WallpaperManager) getSystemService(WALLPAPER_SERVICE);
+        IntentFilter filter = new IntentFilter(Intent.ACTION_WALLPAPER_CHANGED);
+        mReceiver = new WallpaperObserver();
+        registerReceiver(mReceiver, filter);
+    }
+
+    @Override
+    public void onDestroy() {
+        super.onDestroy();
+        unregisterReceiver(mReceiver);
+    }
+
+    public Engine onCreateEngine() {
+        mEngine = new DrawableEngine();
+        return mEngine;
+    }
+
+    class WallpaperObserver extends BroadcastReceiver {
+        public void onReceive(Context context, Intent intent) {
+            mEngine.updateWallpaper();
+        }
+    }
+
+    class DrawableEngine extends Engine {
+        private final Object mLock = new Object();
+        Drawable mBackground;
+
         @Override
         public void onCreate(SurfaceHolder surfaceHolder) {
             super.onCreate(surfaceHolder);
             mBackground = mWallpaperManager.getDrawable();
-            mTextPaint.setAntiAlias(true);
-            mDensity = getResources().getDisplayMetrics().density;
-            mTextPaint.setTextSize(30 * mDensity);
-            mTextPaint.setShadowLayer(5*mDensity, 3*mDensity, 3*mDensity, 0xff000000);
-            mTextPaint.setARGB(255, 255, 255, 255);
-            mTextPaint.setTextAlign(Paint.Align.CENTER);
         }
 
         @Override
         public void onVisibilityChanged(boolean visible) {
-            mHandler.removeMessages(MSG_DRAW);
-            if (visible) {
-                mHandler.sendEmptyMessage(MSG_DRAW);
-                mAnimStartTime = SystemClock.uptimeMillis();
-                mAnimLarger = true;
-            } else {
-                drawFrame(false);
-            }
+            drawFrame();
         }
         
         @Override
         public void onSurfaceChanged(SurfaceHolder holder, int format, int width, int height) {
             super.onSurfaceChanged(holder, format, width, height);
-            drawFrame(false);
+            drawFrame();
         }
 
         @Override
@@ -97,48 +92,28 @@
             super.onSurfaceDestroyed(holder);
         }
         
-        void drawFrame(boolean drawText) {
+        void drawFrame() {
             SurfaceHolder sh = getSurfaceHolder();
             Canvas c = null;
             try {
                 c = sh.lockCanvas();
                 if (c != null) {
                     final Rect frame = sh.getSurfaceFrame();
-                    mBackground.setBounds(frame);
-                    mBackground.draw(c);
-                    
-                    if (drawText) {
-                        // Figure out animation.
-                        long now = SystemClock.uptimeMillis();
-                        while (mAnimStartTime < (now-1000)) {
-                            mAnimStartTime += 1000;
-                            mAnimLarger = !mAnimLarger;
-                        }
-                        float size = (now-mAnimStartTime) / (float)1000;
-                        if (!mAnimLarger) size = 1-size;
-                        int alpha = (int)(255*(size*size));
-                        mTextPaint.setARGB(alpha, 255, 255, 255);
-                        mTextPaint.setShadowLayer(5*mDensity, 3*mDensity, 3*mDensity,
-                                alpha<<24);
-                        mTextPaint.setTextSize(100 * mDensity * size);
-                        c.drawText("Am I live?",
-                                frame.left + (frame.right-frame.left)/2,
-                                frame.top + (frame.bottom-frame.top)/2, mTextPaint);
+                    synchronized (mLock) {
+                        final Drawable background = mBackground;
+                        background.setBounds(frame);
+                        background.draw(c);
                     }
                 }
             } finally {
                 if (c != null) sh.unlockCanvasAndPost(c);
             }
         }
-    }
-    
-    @Override
-    public void onCreate() {
-        super.onCreate();
-        mWallpaperManager = (WallpaperManager)getSystemService(WALLPAPER_SERVICE);
-    }
-    
-    public Engine onCreateEngine() {
-        return new MyEngine();
+
+        void updateWallpaper() {
+            synchronized (mLock) {
+                mBackground = mWallpaperManager.getDrawable();
+            }
+        }
     }
 }
diff --git a/opengl/tests/filter/filter.cpp b/opengl/tests/filter/filter.cpp
index 82aafbf..739bf7c 100644
--- a/opengl/tests/filter/filter.cpp
+++ b/opengl/tests/filter/filter.cpp
@@ -10,6 +10,8 @@
 
 using namespace android;
 
+#define USE_DRAW_TEXTURE 1
+
 int main(int argc, char** argv)
 {
     if (argc!=2 && argc!=3) {
@@ -45,9 +47,9 @@
      dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
      eglInitialize(dpy, &majorVersion, &minorVersion);
      if (!usePbuffer) {
-         surface = eglCreateWindowSurface(dpy, config, window, NULL);
          EGLUtils::selectConfigForNativeWindow(
                  dpy, s_configAttribs, window, &config);
+         surface = eglCreateWindowSurface(dpy, config, window, NULL);
      } else {
          printf("using pbuffer\n");
          eglChooseConfig(dpy, s_configAttribs, &config, 1, &numConfigs);
@@ -63,6 +65,12 @@
      eglQuerySurface(dpy, surface, EGL_HEIGHT, &h);
      GLint dim = w<h ? w : h;
 
+     glViewport(0, 0, w, h);
+     glMatrixMode(GL_PROJECTION);
+     glLoadIdentity();
+     glOrthof(0, w, 0, h, 0, 1);
+
+     glClearColor(0,0,0,0);
      glClear(GL_COLOR_BUFFER_BIT);
 
      GLint crop[4] = { 0, 4, 4, -4 };
@@ -128,14 +136,52 @@
          break;
      }
 
-     glDrawTexiOES(0, 0, 0, dim, dim);
+     //glDrawTexiOES(0, 0, 0, dim, dim);
+     
+     const GLfloat vertices[4][2] = {
+             { 0,    0   },
+             { 0,    dim },
+             { dim,  dim },
+             { dim,  0   }
+     };
 
+     const GLfloat texCoords[4][2] = {
+             { 0,  0 },
+             { 0,  1 },
+             { 1,  1 },
+             { 1,  0 }
+     };
+     
      if (!usePbuffer) {
          eglSwapBuffers(dpy, surface);
-     } else {
-         glFinish();
      }
      
+     glMatrixMode(GL_MODELVIEW);
+     //glEnable(GL_SCISSOR_TEST);
+     //glScissor(0,dim,dim,h-dim);
+     
+     for (int y=0 ; y<dim ; y++) {
+         glClear(GL_COLOR_BUFFER_BIT);
+
+#if USE_DRAW_TEXTURE && GL_OES_draw_texture
+         glDrawTexiOES(0, y, 1, dim, dim);
+#else
+         glLoadIdentity();
+         glTranslatef(0, y, 0);
+         glEnableClientState(GL_VERTEX_ARRAY);
+         glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+         glVertexPointer(2, GL_FLOAT, 0, vertices);
+         glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
+         glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+#endif
+
+         if (!usePbuffer) {
+             eglSwapBuffers(dpy, surface);
+         } else {
+             glFinish();
+         }
+     }
+
      eglTerminate(dpy);
      return 0;
 }
