diff --git a/res/layout/pick_item.xml b/res/layout/pick_item.xml
index 0ae0113..d85edc4 100755
--- a/res/layout/pick_item.xml
+++ b/res/layout/pick_item.xml
@@ -17,9 +17,9 @@
 <TextView xmlns:android="http://schemas.android.com/apk/res/android"
     android:layout_width="match_parent"
     android:layout_height="wrap_content"
-    android:minHeight="?android:attr/listPreferredItemHeight"
-    android:textAppearance="?android:attr/textAppearanceLarge"
+    android:minHeight="?android:attr/listPreferredItemHeightSmall"
+    android:textAppearance="?android:attr/textAppearanceMedium"
     android:gravity="center_vertical"
-    android:drawablePadding="14dip"
-    android:paddingStart="15dip"
-    android:paddingEnd="15dip" />
+    android:drawablePadding="8dip"
+    android:paddingStart="11dip"
+    android:paddingEnd="11dip" />
diff --git a/res/values/strings.xml b/res/values/strings.xml
index c315d94..727842a 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -807,8 +807,8 @@
     <!--  String to display if there is no user-selected widget on lock screen [CHAR LIMIT=22] -->
     <string name="widget_none">None</string>
 
-    <!--  String to display if the default status widget is selected [CHAR LIMIT=22] -->
-    <string name="widget_default">Default</string>
+    <!--  String to display if the clock status widget is selected (it is the default) [CHAR LIMIT=22] -->
+    <string name="widget_default">Clock</string>
 
     <!--  Title for PreferenceScreen to change security method: None/Pattern/PIN/Password [CHAR LIMIT=22] -->
     <string name="unlock_set_unlock_launch_picker_change_title">Change lock screen</string>
diff --git a/src/com/android/settings/AppWidgetPickActivity.java b/src/com/android/settings/AppWidgetPickActivity.java
index a475649..97f816a 100644
--- a/src/com/android/settings/AppWidgetPickActivity.java
+++ b/src/com/android/settings/AppWidgetPickActivity.java
@@ -21,17 +21,20 @@
 import android.content.DialogInterface;
 import android.content.Intent;
 import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.os.Parcelable;
 import android.os.SystemProperties;
+import android.util.DisplayMetrics;
 import android.util.Log;
 
 import java.text.Collator;
