diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 0ecb8a9..44dc845 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -33,8 +33,7 @@
 import android.net.wifi.WifiConfiguration.ProxySettings;
 import android.net.wifi.WifiConfiguration.Status;
 import android.net.wifi.WifiInfo;
-import android.net.wifi.Wps;
-import android.net.wifi.Wps.Setup;
+import android.net.wifi.WpsInfo;
 import android.security.Credentials;
 import android.security.KeyStore;
 import android.text.Editable;
@@ -484,20 +483,20 @@
         return MANUAL;
     }
 
-    Wps getWpsConfig() {
-        Wps config = new Wps();
+    WpsInfo getWpsConfig() {
+        WpsInfo config = new WpsInfo();
         switch (mNetworkSetupSpinner.getSelectedItemPosition()) {
             case WPS_PBC:
-                config.setup = Setup.PBC;
+                config.setup = WpsInfo.PBC;
                 break;
             case WPS_KEYPAD:
-                config.setup = Setup.KEYPAD;
+                config.setup = WpsInfo.KEYPAD;
                 break;
             case WPS_DISPLAY:
-                config.setup = Setup.DISPLAY;
+                config.setup = WpsInfo.DISPLAY;
                 break;
             default:
-                config.setup = Setup.INVALID;
+                config.setup = WpsInfo.INVALID;
                 Log.e(TAG, "WPS not selected type");
                 return config;
         }
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pDialog.java b/src/com/android/settings/wifi/p2p/WifiP2pDialog.java
index 8c06168..e688905 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pDialog.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pDialog.java
@@ -19,8 +19,7 @@
 import android.app.AlertDialog;
 import android.content.Context;
 import android.content.DialogInterface;
-import android.net.wifi.Wps;
-import android.net.wifi.Wps.Setup;
+import android.net.wifi.WpsInfo;
 import android.net.wifi.p2p.WifiP2pConfig;
 import android.net.wifi.p2p.WifiP2pDevice;
 import android.os.Bundle;
@@ -64,21 +63,21 @@
     public WifiP2pConfig getConfig() {
         WifiP2pConfig config = new WifiP2pConfig();
         config.deviceAddress = mDeviceAddress.getText().toString();
-        config.wps = new Wps();
+        config.wps = new WpsInfo();
         switch (mWpsSetupIndex) {
             case WPS_PBC:
-                config.wps.setup = Setup.PBC;
+                config.wps.setup = WpsInfo.PBC;
                 break;
             case WPS_KEYPAD:
-                config.wps.setup = Setup.KEYPAD;
+                config.wps.setup = WpsInfo.KEYPAD;
                 config.wps.pin = ((TextView) mView.findViewById(R.id.wps_pin)).
                         getText().toString();
                 break;
             case WPS_DISPLAY:
-                config.wps.setup = Setup.DISPLAY;
+                config.wps.setup = WpsInfo.DISPLAY;
                 break;
             default:
-                config.wps.setup = Setup.PBC;
+                config.wps.setup = WpsInfo.PBC;
                 break;
         }
         return config;
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pEnabler.java b/src/com/android/settings/wifi/p2p/WifiP2pEnabler.java
index b812d97..0747d64 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pEnabler.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pEnabler.java
@@ -23,7 +23,6 @@
 import android.content.Intent;
 import android.content.IntentFilter;
 import android.net.wifi.p2p.WifiP2pManager;
-import android.os.Handler;
 import android.os.Message;
 import android.preference.CheckBoxPreference;
 import android.preference.Preference;
@@ -39,7 +38,6 @@
     private final Context mContext;
     private final CheckBoxPreference mCheckBox;
     private final IntentFilter mIntentFilter;
-    private final Handler mHandler = new WifiP2pHandler();
     private WifiP2pManager mWifiP2pManager;
     private WifiP2pManager.Channel mChannel;
 
@@ -61,7 +59,7 @@
 
         mWifiP2pManager = (WifiP2pManager) context.getSystemService(Context.WIFI_P2P_SERVICE);
         if (mWifiP2pManager != null) {
-            mChannel = mWifiP2pManager.initialize(mContext, mHandler);
+            mChannel = mWifiP2pManager.initialize(mContext, mContext.getMainLooper(), null);
             if (mChannel == null) {
                 //Failure to set up connection
                 Log.e(TAG, "Failed to set up connection with wifi p2p service");
@@ -116,24 +114,4 @@
         }
     }
 
-    private class WifiP2pHandler extends Handler {
-        @Override
-        public void handleMessage(Message msg) {
-            switch (msg.what) {
-                case WifiP2pManager.HANDLER_DISCONNECTION:
-                    //Failure to set up connection
-                    Log.e(TAG, "Lost connection with wifi p2p service");
-                    mWifiP2pManager = null;
-                    mCheckBox.setEnabled(false);
-                    break;
-                case WifiP2pManager.ENABLE_P2P_FAILED:
-                    mCheckBox.setEnabled(true);
-                    break;
-                default:
-                    //Ignore
-                    break;
-            }
-        }
-    }
-
 }
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pPeer.java b/src/com/android/settings/wifi/p2p/WifiP2pPeer.java
index 35ae15a..1eb810e 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pPeer.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pPeer.java
@@ -22,7 +22,6 @@
 import android.net.wifi.WifiManager;
 import android.net.wifi.p2p.WifiP2pManager;
 import android.net.wifi.p2p.WifiP2pDevice;
-import android.net.wifi.p2p.WifiP2pDevice.Status;
 import android.preference.Preference;
 import android.text.TextUtils;
 import android.view.View;
@@ -74,7 +73,7 @@
 
         // devices go in the order of the status
         if (device.status != other.device.status) {
-            return device.status.ordinal() < other.device.status.ordinal() ? -1 : 1;
+            return device.status < other.device.status ? -1 : 1;
         }
 
         // Sort by name/address
@@ -99,6 +98,6 @@
         Context context = getContext();
         mSignal.setImageLevel(getLevel());
         String[] statusArray = context.getResources().getStringArray(R.array.wifi_p2p_status);
-        setSummary(statusArray[device.status.ordinal()]);
+        setSummary(statusArray[device.status]);
     }
 }
