diff --git a/Android.mk b/Android.mk
index 1bcd412..528e840 100644
--- a/Android.mk
+++ b/Android.mk
@@ -14,21 +14,6 @@
 # limitations under the License.
 #
 
-######################################################
-#
-#    WARNING
-#
-#      /\
-#     /||\
-#    / || \
-#   /      \
-#  /   ||   \
-# /__________\
-#
-# Change the LOCAL_CERTIFICATE back to shared
-#
-######################################################
-
 LOCAL_PATH := $(call my-dir)
 include $(CLEAR_VARS)
 
@@ -37,8 +22,7 @@
 LOCAL_SRC_FILES := $(call all-subdir-java-files)
 
 LOCAL_PACKAGE_NAME := Launcher2
-LOCAL_CERTIFICATE := platform
-# LOCAL_CERTIFICATE := shared
+LOCAL_CERTIFICATE := shared
 
 LOCAL_OVERRIDES_PACKAGES := Launcher
 
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index dfbafde..d2dae88 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -17,11 +17,12 @@
 ** limitations under the License.
 */
 -->
-<!--TODO MAKE THE sharedUserId be uid.system again !! -->
 <manifest
     xmlns:android="http://schemas.android.com/apk/res/android"
-    package="com.android.launcher2">
-
+    package="com.android.launcher2"
+    android:sharedUserId="android.uid.shared"
+    android:sharedUserLabel="@string/uid_name">
+    
     <permission
         android:name="com.android.launcher.permission.INSTALL_SHORTCUT"
         android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
@@ -58,16 +59,10 @@
     <uses-permission android:name="android.permission.BIND_APPWIDGET" />
     <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
     <uses-permission android:name="com.android.launcher.permission.WRITE_SETTINGS" />
-
-    <!-- these two are only needed for the wallpaper picker -->
-    <uses-permission android:name="android.permission.SET_WALLPAPER_COMPONENT" />
-    <uses-permission android:name="android.permission.BIND_WALLPAPER" />
     
-    <!-- During development, run outside acore
-        android:process="android.process.acore"
-    -->
     <application
         android:name="LauncherApplication"
+        android:process="android.process.acore"
         android:label="@string/application_name"
         android:icon="@drawable/ic_launcher_home">
 
@@ -97,19 +92,6 @@
             </intent-filter>
         </activity>
 
-        <!-- TODO: MOVE TO SETTINGS (or actually maybe to its own package) -->
-        <!-- Standard picker for live wallpapers -->
-        <activity android:name="LiveWallpaperPickActivity"
-                android:icon="@drawable/ic_launcher_appwidget"
-                android:label="@string/live_wallpaper_picker_title"
-                android:theme="@android:style/Theme.Wallpaper">
-            <intent-filter>
-                <action android:name="android.service.wallpaper.LIVE_WALLPAPER_CHOOSER" />
-                <action android:name="android.intent.action.SET_WALLPAPER" />
-                <category android:name="android.intent.category.DEFAULT" />
-            </intent-filter>
-        </activity>
-
         <!-- Enable system-default search mode for any activity in Home -->
         <meta-data
             android:name="android.app.default_searchable"
diff --git a/res/drawable-hdpi/livewallpaper_placeholder.png b/res/drawable-hdpi/livewallpaper_placeholder.png
deleted file mode 100644
index 3743489..0000000
--- a/res/drawable-hdpi/livewallpaper_placeholder.png
+++ /dev/null
Binary files differ
diff --git a/res/layout/live_wallpaper_content.xml b/res/layout/live_wallpaper_content.xml
deleted file mode 100644
index 4dc6dbc..0000000
--- a/res/layout/live_wallpaper_content.xml
+++ /dev/null
@@ -1,72 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:orientation="vertical"
-    android:layout_width="fill_parent"
-    android:layout_height="fill_parent"
-    >
-
-	<FrameLayout
-	    android:layout_width="fill_parent"
-	    android:layout_height="0px"
-	    android:layout_weight="1"
-	    >
-	    <!--
-	    <ListView
-	        android:id="@android:id/list"
-	        android:layout_width="fill_parent"
-	        android:layout_height="fill_parent"
-	        />
-	    -->
-	    <TextView
-	        android:id="@android:id/empty"
-	        android:layout_width="fill_parent"
-	        android:layout_height="fill_parent"
-	        android:gravity="center"
-	        android:text="@string/live_wallpaper_empty"
-	        android:visibility="gone"
-	        android:textAppearance="?android:attr/textAppearanceMedium"
-	        />
-	</FrameLayout>
-	
-    <Gallery android:id="@+id/gallery"
-        android:gravity="fill"
-        android:layout_width="fill_parent"
-        android:layout_height="120dip" />
-        
-    <LinearLayout
-        android:orientation="horizontal"
-        android:layout_width="fill_parent"
-        android:layout_height="wrap_content">
-        
-        <Button android:id="@+id/configure"
-            android:layout_width="0px"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="@string/configure_wallpaper"
-            android:layout_gravity="center" />
-
-        <Button android:id="@+id/set"
-            android:layout_width="0px"
-            android:layout_height="wrap_content"
-            android:layout_weight="1"
-            android:text="@string/wallpaper_instructions"
-            android:layout_gravity="center" />
-
-    </LinearLayout>
-	
-</LinearLayout>
diff --git a/res/values/strings.xml b/res/values/strings.xml
index 89c9b1a..1288f64 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -34,11 +34,6 @@
     <string name="pick_wallpaper">Wallpaper gallery</string>
     <!-- Displayed when user selects a shortcut for an app that was uninstalled -->
     <string name="activity_not_found">Application is not installed on your phone.</string>
