diff --git a/src/com/android/settings/SettingsLicenseActivity.java b/src/com/android/settings/SettingsLicenseActivity.java
index c40dd07..0b809e1 100644
--- a/src/com/android/settings/SettingsLicenseActivity.java
+++ b/src/com/android/settings/SettingsLicenseActivity.java
@@ -25,9 +25,12 @@
 import android.webkit.WebViewClient;
 import android.widget.Toast;
 
+import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.zip.GZIPInputStream;
 
 import com.android.internal.app.AlertActivity;
 import com.android.internal.app.AlertController;
@@ -39,10 +42,10 @@
 
     private static final String TAG = "SettingsLicenseActivity";
     private static final boolean LOGV = false || Config.LOGV;
-    
-    private static final String DEFAULT_LICENSE_PATH = "/system/etc/NOTICE.html";
+
+    private static final String DEFAULT_LICENSE_PATH = "/system/etc/NOTICE.html.gz";
     private static final String PROPERTY_LICENSE_PATH = "ro.config.license_path";
-    
+
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -54,14 +57,19 @@
             return;
         }
 
-        FileReader fileReader = null;
+        InputStreamReader inputReader = null;
         StringBuilder data = null;
         try {
-            data = new StringBuilder(2048); 
+            data = new StringBuilder(2048);
             char tmp[] = new char[2048];
             int numRead;
-            fileReader = new FileReader(fileName);
-            while ((numRead = fileReader.read(tmp)) >= 0) {
+            if (fileName.endsWith(".gz")) {
+                inputReader = new InputStreamReader(
+                    new GZIPInputStream(new FileInputStream(fileName)));
+            } else {
+                inputReader = new FileReader(fileName);
+            }
+            while ((numRead = inputReader.read(tmp)) >= 0) {
                 data.append(tmp, 0, numRead);
             }
         } catch (FileNotFoundException e) {
@@ -74,19 +82,19 @@
             return;
         } finally {
             try {
-                if (fileReader != null) {
-                    fileReader.close();
+                if (inputReader != null) {
+                    inputReader.close();
                 }
             } catch (IOException e) {
             }
         }
-    
+
         if (TextUtils.isEmpty(data)) {
             Log.e(TAG, "License HTML is empty (from " + fileName + ")");
             showErrorAndFinish();
             return;
         }
-        
+
         WebView webView = new WebView(this);
 
         // Begin the loading.  This will be done in a separate thread in WebView.
@@ -98,7 +106,7 @@
                 mAlert.setTitle(getString(R.string.settings_license_activity_title));
             }
         });
-        
+
         final AlertController.AlertParams p = mAlertParams;
         p.mTitle = getString(R.string.settings_license_activity_loading);
         p.mView = webView;
@@ -111,5 +119,5 @@
                 .show();
         finish();
     }
-    
+
 }
diff --git a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
index b614712..f9b51d6 100644
--- a/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
+++ b/src/com/android/settings/bluetooth/LocalBluetoothProfileManager.java
@@ -24,6 +24,8 @@
 import android.bluetooth.BluetoothClass;
 import android.content.Context;
 import android.content.SharedPreferences;
+import android.os.Handler;
+import android.text.TextUtils;
 
 import java.util.HashMap;
 import java.util.List;
@@ -141,9 +143,7 @@
         
         public A2dpProfileManager(LocalBluetoothManager localManager) {
             super(localManager);
-            
             mService = new BluetoothA2dp(localManager.getContext());
-            // TODO: block until connection?
         }
 
         @Override
@@ -213,37 +213,32 @@
     /**
      * HeadsetProfileManager is an abstraction for the {@link BluetoothHeadset} service. 
      */