diff --git a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
index d832012..985f8c5 100644
--- a/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
+++ b/src/com/android/settings/wifi/p2p/WifiP2pSettings.java
@@ -31,8 +31,8 @@
 import android.net.wifi.p2p.WifiP2pDevice;
 import android.net.wifi.p2p.WifiP2pDeviceList;
 import android.net.wifi.p2p.WifiP2pManager;
+import android.net.wifi.p2p.WifiP2pManager.PeerListListener;
 import android.os.Bundle;
-import android.os.Handler;
 import android.os.Message;
 import android.preference.Preference;
 import android.preference.PreferenceActivity;
@@ -53,7 +53,8 @@
 /*
  * Displays Wi-fi p2p settings UI
  */
-public class WifiP2pSettings extends SettingsPreferenceFragment {
+public class WifiP2pSettings extends SettingsPreferenceFragment
+        implements PeerListListener {
 
     private static final String TAG = "WifiP2pSettings";
     private static final int MENU_ID_SEARCH = Menu.FIRST;
@@ -62,7 +63,6 @@
 
 
     private final IntentFilter mIntentFilter = new IntentFilter();
-    private final Handler mHandler = new WifiP2pHandler();
     private WifiP2pManager mWifiP2pManager;
     private WifiP2pManager.Channel mChannel;
     private WifiP2pDialog mConnectDialog;
@@ -81,17 +81,15 @@
             if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
                 //TODO: nothing right now
             } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
-                if (mWifiP2pManager != null) mWifiP2pManager.requestPeers(mChannel);
+                if (mWifiP2pManager != null) {
+                    mWifiP2pManager.requestPeers(mChannel, WifiP2pSettings.this);
+                }
             } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
                 if (mWifiP2pManager == null) return;
                 NetworkInfo networkInfo = (NetworkInfo) intent.getParcelableExtra(
                         WifiP2pManager.EXTRA_NETWORK_INFO);
                 if (networkInfo.isConnected()) {
-                    Log.d(TAG, "Start peer connections");
-                    mWifiP2pManager.startPeerCommunication();
-                } else {
-                    Log.d(TAG, "Stop peer connections");
-                    mWifiP2pManager.stopPeerCommunication();
+                    Log.d(TAG, "Connected");
                 }
             }
         }