-import java.util.List;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.List;
 
 /**
  * Displays a list of {@link AppWidgetProviderInfo} widgets, along with any
@@ -49,6 +52,7 @@
 
     private PackageManager mPackageManager;
     private AppWidgetManager mAppWidgetManager;
+    List<PickAdapter.Item> mItems;
     
     /**
      * The allocated {@link AppWidgetManager#EXTRA_APPWIDGET_ID} that this
@@ -143,11 +147,10 @@
     @Override
     public void onClick(DialogInterface dialog, int which) {
         Intent intent = getIntentForPosition(which);
+        PickAdapter.Item item = (PickAdapter.Item) mItems.get(which);
 
         int result;
-        if (intent.getExtras() != null && 
-                (intent.getExtras().containsKey(AppWidgetManager.EXTRA_CUSTOM_INFO) ||
-                 intent.getExtras().containsKey(AppWidgetManager.EXTRA_CUSTOM_EXTRAS))) {
+        if (item.extras != null) {
             // If these extras are present it's because this entry is custom.
             // Don't try to bind it, just pass it back to the app.
             setResultData(RESULT_OK, intent);
@@ -185,11 +188,47 @@
         for (int i = 0; i < size; i++) {
             AppWidgetProviderInfo info = appWidgets.get(i);
 
+            // We remove any widgets whose category isn't included in the filter
+            if (!ignoreFilters && (info.widgetCategory & categoryFilter) == 0) {
+                continue;
+            }
+
+            // We remove any widgets who don't have all the features in the features filter
+            if (!ignoreFilters && (info.widgetFeatures & featuresFilter) != featuresFilter) {
+                continue;
+            }
+
             CharSequence label = info.label;
             Drawable icon = null;
 
             if (info.icon != 0) {
-                icon = mPackageManager.getDrawable(info.provider.getPackageName(), info.icon, null);
+                try {
+                    final Resources res = getResources();
+                    final int density = res.getDisplayMetrics().densityDpi;
+                    int iconDensity;
+                    switch (density) {
+                        case DisplayMetrics.DENSITY_MEDIUM:
+                            iconDensity = DisplayMetrics.DENSITY_LOW;
+                        case DisplayMetrics.DENSITY_TV:
+                            iconDensity = DisplayMetrics.DENSITY_MEDIUM;
+                        case DisplayMetrics.DENSITY_HIGH:
+                            iconDensity = DisplayMetrics.DENSITY_MEDIUM;
+                        case DisplayMetrics.DENSITY_XHIGH:
+                            iconDensity = DisplayMetrics.DENSITY_HIGH;
+                        case DisplayMetrics.DENSITY_XXHIGH:
+                            iconDensity = DisplayMetrics.DENSITY_XHIGH;
+                        default:
+                            // The density is some abnormal value.  Return some other
+                            // abnormal value that is a reasonable scaling of it.
+                            iconDensity = (int)((density*0.75f)+.5f);
+                    }
+                    Resources packageResources = mPackageManager.
+                            getResourcesForApplication(info.provider.getPackageName());
+                    icon = packageResources.getDrawableForDensity(info.icon, iconDensity);
+                } catch (NameNotFoundException e) {
+                    Log.w(TAG, "Can't load icon drawable 0x" + Integer.toHexString(info.icon)
+                            + " for provider: " + info.provider);
+                }
                 if (icon == null) {
                     Log.w(TAG, "Can't load icon drawable 0x" + Integer.toHexString(info.icon)
                             + " for provider: " + info.provider);
@@ -205,16 +244,6 @@
                 item.extras = customExtras.get(i);
             }
 
-            // We remove any widgets whose category isn't included in the filter
-            if (!ignoreFilters && (info.widgetCategory & categoryFilter) == 0) {
-                continue;
-            }
-
-            // We remove any widgets who don't have all the features in the features filter
-            if (!ignoreFilters && (info.widgetFeatures & featuresFilter) != featuresFilter) {
-                continue;
-            }
-
             items.add(item);
         }
     }
@@ -259,8 +288,9 @@
         if (!sortCustomAppWidgets) {
             List<PickAdapter.Item> customItems = new ArrayList<PickAdapter.Item>();
             putCustomAppWidgets(customItems);
-            items.addAll(0, customItems);
+            items.addAll(customItems);
         }
+        mItems = items;
         return items;
     }
 
diff --git a/src/com/android/settings/SecuritySettings.java b/src/com/android/settings/SecuritySettings.java
index f5d1608..1b63acb 100644
--- a/src/com/android/settings/SecuritySettings.java
+++ b/src/com/android/settings/SecuritySettings.java
@@ -475,6 +475,46 @@
         }
     }
 
+    private void launchPickActivityIntent(int featuresFilter, int defaultLabelId, int defaultIconId,
+            ComponentName defaultComponentName, String defaultTag) {
+        // Create intent to pick widget
+        Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
+
+        // Found in KeyguardHostView.java
+        final int KEYGUARD_HOST_ID = 0x4B455947;
+        int appWidgetId = AppWidgetHost.allocateAppWidgetIdForSystem(KEYGUARD_HOST_ID);
+        if (appWidgetId != -1) {
+            pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
+            pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false);
+            pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
+                    AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
+            if (featuresFilter != AppWidgetProviderInfo.WIDGET_FEATURES_NONE) {
+                pickIntent.putExtra(AppWidgetManager.EXTRA_FEATURES_FILTER, featuresFilter);
+            }
+
+            // Add an entry for "none" to let someone select no widget
+            AppWidgetProviderInfo defaultInfo = new AppWidgetProviderInfo();
+            ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>();
+            defaultInfo.label = getResources().getString(defaultLabelId);
+            defaultInfo.icon = defaultIconId;
+            defaultInfo.provider = defaultComponentName;
+            extraInfos.add(defaultInfo);
+
+            ArrayList<Bundle> extraExtras = new ArrayList<Bundle>();
+            Bundle b = new Bundle();
+            b.putBoolean(defaultTag, true);
+            extraExtras.add(b);
+
+            // Launch the widget picker
+            pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos);
+            pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras);
+            pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent());
+            startActivityForResult(pickIntent, REQUEST_PICK_USER_SELECTED_APPWIDGET);
+        } else {
+            Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
+        }
+    }
+
     private Intent getBaseIntent() {
         Intent baseIntent = new Intent(Intent.ACTION_MAIN, null);
         baseIntent.addCategory(Intent.CATEGORY_DEFAULT);
@@ -495,73 +535,19 @@
             startFragment(this, "com.android.settings.ChooseLockGeneric$ChooseLockGenericFragment",
                     SET_OR_CHANGE_LOCK_METHOD_REQUEST, null);
         } else if (KEY_CHOOSE_USER_SELECTED_LOCKSCREEN_WIDGET.equals(key)) {
-            // Create intent to pick widget
-            Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
-
-            // Found in KeyguardHostView.java
-            final int KEYGUARD_HOST_ID = 0x4B455947;
-            int appWidgetId = AppWidgetHost.allocateAppWidgetIdForSystem(KEYGUARD_HOST_ID);
-            if (appWidgetId != -1) {
-                pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
-                pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false);
-                pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
-                        AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
-
-                // Add an entry for "none" to let someone select no widget
-                AppWidgetProviderInfo noneInfo = new AppWidgetProviderInfo();
-                ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>();
-                noneInfo.label = getResources().getString(R.string.widget_none);
-                noneInfo.provider = new ComponentName("", "");
-                extraInfos.add(noneInfo);
-
-                ArrayList<Bundle> extraExtras = new ArrayList<Bundle>();
-                Bundle b = new Bundle();
-                b.putBoolean(EXTRA_NO_WIDGET, true);
-                extraExtras.add(b);
-
-                // Launch the widget picker
-                pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos);
-                pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras);
-                pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent());
-                startActivityForResult(pickIntent, REQUEST_PICK_USER_SELECTED_APPWIDGET);
-            } else {
-                Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
-            }
+            launchPickActivityIntent(AppWidgetProviderInfo.WIDGET_FEATURES_NONE,
+                    R.string.widget_none, 0, new ComponentName("", ""), EXTRA_NO_WIDGET);
         } else if (KEY_CHOOSE_LOCKSCREEN_STATUS_WIDGET.equals(key)) {
-            // Create intent to pick widget
-            Intent pickIntent = new Intent(AppWidgetManager.ACTION_APPWIDGET_PICK);
-
-            // Found in KeyguardHostView.java
-            final int KEYGUARD_HOST_ID = 0x4B455947;
-            int appWidgetId = AppWidgetHost.allocateAppWidgetIdForSystem(KEYGUARD_HOST_ID);
-            if (appWidgetId != -1) {
-                pickIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId);
-                pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_SORT, false);
-                pickIntent.putExtra(AppWidgetManager.EXTRA_CATEGORY_FILTER,
-                        AppWidgetProviderInfo.WIDGET_CATEGORY_KEYGUARD);
-                pickIntent.putExtra(AppWidgetManager.EXTRA_FEATURES_FILTER,
-                        AppWidgetProviderInfo.WIDGET_FEATURES_STATUS);
-
-                // Add an entry for "none" to let someone select no widget
-                AppWidgetProviderInfo noneInfo = new AppWidgetProviderInfo();
-                ArrayList<AppWidgetProviderInfo> extraInfos = new ArrayList<AppWidgetProviderInfo>();
-                noneInfo.label = getResources().getString(R.string.widget_default);
-                noneInfo.provider = new ComponentName("", "");
-                extraInfos.add(noneInfo);
-
-                ArrayList<Bundle> extraExtras = new ArrayList<Bundle>();
-                Bundle b = new Bundle();
-                b.putBoolean(EXTRA_DEFAULT_WIDGET, true);
-                extraExtras.add(b);
-
-                // Launch the widget picker
-                pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_INFO, extraInfos);
-                pickIntent.putExtra(AppWidgetManager.EXTRA_CUSTOM_EXTRAS, extraExtras);
-                pickIntent.putExtra(Intent.EXTRA_INTENT, getBaseIntent());
-                startActivityForResult(pickIntent, REQUEST_PICK_STATUS_APPWIDGET);
-            } else {
-                Log.e(TAG, "Unable to allocate an AppWidget id in lock screen");
+            int defaultIconId;
+            ComponentName clock = new ComponentName(
+                    "com.google.android.deskclock", "com.android.deskclock.DeskClock");
+            try {
+                defaultIconId = getActivity().getPackageManager().getActivityInfo(clock, 0).icon;
+            } catch (PackageManager.NameNotFoundException e) {
+                defaultIconId = 0;
             }
+            launchPickActivityIntent(AppWidgetProviderInfo.WIDGET_FEATURES_STATUS,
+                    R.string.widget_default, defaultIconId, clock, EXTRA_DEFAULT_WIDGET);
         } else if (KEY_BIOMETRIC_WEAK_IMPROVE_MATCHING.equals(key)) {
             ChooseLockSettingsHelper helper =
                     new ChooseLockSettingsHelper(this.getActivity(), this);