-    private static class HeadsetProfileManager extends LocalBluetoothProfileManager {
+    private static class HeadsetProfileManager extends LocalBluetoothProfileManager
+            implements BluetoothHeadset.ServiceListener {
         private BluetoothHeadset mService;
+        private Handler mUiHandler = new Handler();
         
         public HeadsetProfileManager(LocalBluetoothManager localManager) {
             super(localManager);
-            
-//            final boolean[] isServiceConnected = new boolean[1];
-//            BluetoothHeadset.ServiceListener l = new BluetoothHeadset.ServiceListener() {
-//                public void onServiceConnected() {
-//                    synchronized (this) {
-//                        isServiceConnected[0] = true;
-//                        notifyAll();
-//                    }
-//                }
-//                public void onServiceDisconnected() {
-//                    mService = null;
-//                }
-//            };
-            
-            // TODO: block, but can't on UI thread
-            mService = new BluetoothHeadset(localManager.getContext(), null);
+            mService = new BluetoothHeadset(localManager.getContext(), this);
+        }
 
-//            synchronized (l) {
-//                while (!isServiceConnected[0]) {
-//                    try {
-//                        l.wait(100);
-//                    } catch (InterruptedException e) {
-//                        throw new IllegalStateException(e);
-//                    }
-//                }
-//            }
+        public void onServiceConnected() {
+            // This could be called on a non-UI thread, funnel to UI thread.
+            mUiHandler.post(new Runnable() {
+                public void run() {
+                    /*
+                     * We just bound to the service, so refresh the UI of the
+                     * headset device.
+                     */
+                    String address = mService.getHeadsetAddress();
+                    if (TextUtils.isEmpty(address)) return;
+                    mLocalManager.getLocalDeviceManager().onProfileStateChanged(address);
+                }
+            });
+        }
+
+        public void onServiceDisconnected() {
         }
 
         @Override
diff --git a/src/com/android/settings/quicklaunch/QuickLaunchSettings.java b/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
index c023d4d..2ec685d 100644
--- a/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
+++ b/src/com/android/settings/quicklaunch/QuickLaunchSettings.java
@@ -59,14 +59,15 @@
 
     private static final int COLUMN_SHORTCUT = 0;
     private static final int COLUMN_TITLE = 1;
+    private static final int COLUMN_INTENT = 2;
     private static final String[] sProjection = new String[] {
-            Bookmarks.SHORTCUT, Bookmarks.TITLE
+            Bookmarks.SHORTCUT, Bookmarks.TITLE, Bookmarks.INTENT
     };
     private static final String sShortcutSelection = Bookmarks.SHORTCUT + "=?";
     
     private Handler mUiHandler = new Handler();
     
-    private static final String DEFAULT_BOOKMARK_FOLDER = "@default";
+    private static final String DEFAULT_BOOKMARK_FOLDER = "@quicklaunch";
     /** Cursor for Bookmarks provider. */
     private Cursor mBookmarksCursor;
     /** Listens for changes to Bookmarks provider. */
@@ -225,18 +226,18 @@
             
             String title = data.getStringExtra(BookmarkPicker.EXTRA_TITLE);
             char shortcut = data.getCharExtra(BookmarkPicker.EXTRA_SHORTCUT, (char) 0);
-            updateShortcut(shortcut, title, data);
+            updateShortcut(shortcut, data);
             
         } else {
             super.onActivityResult(requestCode, resultCode, data);
         }
     }
 
