diff --git a/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java b/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java
index 69842c2..f863d3d 100644
--- a/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java
+++ b/service/java/com/android/server/lowpan/LowpanInterfaceTracker.java
@@ -27,13 +27,16 @@
 import android.net.NetworkFactory;
 import android.net.NetworkInfo;
 import android.net.NetworkInfo.DetailedState;
-import android.net.ip.IpManager;
-import android.net.ip.IpManager.InitialConfiguration;
-import android.net.ip.IpManager.ProvisioningConfiguration;
+import android.net.ip.IIpClient;
+import android.net.ip.IpClientCallbacks;
+import android.net.ip.IpClientUtil;
 import android.net.lowpan.ILowpanInterface;
 import android.net.lowpan.LowpanException;
 import android.net.lowpan.LowpanInterface;
 import android.net.lowpan.LowpanRuntimeException;
+import android.net.shared.InitialConfiguration;
+import android.net.shared.ProvisioningConfiguration;
+import android.os.ConditionVariable;
 import android.os.Looper;
 import android.os.Message;
 import android.os.RemoteException;
@@ -62,6 +65,9 @@
      */
     private static final int NETWORK_SCORE = 30;
 
+    // TODO: create IpClient asynchronously
+    private static final int IPCLIENT_CREATE_TIMEOUT_MS = 10000;
+
     /** Internal debugging flag. */
     private static final boolean DBG = true;
 
@@ -87,8 +93,8 @@
     private LowpanInterface mLowpanInterface;
     private NetworkAgent mNetworkAgent;
     private NetworkFactory mNetworkFactory;
-    private IpManager mIpManager;
-    private final IpManager.Callback mIpManagerCallback = new IpManagerCallback();
+    private volatile IIpClient mIpClient;
+    private final IpClientCallbackImpl mIpClientCallback = new IpClientCallbackImpl();
 
     // Instance Variables
 
@@ -132,7 +138,19 @@
         }
     }
 
-    class IpManagerCallback extends IpManager.Callback {
+    class IpClientCallbackImpl extends IpClientCallbacks {
+        private final ConditionVariable mObtainedCv = new ConditionVariable(false);
+
+        @Override
+        public void onIpClientCreated(IIpClient ipClient) {
+            mIpClient = ipClient;
+            mObtainedCv.open();
+        }
+
+        public boolean waitUntilCreated() {
+            return mObtainedCv.block(IPCLIENT_CREATE_TIMEOUT_MS);
+        }
+
         @Override
         public void onProvisioningSuccess(LinkProperties newLp) {
             LowpanInterfaceTracker.this.sendMessage(CMD_PROVISIONING_SUCCESS, newLp);
@@ -248,7 +266,12 @@
                 Log.i(TAG, "NormalState.enter()");
             }
 
-            mIpManager = new IpManager(mContext, mInterfaceName, mIpManagerCallback);
+            IpClientUtil.makeIpClient(mContext, mInterfaceName, mIpClientCallback);
+            if (!mIpClientCallback.waitUntilCreated()) {
+                Log.e(TAG, "Failed to create IpClient");
+                transitionTo(mFaultState);
+                return;
+            }
 
             if (mHwAddr == null) {
                 byte[] hwAddr = null;
@@ -314,10 +337,14 @@
             shutdownNetworkAgent();
             mNetworkFactory.unregister();
 
-            if (mIpManager != null) {
-                mIpManager.shutdown();
+            if (mIpClient != null) {
+                try {
+                    mIpClient.shutdown();
+                } catch (RemoteException e) {
+                    Log.e(TAG, "Error shutting down IpClient", e);
+                }
             }
-            mIpManager = null;
+            mIpClient = null;
         }
     }
 
@@ -327,7 +354,11 @@
             shutdownNetworkAgent();
             mNetworkInfo.setIsAvailable(true);
 
-            mIpManager.stop();
+            try {
+                mIpClient.stop();
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error stopping IpClient");
+            }
         }
 
         @Override
@@ -453,7 +484,7 @@
             }
 
             final ProvisioningConfiguration.Builder builder =
-                    mIpManager.buildProvisioningConfiguration();
+                    new ProvisioningConfiguration.Builder();
 
             builder.withInitialConfiguration(initialConfiguration).withProvisioningTimeoutMs(0);
 
@@ -466,7 +497,13 @@
             // the InitialConfiguration for any IPv4 addresses.
             builder.withoutIPv4();
 
-            mIpManager.startProvisioning(builder.build());
+            try {
+                mIpClient.startProvisioning(builder.build().toStableParcelable());
+            } catch (RemoteException e) {
+                Log.e(TAG, "Error starting IpClient provisioning", e);
+                transitionTo(mFaultState);
+                return;
+            }
 
             mNetworkInfo.setDetailedState(DetailedState.OBTAINING_IPADDR, null, mHwAddr);
             mNetworkAgent.sendNetworkInfo(mNetworkInfo);
