diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java
index c932978..774ac58 100644
--- a/src/com/android/settings/wifi/AccessPoint.java
+++ b/src/com/android/settings/wifi/AccessPoint.java
@@ -35,33 +35,6 @@
     private static final int[] STATE_SECURED = {R.attr.state_encrypted};
     private static final int[] STATE_NONE = {};
 
-    public static final class Comparater
-            implements Comparator<AccessPoint> {
-        @Override
-        public int compare(AccessPoint accessPoint1, AccessPoint accessPoint2) {
-            // Active one goes first.
-            if (accessPoint1.mInfo != accessPoint2.mInfo) {
-                return (accessPoint1.mInfo != null) ? -1 : 1;
-            }
-
-            // Reachable one goes before unreachable one.
-            if ((accessPoint1.mRssi ^ accessPoint2.mRssi) < 0) {
-                return (accessPoint1.mRssi != Integer.MAX_VALUE) ? -1 : 1;
-            }
-            // Configured one goes before unconfigured one.
-            if ((accessPoint1.networkId ^ accessPoint2.networkId) < 0) {
-                return (accessPoint1.networkId != -1) ? -1 : 1;
-            }
-            // Sort by signal strength.
-            int difference = WifiManager.compareSignalLevel(
-                    accessPoint2.mRssi, accessPoint1.mRssi);
-            if (difference != 0) {
-                return difference;
-            }
-            // Sort by ssid.
-            return accessPoint1.ssid.compareToIgnoreCase(accessPoint2.ssid);
-        }
-    }
 
     static final int SECURITY_NONE = 0;
     static final int SECURITY_WEP = 1;
@@ -140,6 +113,33 @@
         super.onBindView(view);
     }
 
+    @Override
+    public int compareTo(Preference preference) {
+        if (!(preference instanceof AccessPoint)) {
+            return 1;
+        }
+        AccessPoint other = (AccessPoint) preference;
+        // Active one goes first.
+        if (mInfo != other.mInfo) {
+            return (mInfo != null) ? -1 : 1;
+        }
+        // Reachable one goes before unreachable one.
+        if ((mRssi ^ other.mRssi) < 0) {
+            return (mRssi != Integer.MAX_VALUE) ? -1 : 1;
+        }
+        // Configured one goes before unconfigured one.
+        if ((networkId ^ other.networkId) < 0) {
+            return (networkId != -1) ? -1 : 1;
+        }
+        // Sort by signal strength.
+        int difference = WifiManager.compareSignalLevel(other.mRssi, mRssi);
+        if (difference != 0) {
+            return difference;
+        }
+        // Sort by ssid.
+        return ssid.compareToIgnoreCase(other.ssid);
+    }
+
 
     boolean update(ScanResult result) {
         // We do not call refresh() since this is called before onBindView().
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index 1f7a1da..fefbdfc 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -56,9 +56,9 @@
 import android.widget.AdapterView.AdapterContextMenuInfo;
 import android.widget.Toast;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.TreeSet;
 
 /**
  * This currently provides three types of UI.
@@ -184,7 +184,7 @@
         final ProgressCategoryBase preference =
                 (ProgressCategoryBase) findPreference("access_points");
         mAccessPoints = preference;
-        mAccessPoints.setOrderingAsAdded(true);
+        mAccessPoints.setOrderingAsAdded(false);
         mAddNetwork = findPreference("add_network");
 
         registerForContextMenu(getListView());
@@ -379,8 +379,7 @@
     }
 
     private Collection<AccessPoint> constructAccessPoints() {
-        Collection<AccessPoint> accessPoints =
-                new TreeSet<AccessPoint>(new AccessPoint.Comparater());
+        Collection<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
 
         final List<WifiConfiguration> configs = mWifiManager.getConfiguredNetworks();
         if (configs != null) {