-    private void updateShortcut(char shortcut, String title, Intent intent) {
-        
+    private void updateShortcut(char shortcut, Intent intent) {
         // Update the bookmark for a shortcut
-        Bookmarks.add(getContentResolver(), intent, title.toString(), DEFAULT_BOOKMARK_FOLDER,
-                shortcut, 0);
+        // Pass an empty title so it gets resolved each time this bookmark is
+        // displayed (since the locale could change after we insert into the provider).
+        Bookmarks.add(getContentResolver(), intent, "", DEFAULT_BOOKMARK_FOLDER, shortcut, 0);
     }
     
     private ShortcutPreference getOrCreatePreference(char shortcut) {
@@ -300,7 +301,7 @@
             if (shortcut == 0) continue;
             
             ShortcutPreference pref = getOrCreatePreference(shortcut);
-            pref.setTitle(c.getString(COLUMN_TITLE));
+            pref.setTitle(Bookmarks.getTitle(this, c));
             pref.setSummary(getString(R.string.quick_launch_shortcut,
                     String.valueOf(shortcut)));
             pref.setHasBookmark(true);
diff --git a/src/com/android/settings/wifi/IpSettings.java b/src/com/android/settings/wifi/AdvancedSettings.java
similarity index 87%
rename from src/com/android/settings/wifi/IpSettings.java
rename to src/com/android/settings/wifi/AdvancedSettings.java
index 5a494fa..54aab4b 100644
--- a/src/com/android/settings/wifi/IpSettings.java
+++ b/src/com/android/settings/wifi/AdvancedSettings.java
@@ -27,6 +27,7 @@
 import android.preference.ListPreference;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
+import android.provider.Settings;
 import android.provider.Settings.System;
 import android.text.TextUtils;
 import android.view.KeyEvent;
@@ -34,11 +35,13 @@
 import android.view.MenuItem;
 import android.widget.Toast;
 
-public class IpSettings extends PreferenceActivity implements Preference.OnPreferenceChangeListener {
+public class AdvancedSettings extends PreferenceActivity
+        implements Preference.OnPreferenceChangeListener {
 
     private static final String KEY_MAC_ADDRESS = "mac_address";
     private static final String KEY_USE_STATIC_IP = "use_static_ip";
     private static final String KEY_NUM_CHANNELS = "num_channels";
+    private static final String KEY_SLEEP_POLICY = "sleep_policy";
     
     private String[] mSettingNames = {
             System.WIFI_STATIC_IP, System.WIFI_STATIC_GATEWAY, System.WIFI_STATIC_NETMASK,
@@ -58,7 +61,7 @@
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         
-        addPreferencesFromResource(R.xml.ip_settings);
+        addPreferencesFromResource(R.xml.wifi_advanced_settings);
         
         mUseStaticIpCheckBox = (CheckBoxPreference) findPreference(KEY_USE_STATIC_IP);
 
@@ -74,6 +77,7 @@
         
         updateUi();
         initNumChannelsPreference();
+        initSleepPolicyPreference();
         refreshMacAddress();
     }
 
@@ -108,6 +112,14 @@
             pref.setValue(String.valueOf(numChannels));
         }
     }
+    
+    private void initSleepPolicyPreference() {
+        ListPreference pref = (ListPreference) findPreference(KEY_SLEEP_POLICY);
+        pref.setOnPreferenceChangeListener(this);
+        int value = Settings.System.getInt(getContentResolver(),
+                Settings.System.WIFI_SLEEP_POLICY,Settings. System.WIFI_SLEEP_POLICY_DEFAULT);
+        pref.setValue(String.valueOf(value));
+    }
 
     @Override
     public boolean onKeyDown(int keyCode, KeyEvent event) {
@@ -137,6 +149,16 @@
                 return false;
             }
             
+        } else if (key.equals(KEY_SLEEP_POLICY)) {
+            try {
+                Settings.System.putInt(getContentResolver(),
+                        Settings.System.WIFI_SLEEP_POLICY, Integer.parseInt(((String) newValue)));
+            } catch (NumberFormatException e) {
+                Toast.makeText(this, R.string.wifi_setting_sleep_policy_error,
+                        Toast.LENGTH_SHORT).show();
+                return false;
+            }
+                
         } else {
             String value = (String) newValue;
             
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 3d7ac0a..d2683c0 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -192,7 +192,7 @@
                 return true;
                 
             case MENU_ID_ADVANCED:
-                Intent intent = new Intent(this, IpSettings.class);
+                Intent intent = new Intent(this, AdvancedSettings.class);
                 startActivity(intent);
                 return true;
                 