@@ -109,7 +107,7 @@
         final Activity activity = getActivity();
         mWifiP2pManager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
         if (mWifiP2pManager != null) {
-            mChannel = mWifiP2pManager.initialize(activity, mHandler);
+            mChannel = mWifiP2pManager.initialize(activity, getActivity().getMainLooper(), null);
             if (mChannel == null) {
                 //Failure to set up connection
                 Log.e(TAG, "Failed to set up connection with wifi p2p service");
@@ -126,7 +124,15 @@
                 if (which == DialogInterface.BUTTON_POSITIVE) {
                     WifiP2pConfig config = mConnectDialog.getConfig();
                     if (mWifiP2pManager != null) {
-                        mWifiP2pManager.connect(mChannel, config);
+                        mWifiP2pManager.connect(mChannel, config,
+                                new WifiP2pManager.ActionListener() {
+                            public void onSuccess() {
+                                Log.d(TAG, " connect success");
+                            }
+                            public void onFailure(int reason) {
+                                Log.d(TAG, " connect fail " + reason);
+                            }
+                        });
                     }
                 }
             }
@@ -138,7 +144,14 @@
             public void onClick(DialogInterface dialog, int which) {
                 if (which == DialogInterface.BUTTON_POSITIVE) {
                     if (mWifiP2pManager != null) {
-                        mWifiP2pManager.removeGroup(mChannel);
+                        mWifiP2pManager.removeGroup(mChannel, new WifiP2pManager.ActionListener() {
+                            public void onSuccess() {
+                                Log.d(TAG, " remove group success");
+                            }
+                            public void onFailure(int reason) {
+                                Log.d(TAG, " remove group fail " + reason);
+                            }
+                        });
                     }
                 }
             }
@@ -151,7 +164,16 @@
         super.onResume();
         getActivity().registerReceiver(mReceiver, mIntentFilter);
 
-        if (mWifiP2pManager != null) mWifiP2pManager.discoverPeers(mChannel);
+        if (mWifiP2pManager != null) {
+            mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
+                            public void onSuccess() {
+                                Log.d(TAG, " discover success");
+                            }
+                            public void onFailure(int reason) {
+                                Log.d(TAG, " discover fail " + reason);
+                            }
+                        });
+        }
     }
 
     @Override
@@ -176,12 +198,26 @@
         switch (item.getItemId()) {
             case MENU_ID_SEARCH:
                 if (mWifiP2pManager != null) {
-                    mWifiP2pManager.discoverPeers(mChannel);
+                    mWifiP2pManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {
+                            public void onSuccess() {
+                                Log.d(TAG, " discover success");
+                            }
+                            public void onFailure(int reason) {
+                                Log.d(TAG, " discover fail " + reason);
+                            }
+                        });
                 }
                 return true;
             case MENU_ID_CREATE_GROUP:
                 if (mWifiP2pManager != null) {
-                    mWifiP2pManager.createGroup(mChannel);
+                    mWifiP2pManager.createGroup(mChannel, new WifiP2pManager.ActionListener() {
+                            public void onSuccess() {
+                                Log.d(TAG, " create group success");
+                            }
+                            public void onFailure(int reason) {
+                                Log.d(TAG, " create group fail " + reason);
+                            }
+                        });
                 }
                 return true;
             case MENU_ID_ADVANCED:
@@ -195,7 +231,7 @@
     public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
         if (preference instanceof WifiP2pPeer) {
             mSelectedWifiPeer = (WifiP2pPeer) preference;
-            if (mSelectedWifiPeer.device.status == WifiP2pDevice.Status.CONNECTED) {
+            if (mSelectedWifiPeer.device.status == WifiP2pDevice.CONNECTED) {
                 showDialog(DIALOG_DISCONNECT);
             } else {
                 showDialog(DIALOG_CONNECT);
@@ -222,7 +258,7 @@
         return null;
     }
 
-    private void updatePeers(WifiP2pDeviceList peers) {
+    public void onPeersAvailable(WifiP2pDeviceList peers) {
         final PreferenceScreen preferenceScreen = getPreferenceScreen();
         preferenceScreen.removeAll();
 
@@ -230,24 +266,4 @@
             preferenceScreen.addPreference(new WifiP2pPeer(getActivity(), peer));
         }
     }
-
-    private class WifiP2pHandler extends Handler {
-        @Override
-        public void handleMessage(Message message) {
-            switch (message.what) {
-                case WifiP2pManager.HANDLER_DISCONNECTION:
-                    //Failure to set up connection
-                    Log.e(TAG, "Lost connection with wifi p2p service");
-                    mWifiP2pManager = null;
-                    break;
-                case WifiP2pManager.RESPONSE_PEERS:
-                    updatePeers(mWifiP2pManager.peersInResponse(message));
-                    break;
-                default:
-                    //Ignore
-                    break;
-            }
-        }
-    }
-
 }
