diff --git a/core/java/android/content/AbstractThreadedSyncAdapter.java b/core/java/android/content/AbstractThreadedSyncAdapter.java
index 0db6155..091d44e 100644
--- a/core/java/android/content/AbstractThreadedSyncAdapter.java
+++ b/core/java/android/content/AbstractThreadedSyncAdapter.java
@@ -17,10 +17,10 @@
 package android.content;
 
 import android.accounts.Account;
+import android.net.TrafficStats;
 import android.os.Bundle;
-import android.os.Process;
-import android.os.NetStat;
 import android.os.IBinder;
+import android.os.Process;
 import android.os.RemoteException;
 import android.util.EventLog;
 
@@ -157,8 +157,8 @@
 
             SyncResult syncResult = new SyncResult();
             int uid = Process.myUid();
-            mInitialTxBytes = NetStat.getUidTxBytes(uid);
-            mInitialRxBytes = NetStat.getUidRxBytes(uid);
+            mInitialTxBytes = TrafficStats.getUidTxBytes(uid);
+            mInitialRxBytes = TrafficStats.getUidRxBytes(uid);
             ContentProviderClient provider = null;
             try {
                 provider = mContext.getContentResolver().acquireContentProviderClient(mAuthority);
@@ -175,8 +175,8 @@
                 if (!isCanceled()) {
                     mSyncContext.onFinished(syncResult);
                 }
-                onLogSyncDetails(NetStat.getUidTxBytes(uid) - mInitialTxBytes,
-                        NetStat.getUidRxBytes(uid) - mInitialRxBytes, syncResult);
+                onLogSyncDetails(TrafficStats.getUidTxBytes(uid) - mInitialTxBytes,
+                        TrafficStats.getUidRxBytes(uid) - mInitialRxBytes, syncResult);
                 // synchronize so that the assignment will be seen by other threads
                 // that also synchronize accesses to mSyncThread
                 synchronized (mSyncThreadLock) {
diff --git a/core/java/android/content/TempProviderSyncAdapter.java b/core/java/android/content/TempProviderSyncAdapter.java
index b46c545..5ccaa26 100644
--- a/core/java/android/content/TempProviderSyncAdapter.java
+++ b/core/java/android/content/TempProviderSyncAdapter.java
@@ -1,9 +1,12 @@
 package android.content;
 
+import android.accounts.Account;
+import android.accounts.AuthenticatorException;
+import android.accounts.OperationCanceledException;
 import android.database.SQLException;
+import android.net.TrafficStats;
 import android.os.Bundle;
 import android.os.Debug;
-import android.os.NetStat;
 import android.os.Parcelable;
 import android.os.Process;
 import android.os.SystemProperties;
@@ -12,9 +15,6 @@
 import android.util.EventLog;
 import android.util.Log;
 import android.util.TimingLogger;
-import android.accounts.Account;
-import android.accounts.AuthenticatorException;
-import android.accounts.OperationCanceledException;
 
 import java.io.IOException;
 
@@ -203,8 +203,8 @@
             if (mProviderSyncStarted) mProvider.onSyncCanceled();
             // We may lose the last few sync events when canceling.  Oh well.
             int uid = Process.myUid();
-            logSyncDetails(NetStat.getUidTxBytes(uid) - mInitialTxBytes,
-                    NetStat.getUidRxBytes(uid) - mInitialRxBytes, mResult);
+            logSyncDetails(TrafficStats.getUidTxBytes(uid) - mInitialTxBytes,
+                    TrafficStats.getUidRxBytes(uid) - mInitialRxBytes, mResult);
         }
         
         @Override
@@ -212,8 +212,8 @@
             Process.setThreadPriority(Process.myTid(),
                     Process.THREAD_PRIORITY_BACKGROUND);
             int uid = Process.myUid();
-            mInitialTxBytes = NetStat.getUidTxBytes(uid);
-            mInitialRxBytes = NetStat.getUidRxBytes(uid);
+            mInitialTxBytes = TrafficStats.getUidTxBytes(uid);
+            mInitialRxBytes = TrafficStats.getUidRxBytes(uid);
             try {
                 sync(mSyncContext, mAccount, mAuthority, mExtras);
             } catch (SQLException e) {
@@ -222,8 +222,8 @@
             } finally {
                 mSyncThread = null;
                 if (!mIsCanceled) {
-                    logSyncDetails(NetStat.getUidTxBytes(uid) - mInitialTxBytes,
-                    NetStat.getUidRxBytes(uid) - mInitialRxBytes, mResult);
+                    logSyncDetails(TrafficStats.getUidTxBytes(uid) - mInitialTxBytes,
+                    TrafficStats.getUidRxBytes(uid) - mInitialRxBytes, mResult);
                     mSyncContext.onFinished(mResult);
                 }
             }
diff --git a/core/java/android/os/NetStat.java b/core/java/android/os/NetStat.java
deleted file mode 100644
index e294cdf..0000000
--- a/core/java/android/os/NetStat.java
+++ /dev/null
@@ -1,247 +0,0 @@
-/*
- * Copyright (C) 2007 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 android.os;
-
-import android.util.Log;
-
-import java.io.File;
-import java.io.RandomAccessFile;
-import java.io.IOException;
-
-/** @hide */
-public class NetStat {
-
-    // Logging tag.
-    private final static String TAG = "netstat";
-
-    // We pre-create all the File objects so we don't spend a lot of
-    // CPU at runtime converting from Java Strings to byte[] for the
-    // kernel calls.
-    private final static File[] MOBILE_TX_PACKETS = mobileFiles("tx_packets");
-    private final static File[] MOBILE_RX_PACKETS = mobileFiles("rx_packets");
-    private final static File[] MOBILE_TX_BYTES = mobileFiles("tx_bytes");
-    private final static File[] MOBILE_RX_BYTES = mobileFiles("rx_bytes");
-    private final static File SYS_CLASS_NET_DIR = new File("/sys/class/net");
-
-    /**
-     * Get total number of tx packets sent through rmnet0 or ppp0
-     *
-     * @return number of Tx packets through rmnet0 or ppp0
-     */
-    public static long getMobileTxPkts() {
-        return getMobileStat(MOBILE_TX_PACKETS);
-    }
-
-    /**
-     *  Get total number of rx packets received through rmnet0 or ppp0
-     *
-     * @return number of Rx packets through rmnet0 or ppp0
-     */
-    public static long getMobileRxPkts() {
-        return getMobileStat(MOBILE_RX_PACKETS);
-    }
-
-    /**
-     *  Get total number of tx bytes received through rmnet0 or ppp0
-     *
-     * @return number of Tx bytes through rmnet0 or ppp0
-     */
-      public static long getMobileTxBytes() {
-          return getMobileStat(MOBILE_TX_BYTES);
-      }
-
-    /**
-     *  Get total number of rx bytes received through rmnet0 or ppp0
-     *
-     * @return number of Rx bytes through rmnet0 or ppp0
-     */
-    public static long getMobileRxBytes() {
-        return getMobileStat(MOBILE_RX_BYTES);
-    }
-
-    /**
-     * Get the total number of packets sent through all network interfaces.
-     *
-     * @return the number of packets sent through all network interfaces
-     */
-    public static long getTotalTxPkts() {
-        return getTotalStat("tx_packets");
-    }
-
-    /**
-     * Get the total number of packets received through all network interfaces.
-     *
-     * @return the number of packets received through all network interfaces
-     */
-    public static long getTotalRxPkts() {
-        return getTotalStat("rx_packets");
-    }
-
-    /**
-     * Get the total number of bytes sent through all network interfaces.
-     *
-     * @return the number of bytes sent through all network interfaces
-     */
-    public static long getTotalTxBytes() {
-        return getTotalStat("tx_bytes");
-    }
-
-    /**
-     * Get the total number of bytes received through all network interfaces.
-     *
-     * @return the number of bytes received through all network interfaces
-     */
-    public static long getTotalRxBytes() {
-        return getTotalStat("rx_bytes");
-    }
-
-    /**
-     * Gets network bytes sent for this UID.
-     * The statistics are across all interfaces.
-     * The statistics come from /proc/uid_stat.
-     *
-     * {@see android.os.Process#myUid()}.
-     *
-     * @param uid
-     * @return byte count
-     */
-    public static long getUidTxBytes(int uid) {
-        return getNumberFromFilePath("/proc/uid_stat/" + uid + "/tcp_snd");
-    }
-
-    /**
-     * Gets network bytes received for this UID.
-     * The statistics are across all interfaces.
-     * The statistics come from /proc/uid_stat.
-     *
-     * {@see android.os.Process#myUid()}.
-     *
-     * @param uid
-     * @return byte count
-     */
-    public static long getUidRxBytes(int uid) {
-        return getNumberFromFilePath("/proc/uid_stat/" + uid + "/tcp_rcv");
-    }
-
-    /**
-     * Returns the array of two possible File locations for a given
-     * statistic.
-     */
-    private static File[] mobileFiles(String whatStat) {
-        // Note that we stat them at runtime to see which is
-        // available, rather than here, to guard against the files
-        // coming & going later as modules shut down (e.g. airplane
-        // mode) and whatnot.  The runtime stat() isn't expensive compared
-        // to the previous charset conversion that happened before we
-        // were reusing File instances.
-        File[] files = new File[2];
-        files[0] = new File("/sys/class/net/rmnet0/statistics/" + whatStat);
-        files[1] = new File("/sys/class/net/ppp0/statistics/" + whatStat);
-        return files;
-    }
-
-    private static long getTotalStat(String whatStat) {
-        File netdir = new File("/sys/class/net");
-
-        File[] nets = SYS_CLASS_NET_DIR.listFiles();
-        if (nets == null) {
-            return 0;
-        }
-        long total = 0;
-        StringBuffer strbuf = new StringBuffer();
-        for (File net : nets) {
-            strbuf.append(net.getPath()).append(File.separator).append("statistics")
-                    .append(File.separator).append(whatStat);
-            total += getNumberFromFilePath(strbuf.toString());
-            strbuf.setLength(0);
-        }
-        return total;
-    }
-
-    private static long getMobileStat(File[] files) {
-        for (int i = 0; i < files.length; i++) {
-            File file = files[i];
-            if (!file.exists()) {
-                continue;
-            }
-            try {
-                RandomAccessFile raf = new RandomAccessFile(file, "r");
-                return getNumberFromFile(raf, file.getAbsolutePath());
-            } catch (IOException e) {
-                Log.w(TAG,
-                      "Exception opening TCP statistics file " + file.getAbsolutePath(),
-                      e);
-            }
-        }
-        return 0L;
-    }
-
-    // File will have format <number><newline>
-    private static long getNumberFromFilePath(String filename) {
-        RandomAccessFile raf = getFile(filename);
-        if (raf == null) {
-            return 0L;
-        }
-        return getNumberFromFile(raf, filename);
-    }
-
-    // Private buffer for getNumberFromFile.  Safe for re-use because
-    // getNumberFromFile is synchronized.
-    private final static byte[] buf = new byte[16];
-
-    private static synchronized long getNumberFromFile(RandomAccessFile raf, String filename) {
-        try {
-            raf.read(buf);
-            raf.close();
-        } catch (IOException e) {
-            Log.w(TAG, "Exception getting TCP bytes from " + filename, e);
-            return 0L;
-        } finally {
-            if (raf != null) {
-                try {
-                    raf.close();
-                } catch (IOException e) {
-                    Log.w(TAG, "Exception closing " + filename, e);
-                }
-            }
-        }
-
-        long num = 0L;
-        for (int i = 0; i < buf.length; i++) {
-            if (buf[i] < '0' || buf[i] > '9') {
-                break;
-            }
-            num *= 10;
-            num += buf[i] - '0';
-        }
-        return num;
-    }
-
-    private static RandomAccessFile getFile(String filename) {
-        File f = new File(filename);
-        if (!f.canRead()) {
-            return null;
-        }
-
-        try {
-            return new RandomAccessFile(f, "r");
-        } catch (IOException e) {
-            Log.w(TAG, "Exception opening TCP statistics file " + filename, e);
-            return null;
-        }
-    }
-}
diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java
index 5199ada..e964a8f 100644
--- a/core/java/com/android/internal/os/BatteryStatsImpl.java
+++ b/core/java/com/android/internal/os/BatteryStatsImpl.java
@@ -17,8 +17,8 @@
 package com.android.internal.os;
 
 import android.bluetooth.BluetoothHeadset;
+import android.net.TrafficStats;
 import android.os.BatteryStats;
-import android.os.NetStat;
 import android.os.Parcel;
 import android.os.ParcelFormatException;
 import android.os.Parcelable;
@@ -1022,8 +1022,8 @@
     public void doUnplug(long batteryUptime, long batteryRealtime) {
         for (int iu = mUidStats.size() - 1; iu >= 0; iu--) {
             Uid u = mUidStats.valueAt(iu);
-            u.mStartedTcpBytesReceived = NetStat.getUidRxBytes(u.mUid);
-            u.mStartedTcpBytesSent = NetStat.getUidTxBytes(u.mUid);
+            u.mStartedTcpBytesReceived = TrafficStats.getUidRxBytes(u.mUid);
+            u.mStartedTcpBytesSent = TrafficStats.getUidTxBytes(u.mUid);
             u.mTcpBytesReceivedAtLastUnplug = u.mCurrentTcpBytesReceived;
             u.mTcpBytesSentAtLastUnplug = u.mCurrentTcpBytesSent;
         }
@@ -1031,10 +1031,10 @@
             mUnpluggables.get(i).unplug(batteryUptime, batteryRealtime);
         }
         // Track total mobile data
-        doDataUnplug(mMobileDataRx, NetStat.getMobileRxBytes());
-        doDataUnplug(mMobileDataTx, NetStat.getMobileTxBytes());
-        doDataUnplug(mTotalDataRx, NetStat.getTotalRxBytes());
-        doDataUnplug(mTotalDataTx, NetStat.getTotalTxBytes());
+        doDataUnplug(mMobileDataRx, TrafficStats.getMobileRxBytes());
+        doDataUnplug(mMobileDataTx, TrafficStats.getMobileTxBytes());
+        doDataUnplug(mTotalDataRx, TrafficStats.getTotalRxBytes());
+        doDataUnplug(mTotalDataTx, TrafficStats.getTotalTxBytes());
         // Track radio awake time
         mRadioDataStart = getCurrentRadioDataUptime();
         mRadioDataUptime = 0;
@@ -1058,10 +1058,10 @@
         for (int i = mUnpluggables.size() - 1; i >= 0; i--) {
             mUnpluggables.get(i).plug(batteryUptime, batteryRealtime);
         }
-        doDataPlug(mMobileDataRx, NetStat.getMobileRxBytes());
-        doDataPlug(mMobileDataTx, NetStat.getMobileTxBytes());
-        doDataPlug(mTotalDataRx, NetStat.getTotalRxBytes());
-        doDataPlug(mTotalDataTx, NetStat.getTotalTxBytes());
+        doDataPlug(mMobileDataRx, TrafficStats.getMobileRxBytes());
+        doDataPlug(mMobileDataTx, TrafficStats.getMobileTxBytes());
+        doDataPlug(mTotalDataRx, TrafficStats.getTotalRxBytes());
+        doDataPlug(mTotalDataTx, TrafficStats.getTotalTxBytes());
         // Track radio awake time
         mRadioDataUptime = getRadioDataUptime();
         mRadioDataStart = -1;
@@ -1519,7 +1519,7 @@
         
         public long computeCurrentTcpBytesReceived() {
             return mCurrentTcpBytesReceived + (mStartedTcpBytesReceived >= 0
-                    ? (NetStat.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0);
+                    ? (TrafficStats.getUidRxBytes(mUid) - mStartedTcpBytesReceived) : 0);
         }
 
         @Override
@@ -1696,7 +1696,7 @@
         
         public long computeCurrentTcpBytesSent() {
             return mCurrentTcpBytesSent + (mStartedTcpBytesSent >= 0
-                    ? (NetStat.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0);
+                    ? (TrafficStats.getUidTxBytes(mUid) - mStartedTcpBytesSent) : 0);
         }
 
         void writeToParcelLocked(Parcel out, long batteryRealtime) {
@@ -2919,22 +2919,22 @@
 
     /** Only STATS_UNPLUGGED works properly */
     public long getMobileTcpBytesSent(int which) {
-        return getTcpBytes(NetStat.getMobileTxBytes(), mMobileDataTx, which);
+        return getTcpBytes(TrafficStats.getMobileTxBytes(), mMobileDataTx, which);
     }
 
     /** Only STATS_UNPLUGGED works properly */
     public long getMobileTcpBytesReceived(int which) {
-        return getTcpBytes(NetStat.getMobileRxBytes(), mMobileDataRx, which);
+        return getTcpBytes(TrafficStats.getMobileRxBytes(), mMobileDataRx, which);
     }
 
     /** Only STATS_UNPLUGGED works properly */
     public long getTotalTcpBytesSent(int which) {
-        return getTcpBytes(NetStat.getTotalTxBytes(), mTotalDataTx, which);
+        return getTcpBytes(TrafficStats.getTotalTxBytes(), mTotalDataTx, which);
     }
 
     /** Only STATS_UNPLUGGED works properly */
     public long getTotalTcpBytesReceived(int which) {
-        return getTcpBytes(NetStat.getTotalRxBytes(), mTotalDataRx, which);
+        return getTcpBytes(TrafficStats.getTotalRxBytes(), mTotalDataRx, which);
     }
 
     @Override
diff --git a/core/java/com/google/android/net/GoogleHttpClient.java b/core/java/com/google/android/net/GoogleHttpClient.java
index 8a1298f..7bdc7f8 100644
--- a/core/java/com/google/android/net/GoogleHttpClient.java
+++ b/core/java/com/google/android/net/GoogleHttpClient.java
@@ -19,13 +19,14 @@
 import android.content.ContentResolver;
 import android.content.ContentValues;
 import android.content.Context;
+import android.net.TrafficStats;
 import android.net.http.AndroidHttpClient;
 import android.os.Build;
-import android.os.NetStat;
 import android.os.SystemClock;
 import android.provider.Checkin;
 import android.util.Config;
 import android.util.Log;
+import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
 import org.apache.http.HttpEntity;
 import org.apache.http.HttpEntityEnclosingRequest;
 import org.apache.http.HttpHost;
@@ -45,7 +46,6 @@
 import org.apache.http.impl.client.RequestWrapper;
 import org.apache.http.params.HttpParams;
 import org.apache.http.protocol.HttpContext;
-import org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
 
 import java.io.IOException;
 import java.net.InetAddress;
@@ -205,8 +205,8 @@
                 // to follow redirects, count each redirect as an additional round trip.
 
                 int uid = android.os.Process.myUid();
-                long startTx = NetStat.getUidTxBytes(uid);
-                long startRx = NetStat.getUidRxBytes(uid);
+                long startTx = TrafficStats.getUidTxBytes(uid);
+                long startRx = TrafficStats.getUidRxBytes(uid);
 
                 response = mClient.execute(request, context);
                 HttpEntity origEntity = response == null ? null : response.getEntity();
diff --git a/core/java/com/google/android/net/NetworkStatsEntity.java b/core/java/com/google/android/net/NetworkStatsEntity.java
index f5d2349..a22fa1e 100644
--- a/core/java/com/google/android/net/NetworkStatsEntity.java
+++ b/core/java/com/google/android/net/NetworkStatsEntity.java
@@ -16,11 +16,10 @@
 
 package com.google.android.net;
 
-import android.os.NetStat;
+import android.net.TrafficStats;
 import android.os.SystemClock;
 import android.os.SystemProperties;
 import android.util.EventLog;
-
 import org.apache.http.HttpEntity;
 import org.apache.http.entity.HttpEntityWrapper;
 
@@ -45,8 +44,8 @@
                 super.close();
             } finally {
                 long processingTime = SystemClock.elapsedRealtime() - mProcessingStartTime;
-                long tx = NetStat.getUidTxBytes(mUid);
-                long rx = NetStat.getUidRxBytes(mUid);
+                long tx = TrafficStats.getUidTxBytes(mUid);
+                long rx = TrafficStats.getUidRxBytes(mUid);
 
                 EventLog.writeEvent(HTTP_STATS_EVENT, mUa, mResponseLatency, processingTime,
                         tx - mStartTx, rx - mStartRx);
diff --git a/services/java/com/android/server/NetStatService.java b/services/java/com/android/server/NetStatService.java
index 1ea0bac..0834405 100644
--- a/services/java/com/android/server/NetStatService.java
+++ b/services/java/com/android/server/NetStatService.java
@@ -17,8 +17,8 @@
 package com.android.server;
 
 import android.content.Context;
+import android.net.TrafficStats;
 import android.os.INetStatService;
-import android.os.NetStat;
 
 public class NetStatService extends INetStatService.Stub {
 
@@ -27,34 +27,34 @@
     }
 
     public long getMobileTxPackets() {
-        return NetStat.getMobileTxPkts();
+        return TrafficStats.getMobileTxPkts();
     }
 
     public long getMobileRxPackets() {
-        return NetStat.getMobileRxPkts();
+        return TrafficStats.getMobileRxPkts();
     }
 
     public long getMobileTxBytes() {
-        return NetStat.getMobileTxBytes();
+        return TrafficStats.getMobileTxBytes();
     }
 
     public long getMobileRxBytes() {
-        return NetStat.getMobileRxBytes();
+        return TrafficStats.getMobileRxBytes();
     }
 
     public long getTotalTxPackets() {
-        return NetStat.getTotalTxPkts();
+        return TrafficStats.getTotalTxPkts();
     }
 
     public long getTotalRxPackets() {
-        return NetStat.getTotalRxPkts();
+        return TrafficStats.getTotalRxPkts();
     }
 
     public long getTotalTxBytes() {
-        return NetStat.getTotalTxBytes();
+        return TrafficStats.getTotalTxBytes();
     }
 
     public long getTotalRxBytes() {
-        return NetStat.getTotalRxBytes();
+        return TrafficStats.getTotalRxBytes();
     }
 }