-    <!-- Title for the screen that lets the user choose a live wallpaper to use
-         for the system. -->
-    <string name="live_wallpaper_picker_title">Live wallpaper</string>    
-    <!-- List item for configuring the current wallpaper -->
-    <string name="configure_wallpaper">Configure...</string>
 
     <!-- Folders -->
     <skip />
@@ -132,9 +127,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>
 
-
-    <!-- STUFF FOR THE WALLPAPER PICKER. -->
-    <string name="live_wallpaper_empty">No live wallpapers.</string>
-    <string name="set_live_wallpaper">Set wallpaper</string>
-    
 </resources>
diff --git a/src/com/android/launcher2/LiveWallpaperPickActivity.java b/src/com/android/launcher2/LiveWallpaperPickActivity.java
deleted file mode 100644
index b8d8d54..0000000
--- a/src/com/android/launcher2/LiveWallpaperPickActivity.java
+++ /dev/null
@@ -1,400 +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.launcher2;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import android.app.Activity;
-import android.app.ListActivity;
-import android.app.WallpaperInfo;
-import android.app.WallpaperManager;
-import android.content.ComponentName;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.ServiceConnection;
-import android.content.pm.ComponentInfo;
-import android.content.pm.PackageManager;
-import android.content.pm.ResolveInfo;
-import android.content.pm.ServiceInfo;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.BitmapDrawable;
-import android.graphics.Bitmap;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.os.Binder;
-import android.os.Bundle;
-import android.os.IBinder;
-import android.os.ParcelFileDescriptor;
-import android.os.RemoteException;
-import android.os.SystemClock;
-import android.service.wallpaper.IWallpaperConnection;
-import android.service.wallpaper.IWallpaperEngine;
-import android.service.wallpaper.IWallpaperService;
-import android.service.wallpaper.WallpaperService;
-import android.service.wallpaper.WallpaperSettingsActivity;
-import android.util.DisplayMetrics;
-import android.util.Log;
-import android.view.Gravity;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
-import android.view.WindowManager;
-import android.widget.AdapterView;
-import android.widget.BaseAdapter;
-import android.widget.Button;
-import android.widget.Gallery;
-import android.widget.ImageView;
-import android.widget.ListView;
-
-import java.io.IOException;
-import java.text.Collator;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-
-/**
- * Displays a list of live wallpapers, allowing the user to select one
- * and make it the system global wallpaper.
- */
-public class LiveWallpaperPickActivity 
-    extends Activity
-    implements AdapterView.OnItemSelectedListener,
-               View.OnClickListener
-{
-    private static final String TAG = "LiveWallpaperPickActivity";
-
-    private PackageManager mPackageManager;
-    private WallpaperManager mWallpaperManager;
-    
-    Intent mSelectedIntent;
-    WallpaperInfo mSelectedInfo;
-    WallpaperConnection mWallpaperConnection;
- 
-    private Gallery mGallery;
-    private Button mConfigureButton;
-    
-    private ArrayList<Intent> mWallpaperIntents;
-    private ArrayList<WallpaperInfo> mWallpaperInfos;
- 
-    private ArrayList<Drawable> mThumbnails;
-
-    class WallpaperConnection extends IWallpaperConnection.Stub
-            implements ServiceConnection {
-        final Intent mIntent;
-        IWallpaperService mService;
-        IWallpaperEngine mEngine;
-        boolean mConnected;
-
-        public WallpaperConnection(Intent intent) {
-            mIntent = intent;
-        }
-        
-        public boolean connect() {
-            synchronized (this) {
-                if (!bindService(mIntent, this, Context.BIND_AUTO_CREATE)) {
-                    return false;
-                }
-                
-                mConnected = true;
-                return true;
-            }
-        }
-        
-        public void disconnect() {
-            synchronized (this) {
-                mConnected = false;
-                if (mEngine != null) {
-                    try {
-                        mEngine.destroy();
-                    } catch (RemoteException e) {
-                    }
-                    mEngine = null;
-                }
-                unbindService(this);
-                mService = null;
-            }
-        }
-        
-        public void onServiceConnected(ComponentName name, IBinder service) {
-            if (mWallpaperConnection == this) {
-                mService = IWallpaperService.Stub.asInterface(service);
-                try {
-                    View button = findViewById(R.id.set);
-                    mService.attach(this, button.getWindowToken(),
-                            WindowManager.LayoutParams.TYPE_APPLICATION_MEDIA,
-                            true,
-                            button.getRootView().getWidth(),
-                            button.getRootView().getHeight());
-                } catch (RemoteException e) {
-                    Log.w(TAG, "Failed attaching wallpaper; clearing", e);
-                }
-            }
-        }
-
-        public void onServiceDisconnected(ComponentName name) {
-            mService = null;
-            mEngine = null;
-            if (mWallpaperConnection == this) {
-                Log.w(TAG, "Wallpaper service gone: " + name);
-            }
-        }
-        
-        public void attachEngine(IWallpaperEngine engine) {
-            synchronized (this) {
-                if (mConnected) {
-                    mEngine = engine;
-                    try {
-                        engine.setVisibility(true);
-                    } catch (RemoteException e) {
-                    }
-                } else {
-                    try {
-                        engine.destroy();
-                    } catch (RemoteException e) {
-                    }
-                }
-            }
-        }
-        
-        public ParcelFileDescriptor setWallpaper(String name) {
-            return null;
-        }
-    }
-
-    private class ImageAdapter extends BaseAdapter {
-        private LayoutInflater mLayoutInflater;
-
-        ImageAdapter(LiveWallpaperPickActivity context) {
-            mLayoutInflater = context.getLayoutInflater();
-        }
-
-        public int getCount() {
-            return mThumbnails.size();
-        }
-
-        public Object getItem(int position) {
-            return position;
-        }
-
-        public long getItemId(int position) {
-            return position;
-        }
-
-        public View getView(int position, View convertView, ViewGroup parent) {
-            ImageView image;
-           
-            if (convertView == null) {
-                image = (ImageView) mLayoutInflater.inflate(R.layout.wallpaper_item, parent, false);
-            } else {
-                image = (ImageView) convertView;
-            }
-          
-            image.setImageDrawable(mThumbnails.get(position));
-            image.getDrawable().setDither(true);
-
-            image.setAdjustViewBounds(true);
-            image.setScaleType(ImageView.ScaleType.FIT_CENTER);
-            image.setLayoutParams(new Gallery.LayoutParams(
-                ViewGroup.LayoutParams.WRAP_CONTENT,
-                ViewGroup.LayoutParams.FILL_PARENT));
-
-            return image;
-        }
-    }
-
-
-    private void findLiveWallpapers() {
-        mThumbnails = new ArrayList<Drawable>(24);
-        List<ResolveInfo> list = 
-                mPackageManager.queryIntentServices(getTargetIntent(),
-                        PackageManager.GET_META_DATA);
-        
-        mWallpaperIntents = new ArrayList<Intent>(list.size());
-        mWallpaperInfos = new ArrayList<WallpaperInfo>(list.size());
-        
-        int listSize = list.size();
-        DisplayMetrics metrics = new DisplayMetrics();
-        getWindowManager().getDefaultDisplay().getMetrics(metrics);
-
-        Drawable galleryIcon = this.getResources().getDrawable(
-            R.drawable.livewallpaper_placeholder);
-        int galleryIconW = galleryIcon.getIntrinsicWidth();
-        int galleryIconH = galleryIcon.getIntrinsicHeight();
-        
-        Paint pt = new Paint(Paint.ANTI_ALIAS_FLAG|Paint.DITHER_FLAG);
-        pt.setTextAlign(Paint.Align.CENTER);
-
-        for (int i = 0; i < listSize; i++) {
-            ResolveInfo resolveInfo = list.get(i);
-            ComponentInfo ci = resolveInfo.serviceInfo;
-            WallpaperInfo winfo;
-            try {
-                winfo = new WallpaperInfo(this, resolveInfo);
-            } catch (XmlPullParserException e) {
-                Log.w(TAG, "Skipping wallpaper " + ci, e);
-                continue;
-            } catch (IOException e) {
-                Log.w(TAG, "Skipping wallpaper " + ci, e);
-                continue;
-            }
-
-            String packageName = winfo.getPackageName();
-            String className = winfo.getServiceName();
-            Intent intent = new Intent(getTargetIntent());
-            intent.setClassName(packageName, className);
-            mWallpaperIntents.add(intent);
-            mWallpaperInfos.add(winfo);
-
-            Drawable thumb = winfo.loadThumbnail(mPackageManager);
-            if (null == thumb) {
-                final int thumbWidth = (int)(180 * metrics.density);
-                final int thumbHeight = (int)(160 * metrics.density);
-                Bitmap thumbBit = Bitmap.createBitmap(
-                    thumbWidth, thumbHeight, 
-                    Bitmap.Config.ARGB_8888);
-                Canvas can = new Canvas(thumbBit);
-                pt.setARGB(204,102,102,102);
-                can.drawPaint(pt);
-
-                galleryIcon.setBounds(0,0,thumbWidth,thumbHeight);
-                ((BitmapDrawable)galleryIcon).setGravity(Gravity.CENTER);
-                galleryIcon.draw(can);
-
-                pt.setARGB(255, 255, 255, 255);
-                pt.setTextSize(20 * metrics.density);
-                can.drawText(className.substring(className.lastIndexOf('.')+1),
-                    (int)(thumbWidth*0.5),
-                    (int)(thumbHeight-22*metrics.density),
-                    pt);
-                thumb = new BitmapDrawable(thumbBit);
-            }
-            mThumbnails.add(thumb);
-        }
-
-
-    }
-
-    
-    @Override
-    public void onCreate(Bundle icicle) {
-        super.onCreate(icicle);
-
-        mPackageManager = getPackageManager();
-        mWallpaperManager = WallpaperManager.getInstance(this);
-        
-        findLiveWallpapers();
-
-        setContentView(R.layout.live_wallpaper_content);
-        
-        mGallery = (Gallery) findViewById(R.id.gallery);
-        mGallery.setAdapter(new ImageAdapter(this));
-        mGallery.setOnItemSelectedListener(this);
-        mGallery.setCallbackDuringFling(false);
-
-        View button = findViewById(R.id.set);
-        button.setOnClickListener(this);
-        
-        mConfigureButton = (Button)findViewById(R.id.configure);
-        mConfigureButton.setEnabled(false);
-        mConfigureButton.setOnClickListener(this);
-      
-        // Set default return data
-        setResult(RESULT_CANCELED);
-    }
-    
-    @Override
-    public void onResume() {
-        super.onResume();
-        if (mWallpaperConnection != null && mWallpaperConnection.mEngine != null) {
-            try {
-                mWallpaperConnection.mEngine.setVisibility(true);
-            } catch (RemoteException e) {
-            }
-        }
-    }
-    
-    @Override
-    public void onPause() {
-        super.onPause();
-        if (mWallpaperConnection != null && mWallpaperConnection.mEngine != null) {
-            try {
-                mWallpaperConnection.mEngine.setVisibility(false);
-            } catch (RemoteException e) {
-            }
-        }
-    }
-    
-    @Override
-    public void onDetachedFromWindow() {
-        super.onDetachedFromWindow();
-        if (mWallpaperConnection != null) {
-            mWallpaperConnection.disconnect();
-        }
-        mWallpaperConnection = null;
-    }
-    
-    protected Intent getTargetIntent() {
-        return new Intent(WallpaperService.SERVICE_INTERFACE);
-    }
-    
-    public void onItemSelected(AdapterView parent, View v, int position, long id) {
-        mSelectedIntent = mWallpaperIntents.get(position);
-        mSelectedInfo = mWallpaperInfos.get(position);
-        mConfigureButton.setEnabled(mSelectedInfo != null
-                && mSelectedInfo.getSettingsActivity() != null);
-        findViewById(R.id.set).setEnabled(true);
-        
-        WallpaperConnection conn = new WallpaperConnection(mSelectedIntent);
-        if (conn.connect()) {
-            if (mWallpaperConnection != null) {
-                mWallpaperConnection.disconnect();
-            }
-            mWallpaperConnection = conn;
-        }
-    }
-    
-    public void onClick(View v) { // "Set" button
-        if (v.getId() == R.id.set) {
-            if (mSelectedIntent != null) {
-                try {
-                    mWallpaperManager.getIWallpaperManager().setWallpaperComponent(
-                            mSelectedIntent.getComponent());
-                    this.setResult(RESULT_OK);
-                } catch (RemoteException e) {
-                    // do nothing
-                } catch (RuntimeException e) {
-                    Log.w(TAG, "Failure setting wallpaper", e);
-                }
-                finish();
-            }
-        } else if (v.getId() == R.id.configure) {
-            if (mSelectedInfo != null && mSelectedInfo.getSettingsActivity() != null) {
-                Intent intent = new Intent();
-                intent.setComponent(new ComponentName(mSelectedInfo.getPackageName(),
-                        mSelectedInfo.getSettingsActivity()));
-                intent.putExtra(WallpaperSettingsActivity.EXTRA_PREVIEW_MODE, true);
-                startActivity(intent);
-            }
-        }
-    }
-
-    public void onNothingSelected(AdapterView parent) {
-    }
-
-}
