Merge m-c to inbound, a=merge
authorWes Kocher <wkocher@mozilla.com>
Wed, 29 Jul 2015 20:20:59 -0700
changeset 287016 69b3b57895914bb082331c9567581c1c399cc390
parent 287015 a63cfee656aaf517c3102c177eab433ee0d2bb28 (current diff)
parent 286964 62469b20ec842c2399c409bdc2af0f5e5d3facd2 (diff)
child 287017 631e78da4e3deb91b7ca83cf74f5607a6cf45d19
push id5067
push userraliiev@mozilla.com
push dateMon, 21 Sep 2015 14:04:52 +0000
treeherdermozilla-beta@14221ffe5b2f [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone42.0a1
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge m-c to inbound, a=merge
browser/app/profile/firefox.js
browser/base/content/tabbrowser.xml
browser/themes/linux/jar.mn
browser/themes/osx/jar.mn
browser/themes/windows/jar.mn
mobile/android/base/resources/drawable-hdpi/lock_identified.png
mobile/android/base/resources/drawable-hdpi/lock_verified.png
mobile/android/base/resources/drawable-xhdpi/lock_identified.png
mobile/android/base/resources/drawable-xhdpi/lock_verified.png
mobile/android/base/resources/drawable-xxhdpi/lock_identified.png
mobile/android/base/resources/layout/site_identity_unknown.xml
--- a/b2g/chrome/content/shell.js
+++ b/b2g/chrome/content/shell.js
@@ -196,19 +196,19 @@ var shell = {
     if (this.onlineForCrashReport()) {
       this.submitQueuedCrashes();
       return;
     }
 
     debugCrashReport('Not online, postponing.');
 
     Services.obs.addObserver(function observer(subject, topic, state) {
-      let network = subject.QueryInterface(Ci.nsINetworkInterface);
-      if (network.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED
-          && network.type == Ci.nsINetworkInterface.NETWORK_TYPE_WIFI) {
+      let network = subject.QueryInterface(Ci.nsINetworkInfo);
+      if (network.state == Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED
+          && network.type == Ci.nsINetworkInfo.NETWORK_TYPE_WIFI) {
         shell.submitQueuedCrashes();
 
         Services.obs.removeObserver(observer, topic);
       }
     }, "network-connection-state-changed", false);
   },
 
   get homeURL() {
--- a/b2g/config/aries/sources.xml
+++ b/b2g/config/aries/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="088f350b39baf8f86c7c1161fd4be178ce822b7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5bb657ada461be666c35f419dbe072ed2ce632fc"/>
--- a/b2g/config/dolphin/sources.xml
+++ b/b2g/config/dolphin/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="088f350b39baf8f86c7c1161fd4be178ce822b7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5bb657ada461be666c35f419dbe072ed2ce632fc"/>
--- a/b2g/config/emulator-ics/sources.xml
+++ b/b2g/config/emulator-ics/sources.xml
@@ -14,17 +14,17 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="1b0db93fb6b870b03467aff50d6419771ba0d88c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="088f350b39baf8f86c7c1161fd4be178ce822b7b"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="8bc59310552179f9a8bc6cdd0188e2475df52fb7"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="9d0e5057ee5404a31ec1bf76131cb11336a7c3b6"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/emulator-jb/sources.xml
+++ b/b2g/config/emulator-jb/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="660169a3d7e034a892359e39135e8c2785a6ad6f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="088f350b39baf8f86c7c1161fd4be178ce822b7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5bb657ada461be666c35f419dbe072ed2ce632fc"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/emulator-kk/sources.xml
+++ b/b2g/config/emulator-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="088f350b39baf8f86c7c1161fd4be178ce822b7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5bb657ada461be666c35f419dbe072ed2ce632fc"/>
--- a/b2g/config/emulator-l/sources.xml
+++ b/b2g/config/emulator-l/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="07c383a786f188904311a37f6062c2cb84c9b61d">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="088f350b39baf8f86c7c1161fd4be178ce822b7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5bb657ada461be666c35f419dbe072ed2ce632fc"/>
--- a/b2g/config/emulator/sources.xml
+++ b/b2g/config/emulator/sources.xml
@@ -14,17 +14,17 @@
   <!--original fetch url was git://github.com/apitrace/-->
   <remote fetch="https://git.mozilla.org/external/apitrace" name="apitrace"/>
   <default remote="caf" revision="refs/tags/android-4.0.4_r2.1" sync-j="4"/>
   <!-- Gonk specific things and forks -->
   <project name="platform_build" path="build" remote="b2g" revision="1b0db93fb6b870b03467aff50d6419771ba0d88c">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="fake-dalvik" path="dalvik" remote="b2g" revision="ca1f327d5acc198bb4be62fa51db2c039032c9ce"/>
-  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="088f350b39baf8f86c7c1161fd4be178ce822b7b"/>
+  <project name="gaia.git" path="gaia" remote="mozillaorg" revision="bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="platform_hardware_ril" path="hardware/ril" remote="b2g" revision="8bc59310552179f9a8bc6cdd0188e2475df52fb7"/>
   <project name="platform_external_qemu" path="external/qemu" remote="b2g" revision="9d0e5057ee5404a31ec1bf76131cb11336a7c3b6"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="34ea6163f9f0e0122fb0bb03607eccdca31ced7a"/>
   <!-- Stock Android things -->
   <project name="platform/abi/cpp" path="abi/cpp" revision="dd924f92906085b831bf1cbbc7484d3c043d613c"/>
--- a/b2g/config/flame-kk/sources.xml
+++ b/b2g/config/flame-kk/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="e862ab9177af664f00b4522e2350f4cb13866d73">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="088f350b39baf8f86c7c1161fd4be178ce822b7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5bb657ada461be666c35f419dbe072ed2ce632fc"/>
--- a/b2g/config/gaia.json
+++ b/b2g/config/gaia.json
@@ -1,9 +1,9 @@
 {
     "git": {
-        "git_revision": "088f350b39baf8f86c7c1161fd4be178ce822b7b", 
+        "git_revision": "bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8", 
         "remote": "https://git.mozilla.org/releases/gaia.git", 
         "branch": ""
     }, 
-    "revision": "97666dae0fe5da2a0da4f57f41fcb12e9c2fe709", 
+    "revision": "3b5be8b229de20ea6cdcd3089558bf631c184c58", 
     "repo_path": "integration/gaia-central"
 }
--- a/b2g/config/nexus-4/sources.xml
+++ b/b2g/config/nexus-4/sources.xml
@@ -12,17 +12,17 @@
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="660169a3d7e034a892359e39135e8c2785a6ad6f">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="088f350b39baf8f86c7c1161fd4be178ce822b7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5bb657ada461be666c35f419dbe072ed2ce632fc"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <!-- Stock Android things -->
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.1" path="prebuilts/clang/linux-x86/3.1" revision="5c45f43419d5582949284eee9cef0c43d866e03b"/>
   <project groups="linux" name="platform/prebuilts/clang/linux-x86/3.2" path="prebuilts/clang/linux-x86/3.2" revision="3748b4168e7bd8d46457d4b6786003bc6a5223ce"/>
--- a/b2g/config/nexus-5-l/sources.xml
+++ b/b2g/config/nexus-5-l/sources.xml
@@ -10,17 +10,17 @@
   <!--original fetch url was git://codeaurora.org/-->
   <remote fetch="https://git.mozilla.org/external/caf" name="caf"/>
   <!--original fetch url was https://git.mozilla.org/releases-->
   <remote fetch="https://git.mozilla.org/releases" name="mozillaorg"/>
   <!-- B2G specific things. -->
   <project name="platform_build" path="build" remote="b2g" revision="07c383a786f188904311a37f6062c2cb84c9b61d">
     <copyfile dest="Makefile" src="core/root.mk"/>
   </project>
-  <project name="gaia" path="gaia" remote="mozillaorg" revision="088f350b39baf8f86c7c1161fd4be178ce822b7b"/>
+  <project name="gaia" path="gaia" remote="mozillaorg" revision="bf8565e0c3ad216ccb3f109c17f8a2eb2c42f6b8"/>
   <project name="fake-libdvm" path="dalvik" remote="b2g" revision="d50ae982b19f42f0b66d08b9eb306be81687869f"/>
   <project name="gonk-misc" path="gonk-misc" remote="b2g" revision="9f45c1988fe72749f0659409e6e3320fabf7b79a"/>
   <project name="librecovery" path="librecovery" remote="b2g" revision="1b3591a50ed352fc6ddb77462b7b35d0bfa555a3"/>
   <project name="moztt" path="external/moztt" remote="b2g" revision="657894b4a1dc0a926117f4812e0940229f9f676f"/>
   <project name="rilproxy" path="rilproxy" remote="b2g" revision="5ef30994f4778b4052e58a4383dbe7890048c87e"/>
   <project name="valgrind" path="external/valgrind" remote="b2g" revision="daa61633c32b9606f58799a3186395fd2bbb8d8c"/>
   <project name="vex" path="external/VEX" remote="b2g" revision="47f031c320888fe9f3e656602588565b52d43010"/>
   <project name="apitrace" path="external/apitrace" remote="apitrace" revision="5bb657ada461be666c35f419dbe072ed2ce632fc"/>
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -103,65 +103,22 @@ pref("app.update.altwindowtype", "Browse
 pref("app.update.log", false);
 
 // The number of general background check failures to allow before notifying the
 // user of the failure. User initiated update checks always notify the user of
 // the failure.
 pref("app.update.backgroundMaxErrors", 10);
 
 // The aus update xml certificate checks for application update are disabled on
-// Windows and Mac OS X since the mar signature check are implemented on these
-// platforms and is sufficient to prevent us from applying a mar that is not
-// valid.
-#if defined(XP_WIN) || defined(XP_MACOSX)
+// Windows, Mac OS X, and Linux since the mar signature check are implemented on
+// these platforms and is sufficient to prevent us from applying a mar that is
+// not valid. Bug 1182352 will remove the update xml certificate checks and the
+// following two preferences.
 pref("app.update.cert.requireBuiltIn", false);
 pref("app.update.cert.checkAttributes", false);
-#else
-// When |app.update.cert.requireBuiltIn| is true or not specified the
-// final certificate and all certificates the connection is redirected to before
-// the final certificate for the url specified in the |app.update.url|
-// preference must be built-in.
-pref("app.update.cert.requireBuiltIn", true);
-
-// When |app.update.cert.checkAttributes| is true or not specified the
-// certificate attributes specified in the |app.update.certs.| preference branch
-// are checked against the certificate for the url specified by the
-// |app.update.url| preference.
-pref("app.update.cert.checkAttributes", true);
-
-// The number of certificate attribute check failures to allow for background
-// update checks before notifying the user of the failure. User initiated update
-// checks always notify the user of the certificate attribute check failure.
-pref("app.update.cert.maxErrors", 5);
-
-// The |app.update.certs.| preference branch contains branches that are
-// sequentially numbered starting at 1 that contain attribute name / value
-// pairs for the certificate used by the server that hosts the update xml file
-// as specified in the |app.update.url| preference. When these preferences are
-// present the following conditions apply for a successful update check:
-// 1. the uri scheme must be https
-// 2. the preference name must exist as an attribute name on the certificate and
-//    the value for the name must be the same as the value for the attribute name
-//    on the certificate.
-// If these conditions aren't met it will be treated the same as when there is
-// no update available. This validation will not be performed when the
-// |app.update.url.override| user preference has been set for testing updates or
-// when the |app.update.cert.checkAttributes| preference is set to false. Also,
-// the |app.update.url.override| preference should ONLY be used for testing.
-// IMPORTANT! media.gmp-manager.certs.* prefs should also be updated if these
-// are updated.
-
-// Non-release builds (Nightly, Aurora, etc.) have been switched over to aus4.mozilla.org.
-// This condition protects us against accidentally using it for release builds.
-pref("app.update.certs.1.issuerName", "CN=DigiCert Secure Server CA,O=DigiCert Inc,C=US");
-pref("app.update.certs.1.commonName", "aus4.mozilla.org");
-
-pref("app.update.certs.2.issuerName", "CN=Thawte SSL CA,O=\"Thawte, Inc.\",C=US");
-pref("app.update.certs.2.commonName", "aus4.mozilla.org");
-#endif
 
 // Whether or not app updates are enabled
 pref("app.update.enabled", true);
 
 // This preference turns on app.update.mode and allows automatic download and
 // install to take place. We use a separate boolean toggle for this to make
 // the UI easier to construct.
 pref("app.update.auto", true);
@@ -1979,17 +1936,17 @@ pref("browser.reader.detectedFirstArticl
 // Don't limit how many nodes we care about on desktop:
 pref("reader.parse-node-limit", 0);
 
 pref("browser.pocket.enabled", true);
 pref("browser.pocket.api", "api.getpocket.com");
 pref("browser.pocket.site", "getpocket.com");
 pref("browser.pocket.oAuthConsumerKey", "40249-e88c401e1b1f2242d9e441c4");
 pref("browser.pocket.useLocaleList", true);
-pref("browser.pocket.enabledLocales", "en-US de es-ES ja ja-JP-mac ru");
+pref("browser.pocket.enabledLocales", "cs de en-GB en-US en-ZA es-ES es-MX fr hu it ja ja-JP-mac ko nl pl pt-BR pt-PT ru zh-CN zh-TW");
 
 pref("view_source.tab", true);
 
 // Enable Service Workers for desktop on non-release builds
 #ifndef RELEASE_BUILD
 pref("dom.serviceWorkers.enabled", true);
 pref("dom.serviceWorkers.interception.enabled", true);
 #endif
--- a/browser/base/content/tab-content.js
+++ b/browser/base/content/tab-content.js
@@ -25,17 +25,16 @@ XPCOMUtils.defineLazyGetter(this, "Simpl
   // Register targets
   ssdp.registerDevice({
     id: "roku:ecp",
     target: "roku:ecp",
     factory: function(aService) {
       Cu.import("resource://gre/modules/RokuApp.jsm");
       return new RokuApp(aService);
     },
-    mirror: true,
     types: ["video/mp4"],
     extensions: ["mp4"]
   });
   return ssdp;
 });
 
 // TabChildGlobal
 var global = this;
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -1099,17 +1099,16 @@ BrowserGlue.prototype = {
     }
     var rokuDevice = {
       id: "roku:ecp",
       target: "roku:ecp",
       factory: function(aService) {
         Cu.import("resource://gre/modules/RokuApp.jsm");
         return new RokuApp(aService);
       },
-      mirror: true,
       types: ["video/mp4"],
       extensions: ["mp4"]
     };
 
     // Register targets
     SimpleServiceDiscovery.registerDevice(rokuDevice);
 
     // Search for devices continuously every 120 seconds
--- a/dom/media/tests/mochitest/network.js
+++ b/dom/media/tests/mochitest/network.js
@@ -20,17 +20,17 @@ function isNetworkReady() {
           SpecialPowers.Ci.nsINetworkInterfaceListService.LIST_NOT_INCLUDE_SUPL_INTERFACES |
           SpecialPowers.Ci.nsINetworkInterfaceListService.LIST_NOT_INCLUDE_IMS_INTERFACES |
           SpecialPowers.Ci.nsINetworkInterfaceListService.LIST_NOT_INCLUDE_DUN_INTERFACES |
           SpecialPowers.Ci.nsINetworkInterfaceListService.LIST_NOT_INCLUDE_FOTA_INTERFACES);
     var num = itfList.getNumberOfInterface();
     for (var i = 0; i < num; i++) {
       var ips = {};
       var prefixLengths = {};
-      var length = itfList.getInterface(i).getAddresses(ips, prefixLengths);
+      var length = itfList.getInterfaceInfo(i).getAddresses(ips, prefixLengths);
 
       for (var j = 0; j < length; j++) {
         var ip = ips.value[j];
         // skip IPv6 address until bug 797262 is implemented
         if (ip.indexOf(":") < 0) {
           info("Network interface is ready with address: " + ip);
           return true;
         }
--- a/dom/mobileconnection/gonk/MobileConnectionService.js
+++ b/dom/mobileconnection/gonk/MobileConnectionService.js
@@ -703,20 +703,20 @@ MobileConnectionProvider.prototype = {
     if (isUpdated && !aBatch) {
       this.deliverListenerEvent("notifyVoiceChanged");
     }
   },
 
   updateDataInfo: function(aNewInfo, aBatch = false) {
     // For the data connection, the `connected` flag indicates whether
     // there's an active data call. We get correct `connected` state here.
-    let active = gNetworkManager.active;
+    let active = gNetworkManager.activeNetworkInfo;
     aNewInfo.connected = false;
     if (active &&
-        active.type === Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE &&
+        active.type === Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE &&
         active.serviceId === this._clientId) {
       aNewInfo.connected = true;
     }
 
     let isUpdated = this._updateConnectionInfo(this.data, aNewInfo);
     if (isUpdated && !aBatch) {
       this.deliverListenerEvent("notifyDataChanged");
     }
@@ -1594,21 +1594,20 @@ MobileConnectionService.prototype = {
       case NS_NETWORK_ACTIVE_CHANGED_TOPIC_ID:
         for (let i = 0; i < this.numItems; i++) {
           let provider = this._providers[i];
           // Update connected flag only.
           provider.updateDataInfo({});
         }
         break;
       case NS_DATA_CALL_ERROR_TOPIC_ID:
-        let network = aSubject;
         try {
-          if (network instanceof Ci.nsIRilNetworkInterface) {
-            let rilNetwork = network.QueryInterface(Ci.nsIRilNetworkInterface);
-            this.notifyDataError(rilNetwork.serviceId, rilNetwork);
+          if (aSubject instanceof Ci.nsIRilNetworkInfo) {
+            let rilInfo = aSubject.QueryInterface(Ci.nsIRilNetworkInfo);
+            this.notifyDataError(rilInfo.serviceId, aData);
           }
         } catch (e) {}
         break;
       case NS_PREFBRANCH_PREFCHANGE_TOPIC_ID:
         if (aData === kPrefRilDebuggingEnabled) {
           this._updateDebugFlag();
         }
         break;
--- a/dom/mobilemessage/gonk/MmsService.js
+++ b/dom/mobilemessage/gonk/MmsService.js
@@ -222,20 +222,20 @@ function MmsConnection(aServiceId) {
 MmsConnection.prototype = {
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver]),
 
   /** MMS proxy settings. */
   mmsc:     "",
   mmsProxy: "",
   mmsPort:  -1,
 
-  setApnSetting: function(network) {
-    this.mmsc = network.mmsc;
-    this.mmsProxy = network.mmsProxy;
-    this.mmsPort = network.mmsPort;
+  setApnSetting: function(networkInfo) {
+    this.mmsc = networkInfo.mmsc;
+    this.mmsProxy = networkInfo.mmsProxy;
+    this.mmsPort = networkInfo.mmsPort;
   },
 
   get proxyInfo() {
     if (!this.mmsProxy) {
       if (DEBUG) debug("getProxyInfo: MMS proxy is not available.");
       return null;
     }
 
@@ -263,18 +263,18 @@ MmsConnection.prototype = {
   pendingCallbacks: null,
 
   /** MMS network connection reference count. */
   refCount: 0,
 
   // cache of hosts to be accessed when this connection is alive.
   hostsToRoute: null,
 
-  // cache of the networkInterface acquired during this connection.
-  networkInterface: null,
+  // cache of the networkInfo acquired during this connection.
+  networkInfo: null,
 
   connectTimer: null,
 
   disconnectTimer: null,
 
   /**
    * Callback when |connectTimer| is timeout or cancelled by shutdown.
    */
@@ -298,24 +298,24 @@ MmsConnection.prototype = {
       return;
     }
 
     let deactivateMmsDataCall = (aError) => {
       if (aError) debug("Failed to removeHostRoute: " + aError);
 
       // Clear cache.
       this.hostsToRoute = [];
-      this.networkInterface = null;
+      this.networkInfo = null;
 
-      this.radioInterface.deactivateDataCallByType(Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS);
+      this.radioInterface.deactivateDataCallByType(Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_MMS);
     };
 
     let promises =
       this.hostsToRoute.map((aHost) => {
-        return gNetworkManager.removeHostRoute(this.networkInterface, aHost);
+        return gNetworkManager.removeHostRoute(this.networkInfo, aHost);
       });
 
     return Promise.all(promises)
       .then(() => deactivateMmsDataCall(),
             (aError) => deactivateMmsDataCall(aError));
   },
 
   init: function() {
@@ -437,17 +437,17 @@ MmsConnection.prototype = {
       // MMS network fails to be connected within a time period.
       this.connectTimer.
         initWithCallback(() => this.flushPendingCallbacks(_HTTP_STATUS_ACQUIRE_TIMEOUT),
                          TIME_TO_BUFFER_MMS_REQUESTS,
                          Ci.nsITimer.TYPE_ONE_SHOT);
 
       // Bug 1059110: Ensure all the initialization are done before setup data call.
       if (DEBUG) debug("acquire: buffer the MMS request and setup the MMS data call.");
-      this.radioInterface.setupDataCallByType(Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS);
+      this.radioInterface.setupDataCallByType(Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_MMS);
 
       return false;
     }
 
     callback(true, _HTTP_STATUS_ACQUIRE_CONNECTION_SUCCESS);
     return true;
   },
 
@@ -489,17 +489,17 @@ MmsConnection.prototype = {
       host = url;
     }
 
     try {
       let uri = Services.io.newURI(host, null, null);
       host = uri.host;
     } catch (e) {}
 
-    return gNetworkManager.addHostRoute(this.networkInterface, host)
+    return gNetworkManager.addHostRoute(this.networkInfo, host)
       .then(() => {
         if (this.hostsToRoute.indexOf(host) < 0) {
           this.hostsToRoute.push(host);
         }
       });
   },
 
   shutdown: function() {
@@ -512,50 +512,50 @@ MmsConnection.prototype = {
     this.onDisconnectTimerTimeout();
   },
 
   // nsIObserver
 
   observe: function(subject, topic, data) {
     switch (topic) {
       case kNetworkConnStateChangedTopic: {
-        // The network for MMS connection must be nsIRilNetworkInterface.
-        if (!(subject instanceof Ci.nsIRilNetworkInterface)) {
+        // The network info for MMS connection must be nsIRilNetworkInfo.
+        if (!(subject instanceof Ci.nsIRilNetworkInfo)) {
           return;
         }
 
         // Check if the network state change belongs to this service.
-        let network = subject.QueryInterface(Ci.nsIRilNetworkInterface);
-        if (network.serviceId != this.serviceId ||
-            network.type != Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS) {
+        let networkInfo = subject.QueryInterface(Ci.nsIRilNetworkInfo);
+        if (networkInfo.serviceId != this.serviceId ||
+            networkInfo.type != Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_MMS) {
           return;
         }
 
         let connected =
-          network.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED;
+          networkInfo.state == Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED;
 
         // Return if the MMS network state doesn't change, where the network
         // state change can come from other non-MMS networks.
         if (connected == this.connected) {
           return;
         }
 
         this.connected = connected;
         if (!this.connected) {
           this.hostsToRoute = [];
-          this.networkInterface = null;
+          this.networkInfo = null;
           return;
         }
 
         // Set up the MMS APN setting based on the connected MMS network,
         // which is going to be used for the HTTP requests later.
-        this.setApnSetting(network);
+        this.setApnSetting(networkInfo);
 
-        // Cache connected network.
-        this.networkInterface = network;
+        // Cache connected network info.
+        this.networkInfo = networkInfo;
 
         if (DEBUG) debug("Got the MMS network connected! Resend the buffered " +
                          "MMS requests: number: " + this.pendingCallbacks.length);
         this.connectTimer.cancel();
         this.flushPendingCallbacks(_HTTP_STATUS_ACQUIRE_CONNECTION_SUCCESS);
         break;
       }
       case NS_XPCOM_SHUTDOWN_OBSERVER_ID: {
@@ -740,17 +740,17 @@ XPCOMUtils.defineLazyGetter(this, "gMmsT
           debug('Failed to start a transaction: ' + aReason);
           mmsConnection.release();
           cancellable.done(_HTTP_STATUS_FAILED_TO_ROUTE, null);
         };
 
         // TODO: |getNetId| will be implemented as a sync call in nsINetworkManager
         //       once Bug 1141903 is landed.
         mmsConnection.ensureRouting(url)
-          .then(() => gNetworkService.getNetId(mmsConnection.networkInterface.name))
+          .then(() => gNetworkService.getNetId(mmsConnection.networkInfo.name))
           .then((netId) => startTransaction(netId))
           .catch((aReason) => onRejected(aReason));
       });
 
       return cancellable;
     },
 
     sendHttpRequest: function(mmsConnection, method, url, istream, proxyFilter,
--- a/dom/network/NetworkStatsService.jsm
+++ b/dom/network/NetworkStatsService.jsm
@@ -21,18 +21,18 @@ Cu.import("resource://gre/modules/Networ
 Cu.import("resource://gre/modules/Timer.jsm");
 
 const NET_NETWORKSTATSSERVICE_CONTRACTID = "@mozilla.org/network/netstatsservice;1";
 const NET_NETWORKSTATSSERVICE_CID = Components.ID("{18725604-e9ac-488a-8aa0-2471e7f6c0a4}");
 
 const TOPIC_BANDWIDTH_CONTROL = "netd-bandwidth-control"
 
 const TOPIC_CONNECTION_STATE_CHANGED = "network-connection-state-changed";
-const NET_TYPE_WIFI = Ci.nsINetworkInterface.NETWORK_TYPE_WIFI;
-const NET_TYPE_MOBILE = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE;
+const NET_TYPE_WIFI = Ci.nsINetworkInfo.NETWORK_TYPE_WIFI;
+const NET_TYPE_MOBILE = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE;
 
 // Networks have different status that NetworkStats API needs to be aware of.
 // Network is present and ready, so NetworkManager provides the whole info.
 const NETWORK_STATUS_READY   = 0;
 // Network is present but hasn't established a connection yet (e.g. SIM that has not
 // enabled 3G since boot).
 const NETWORK_STATUS_STANDBY = 1;
 // Network is not present, but stored in database by the previous connections.
@@ -187,20 +187,20 @@ this.NetworkStatsService = {
   observe: function observe(aSubject, aTopic, aData) {
     switch (aTopic) {
       case TOPIC_CONNECTION_STATE_CHANGED:
 
         // If new interface is registered (notified from NetworkService),
         // the stats are updated for the new interface without waiting to
         // complete the updating period.
 
-        let network = aSubject.QueryInterface(Ci.nsINetworkInterface);
-        debug("Network " + network.name + " of type " + network.type + " status change");
+        let networkInfo = aSubject.QueryInterface(Ci.nsINetworkInfo);
+        debug("Network " + networkInfo.name + " of type " + networkInfo.type + " status change");
 
-        let netId = this.convertNetworkInterface(network);
+        let netId = this.convertNetworkInfo(networkInfo);
         if (!netId) {
           break;
         }
 
         this._updateCurrentAlarm(netId);
 
         debug("NetId: " + netId);
         this.updateStats(netId);
@@ -264,43 +264,43 @@ this.NetworkStatsService = {
                                       NET_TYPE_MOBILE);
         networks[netId] = { id : icc.iccInfo.iccid,
                             type: NET_TYPE_MOBILE };
       }
     }
     return networks;
   },
 
-  convertNetworkInterface: function(aNetwork) {
-    if (aNetwork.type != NET_TYPE_MOBILE &&
-        aNetwork.type != NET_TYPE_WIFI) {
+  convertNetworkInfo: function(aNetworkInfo) {
+    if (aNetworkInfo.type != NET_TYPE_MOBILE &&
+        aNetworkInfo.type != NET_TYPE_WIFI) {
       return null;
     }
 
     let id = '0';
-    if (aNetwork.type == NET_TYPE_MOBILE) {
-      if (!(aNetwork instanceof Ci.nsIRilNetworkInterface)) {
-        debug("Error! Mobile network should be an nsIRilNetworkInterface!");
+    if (aNetworkInfo.type == NET_TYPE_MOBILE) {
+      if (!(aNetworkInfo instanceof Ci.nsIRilNetworkInfo)) {
+        debug("Error! Mobile network should be an nsIRilNetworkInfo!");
         return null;
       }
 
-      let rilNetwork = aNetwork.QueryInterface(Ci.nsIRilNetworkInterface);
+      let rilNetwork = aNetworkInfo.QueryInterface(Ci.nsIRilNetworkInfo);
       id = rilNetwork.iccId;
     }
 
-    let netId = this.getNetworkId(id, aNetwork.type);
+    let netId = this.getNetworkId(id, aNetworkInfo.type);
 
     if (!this._networks[netId]) {
       this._networks[netId] = Object.create(null);
       this._networks[netId].network = { id: id,
-                                        type: aNetwork.type };
+                                        type: aNetworkInfo.type };
     }
 
     this._networks[netId].status = NETWORK_STATUS_READY;
-    this._networks[netId].interfaceName = aNetwork.name;
+    this._networks[netId].interfaceName = aNetworkInfo.name;
     return netId;
   },
 
   getNetworkId: function getNetworkId(aIccId, aNetworkType) {
     return aIccId + '' + aNetworkType;
   },
 
   /* Function to ensure that one network is valid. The network is valid if its status is
@@ -733,20 +733,20 @@ this.NetworkStatsService = {
         aCallback(true, "OK");
       }
     });
   },
 
   /*
    * Function responsible for receiving stats which are not from netd.
    */
-  saveStats: function saveStats(aAppId, aIsInBrowser, aServiceType, aNetwork,
+  saveStats: function saveStats(aAppId, aIsInBrowser, aServiceType, aNetworkInfo,
                                 aTimeStamp, aRxBytes, aTxBytes, aIsAccumulative,
                                 aCallback) {
-    let netId = this.convertNetworkInterface(aNetwork);
+    let netId = this.convertNetworkInfo(aNetworkInfo);
     if (!netId) {
       if (aCallback) {
         aCallback(false, "Invalid network type");
       }
       return;
     }
 
     // Check if |aConnectionType|, |aAppId| and |aServiceType| are valid.
--- a/dom/network/NetworkStatsServiceProxy.js
+++ b/dom/network/NetworkStatsServiceProxy.js
@@ -24,66 +24,66 @@ function NetworkStatsServiceProxy() {
   }
 }
 
 NetworkStatsServiceProxy.prototype = {
   /*
    * Function called in the protocol layer (HTTP, FTP, WebSocket ...etc)
    * to pass the per-app stats to NetworkStatsService.
    */
-  saveAppStats: function saveAppStats(aAppId, aIsInBrowser, aNetwork, aTimeStamp,
+  saveAppStats: function saveAppStats(aAppId, aIsInBrowser, aNetworkInfo, aTimeStamp,
                                       aRxBytes, aTxBytes, aIsAccumulative,
                                       aCallback) {
-    if (!aNetwork) {
+    if (!aNetworkInfo) {
       if (DEBUG) {
-        debug("|aNetwork| is not specified. Failed to save stats. Returning.");
+        debug("|aNetworkInfo| is not specified. Failed to save stats. Returning.");
       }
       return;
     }
 
     if (DEBUG) {
       debug("saveAppStats: " + aAppId + " " + aIsInBrowser + " " +
-            aNetwork.type + " " + aTimeStamp + " " +
+            aNetworkInfo.type + " " + aTimeStamp + " " +
             aRxBytes + " " + aTxBytes + " " + aIsAccumulative);
     }
 
     if (aCallback) {
       aCallback = aCallback.notify;
     }
 
-    NetworkStatsService.saveStats(aAppId, aIsInBrowser, "", aNetwork,
+    NetworkStatsService.saveStats(aAppId, aIsInBrowser, "", aNetworkInfo,
                                   aTimeStamp, aRxBytes, aTxBytes,
                                   aIsAccumulative, aCallback);
   },
 
   /*
    * Function called in the points of different system services
    * to pass the per-service stats to NetworkStatsService.
    */
-  saveServiceStats: function saveServiceStats(aServiceType, aNetwork,
+  saveServiceStats: function saveServiceStats(aServiceType, aNetworkInfo,
                                               aTimeStamp, aRxBytes, aTxBytes,
                                               aIsAccumulative, aCallback) {
-    if (!aNetwork) {
+    if (!aNetworkInfo) {
       if (DEBUG) {
-        debug("|aNetwork| is not specified. Failed to save stats. Returning.");
+        debug("|aNetworkInfo| is not specified. Failed to save stats. Returning.");
       }
       return;
     }
 
     if (DEBUG) {
-      debug("saveServiceStats: " + aServiceType + " " + aNetwork.type + " " +
+      debug("saveServiceStats: " + aServiceType + " " + aNetworkInfo.type + " " +
             aTimeStamp + " " + aRxBytes + " " + aTxBytes + " " +
             aIsAccumulative);
     }
 
     if (aCallback) {
       aCallback = aCallback.notify;
     }
 
-    NetworkStatsService.saveStats(0, false, aServiceType ,aNetwork, aTimeStamp,
+    NetworkStatsService.saveStats(0, false, aServiceType , aNetworkInfo, aTimeStamp,
                                   aRxBytes, aTxBytes, aIsAccumulative,
                                   aCallback);
   },
 
   classID : NETWORKSTATSSERVICEPROXY_CID,
   QueryInterface : XPCOMUtils.generateQI([nsINetworkStatsServiceProxy]),
 }
 
--- a/dom/network/TCPSocket.js
+++ b/dom/network/TCPSocket.js
@@ -180,17 +180,17 @@ TCPSocket.prototype = {
   _trackingNumber: 0,
 
 #ifdef MOZ_WIDGET_GONK
   // Network statistics (Gonk-specific feature)
   _txBytes: 0,
   _rxBytes: 0,
   _appId: Ci.nsIScriptSecurityManager.NO_APP_ID,
   _inBrowser: false,
-  _activeNetwork: null,
+  _activeNetworkInfo: null,
 #endif
 
   // Public accessors.
   get readyState() {
     return this._readyState;
   },
   get binaryType() {
     return this._binaryType;
@@ -369,17 +369,17 @@ TCPSocket.prototype = {
     }
 
     let nssProxy = Cc["@mozilla.org/networkstatsServiceProxy;1"]
                      .getService(Ci.nsINetworkStatsServiceProxy);
     if (!nssProxy) {
       LOG("Error: Ci.nsINetworkStatsServiceProxy service is not available.");
       return;
     }
-    nssProxy.saveAppStats(this._appId, this._inBrowser, this._activeNetwork,
+    nssProxy.saveAppStats(this._appId, this._inBrowser, this._activeNetworkInfo,
                           Date.now(), this._rxBytes, this._txBytes, false);
 
     // Reset the counters once the statistics is saved to NetworkStatsServiceProxy.
     this._txBytes = this._rxBytes = 0;
   },
   // End of helper method for network statistics.
 #endif
 
@@ -611,22 +611,22 @@ TCPSocket.prototype = {
       return that;
     }
 
     let transport = that._transport = this._createTransport(host, port, that._ssl);
     transport.setEventSink(that, Services.tm.currentThread);
     that._initStream(that._binaryType);
 
 #ifdef MOZ_WIDGET_GONK
-    // Set _activeNetwork, which is only required for network statistics.
+    // Set _activeNetworkInfo, which is only required for network statistics.
     // Note that nsINetworkManager, as well as nsINetworkStatsServiceProxy, is
     // Gonk-specific.
     let networkManager = Cc["@mozilla.org/network/manager;1"].getService(Ci.nsINetworkManager);
     if (networkManager) {
-      that._activeNetwork = networkManager.active;
+      that._activeNetworkInfo = networkManager.activeNetworkInfo;
     }
 #endif
 
     return that;
   },
 
   upgradeToSecure: function ts_upgradeToSecure() {
     if (this._readyState !== kOPEN) {
--- a/dom/network/interfaces/nsINetworkStatsServiceProxy.idl
+++ b/dom/network/interfaces/nsINetworkStatsServiceProxy.idl
@@ -1,43 +1,43 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
 * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsISupports.idl"
 
-interface nsINetworkInterface;
+interface nsINetworkInfo;
 
 [scriptable, function, uuid(5f821529-1d80-4ab5-a933-4e1b3585b6bc)]
 interface nsINetworkStatsServiceProxyCallback : nsISupports
 {
   /*
    * @param aResult callback result with boolean value
    * @param aMessage message
    */
   void notify(in boolean aResult, in jsval aMessage);
 };
 
-[scriptable, uuid(98fd8f69-784e-4626-aa59-56d6436a3c24)]
+[scriptable, uuid(f4f3e901-e102-499d-9d37-dc9951f52df7)]
 interface nsINetworkStatsServiceProxy : nsISupports
 {
   /*
    * An interface used to record per-app traffic data.
    * @param aAppId app id
    * @param aIsInBrowser true if the iframe element is mozbrowser
    * @param aNetworkInterface network
    * @param aTimeStamp time stamp
    * @param aRxBytes received data amount
    * @param aTxBytes transmitted data amount
    * @param aIsAccumulative is stats accumulative
    * @param aCallback an optional callback
    */
   void saveAppStats(in unsigned long aAppId,
                     in boolean aIsInBrowser,
-                    in nsINetworkInterface aNetwork,
+                    in nsINetworkInfo aNetworkInfo,
                     in unsigned long long aTimeStamp,
                     in unsigned long long aRxBytes,
                     in unsigned long long aTxBytes,
                     in boolean aIsAccumulative,
          [optional] in nsINetworkStatsServiceProxyCallback aCallback);
 
   /*
    * An interface used to record per-system service traffic data.
@@ -45,15 +45,15 @@ interface nsINetworkStatsServiceProxy : 
    * @param aNetworkInterface network
    * @param aTimeStamp time stamp
    * @param aRxBytes received data amount
    * @param aTxBytes transmitted data amount
    * @param aIsAccumulative is stats accumulative
    * @param aCallback an optional callback
    */
   void saveServiceStats(in string aServiceType,
-                        in nsINetworkInterface aNetwork,
+                        in nsINetworkInfo aNetworkInfo,
                         in unsigned long long aTimeStamp,
                         in unsigned long long aRxBytes,
                         in unsigned long long aTxBytes,
                         in boolean aIsAccumulative,
              [optional] in nsINetworkStatsServiceProxyCallback aCallback);
 };
--- a/dom/network/tests/unit_stats/test_networkstats_db.js
+++ b/dom/network/tests/unit_stats/test_networkstats_db.js
@@ -931,17 +931,17 @@ var alarms = [{ id:                null,
 var alarmsDbId = 1;
 
 add_test(function test_addAlarm() {
   // Add alarms[0] -> DB: [ alarms[0] (id: 1) ]
   // Check the insertion is OK.
   netStatsDb.addAlarm(alarms[0], function(error, result) {
     do_check_eq(error, null);
     alarmsDbId = result;
-    netStatsDb.getAlarms(Ci.nsINetworkInterface.NETWORK_TYPE_WIFI, exampleManifestURL, function(error, result) {
+    netStatsDb.getAlarms(Ci.nsINetworkInfo.NETWORK_TYPE_WIFI, exampleManifestURL, function(error, result) {
       do_check_eq(error, null);
       do_check_eq(result.length, 1);
       do_check_eq(result[0].id, alarmsDbId);
       do_check_eq(result[0].networkId, alarms[0].networkId);
       do_check_eq(result[0].absoluteThreshold, alarms[0].absoluteThreshold);
       do_check_eq(result[0].relativeThreshold, alarms[0].relativeThreshold);
       do_check_eq(result[0].data.foo, alarms[0].data.foo);
       run_next_test();
--- a/dom/network/tests/unit_stats/test_networkstats_service.js
+++ b/dom/network/tests/unit_stats/test_networkstats_service.js
@@ -255,29 +255,29 @@ add_test(function test_fireAlarm() {
                 data: null,
                 pageURL: testPageURL,
                 manifestURL: testManifestURL };
 
   // Set wifi status to standby to avoid connecting to netd when adding an alarm.
   NetworkStatsService._networks[wifiId].status = NETWORK_STATUS_STANDBY;
 
   NetworkStatsService._db.addAlarm(alarm, function addSuccessCb(error, newId) {
-    NetworkStatsService._db.getAlarms(Ci.nsINetworkInterface.NETWORK_TYPE_WIFI,
+    NetworkStatsService._db.getAlarms(Ci.nsINetworkInfo.NETWORK_TYPE_WIFI,
                                       testManifestURL, function onGet(error, result) {
       do_check_eq(error, null);
       do_check_eq(result.length, 1);
 
       // Result of getAlarms is based on expected child's data format, so
       // some changes are needed to be able to use it.
       result[0].networkId = wifiId;
       result[0].pageURL = testPageURL;
       result[0].manifestURL = testManifestURL;
 
       NetworkStatsService._fireAlarm(result[0], false);
-      NetworkStatsService._db.getAlarms(Ci.nsINetworkInterface.NETWORK_TYPE_WIFI,
+      NetworkStatsService._db.getAlarms(Ci.nsINetworkInfo.NETWORK_TYPE_WIFI,
                                         testManifestURL, function onGet(error, result) {
         do_check_eq(error, undefined);
         do_check_eq(result.length, 0);
         run_next_test();
       });
     });
   });
 });
--- a/dom/network/tests/unit_stats/test_networkstats_service_proxy.js
+++ b/dom/network/tests/unit_stats/test_networkstats_service_proxy.js
@@ -4,51 +4,50 @@
 const {classes: Cc, interfaces: Ci, utils: Cu, results: Cr} = Components;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
 XPCOMUtils.defineLazyServiceGetter(this, "nssProxy",
                                    "@mozilla.org/networkstatsServiceProxy;1",
                                    "nsINetworkStatsServiceProxy");
 
-function mokConvertNetworkInterface() {
-  NetworkStatsService.convertNetworkInterface = function(aNetwork) {
-    if (aNetwork.type != Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE &&
-        aNetwork.type != Ci.nsINetworkInterface.NETWORK_TYPE_WIFI) {
+function mokConvertNetworkInfo() {
+  NetworkStatsService.convertNetworkInfo = function(aNetworkInfo) {
+    if (aNetworkInfo.type != Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE &&
+        aNetworkInfo.type != Ci.nsINetworkInfo.NETWORK_TYPE_WIFI) {
       return null;
     }
 
     let id = '0';
-    if (aNetwork.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE) {
+    if (aNetworkInfo.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE) {
       id = '1234'
     }
 
-    let netId = this.getNetworkId(id, aNetwork.type);
+    let netId = this.getNetworkId(id, aNetworkInfo.type);
 
     if (!this._networks[netId]) {
       this._networks[netId] = Object.create(null);
       this._networks[netId].network = { id: id,
-                                        type: aNetwork.type };
+                                        type: aNetworkInfo.type };
     }
 
     return netId;
   };
 }
 
 add_test(function test_saveAppStats() {
   var cachedStats = NetworkStatsService.cachedStats;
   var timestamp = NetworkStatsService.cachedStatsDate.getTime();
 
-  // Create to fake nsINetworkInterfaces. As nsINetworkInterface can not
-  // be instantiated, these two vars will emulate it by filling the properties
-  // that will be used.
-  var wifi = {type: Ci.nsINetworkInterface.NETWORK_TYPE_WIFI, id: "0"};
-  var mobile = {type: Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE, id: "1234"};
+  // Create to fake nsINetworkInfos. As nsINetworkInfo can not be instantiated,
+  // these two vars will emulate it by filling the properties that will be used.
+  var wifi = {type: Ci.nsINetworkInfo.NETWORK_TYPE_WIFI, id: "0"};
+  var mobile = {type: Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE, id: "1234"};
 
-  // Insert fake mobile network interface in NetworkStatsService
+  // Insert fake mobile network info in NetworkStatsService
   var mobileNetId = NetworkStatsService.getNetworkId(mobile.id, mobile.type);
 
   do_check_eq(Object.keys(cachedStats).length, 0);
 
   nssProxy.saveAppStats(1, false, wifi, timestamp, 10, 20, false,
                         function (success, message) {
     do_check_eq(success, true);
     nssProxy.saveAppStats(1, false, mobile, timestamp, 10, 20, false,
@@ -78,23 +77,22 @@ add_test(function test_saveAppStats() {
       run_next_test();
     });
   });
 });
 
 add_test(function test_saveServiceStats() {
   var timestamp = NetworkStatsService.cachedStatsDate.getTime();
 
-  // Create to fake nsINetworkInterfaces. As nsINetworkInterface can not
-  // be instantiated, these two vars will emulate it by filling the properties
-  // that will be used.
-  var wifi = {type: Ci.nsINetworkInterface.NETWORK_TYPE_WIFI, id: "0"};
-  var mobile = {type: Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE, id: "1234"};
+  // Create to fake nsINetworkInfos. As nsINetworkInfo can not be instantiated,
+  // these two vars will emulate it by filling the properties that will be used.
+  var wifi = {type: Ci.nsINetworkInfo.NETWORK_TYPE_WIFI, id: "0"};
+  var mobile = {type: Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE, id: "1234"};
 
-  // Insert fake mobile network interface in NetworkStatsService
+  // Insert fake mobile network info in NetworkStatsService
   var mobileNetId = NetworkStatsService.getNetworkId(mobile.id, mobile.type);
 
   NetworkStatsService.updateCachedStats(function (success, msg) {
     do_check_eq(success, true);
 
     var cachedStats = NetworkStatsService.cachedStats;
     do_check_eq(Object.keys(cachedStats).length, 0);
 
@@ -133,17 +131,17 @@ add_test(function test_saveServiceStats(
     });
   });
 });
 
 add_test(function test_saveStatsWithDifferentDates() {
   var today = NetworkStatsService.cachedStatsDate;
   var tomorrow = new Date(today.getTime() + (24 * 60 * 60 * 1000));
 
-  var mobile = {type: Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE, id: "1234"};
+  var mobile = {type: Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE, id: "1234"};
 
   NetworkStatsService.updateCachedStats(function (success, message) {
     do_check_eq(success, true);
 
     do_check_eq(Object.keys(NetworkStatsService.cachedStats).length, 0);
     nssProxy.saveAppStats(1, false, mobile, today.getTime(), 10, 20, false,
                           function (success, message) {
       do_check_eq(success, true);
@@ -168,17 +166,17 @@ add_test(function test_saveStatsWithDiff
       });
     });
   });
 });
 
 add_test(function test_saveStatsWithMaxCachedTraffic() {
   var timestamp = NetworkStatsService.cachedStatsDate.getTime();
   var maxtraffic = NetworkStatsService.maxCachedTraffic;
-  var wifi = {type: Ci.nsINetworkInterface.NETWORK_TYPE_WIFI, id: "0"};
+  var wifi = {type: Ci.nsINetworkInfo.NETWORK_TYPE_WIFI, id: "0"};
 
   NetworkStatsService.updateCachedStats(function (success, message) {
     do_check_eq(success, true);
 
     var cachedStats = NetworkStatsService.cachedStats;
     do_check_eq(Object.keys(cachedStats).length, 0);
     nssProxy.saveAppStats(1, false, wifi, timestamp, 10, 20, false,
                           function (success, message) {
@@ -194,21 +192,21 @@ add_test(function test_saveStatsWithMaxC
     });
   });
 });
 
 add_test(function test_saveAppStats() {
   var cachedStats = NetworkStatsService.cachedStats;
   var timestamp = NetworkStatsService.cachedStatsDate.getTime();
 
-  // Create to fake nsINetworkInterfaces. As nsINetworkInterface can not
+  // Create to fake nsINetworkInfo. As nsINetworkInfo can not
   // be instantiated, these two vars will emulate it by filling the properties
   // that will be used.
-  var wifi = {type: Ci.nsINetworkInterface.NETWORK_TYPE_WIFI, id: "0"};
-  var mobile = {type: Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE, id: "1234"};
+  var wifi = {type: Ci.nsINetworkInfo.NETWORK_TYPE_WIFI, id: "0"};
+  var mobile = {type: Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE, id: "1234"};
 
   // Insert fake mobile network interface in NetworkStatsService
   var mobileNetId = NetworkStatsService.getNetworkId(mobile.id, mobile.type);
 
   do_check_eq(Object.keys(cachedStats).length, 0);
 
   nssProxy.saveAppStats(1, false, wifi, timestamp, 10, 20, false, { notify:
                         function (success, message) {
@@ -227,14 +225,14 @@ add_test(function test_saveAppStats() {
   }});
 });
 
 function run_test() {
   do_get_profile();
 
   Cu.import("resource://gre/modules/NetworkStatsService.jsm");
 
-  // Function convertNetworkInterface of NetworkStatsService causes errors when dealing
+  // Function convertNetworkInfo of NetworkStatsService causes errors when dealing
   // with RIL to get the iccid, so overwrite it.
-  mokConvertNetworkInterface();
+  mokConvertNetworkInfo();
 
   run_next_test();
 }
--- a/dom/push/PushServiceWebSocket.jsm
+++ b/dom/push/PushServiceWebSocket.jsm
@@ -1251,34 +1251,34 @@ let PushNetworkInfo = {
     try {
       if (!prefs.get("udp.wakeupEnabled")) {
         debug("UDP support disabled, we do not send any carrier info");
         throw new Error("UDP disabled");
       }
 
       let nm = Cc["@mozilla.org/network/manager;1"]
                  .getService(Ci.nsINetworkManager);
-      if (nm.active &&
-          nm.active.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE) {
+      if (nm.activeNetworkInfo &&
+          nm.activeNetworkInfo.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE) {
         let iccService = Cc["@mozilla.org/icc/iccservice;1"]
                            .getService(Ci.nsIIccService);
         // TODO: Bug 927721 - PushService for multi-sim
         // In Multi-sim, there is more than one client in iccService. Each
         // client represents a icc handle. To maintain backward compatibility
         // with single sim, we always use client 0 for now. Adding support
         // for multiple sim will be addressed in bug 927721, if needed.
         let clientId = 0;
         let icc = iccService.getIccByServiceId(clientId);
         let iccInfo = icc && icc.iccInfo;
         if (iccInfo) {
           debug("Running on mobile data");
 
           let ips = {};
           let prefixLengths = {};
-          nm.active.getAddresses(ips, prefixLengths);
+          nm.activeNetworkInfo.getAddresses(ips, prefixLengths);
 
           return {
             mcc: iccInfo.mcc,
             mnc: iccInfo.mnc,
             ip:  ips.value[0]
           };
         }
       }
--- a/dom/simplepush/PushService.jsm
+++ b/dom/simplepush/PushService.jsm
@@ -1769,32 +1769,33 @@ this.PushService = {
 
     try {
       if (!prefs.get("udp.wakeupEnabled")) {
         debug("UDP support disabled, we do not send any carrier info");
         throw new Error("UDP disabled");
       }
 
       let nm = Cc["@mozilla.org/network/manager;1"].getService(Ci.nsINetworkManager);
-      if (nm.active && nm.active.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE) {
+      if (nm.activeNetworkInfo &&
+          nm.activeNetworkInfo.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE) {
         let iccService = Cc["@mozilla.org/icc/iccservice;1"].getService(Ci.nsIIccService);
         // TODO: Bug 927721 - PushService for multi-sim
         // In Multi-sim, there is more than one client in iccService. Each
         // client represents a icc handle. To maintain backward compatibility
         // with single sim, we always use client 0 for now. Adding support
         // for multiple sim will be addressed in bug 927721, if needed.
         let clientId = 0;
         let icc = iccService.getIccByServiceId(clientId);
         let iccInfo = icc && icc.iccInfo;
         if (iccInfo) {
           debug("Running on mobile data");
 
           let ips = {};
           let prefixLengths = {};
-          nm.active.getAddresses(ips, prefixLengths);
+          nm.activeNetworkInfo.getAddresses(ips, prefixLengths);
 
           return {
             mcc: iccInfo.mcc,
             mnc: iccInfo.mnc,
             ip:  ips.value[0]
           }
         }
       }
--- a/dom/system/gonk/DataCallManager.js
+++ b/dom/system/gonk/DataCallManager.js
@@ -48,38 +48,40 @@ let RILQUIRKS_SUBSCRIPTION_CONTROL =
 let RILQUIRKS_HAVE_IPV6 =
   libcutils.property_get("ro.moz.ril.ipv6", "false") == "true";
 
 const DATACALLMANAGER_CID =
   Components.ID("{35b9efa2-e42c-45ce-8210-0a13e6f4aadc}");
 const DATACALLHANDLER_CID =
   Components.ID("{132b650f-c4d8-4731-96c5-83785cb31dee}");
 const RILNETWORKINTERFACE_CID =
-  Components.ID("{8c11bef9-9b4f-4d96-bed7-f5a1f48eabda}");
+  Components.ID("{9574ee84-5d0d-4814-b9e6-8b279e03dcf4}");
+const RILNETWORKINFO_CID =
+  Components.ID("{dd6cf2f0-f0e3-449f-a69e-7c34fdcb8d4b}");
 
 const TOPIC_XPCOM_SHUTDOWN      = "xpcom-shutdown";
 const TOPIC_MOZSETTINGS_CHANGED = "mozsettings-changed";
 const TOPIC_PREF_CHANGED        = "nsPref:changed";
 const TOPIC_DATA_CALL_ERROR     = "data-call-error";
 const PREF_RIL_DEBUG_ENABLED    = "ril.debugging.enabled";
 
-const NETWORK_TYPE_UNKNOWN     = Ci.nsINetworkInterface.NETWORK_TYPE_UNKNOWN;
-const NETWORK_TYPE_WIFI        = Ci.nsINetworkInterface.NETWORK_TYPE_WIFI;
-const NETWORK_TYPE_MOBILE      = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE;
-const NETWORK_TYPE_MOBILE_MMS  = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS;
-const NETWORK_TYPE_MOBILE_SUPL = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL;
-const NETWORK_TYPE_MOBILE_IMS  = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS;
-const NETWORK_TYPE_MOBILE_DUN  = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN;
-const NETWORK_TYPE_MOBILE_FOTA = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_FOTA;
+const NETWORK_TYPE_UNKNOWN     = Ci.nsINetworkInfo.NETWORK_TYPE_UNKNOWN;
+const NETWORK_TYPE_WIFI        = Ci.nsINetworkInfo.NETWORK_TYPE_WIFI;
+const NETWORK_TYPE_MOBILE      = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE;
+const NETWORK_TYPE_MOBILE_MMS  = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_MMS;
+const NETWORK_TYPE_MOBILE_SUPL = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_SUPL;
+const NETWORK_TYPE_MOBILE_IMS  = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_IMS;
+const NETWORK_TYPE_MOBILE_DUN  = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN;
+const NETWORK_TYPE_MOBILE_FOTA = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_FOTA;
 
-const NETWORK_STATE_UNKNOWN       = Ci.nsINetworkInterface.NETWORK_STATE_UNKNOWN;
-const NETWORK_STATE_CONNECTING    = Ci.nsINetworkInterface.NETWORK_STATE_CONNECTING;
-const NETWORK_STATE_CONNECTED     = Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED;
-const NETWORK_STATE_DISCONNECTING = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTING;
-const NETWORK_STATE_DISCONNECTED  = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED;
+const NETWORK_STATE_UNKNOWN       = Ci.nsINetworkInfo.NETWORK_STATE_UNKNOWN;
+const NETWORK_STATE_CONNECTING    = Ci.nsINetworkInfo.NETWORK_STATE_CONNECTING;
+const NETWORK_STATE_CONNECTED     = Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED;
+const NETWORK_STATE_DISCONNECTING = Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTING;
+const NETWORK_STATE_DISCONNECTED  = Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED;
 
 const INT32_MAX = 2147483647;
 
 // set to true in ril_consts.js to see debug messages
 var DEBUG = RIL.DEBUG_RIL;
 
 function updateDebugFlag() {
   // Read debug setting from pref
@@ -410,17 +412,17 @@ DataCallHandler.prototype = {
       gNetworkManager.unregisterNetworkInterface(networkInterface);
       networkInterface.shutdown();
       networkInterface = null;
     });
     this.dataNetworkInterfaces.clear();
     this._dataCalls = [];
     this.clientId = null;
 
-    this.dataCallinterface.unregisterListener(this);
+    this.dataCallInterface.unregisterListener(this);
     this.dataCallInterface = null;
 
     let mobileConnection =
       gMobileConnectionService.getItemByServiceId(this.clientId);
     mobileConnection.unregisterListener(this);
   },
 
   /**
@@ -620,18 +622,18 @@ DataCallHandler.prototype = {
     if (!isRegistered || !haveDataConnection) {
       if (DEBUG) {
         this.debug("RIL is not ready for data connection: Phone's not " +
                    "registered or doesn't have data connection.");
       }
       return;
     }
     let wifi_active = false;
-    if (gNetworkManager.active &&
-        gNetworkManager.active.type == NETWORK_TYPE_WIFI) {
+    if (gNetworkManager.activeNetworkInfo &&
+        gNetworkManager.activeNetworkInfo.type == NETWORK_TYPE_WIFI) {
       wifi_active = true;
     }
 
     let defaultDataCallConnected = networkInterface.connected;
 
     // We have moved part of the decision making into DataCall, the rest will be
     // moved after Bug 904514 - [meta] NetworkManager enhancement.
     if (networkInterface.enabled &&
@@ -704,17 +706,17 @@ DataCallHandler.prototype = {
       if (DEBUG) this.debug(aNetworkType + " is not a mobile network type!");
       throw Cr.NS_ERROR_INVALID_ARG;
     }
 
     let networkInterface = this.dataNetworkInterfaces.get(aNetworkType);
     if (!networkInterface) {
       return NETWORK_STATE_UNKNOWN;
     }
-    return networkInterface.state;
+    return networkInterface.info.state;
   },
 
   setupDataCallByType: function(aNetworkType) {
     if (DEBUG) {
       this.debug("setupDataCallByType: " + aNetworkType);
     }
 
     if (!this._isMobileNetworkType(aNetworkType)) {
@@ -755,18 +757,18 @@ DataCallHandler.prototype = {
   },
 
   _deactivatingDataCalls: false,
 
   deactivateDataCalls: function(aCallback) {
     let dataDisconnecting = false;
     this.dataNetworkInterfaces.forEach(function(networkInterface) {
       if (networkInterface.enabled) {
-        if (networkInterface.state != NETWORK_STATE_UNKNOWN &&
-            networkInterface.state != NETWORK_STATE_DISCONNECTED) {
+        if (networkInterface.info.state != NETWORK_STATE_UNKNOWN &&
+            networkInterface.info.state != NETWORK_STATE_DISCONNECTED) {
           dataDisconnecting = true;
         }
         networkInterface.disconnect();
       }
     });
 
     this._deactivatingDataCalls = dataDisconnecting;
     if (!dataDisconnecting) {
@@ -831,33 +833,24 @@ DataCallHandler.prototype = {
     }
 
     return -1;
   },
 
   /**
    * Notify about data call setup error, called from DataCall.
    */
-  notifyDataCallError: function(aMessage) {
+  notifyDataCallError: function(aDataCall, aErrorMsg) {
     // Notify data call error only for data APN
     let networkInterface = this.dataNetworkInterfaces.get(NETWORK_TYPE_MOBILE);
     if (networkInterface && networkInterface.enabled) {
       let dataCall = networkInterface.dataCall;
-      // If there is a cid, compare cid; otherwise it is probably an error on
-      // data call setup.
-      if (aMessage.cid !== undefined) {
-        if (aMessage.linkInfo.cid == dataCall.linkInfo.cid) {
-          Services.obs.notifyObservers(networkInterface, TOPIC_DATA_CALL_ERROR,
-                                       null);
-        }
-      } else {
-        if (this._compareDataCallOptions(dataCall, aMessage)) {
-          Services.obs.notifyObservers(networkInterface, TOPIC_DATA_CALL_ERROR,
-                                       null);
-        }
+      if (this._compareDataCallOptions(dataCall, aDataCall)) {
+        Services.obs.notifyObservers(networkInterface.info,
+                                     TOPIC_DATA_CALL_ERROR, aErrorMsg);
       }
     }
   },
 
   /**
    * Notify about data call changed, called from DataCall.
    */
   notifyDataCallChanged: function(aUpdatedDataCall) {
@@ -1060,17 +1053,17 @@ DataCall.prototype = {
       this.state = NETWORK_STATE_DISCONNECTED;
 
       if (this.requestedNetworkIfaces.length === 0) {
         if (DEBUG) this.debug("This DataCall is not requested anymore.");
         return;
       }
 
       // Let DataCallHandler notify MobileConnectionService
-      this.dataCallHandler.notifyDataCallError(this);
+      this.dataCallHandler.notifyDataCallError(this, errorMsg);
 
       // For suggestedRetryTime, the value of INT32_MAX(0x7fffffff) means no retry.
       if (aDataCall.suggestedRetryTime === INT32_MAX ||
           this.isPermanentFail(aDataCall.failCause, errorMsg)) {
         if (DEBUG) this.debug("Data call error: no retry needed.");
         return;
       }
 
@@ -1237,17 +1230,17 @@ DataCall.prototype = {
       return true;
     }
 
     return false;
   },
 
   inRequestedTypes: function(aType) {
     for (let i = 0; i < this.requestedNetworkIfaces.length; i++) {
-      if (this.requestedNetworkIfaces[i].type == aType) {
+      if (this.requestedNetworkIfaces[i].info.type == aType) {
         return true;
       }
     }
     return false;
   },
 
   canHandleApn: function(aApnSetting) {
     let isIdentical = this.apnProfile.apn == aApnSetting.apn &&
@@ -1274,33 +1267,33 @@ DataCall.prototype = {
 
   reset: function() {
     this.resetLinkInfo();
 
     this.state = NETWORK_STATE_UNKNOWN;
   },
 
   connect: function(aNetworkInterface) {
-    if (DEBUG) this.debug("connect: " + aNetworkInterface.type);
+    if (DEBUG) this.debug("connect: " + aNetworkInterface.info.type);
 
     if (this.requestedNetworkIfaces.indexOf(aNetworkInterface) == -1) {
       this.requestedNetworkIfaces.push(aNetworkInterface);
     }
 
     if (this.state == NETWORK_STATE_CONNECTING ||
         this.state == NETWORK_STATE_DISCONNECTING) {
       return;
     }
     if (this.state == NETWORK_STATE_CONNECTED) {
       // This needs to run asynchronously, to behave the same way as the case of
       // non-shared apn, see bug 1059110.
       Services.tm.currentThread.dispatch(() => {
         // Do not notify if state changed while this event was being dispatched,
         // the state probably was notified already or need not to be notified.
-        if (aNetworkInterface.state == RIL.GECKO_NETWORK_STATE_CONNECTED) {
+        if (aNetworkInterface.info.state == RIL.GECKO_NETWORK_STATE_CONNECTED) {
           aNetworkInterface.notifyRILNetworkInterface();
         }
       }, Ci.nsIEventTarget.DISPATCH_NORMAL);
       return;
     }
 
     // If retry mechanism is running on background, stop it since we are going
     // to setup data call now.
@@ -1400,17 +1393,17 @@ DataCall.prototype = {
       // Event timer for connection retries
       this.timer = Cc["@mozilla.org/timer;1"].createInstance(Ci.nsITimer);
     }
     this.timer.initWithCallback(this, apnRetryTimer * 1000,
                                 Ci.nsITimer.TYPE_ONE_SHOT);
   },
 
   disconnect: function(aNetworkInterface) {
-    if (DEBUG) this.debug("disconnect: " + aNetworkInterface.type);
+    if (DEBUG) this.debug("disconnect: " + aNetworkInterface.info.type);
 
     let index = this.requestedNetworkIfaces.indexOf(aNetworkInterface);
     if (index != -1) {
       this.requestedNetworkIfaces.splice(index, 1);
 
       if (this.state == NETWORK_STATE_DISCONNECTED ||
           this.state == NETWORK_STATE_UNKNOWN) {
         if (this.timer) {
@@ -1421,17 +1414,17 @@ DataCall.prototype = {
       }
 
       // Notify the DISCONNECTED event immediately after network interface is
       // removed from requestedNetworkIfaces, to make the DataCall, shared or
       // not, to have the same behavior.
       Services.tm.currentThread.dispatch(() => {
         // Do not notify if state changed while this event was being dispatched,
         // the state probably was notified already or need not to be notified.
-        if (aNetworkInterface.state == RIL.GECKO_NETWORK_STATE_DISCONNECTED) {
+        if (aNetworkInterface.info.state == RIL.GECKO_NETWORK_STATE_DISCONNECTED) {
           aNetworkInterface.notifyRILNetworkInterface();
 
           // Clear link info after notifying NetworkManager.
           if (this.requestedNetworkIfaces.length === 0) {
             this.resetLinkInfo();
           }
         }
       }, Ci.nsIEventTarget.DISPATCH_NORMAL);
@@ -1444,17 +1437,17 @@ DataCall.prototype = {
         this.state != NETWORK_STATE_CONNECTED) {
       return;
     }
 
     this.deactivate();
   },
 
   deactivate: function() {
-    let reason = Ci.nsINetworkInterface.DATACALL_DEACTIVATE_NO_REASON;
+    let reason = Ci.nsIDataCallInterface.DATACALL_DEACTIVATE_NO_REASON;
     if (DEBUG) {
       this.debug("Going to disconnect data connection cid " + this.linkInfo.cid);
     }
 
     let dcInterface = this.dataCallHandler.dataCallInterface;
     dcInterface.deactivateDataCall(this.linkInfo.cid, reason, {
       QueryInterface: XPCOMUtils.generateQI([Ci.nsIDataCallCallback]),
       notifySuccess: () => {
@@ -1476,165 +1469,200 @@ DataCall.prototype = {
   shutdown: function() {
     if (this.timer) {
       this.timer.cancel();
       this.timer = null;
     }
   }
 };
 
-function RILNetworkInterface(aDataCallHandler, aType, aApnSetting, aDataCall) {
-  if (!aDataCall) {
-    throw new Error("No dataCall for RILNetworkInterface: " + type);
-  }
-
-  this.dataCallHandler = aDataCallHandler;
+function RILNetworkInfo(aClientId, aType, aNetworkInterface)
+{
+  this.serviceId = aClientId;
   this.type = aType;
-  this.apnSetting = aApnSetting;
-  this.dataCall = aDataCall;
-
-  this.enabled = false;
-}
 
-RILNetworkInterface.prototype = {
-  classID:   RILNETWORKINTERFACE_CID,
-  classInfo: XPCOMUtils.generateCI({classID: RILNETWORKINTERFACE_CID,
-                                    classDescription: "RILNetworkInterface",
-                                    interfaces: [Ci.nsINetworkInterface,
-                                                 Ci.nsIRilNetworkInterface]}),
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInterface,
-                                         Ci.nsIRilNetworkInterface]),
+  this.networkInterface = aNetworkInterface;
+}
+RILNetworkInfo.prototype = {
+  classID:   RILNETWORKINFO_CID,
+  classInfo: XPCOMUtils.generateCI({classID: RILNETWORKINFO_CID,
+                                    classDescription: "RILNetworkInfo",
+                                    interfaces: [Ci.nsINetworkInfo,
+                                                 Ci.nsIRilNetworkInfo]}),
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInfo,
+                                         Ci.nsIRilNetworkInfo]),
+
+  networkInterface: null,
 
-  // Hold reference to DataCall object which is determined at initilization.
-  dataCall: null,
+  getDataCall: function() {
+    return this.networkInterface.dataCall;
+  },
 
-  // If this RILNetworkInterface type is enabled or not.
-  enabled: null,
+  getApnSetting: function() {
+    return this.networkInterface.apnSetting;
+  },
+
+  debug: function(aMsg) {
+    dump("-*- RILNetworkInfo[" + this.serviceId + ":" + this.type + "]: " +
+         aMsg + "\n");
+  },
 
   /**
-   * nsINetworkInterface Implementation
+   * nsINetworkInfo Implementation
    */
-
   get state() {
-    if (!this.dataCall.inRequestedTypes(this.type)) {
+    let dataCall = this.getDataCall();
+    if (!dataCall.inRequestedTypes(this.type)) {
       return NETWORK_STATE_DISCONNECTED;
     }
-    return this.dataCall.state;
+    return dataCall.state;
   },
 
   type: null,
 
   get name() {
-    return this.dataCall.linkInfo.ifname;
-  },
-
-  get httpProxyHost() {
-    return this.apnSetting.proxy || "";
-  },
-
-  get httpProxyPort() {
-    return this.apnSetting.port || "";
+    return this.getDataCall().linkInfo.ifname;
   },
 
   getAddresses: function(aIps, aPrefixLengths) {
-    let addresses = this.dataCall.linkInfo.addresses;
+    let addresses = this.getDataCall().linkInfo.addresses;
 
     let ips = [];
     let prefixLengths = [];
     for (let i = 0; i < addresses.length; i++) {
       let [ip, prefixLength] = addresses[i].split("/");
       ips.push(ip);
       prefixLengths.push(prefixLength);
     }
 
     aIps.value = ips.slice();
     aPrefixLengths.value = prefixLengths.slice();
 
     return ips.length;
   },
 
   getGateways: function(aCount) {
-    let linkInfo = this.dataCall.linkInfo;
+    let linkInfo = this.getDataCall().linkInfo;
 
     if (aCount) {
       aCount.value = linkInfo.gateways.length;
     }
+
     return linkInfo.gateways.slice();
   },
 
   getDnses: function(aCount) {
-    let linkInfo = this.dataCall.linkInfo;
+    let linkInfo = this.getDataCall().linkInfo;
 
     if (aCount) {
       aCount.value = linkInfo.dnses.length;
     }
+
     return linkInfo.dnses.slice();
   },
 
   /**
-   * nsIRilNetworkInterface Implementation
+   * nsIRilNetworkInfo Implementation
    */
 
-  get serviceId() {
-    return this.dataCallHandler.clientId;
-  },
+  serviceId: 0,
 
   get iccId() {
-    let icc = gIccService.getIccByServiceId(this.dataCallHandler.clientId);
+    let icc = gIccService.getIccByServiceId(this.serviceId);
     let iccInfo = icc && icc.iccInfo;
 
     return iccInfo && iccInfo.iccid;
   },
 
   get mmsc() {
     if (this.type != NETWORK_TYPE_MOBILE_MMS) {
       if (DEBUG) this.debug("Error! Only MMS network can get MMSC.");
       throw Cr.NS_ERROR_UNEXPECTED;
     }
 
-    return this.apnSetting.mmsc || "";
+    return this.getApnSetting().mmsc || "";
   },
 
   get mmsProxy() {
     if (this.type != NETWORK_TYPE_MOBILE_MMS) {
       if (DEBUG) this.debug("Error! Only MMS network can get MMS proxy.");
       throw Cr.NS_ERROR_UNEXPECTED;
     }
 
-    return this.apnSetting.mmsproxy || "";
+    return this.getApnSetting().mmsproxy || "";
   },
 
   get mmsPort() {
     if (this.type != NETWORK_TYPE_MOBILE_MMS) {
       if (DEBUG) this.debug("Error! Only MMS network can get MMS port.");
       throw Cr.NS_ERROR_UNEXPECTED;
     }
 
     // Note: Port 0 is reserved, so we treat it as invalid as well.
     // See http://www.iana.org/assignments/port-numbers
-    return this.apnSetting.mmsport || -1;
+    return this.getApnSetting().mmsport || -1;
+  },
+};
+
+function RILNetworkInterface(aDataCallHandler, aType, aApnSetting, aDataCall) {
+  if (!aDataCall) {
+    throw new Error("No dataCall for RILNetworkInterface: " + type);
+  }
+
+  this.dataCallHandler = aDataCallHandler;
+  this.enabled = false;
+  this.dataCall = aDataCall;
+  this.apnSetting = aApnSetting;
+
+  this.info = new RILNetworkInfo(aDataCallHandler.clientId, aType, this);
+}
+
+RILNetworkInterface.prototype = {
+  classID:   RILNETWORKINTERFACE_CID,
+  classInfo: XPCOMUtils.generateCI({classID: RILNETWORKINTERFACE_CID,
+                                    classDescription: "RILNetworkInterface",
+                                    interfaces: [Ci.nsINetworkInterface]}),
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInterface]),
+
+  // If this RILNetworkInterface type is enabled or not.
+  enabled: null,
+
+  apnSetting: null,
+
+  dataCall: null,
+
+  /**
+   * nsINetworkInterface Implementation
+   */
+
+  info: null,
+
+  get httpProxyHost() {
+    return this.apnSetting.proxy || "";
+  },
+
+  get httpProxyPort() {
+    return this.apnSetting.port || "";
   },
 
   // Helpers
 
   debug: function(aMsg) {
     dump("-*- RILNetworkInterface[" + this.dataCallHandler.clientId + ":" +
-         this.type + "]: " + aMsg + "\n");
+         this.info.type + "]: " + aMsg + "\n");
   },
 
-  apnSetting: null,
-
   get connected() {
-    return this.state == NETWORK_STATE_CONNECTED;
+    return this.info.state == NETWORK_STATE_CONNECTED;
   },
 
   notifyRILNetworkInterface: function() {
     if (DEBUG) {
-      this.debug("notifyRILNetworkInterface type: " + this.type + ", state: " +
-                 this.state);
+      this.debug("notifyRILNetworkInterface type: " + this.info.type +
+                 ", state: " + this.info.state);
     }
 
     gNetworkManager.updateNetworkInterface(this);
   },
 
   connect: function() {
     this.enabled = true;
 
--- a/dom/system/gonk/GonkGPSGeolocationProvider.cpp
+++ b/dom/system/gonk/GonkGPSGeolocationProvider.cpp
@@ -20,17 +20,17 @@
 #include <hardware/gps.h>
 
 #include "mozilla/Constants.h"
 #include "mozilla/Preferences.h"
 #include "mozilla/Services.h"
 #include "nsContentUtils.h"
 #include "nsGeoPosition.h"
 #include "nsIInterfaceRequestorUtils.h"
-#include "nsINetworkManager.h"
+#include "nsINetworkInterface.h"
 #include "nsIObserverService.h"
 #include "nsJSUtils.h"
 #include "nsPrintfCString.h"
 #include "nsServiceManagerUtils.h"
 #include "nsThreadUtils.h"
 #include "prtime.h"
 #include "mozilla/dom/BindingUtils.h"
 #include "mozilla/dom/ScriptSettings.h"
@@ -354,22 +354,22 @@ GonkGPSGeolocationProvider::GetGPSInterf
   return result;
 }
 
 #ifdef MOZ_B2G_RIL
 int32_t
 GonkGPSGeolocationProvider::GetDataConnectionState()
 {
   if (!mRadioInterface) {
-    return nsINetworkInterface::NETWORK_STATE_UNKNOWN;
+    return nsINetworkInfo::NETWORK_STATE_UNKNOWN;
   }
 
   int32_t state;
   mRadioInterface->GetDataCallStateByType(
-    nsINetworkInterface::NETWORK_TYPE_MOBILE_SUPL, &state);
+    nsINetworkInfo::NETWORK_TYPE_MOBILE_SUPL, &state);
   return state;
 }
 
 void
 GonkGPSGeolocationProvider::SetAGpsDataConn(nsAString& aApn)
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(mAGpsInterface);
@@ -378,34 +378,34 @@ GonkGPSGeolocationProvider::SetAGpsDataC
   if (mAGpsRilInterface &&
       mAGpsRilInterface->size >= sizeof(AGpsRilInterface) &&
       mAGpsRilInterface->update_network_availability) {
     hasUpdateNetworkAvailability = true;
   }
 
   int32_t connectionState = GetDataConnectionState();
   NS_ConvertUTF16toUTF8 apn(aApn);
-  if (connectionState == nsINetworkInterface::NETWORK_STATE_CONNECTED) {
+  if (connectionState == nsINetworkInfo::NETWORK_STATE_CONNECTED) {
     // The definition of availability is
     // 1. The device is connected to the home network
     // 2. The device is connected to a foreign network and data
     //    roaming is enabled
     // RIL turns on/off data connection automatically when the data
     // roaming setting changes.
     if (hasUpdateNetworkAvailability) {
       mAGpsRilInterface->update_network_availability(true, apn.get());
     }
 #ifdef AGPS_HAVE_DUAL_APN
     mAGpsInterface->data_conn_open(AGPS_TYPE_SUPL,
                                    apn.get(),
                                    AGPS_APN_BEARER_IPV4);
 #else
     mAGpsInterface->data_conn_open(apn.get());
 #endif
-  } else if (connectionState == nsINetworkInterface::NETWORK_STATE_DISCONNECTED) {
+  } else if (connectionState == nsINetworkInfo::NETWORK_STATE_DISCONNECTED) {
     if (hasUpdateNetworkAvailability) {
       mAGpsRilInterface->update_network_availability(false, apn.get());
     }
 #ifdef AGPS_HAVE_DUAL_APN
     mAGpsInterface->data_conn_closed(AGPS_TYPE_SUPL);
 #else
     mAGpsInterface->data_conn_closed();
 #endif
@@ -445,35 +445,35 @@ void
 GonkGPSGeolocationProvider::RequestDataConnection()
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   if (!mRadioInterface) {
     return;
   }
 
-  if (GetDataConnectionState() == nsINetworkInterface::NETWORK_STATE_CONNECTED) {
+  if (GetDataConnectionState() == nsINetworkInfo::NETWORK_STATE_CONNECTED) {
     // Connection is already established, we don't need to setup again.
     // We just get supl APN and make AGPS data connection state updated.
     RequestSettingValue("ril.supl.apn");
   } else {
-    mRadioInterface->SetupDataCallByType(nsINetworkInterface::NETWORK_TYPE_MOBILE_SUPL);
+    mRadioInterface->SetupDataCallByType(nsINetworkInfo::NETWORK_TYPE_MOBILE_SUPL);
   }
 }
 
 void
 GonkGPSGeolocationProvider::ReleaseDataConnection()
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   if (!mRadioInterface) {
     return;
   }
 
-  mRadioInterface->DeactivateDataCallByType(nsINetworkInterface::NETWORK_TYPE_MOBILE_SUPL);
+  mRadioInterface->DeactivateDataCallByType(nsINetworkInfo::NETWORK_TYPE_MOBILE_SUPL);
 }
 
 void
 GonkGPSGeolocationProvider::RequestSetID(uint32_t flags)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   if (!mRadioInterface ||
@@ -1005,25 +1005,25 @@ GonkGPSGeolocationProvider::SetHighAccur
   return NS_OK;
 }
 
 namespace {
 int
 ConvertToGpsNetworkType(int aNetworkInterfaceType)
 {
   switch (aNetworkInterfaceType) {
-    case nsINetworkInterface::NETWORK_TYPE_WIFI:
+    case nsINetworkInfo::NETWORK_TYPE_WIFI:
       return AGPS_RIL_NETWORK_TYPE_WIFI;
-    case nsINetworkInterface::NETWORK_TYPE_MOBILE:
+    case nsINetworkInfo::NETWORK_TYPE_MOBILE:
       return AGPS_RIL_NETWORK_TYPE_MOBILE;
-    case nsINetworkInterface::NETWORK_TYPE_MOBILE_MMS:
+    case nsINetworkInfo::NETWORK_TYPE_MOBILE_MMS:
       return AGPS_RIL_NETWORK_TYPE_MOBILE_MMS;
-    case nsINetworkInterface::NETWORK_TYPE_MOBILE_SUPL:
+    case nsINetworkInfo::NETWORK_TYPE_MOBILE_SUPL:
       return AGPS_RIL_NETWORK_TYPE_MOBILE_SUPL;
-    case nsINetworkInterface::NETWORK_TYPE_MOBILE_DUN:
+    case nsINetworkInfo::NETWORK_TYPE_MOBILE_DUN:
       return AGPS_RIL_NETWORK_TTYPE_MOBILE_DUN;
     default:
       NS_WARNING(nsPrintfCString("Unknown network type mapping %d",
                                  aNetworkInterfaceType).get());
       return -1;
   }
 }
 } // namespace
@@ -1032,31 +1032,31 @@ NS_IMETHODIMP
 GonkGPSGeolocationProvider::Observe(nsISupports* aSubject,
                                     const char* aTopic,
                                     const char16_t* aData)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
 #ifdef MOZ_B2G_RIL
   if (!strcmp(aTopic, kNetworkConnStateChangedTopic)) {
-    nsCOMPtr<nsINetworkInterface> iface = do_QueryInterface(aSubject);
-    if (!iface) {
+    nsCOMPtr<nsINetworkInfo> info = do_QueryInterface(aSubject);
+    if (!info) {
       return NS_OK;
     }
-    nsCOMPtr<nsIRilNetworkInterface> rilface = do_QueryInterface(aSubject);
+    nsCOMPtr<nsIRilNetworkInfo> rilInfo = do_QueryInterface(aSubject);
     if (mAGpsRilInterface && mAGpsRilInterface->update_network_state) {
       int32_t state;
       int32_t type;
-      iface->GetState(&state);
-      iface->GetType(&type);
-      bool connected = (state == nsINetworkInterface::NETWORK_STATE_CONNECTED);
+      info->GetState(&state);
+      info->GetType(&type);
+      bool connected = (state == nsINetworkInfo::NETWORK_STATE_CONNECTED);
       bool roaming = false;
       int gpsNetworkType = ConvertToGpsNetworkType(type);
       if (gpsNetworkType >= 0) {
-        if (rilface) {
+        if (rilInfo) {
           do {
             nsCOMPtr<nsIMobileConnectionService> service =
               do_GetService(NS_MOBILE_CONNECTION_SERVICE_CONTRACTID);
             if (!service) {
               break;
             }
 
             nsCOMPtr<nsIMobileConnection> connection;
@@ -1075,17 +1075,17 @@ GonkGPSGeolocationProvider::Observe(nsIS
         mAGpsRilInterface->update_network_state(
           connected,
           gpsNetworkType,
           roaming,
           /* extra_info = */ nullptr);
       }
     }
     // No data connection
-    if (!rilface) {
+    if (!rilInfo) {
       return NS_OK;
     }
 
     RequestSettingValue("ril.supl.apn");
   }
 #endif
 
   if (!strcmp(aTopic, kMozSettingsChangedTopic)) {
--- a/dom/system/gonk/NetworkInterfaceListService.js
+++ b/dom/system/gonk/NetworkInterfaceListService.js
@@ -45,29 +45,27 @@ NetworkInterfaceListService.prototype = 
           excludeFota: (aConditions &
                         Ci.nsINetworkInterfaceListService.
                         LIST_NOT_INCLUDE_FOTA_INTERFACES) != 0
         }
       )[0]);
   }
 };
 
-function FakeNetworkInterface(aAttributes) {
+function FakeNetworkInfo(aAttributes) {
   this.state = aAttributes.state;
   this.type = aAttributes.type;
   this.name = aAttributes.name;
   this.ips = aAttributes.ips;
   this.prefixLengths = aAttributes.prefixLengths;
   this.gateways = aAttributes.gateways;
   this.dnses = aAttributes.dnses;
-  this.httpProxyHost = aAttributes.httpProxyHost;
-  this.httpProxyPort = aAttributes.httpProxyPort;
 }
-FakeNetworkInterface.prototype = {
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInterface]),
+FakeNetworkInfo.prototype = {
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInfo]),
 
   getAddresses: function (ips, prefixLengths) {
     ips.value = this.ips.slice();
     prefixLengths.value = this.prefixLengths.slice();
 
     return this.ips.length;
   },
 
@@ -84,28 +82,28 @@ FakeNetworkInterface.prototype = {
     }
     return this.dnses.slice();
   }
 };
 
 function NetworkInterfaceList (aInterfaceLiterals) {
   this._interfaces = [];
   for (let entry of aInterfaceLiterals) {
-    this._interfaces.push(new FakeNetworkInterface(entry));
+    this._interfaces.push(new FakeNetworkInfo(entry));
   }
 }
 
 NetworkInterfaceList.prototype = {
   QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInterfaceList]),
 
   getNumberOfInterface: function() {
     return this._interfaces.length;
   },
 
-  getInterface: function(index) {
+  getInterfaceInfo: function(index) {
     if (!this._interfaces) {
       return null;
     }
     return this._interfaces[index];
   }
 };
 
 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([NetworkInterfaceListService]);
--- a/dom/system/gonk/NetworkManager.js
+++ b/dom/system/gonk/NetworkManager.js
@@ -11,17 +11,17 @@ Cu.import("resource://gre/modules/Servic
 Cu.import("resource://gre/modules/FileUtils.jsm");
 Cu.import("resource://gre/modules/systemlibs.js");
 Cu.import("resource://gre/modules/Promise.jsm");
 
 const NETWORKMANAGER_CONTRACTID = "@mozilla.org/network/manager;1";
 const NETWORKMANAGER_CID =
   Components.ID("{33901e46-33b8-11e1-9869-f46d04d25bcc}");
 
-const DEFAULT_PREFERRED_NETWORK_TYPE = Ci.nsINetworkInterface.NETWORK_TYPE_WIFI;
+const DEFAULT_PREFERRED_NETWORK_TYPE = Ci.nsINetworkInfo.NETWORK_TYPE_WIFI;
 
 XPCOMUtils.defineLazyGetter(this, "ppmm", function() {
   return Cc["@mozilla.org/parentprocessmessagemanager;1"]
          .getService(Ci.nsIMessageBroadcaster);
 });
 
 XPCOMUtils.defineLazyServiceGetter(this, "gDNSService",
                                    "@mozilla.org/network/dns-service;1",
@@ -80,52 +80,52 @@ updateDebug();
 
 function defineLazyRegExp(obj, name, pattern) {
   obj.__defineGetter__(name, function() {
     delete obj[name];
     return obj[name] = new RegExp(pattern);
   });
 }
 
-function NetworkInterface(aNetwork) {
+function ExtraNetworkInfo(aNetwork) {
   let ips = {};
   let prefixLengths = {};
-  aNetwork.getAddresses(ips, prefixLengths);
+  aNetwork.info.getAddresses(ips, prefixLengths);
 
-  this.state = aNetwork.state;
-  this.type = aNetwork.type;
-  this.name = aNetwork.name;
+  this.state = aNetwork.info.state;
+  this.type = aNetwork.info.type;
+  this.name = aNetwork.info.name;
   this.ips = ips.value;
   this.prefixLengths = prefixLengths.value;
-  this.gateways = aNetwork.getGateways();
-  this.dnses = aNetwork.getDnses();
+  this.gateways = aNetwork.info.getGateways();
+  this.dnses = aNetwork.info.getDnses();
   this.httpProxyHost = aNetwork.httpProxyHost;
   this.httpProxyPort = aNetwork.httpProxyPort;
 }
-NetworkInterface.prototype = {
-  QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInterface]),
-
+ExtraNetworkInfo.prototype = {
   getAddresses: function(aIps, aPrefixLengths) {
     aIps.value = this.ips.slice();
     aPrefixLengths.value = this.prefixLengths.slice();
 
     return this.ips.length;
   },
 
   getGateways: function(aCount) {
     if (aCount) {
       aCount.value = this.gateways.length;
     }
+
     return this.gateways.slice();
   },
 
   getDnses: function(aCount) {
     if (aCount) {
       aCount.value = this.dnses.length;
     }
+
     return this.dnses.slice();
   }
 };
 
 function NetworkInterfaceLinks()
 {
   this.resetLinks();
 }
@@ -226,74 +226,73 @@ NetworkManager.prototype = {
       case "NetworkInterfaceList:ListInterface": {
         let excludeMms = aMsg.json.excludeMms;
         let excludeSupl = aMsg.json.excludeSupl;
         let excludeIms = aMsg.json.excludeIms;
         let excludeDun = aMsg.json.excludeDun;
         let excludeFota = aMsg.json.excludeFota;
         let interfaces = [];
 
-        for each (let i in this.networkInterfaces) {
-          if ((i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS && excludeMms) ||
-              (i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL && excludeSupl) ||
-              (i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS && excludeIms) ||
-              (i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN && excludeDun) ||
-              (i.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_FOTA && excludeFota)) {
+        for each (let network in this.networkInterfaces) {
+          let i = network.info;
+          if ((i.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_MMS && excludeMms) ||
+              (i.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_SUPL && excludeSupl) ||
+              (i.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_IMS && excludeIms) ||
+              (i.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN && excludeDun) ||
+              (i.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_FOTA && excludeFota)) {
             continue;
           }
 
           let ips = {};
           let prefixLengths = {};
           i.getAddresses(ips, prefixLengths);
 
           interfaces.push({
             state: i.state,
             type: i.type,
             name: i.name,
             ips: ips.value,
             prefixLengths: prefixLengths.value,
             gateways: i.getGateways(),
-            dnses: i.getDnses(),
-            httpProxyHost: i.httpProxyHost,
-            httpProxyPort: i.httpProxyPort
+            dnses: i.getDnses()
           });
         }
         return interfaces;
       }
     }
   },
 
-  getNetworkId: function(network) {
+  getNetworkId: function(aNetworkInfo) {
     let id = "device";
     try {
-      if (network instanceof Ci.nsIRilNetworkInterface) {
-        let rilNetwork = network.QueryInterface(Ci.nsIRilNetworkInterface);
-        id = "ril" + rilNetwork.serviceId;
+      if (aNetworkInfo instanceof Ci.nsIRilNetworkInfo) {
+        let rilInfo = aNetworkInfo.QueryInterface(Ci.nsIRilNetworkInfo);
+        id = "ril" + rilInfo.serviceId;
       }
     } catch (e) {}
 
-    return id + "-" + network.type;
+    return id + "-" + aNetworkInfo.type;
   },
 
   // nsINetworkManager
 
   registerNetworkInterface: function(network) {
     if (!(network instanceof Ci.nsINetworkInterface)) {
       throw Components.Exception("Argument must be nsINetworkInterface.",
                                  Cr.NS_ERROR_INVALID_ARG);
     }
-    let networkId = this.getNetworkId(network);
+    let networkId = this.getNetworkId(network.info);
     if (networkId in this.networkInterfaces) {
       throw Components.Exception("Network with that type already registered!",
                                  Cr.NS_ERROR_INVALID_ARG);
     }
     this.networkInterfaces[networkId] = network;
     this.networkInterfaceLinks[networkId] = new NetworkInterfaceLinks();
 
-    Services.obs.notifyObservers(network, TOPIC_INTERFACE_REGISTERED, null);
+    Services.obs.notifyObservers(network.info, TOPIC_INTERFACE_REGISTERED, null);
     debug("Network '" + networkId + "' registered.");
   },
 
   _addSubnetRoutes: function(network) {
     let ips = {};
     let prefixLengths = {};
     let length = network.getAddresses(ips, prefixLengths);
     let promises = [];
@@ -311,201 +310,211 @@ NetworkManager.prototype = {
     return Promise.all(promises);
   },
 
   updateNetworkInterface: function(network) {
     if (!(network instanceof Ci.nsINetworkInterface)) {
       throw Components.Exception("Argument must be nsINetworkInterface.",
                                  Cr.NS_ERROR_INVALID_ARG);
     }
-    let networkId = this.getNetworkId(network);
+    let networkId = this.getNetworkId(network.info);
     if (!(networkId in this.networkInterfaces)) {
       throw Components.Exception("No network with that type registered.",
                                  Cr.NS_ERROR_INVALID_ARG);
     }
-    debug("Network " + network.type + "/" + network.name +
-          " changed state to " + network.state);
+    debug("Network " + network.info.type + "/" + network.info.name +
+          " changed state to " + network.info.state);
 
     // Keep a copy of network in case it is modified while we are updating.
-    let networkInterface = new NetworkInterface(network);
+    let extNetworkInfo = new ExtraNetworkInfo(network);
 
     // Note that since Lollipop we need to allocate and initialize
     // something through netd, so we add createNetwork/destroyNetwork
     // to deal with that explicitly.
 
-    switch (networkInterface.state) {
-      case Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED:
+    switch (extNetworkInfo.state) {
+      case Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED:
 
-        this._createNetwork(networkInterface.name)
+        this._createNetwork(extNetworkInfo.name)
           // Remove pre-created default route and let setAndConfigureActive()
           // to set default route only on preferred network
-          .then(() => this._removeDefaultRoute(networkInterface))
+          .then(() => this._removeDefaultRoute(extNetworkInfo))
           // Set DNS server as early as possible to prevent from
           // premature domain name lookup.
-          .then(() => this._setDNS(networkInterface))
+          .then(() => this._setDNS(extNetworkInfo))
           .then(() => {
             // Add host route for data calls
-            if (!this.isNetworkTypeMobile(networkInterface.type)) {
+            if (!this.isNetworkTypeMobile(extNetworkInfo.type)) {
               return;
             }
 
             let currentInterfaceLinks = this.networkInterfaceLinks[networkId];
-            let newLinkRoutes = networkInterface.getDnses().concat(
-              networkInterface.httpProxyHost);
+            let newLinkRoutes = extNetworkInfo.getDnses().concat(
+              extNetworkInfo.httpProxyHost);
             // If gateways have changed, remove all old routes first.
-            return this._handleGateways(networkId, networkInterface.getGateways())
+            return this._handleGateways(networkId, extNetworkInfo.getGateways())
               .then(() => this._updateRoutes(currentInterfaceLinks.linkRoutes,
                                              newLinkRoutes,
-                                             networkInterface.getGateways(),
-                                             networkInterface.name))
+                                             extNetworkInfo.getGateways(),
+                                             extNetworkInfo.name))
               .then(() => currentInterfaceLinks.setLinks(newLinkRoutes,
-                                                         networkInterface.getGateways(),
-                                                         networkInterface.name));
+                                                         extNetworkInfo.getGateways(),
+                                                         extNetworkInfo.name));
           })
           .then(() => {
-            if (networkInterface.type !=
-                Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN) {
+            if (extNetworkInfo.type !=
+                Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN) {
               return;
             }
             // Dun type is a special case where we add the default route to a
             // secondary table.
-            return this.setSecondaryDefaultRoute(networkInterface);
+            return this.setSecondaryDefaultRoute(extNetworkInfo);
           })
-          .then(() => this._addSubnetRoutes(networkInterface))
+          .then(() => this._addSubnetRoutes(extNetworkInfo))
           .then(() => this.setAndConfigureActive())
           .then(() => {
             // Update data connection when Wifi connected/disconnected
-            if (networkInterface.type ==
-                Ci.nsINetworkInterface.NETWORK_TYPE_WIFI && this.mRil) {
+            if (extNetworkInfo.type ==
+                Ci.nsINetworkInfo.NETWORK_TYPE_WIFI && this.mRil) {
               for (let i = 0; i < this.mRil.numRadioInterfaces; i++) {
                 this.mRil.getRadioInterface(i).updateRILNetworkInterface();
               }
             }
 
             // Probing the public network accessibility after routing table is ready
             CaptivePortalDetectionHelper
-              .notify(CaptivePortalDetectionHelper.EVENT_CONNECT, this.active);
+              .notify(CaptivePortalDetectionHelper.EVENT_CONNECT,
+                      this.activeNetworkInfo);
           })
           .then(() => {
             // Notify outer modules like MmsService to start the transaction after
             // the configuration of the network interface is done.
-            Services.obs.notifyObservers(network, TOPIC_CONNECTION_STATE_CHANGED,
-                                         this.convertConnectionType(network));
+            Services.obs.notifyObservers(network.info,
+                                         TOPIC_CONNECTION_STATE_CHANGED,
+                                         this.convertConnectionType(network.info));
           })
           .catch(aError => {
             debug("updateNetworkInterface error: " + aError);
           });
         break;
-      case Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED:
+      case Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED:
         Promise.resolve()
           .then(() => {
-            if (!this.isNetworkTypeMobile(networkInterface.type)) {
+            if (!this.isNetworkTypeMobile(extNetworkInfo.type)) {
               return;
             }
             // Remove host route for data calls
             return this._cleanupAllHostRoutes(networkId);
           })
           .then(() => {
-            if (networkInterface.type !=
-                Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN) {
+            if (extNetworkInfo.type !=
+                Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN) {
               return;
             }
             // Remove secondary default route for dun.
-            return this.removeSecondaryDefaultRoute(networkInterface);
+            return this.removeSecondaryDefaultRoute(extNetworkInfo);
           })
           .then(() => {
-            if (networkInterface.type == Ci.nsINetworkInterface.NETWORK_TYPE_WIFI) {
+            if (extNetworkInfo.type == Ci.nsINetworkInfo.NETWORK_TYPE_WIFI) {
               // Remove routing table in /proc/net/route
-              return this._resetRoutingTable(networkInterface.name);
+              return this._resetRoutingTable(extNetworkInfo.name);
             }
-            if (networkInterface.type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE) {
-              return this._removeDefaultRoute(networkInterface)
+            if (extNetworkInfo.type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE) {
+              return this._removeDefaultRoute(extNetworkInfo)
             }
           })
           .then(() => {
             // Clear http proxy on active network.
-            if (this.active && networkInterface.type == this.active.type) {
+            if (this.activeNetworkInfo &&
+                extNetworkInfo.type == this.activeNetworkInfo.type) {
               this.clearNetworkProxy();
             }
 
             // Abort ongoing captive portal detection on the wifi interface
             CaptivePortalDetectionHelper
-              .notify(CaptivePortalDetectionHelper.EVENT_DISCONNECT, networkInterface);
+              .notify(CaptivePortalDetectionHelper.EVENT_DISCONNECT, extNetworkInfo);
           })
           .then(() => this.setAndConfigureActive())
           .then(() => {
             // Update data connection when Wifi connected/disconnected
-            if (networkInterface.type ==
-                Ci.nsINetworkInterface.NETWORK_TYPE_WIFI && this.mRil) {
+            if (extNetworkInfo.type ==
+                Ci.nsINetworkInfo.NETWORK_TYPE_WIFI && this.mRil) {
               for (let i = 0; i < this.mRil.numRadioInterfaces; i++) {
                 this.mRil.getRadioInterface(i).updateRILNetworkInterface();
               }
             }
           })
-          .then(() => this._destroyNetwork(networkInterface.name))
+          .then(() => this._destroyNetwork(extNetworkInfo.name))
           .then(() => {
             // Notify outer modules like MmsService to start the transaction after
             // the configuration of the network interface is done.
-            Services.obs.notifyObservers(network, TOPIC_CONNECTION_STATE_CHANGED,
-                                         this.convertConnectionType(network));
+            Services.obs.notifyObservers(network.info,
+                                         TOPIC_CONNECTION_STATE_CHANGED,
+                                         this.convertConnectionType(network.info));
           })
           .catch(aError => {
             debug("updateNetworkInterface error: " + aError);
           });
         break;
     }
   },
 
   unregisterNetworkInterface: function(network) {
     if (!(network instanceof Ci.nsINetworkInterface)) {
       throw Components.Exception("Argument must be nsINetworkInterface.",
                                  Cr.NS_ERROR_INVALID_ARG);
     }
-    let networkId = this.getNetworkId(network);
+    let networkId = this.getNetworkId(network.info);
     if (!(networkId in this.networkInterfaces)) {
       throw Components.Exception("No network with that type registered.",
                                  Cr.NS_ERROR_INVALID_ARG);
     }
 
     // This is for in case a network gets unregistered without being
     // DISCONNECTED.
-    if (this.isNetworkTypeMobile(network.type)) {
+    if (this.isNetworkTypeMobile(network.info.type)) {
       this._cleanupAllHostRoutes(networkId);
     }
 
     delete this.networkInterfaces[networkId];
 
-    Services.obs.notifyObservers(network, TOPIC_INTERFACE_UNREGISTERED, null);
+    Services.obs.notifyObservers(network.info, TOPIC_INTERFACE_UNREGISTERED, null);
     debug("Network '" + networkId + "' unregistered.");
   },
 
   _manageOfflineStatus: true,
 
   networkInterfaces: null,
 
   networkInterfaceLinks: null,
 
   _preferredNetworkType: DEFAULT_PREFERRED_NETWORK_TYPE,
   get preferredNetworkType() {
     return this._preferredNetworkType;
   },
   set preferredNetworkType(val) {
-    if ([Ci.nsINetworkInterface.NETWORK_TYPE_WIFI,
-         Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE].indexOf(val) == -1) {
+    if ([Ci.nsINetworkInfo.NETWORK_TYPE_WIFI,
+         Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE].indexOf(val) == -1) {
       throw "Invalid network type";
     }
     this._preferredNetworkType = val;
   },
 
-  active: null,
+  _activeNetwork: null,
+
+  get activeNetworkInfo() {
+    return this._activeNetwork && this._activeNetwork.info;
+  },
+
   _overriddenActive: null,
 
   overrideActive: function(network) {
-    if ([Ci.nsINetworkInterface.NETWORK_TYPE_WIFI,
-         Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE].indexOf(val) == -1) {
+    let type = network.info.type;
+    if ([Ci.nsINetworkInfo.NETWORK_TYPE_WIFI,
+         Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE].indexOf(type) == -1) {
       throw "Invalid network type";
     }
 
     this._overriddenActive = network;
     this.setAndConfigureActive();
   },
 
   _updateRoutes: function(oldLinks, newLinks, gateways, interfaceName) {
@@ -543,90 +552,90 @@ NetworkManager.prototype = {
                                         networkName, aIpAddress,
                                         getMaxPrefixLength(aIpAddress), gateway));
       }
     });
 
     return Promise.all(promises);
   },
 
-  isValidatedNetwork: function(network) {
+  isValidatedNetwork: function(aNetworkInfo) {
     let isValid = false;
     try {
-      isValid = (this.getNetworkId(network) in this.networkInterfaces);
+      isValid = (this.getNetworkId(aNetworkInfo) in this.networkInterfaces);
     } catch (e) {
       debug("Invalid network interface: " + e);
     }
 
     return isValid;
   },
 
-  addHostRoute: function(network, host) {
-    if (!this.isValidatedNetwork(network)) {
-      return Promise.reject("Invalid network interface.");
+  addHostRoute: function(aNetworkInfo, aHost) {
+    if (!this.isValidatedNetwork(aNetworkInfo)) {
+      return Promise.reject("Invalid network info.");
     }
 
-    return this.resolveHostname(network, host)
+    return this.resolveHostname(aNetworkInfo, aHost)
       .then((ipAddresses) => {
         let promises = [];
-        let networkId = this.getNetworkId(network);
+        let networkId = this.getNetworkId(aNetworkInfo);
 
         ipAddresses.forEach((aIpAddress) => {
           let promise =
-            this._setHostRoutes(true, [aIpAddress], network.name, network.getGateways())
+            this._setHostRoutes(true, [aIpAddress], aNetworkInfo.name, aNetworkInfo.getGateways())
               .then(() => this.networkInterfaceLinks[networkId].extraRoutes.push(aIpAddress));
 
           promises.push(promise);
         });
 
         return Promise.all(promises);
       });
   },
 
-  removeHostRoute: function(network, host) {
-    if (!this.isValidatedNetwork(network)) {
-      return Promise.reject("Invalid network interface.");
+  removeHostRoute: function(aNetworkInfo, aHost) {
+    if (!this.isValidatedNetwork(aNetworkInfo)) {
+      return Promise.reject("Invalid network info.");
     }
 
-    return this.resolveHostname(network, host)
+    return this.resolveHostname(aNetworkInfo, aHost)
       .then((ipAddresses) => {
         let promises = [];
-        let networkId = this.getNetworkId(network);
+        let networkId = this.getNetworkId(aNetworkInfo);
 
         ipAddresses.forEach((aIpAddress) => {
           let found = this.networkInterfaceLinks[networkId].extraRoutes.indexOf(aIpAddress);
           if (found < 0) {
             return; // continue
           }
 
           let promise =
-            this._setHostRoutes(false, [aIpAddress], network.name, network.getGateways())
+            this._setHostRoutes(false, [aIpAddress], aNetworkInfo.name, aNetworkInfo.getGateways())
               .then(() => {
                 this.networkInterfaceLinks[networkId].extraRoutes.splice(found, 1);
               }, () => {
                 // We should remove it even if the operation failed.
                 this.networkInterfaceLinks[networkId].extraRoutes.splice(found, 1);
               });
           promises.push(promise);
         });
 
         return Promise.all(promises);
       });
   },
 
   isNetworkTypeSecondaryMobile: function(type) {
-    return (type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS ||
-            type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL ||
-            type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS ||
-            type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN ||
-            type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_FOTA);
+    return (type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_MMS ||
+            type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_SUPL ||
+            type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_IMS ||
+            type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN ||
+            type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_FOTA);
   },
 
   isNetworkTypeMobile: function(type) {
-    return (type == Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE ||
+    return (type == Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE ||
             this.isNetworkTypeSecondaryMobile(type));
   },
 
   _handleGateways: function(networkId, gateways) {
     let currentNetworkLinks = this.networkInterfaceLinks[networkId];
     if (currentNetworkLinks.gateways.length == 0 ||
         currentNetworkLinks.compareGateways(gateways)) {
       return Promise.resolve();
@@ -760,161 +769,163 @@ NetworkManager.prototype = {
     return Promise.all(promises);
   },
 
   /**
    * Determine the active interface and configure it.
    */
   setAndConfigureActive: function() {
     debug("Evaluating whether active network needs to be changed.");
-    let oldActive = this.active;
+    let oldActive = this._activeNetwork;
 
     if (this._overriddenActive) {
       debug("We have an override for the active network: " +
-            this._overriddenActive.name);
+            this._overriddenActive.info.name);
       // The override was just set, so reconfigure the network.
-      if (this.active != this._overriddenActive) {
-        this.active = this._overriddenActive;
-        this._setDefaultRouteAndProxy(this.active, oldActive);
-        Services.obs.notifyObservers(this.active, TOPIC_ACTIVE_CHANGED, null);
+      if (this._activeNetwork != this._overriddenActive) {
+        this._activeNetwork = this._overriddenActive;
+        this._setDefaultRouteAndProxy(this._activeNetwork, oldActive);
+        Services.obs.notifyObservers(this.activeNetworkInfo,
+                                     TOPIC_ACTIVE_CHANGED, null);
       }
       return;
     }
 
     // The active network is already our preferred type.
-    if (this.active &&
-        this.active.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED &&
-        this.active.type == this._preferredNetworkType) {
+    if (this.activeNetworkInfo &&
+        this.activeNetworkInfo.state == Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED &&
+        this.activeNetworkInfo.type == this._preferredNetworkType) {
       debug("Active network is already our preferred type.");
-      return this._setDefaultRouteAndProxy(this.active, oldActive);
+      return this._setDefaultRouteAndProxy(this._activeNetwork, oldActive);
     }
 
     // Find a suitable network interface to activate.
-    this.active = null;
+    this._activeNetwork = null;
     let anyConnected = false;
 
     for each (let network in this.networkInterfaces) {
-      if (network.state != Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED) {
+      if (network.info.state != Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED) {
         continue;
       }
       anyConnected = true;
 
       // Set active only for default connections.
-      if (network.type != Ci.nsINetworkInterface.NETWORK_TYPE_WIFI &&
-          network.type != Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE) {
+      if (network.info.type != Ci.nsINetworkInfo.NETWORK_TYPE_WIFI &&
+          network.info.type != Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE) {
         continue;
       }
 
-      this.active = network;
-      if (network.type == this.preferredNetworkType) {
-        debug("Found our preferred type of network: " + network.name);
+      this._activeNetwork = network;
+      if (network.info.type == this.preferredNetworkType) {
+        debug("Found our preferred type of network: " + network.info.name);
         break;
       }
     }
 
     return Promise.resolve()
       .then(() => {
-        if (!this.active) {
+        if (!this._activeNetwork) {
           return Promise.resolve();
         }
 
-        return this._setDefaultRouteAndProxy(this.active, oldActive);
+        return this._setDefaultRouteAndProxy(this._activeNetwork, oldActive);
       })
       .then(() => {
-        if (this.active != oldActive) {
-          Services.obs.notifyObservers(this.active, TOPIC_ACTIVE_CHANGED, null);
+        if (this._activeNetwork != oldActive) {
+          Services.obs.notifyObservers(this.activeNetworkInfo,
+                                       TOPIC_ACTIVE_CHANGED, null);
         }
 
         if (this._manageOfflineStatus) {
           Services.io.offline = !anyConnected;
         }
       });
   },
 
-  resolveHostname: function(network, hostname) {
+  resolveHostname: function(aNetworkInfo, aHostname) {
     // Sanity check for null, undefined and empty string... etc.
-    if (!hostname) {
-      return Promise.reject(new Error("hostname is empty: " + hostname));
+    if (!aHostname) {
+      return Promise.reject(new Error("hostname is empty: " + aHostname));
     }
 
-    if (hostname.match(this.REGEXP_IPV4) ||
-        hostname.match(this.REGEXP_IPV6)) {
-      return Promise.resolve([hostname]);
+    if (aHostname.match(this.REGEXP_IPV4) ||
+        aHostname.match(this.REGEXP_IPV6)) {
+      return Promise.resolve([aHostname]);
     }
 
     // Wrap gDNSService.asyncResolveExtended to a promise, which
     // resolves with an array of ip addresses or rejects with
     // the reason otherwise.
     let hostResolveWrapper = aNetId => {
       return new Promise((aResolve, aReject) => {
         // Callback for gDNSService.asyncResolveExtended.
         let onLookupComplete = (aRequest, aRecord, aStatus) => {
           if (!Components.isSuccessCode(aStatus)) {
-            aReject(new Error("Failed to resolve '" + hostname +
+            aReject(new Error("Failed to resolve '" + aHostname +
                               "', with status: " + aStatus));
             return;
           }
 
           let retval = [];
           while (aRecord.hasMore()) {
             retval.push(aRecord.getNextAddrAsString());
           }
 
           if (!retval.length) {
             aReject(new Error("No valid address after DNS lookup!"));
             return;
           }
 
-          debug("hostname is resolved: " + hostname);
+          debug("hostname is resolved: " + aHostname);
           debug("Addresses: " + JSON.stringify(retval));
 
           aResolve(retval);
         };
 
-        debug('Calling gDNSService.asyncResolveExtended: ' + aNetId + ', ' + hostname);
-        gDNSService.asyncResolveExtended(hostname,
+        debug('Calling gDNSService.asyncResolveExtended: ' + aNetId + ', ' + aHostname);
+        gDNSService.asyncResolveExtended(aHostname,
                                          0,
                                          aNetId,
                                          onLookupComplete,
                                          Services.tm.mainThread);
       });
     };
 
     // TODO: |getNetId| will be implemented as a sync call in nsINetworkManager
     //       once Bug 1141903 is landed.
-    return gNetworkService.getNetId(network.name)
+    return gNetworkService.getNetId(aNetworkInfo.name)
       .then(aNetId => hostResolveWrapper(aNetId));
   },
 
-  convertConnectionType: function(network) {
+  convertConnectionType: function(aNetworkInfo) {
     // If there is internal interface change (e.g., MOBILE_MMS, MOBILE_SUPL),
     // the function will return null so that it won't trigger type change event
     // in NetworkInformation API.
-    if (network.type != Ci.nsINetworkInterface.NETWORK_TYPE_WIFI &&
-        network.type != Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE) {
+    if (aNetworkInfo.type != Ci.nsINetworkInfo.NETWORK_TYPE_WIFI &&
+        aNetworkInfo.type != Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE) {
       return null;
     }
 
-    if (network.state == Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED) {
+    if (aNetworkInfo.state == Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED) {
       return CONNECTION_TYPE_NONE;
     }
 
-    switch (network.type) {
-      case Ci.nsINetworkInterface.NETWORK_TYPE_WIFI:
+    switch (aNetworkInfo.type) {
+      case Ci.nsINetworkInfo.NETWORK_TYPE_WIFI:
         return CONNECTION_TYPE_WIFI;
-      case Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE:
+      case Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE:
         return CONNECTION_TYPE_CELLULAR;
     }
   },
 
-  _setDNS: function(aNetwork) {
+  _setDNS: function(aNetworkInfo) {
     return new Promise((aResolve, aReject) => {
-      let dnses = aNetwork.getDnses();
-      let gateways = aNetwork.getGateways();
-      gNetworkService.setDNS(aNetwork.name, dnses.length, dnses,
+      let dnses = aNetworkInfo.getDnses();
+      let gateways = aNetworkInfo.getGateways();
+      gNetworkService.setDNS(aNetworkInfo.name, dnses.length, dnses,
                              gateways.length, gateways, (aError) => {
         if (aError) {
           aReject("setDNS failed");
           return;
         }
         aResolve();
       });
     });
@@ -951,65 +962,66 @@ NetworkManager.prototype = {
           debug("resetRoutingTable failed");
         }
         // Always resolve.
         aResolve();
       });
     });
   },
 
-  _removeDefaultRoute: function(aNetwork) {
+  _removeDefaultRoute: function(aNetworkInfo) {
     return new Promise((aResolve, aReject) => {
-      let gateways = aNetwork.getGateways();
-      gNetworkService.removeDefaultRoute(aNetwork.name, gateways.length,
+      let gateways = aNetworkInfo.getGateways();
+      gNetworkService.removeDefaultRoute(aNetworkInfo.name, gateways.length,
                                          gateways, (aSuccess) => {
         if (!aSuccess) {
           debug("removeDefaultRoute failed");
         }
         // Always resolve.
         aResolve();
       });
     });
   },
 
   _setDefaultRouteAndProxy: function(aNetwork, aOldInterface) {
     return new Promise((aResolve, aReject) => {
-      let gateways = aNetwork.getGateways();
-      let oldInterfaceName = (aOldInterface ? aOldInterface.name : "");
-      gNetworkService.setDefaultRoute(aNetwork.name, gateways.length, gateways,
+      let networkInfo = aNetwork.info;
+      let gateways = networkInfo.getGateways();
+      let oldInterfaceName = (aOldInterface ? aOldInterface.info.name : "");
+      gNetworkService.setDefaultRoute(networkInfo.name, gateways.length, gateways,
                                       oldInterfaceName, (aSuccess) => {
         if (!aSuccess) {
-          gNetworkService.destroyNetwork(aNetwork, function() {
+          gNetworkService.destroyNetwork(networkInfo.name, function() {
             aReject("setDefaultRoute failed");
           });
           return;
         }
         this.setNetworkProxy(aNetwork);
         aResolve();
       });
     });
   },
 
-  setNetworkProxy: function(network) {
+  setNetworkProxy: function(aNetwork) {
     try {
-      if (!network.httpProxyHost || network.httpProxyHost === "") {
+      if (!aNetwork.httpProxyHost || aNetwork.httpProxyHost === "") {
         // Sets direct connection to internet.
         this.clearNetworkProxy();
 
-        debug("No proxy support for " + network.name + " network interface.");
+        debug("No proxy support for " + aNetwork.info.name + " network interface.");
         return;
       }
 
-      debug("Going to set proxy settings for " + network.name + " network interface.");
+      debug("Going to set proxy settings for " + aNetwork.info.name + " network interface.");
 
       // Do not use this proxy server for all protocols.
       Services.prefs.setBoolPref("network.proxy.share_proxy_settings", false);
-      Services.prefs.setCharPref("network.proxy.http", network.httpProxyHost);
-      Services.prefs.setCharPref("network.proxy.ssl", network.httpProxyHost);
-      let port = network.httpProxyPort === 0 ? 8080 : network.httpProxyPort;
+      Services.prefs.setCharPref("network.proxy.http", aNetwork.httpProxyHost);
+      Services.prefs.setCharPref("network.proxy.ssl", aNetwork.httpProxyHost);
+      let port = aNetwork.httpProxyPort === 0 ? 8080 : aNetwork.httpProxyPort;
       Services.prefs.setIntPref("network.proxy.http_port", port);
       Services.prefs.setIntPref("network.proxy.ssl_port", port);
 
       let usePAC;
       try {
         usePAC = Services.prefs.getBoolPref("network.proxy.pac_generator");
       } catch (ex) {}
 
@@ -1017,17 +1029,17 @@ NetworkManager.prototype = {
         Services.prefs.setCharPref("network.proxy.autoconfig_url",
                                    gPACGenerator.generate());
         Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_PAC);
       } else {
         Services.prefs.setIntPref("network.proxy.type", PROXY_TYPE_MANUAL);
       }
     } catch(ex) {
         debug("Exception " + ex + ". Unable to set proxy setting for " +
-              network.name + " network interface.");
+              aNetwork.info.name + " network interface.");
     }
   },
 
   clearNetworkProxy: function() {
     debug("Going to clear all network proxy.");
 
     Services.prefs.clearUserPref("network.proxy.share_proxy_settings");
     Services.prefs.clearUserPref("network.proxy.http");
@@ -1100,27 +1112,27 @@ let CaptivePortalDetectionHelper = (func
   return {
     EVENT_CONNECT: EVENT_CONNECT,
     EVENT_DISCONNECT: EVENT_DISCONNECT,
     notify: function(eventType, network) {
       switch (eventType) {
         case EVENT_CONNECT:
           // perform captive portal detection on wifi interface
           if (_available && network &&
-              network.type == Ci.nsINetworkInterface.NETWORK_TYPE_WIFI) {
+              network.type == Ci.nsINetworkInfo.NETWORK_TYPE_WIFI) {
             _performDetection(network.name, function() {
               // TODO: bug 837600
               // We can disconnect wifi in here if user abort the login procedure.
             });
           }
 
           break;
         case EVENT_DISCONNECT:
           if (_available &&
-              network.type == Ci.nsINetworkInterface.NETWORK_TYPE_WIFI) {
+              network.type == Ci.nsINetworkInfo.NETWORK_TYPE_WIFI) {
             _abort(network.name);
           }
           break;
       }
     }
   };
 }());
 
--- a/dom/system/gonk/RadioInterfaceLayer.js
+++ b/dom/system/gonk/RadioInterfaceLayer.js
@@ -55,18 +55,18 @@ const kSettingsTimezoneAutoUpdateAvailab
 const NS_PREFBRANCH_PREFCHANGE_TOPIC_ID = "nsPref:changed";
 
 const kPrefRilNumRadioInterfaces = "ril.numRadioInterfaces";
 const kPrefRilDebuggingEnabled = "ril.debugging.enabled";
 
 const RADIO_POWER_OFF_TIMEOUT = 30000;
 const HW_DEFAULT_CLIENT_ID = 0;
 
-const NETWORK_TYPE_WIFI        = Ci.nsINetworkInterface.NETWORK_TYPE_WIFI;
-const NETWORK_TYPE_MOBILE      = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE;
+const NETWORK_TYPE_WIFI        = Ci.nsINetworkInfo.NETWORK_TYPE_WIFI;
+const NETWORK_TYPE_MOBILE      = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE;
 
 // set to true in ril_consts.js to see debug messages
 var DEBUG = RIL.DEBUG_RIL;
 
 function updateDebugFlag() {
   // Read debug setting from pref
   let debugPref;
   try {
@@ -1143,31 +1143,31 @@ RadioInterface.prototype = {
       case kSysClockChangeObserverTopic:
         let offset = parseInt(data, 10);
         if (this._lastNitzMessage) {
           this._lastNitzMessage.receiveTimeInMS += offset;
         }
         this._sntp.updateOffset(offset);
         break;
       case kNetworkConnStateChangedTopic:
-        let network = subject.QueryInterface(Ci.nsINetworkInterface);
-        if (network.state != Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED) {
+        let networkInfo = subject.QueryInterface(Ci.nsINetworkInfo);
+        if (networkInfo.state != Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED) {
           return;
         }
 
         // SNTP can only update when we have mobile or Wifi connections.
-        if (network.type != NETWORK_TYPE_WIFI &&
-            network.type != NETWORK_TYPE_MOBILE) {
+        if (networkInfo.type != NETWORK_TYPE_WIFI &&
+            networkInfo.type != NETWORK_TYPE_MOBILE) {
           return;
         }
 
         // If the network comes from RIL, make sure the RIL service is matched.
-        if (subject instanceof Ci.nsIRilNetworkInterface) {
-          network = subject.QueryInterface(Ci.nsIRilNetworkInterface);
-          if (network.serviceId != this.clientId) {
+        if (subject instanceof Ci.nsIRilNetworkInfo) {
+          networkInfo = subject.QueryInterface(Ci.nsIRilNetworkInfo);
+          if (networkInfo.serviceId != this.clientId) {
             return;
           }
         }
 
         // SNTP won't update unless the SNTP is already expired.
         if (this._sntp.isExpired()) {
           this._sntp.request();
         }
@@ -1237,18 +1237,19 @@ RadioInterface.prototype = {
         this._clockAutoUpdateEnabled = aResult;
         if (!this._clockAutoUpdateEnabled) {
           break;
         }
 
         // Set the latest cached NITZ time if it's available.
         if (this._lastNitzMessage) {
           this.setClockByNitz(this._lastNitzMessage);
-        } else if (gNetworkManager.active && gNetworkManager.active.state ==
-                 Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED) {
+        } else if (gNetworkManager.activeNetworkInfo &&
+                   gNetworkManager.activeNetworkInfo.state ==
+                   Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED) {
           // Set the latest cached SNTP time if it's available.
           if (!this._sntp.isExpired()) {
             this.setClockBySntp(this._sntp.getOffset());
           } else {
             // Or refresh the SNTP.
             this._sntp.request();
           }
         } else {
--- a/dom/system/gonk/TetheringService.js
+++ b/dom/system/gonk/TetheringService.js
@@ -243,17 +243,17 @@ TetheringService.prototype = {
         break;
       case TOPIC_MOZSETTINGS_CHANGED:
         if ("wrappedJSObject" in aSubject) {
           aSubject = aSubject.wrappedJSObject;
         }
         this.handle(aSubject.key, aSubject.value);
         break;
       case TOPIC_CONNECTION_STATE_CHANGED:
-        network = aSubject.QueryInterface(Ci.nsINetworkInterface);
+        network = aSubject.QueryInterface(Ci.nsINetworkInfo);
         debug("Network " + network.type + "/" + network.name +
               " changed state to " + network.state);
         this.onConnectionChanged(network);
         break;
       case TOPIC_XPCOM_SHUTDOWN:
         Services.obs.removeObserver(this, TOPIC_XPCOM_SHUTDOWN);
         Services.obs.removeObserver(this, TOPIC_MOZSETTINGS_CHANGED);
         Services.obs.removeObserver(this, TOPIC_CONNECTION_STATE_CHANGED);
@@ -333,28 +333,28 @@ TetheringService.prototype = {
 
     this.tetheringSettings[SETTINGS_WIFI_DHCPSERVER_STARTIP] = DEFAULT_WIFI_DHCPSERVER_STARTIP;
     this.tetheringSettings[SETTINGS_WIFI_DHCPSERVER_ENDIP]   = DEFAULT_WIFI_DHCPSERVER_ENDIP;
 
     this.tetheringSettings[SETTINGS_DUN_REQUIRED] =
       libcutils.property_get("ro.tethering.dun_required") === "1";
   },
 
-  getNetworkInterface: function(aType, aServiceId) {
-    for each (let network in gNetworkManager.networkInterfaces) {
-      if (network.type == aType) {
+  getNetworkInfo: function(aType, aServiceId) {
+    for each (let networkInfo in gNetworkManager.allNetworkInfo) {
+      if (networkInfo.type == aType) {
         try {
-          if (network instanceof Ci.nsIRilNetworkInterface) {
-            let rilNetwork = network.QueryInterface(Ci.nsIRilNetworkInterface);
+          if (networkInfo instanceof Ci.nsIRilNetworkInfo) {
+            let rilNetwork = networkInfo.QueryInterface(Ci.nsIRilNetworkInfo);
             if (rilNetwork.serviceId != aServiceId) {
               continue;
             }
           }
         } catch (e) {}
-        return network;
+        return networkInfo;
       }
     }
     return null;
   },
 
   handleLastUsbTetheringRequest: function() {
     debug('handleLastUsbTetheringRequest... ' + this._usbTetheringRequestCount);
 
@@ -400,17 +400,17 @@ TetheringService.prototype = {
     this.dunRetryTimer.cancel();
     let connection =
       gMobileConnectionService.getItemByServiceId(this._dataDefaultServiceId);
     let data = connection && connection.data;
     if (data && data.state === "registered") {
       let ril = gRil.getRadioInterface(this._dataDefaultServiceId);
 
       this.dunRetryTimes = 0;
-      ril.setupDataCallByType(Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN);
+      ril.setupDataCallByType(Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN);
       this.dunConnectTimer.cancel();
       this.dunConnectTimer.
         initWithCallback(this.onDunConnectTimerTimeout.bind(this),
                          MOBILE_DUN_CONNECT_TIMEOUT, Ci.nsITimer.TYPE_ONE_SHOT);
       return;
     }
 
     if (this.dunRetryTimes++ >= this.MOBILE_DUN_MAX_RETRIES) {
@@ -425,40 +425,40 @@ TetheringService.prototype = {
     this.dunRetryTimer.
       initWithCallback(this.setupDunConnection.bind(this),
                        MOBILE_DUN_RETRY_INTERVAL, Ci.nsITimer.TYPE_ONE_SHOT);
   },
 
   _dunActiveUsers: 0,
   handleDunConnection: function(aEnable, aCallback) {
     debug("handleDunConnection: " + aEnable);
-    let dun = this.getNetworkInterface(
-      Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN, this._dataDefaultServiceId);
+    let dun = this.getNetworkInfo(
+      Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN, this._dataDefaultServiceId);
 
     if (!aEnable) {
       this._dunActiveUsers--;
       if (this._dunActiveUsers > 0) {
         debug("Dun still needed by others, do not disconnect.")
         return;
       }
 
       this.dunRetryTimes = 0;
       this.dunRetryTimer.cancel();
       this.dunConnectTimer.cancel();
       this._pendingTetheringRequests = [];
 
-      if (dun && (dun.state == Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED)) {
+      if (dun && (dun.state == Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED)) {
         gRil.getRadioInterface(this._dataDefaultServiceId)
-          .deactivateDataCallByType(Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN);
+          .deactivateDataCallByType(Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN);
       }
       return;
     }
 
     this._dunActiveUsers++;
-    if (!dun || (dun.state != Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED)) {
+    if (!dun || (dun.state != Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED)) {
       debug("DUN data call inactive, setup dun data call!")
       this._pendingTetheringRequests.push(aCallback);
       this.dunRetryTimes = 0;
       this.setupDunConnection();
 
       return;
     }
 
@@ -490,33 +490,34 @@ TetheringService.prototype = {
       gNetworkService.enableUsbRndis(false, this.enableUsbRndisResult.bind(this));
       return;
     }
 
     this.tetheringSettings[SETTINGS_USB_ENABLED] = true;
     this._usbTetheringAction = TETHERING_STATE_ONGOING;
 
     if (this.tetheringSettings[SETTINGS_DUN_REQUIRED]) {
-      this.handleDunConnection(true, (aNetwork) => {
-        if (!aNetwork){
+      this.handleDunConnection(true, (aNetworkInfo) => {
+        if (!aNetworkInfo){
           this.usbTetheringResultReport(aEnable, "Dun connection failed");
           return;
         }
-        this._tetheringInterface[TETHERING_TYPE_USB].externalInterface = aNetwork.name;
+        this._tetheringInterface[TETHERING_TYPE_USB].externalInterface =
+          aNetworkInfo.name;
         gNetworkService.enableUsbRndis(true, this.enableUsbRndisResult.bind(this));
       });
       return;
     }
 
-    if (gNetworkManager.active) {
+    if (gNetworkManager.activeNetworkInfo) {
       this._tetheringInterface[TETHERING_TYPE_USB].externalInterface =
-        gNetworkManager.active.name;
+        gNetworkManager.activeNetworkInfo.name;
     } else {
-      let mobile = this.getNetworkInterface(
-        Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE, this._dataDefaultServiceId);
+      let mobile = this.getNetworkInfo(
+        Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE, this._dataDefaultServiceId);
       if (mobile && mobile.name) {
         this._tetheringInterface[TETHERING_TYPE_USB].externalInterface = mobile.name;
       }
     }
     gNetworkService.enableUsbRndis(true, this.enableUsbRndisResult.bind(this));
   },
 
   getUSBTetheringParameters: function(aEnable, aTetheringInterface) {
@@ -594,20 +595,20 @@ TetheringService.prototype = {
       if (this._usbTetheringRequestCount > 0) {
         debug('Perform pending USB tethering requests.');
         this.handleLastUsbTetheringRequest();
       }
     });
   },
 
   // Enable/disable WiFi tethering by sending commands to netd.
-  setWifiTethering: function(aEnable, aNetwork, aConfig, aCallback) {
+  setWifiTethering: function(aEnable, aInterfaceName, aConfig, aCallback) {
     debug("setWifiTethering: " + aEnable);
-    if (!aNetwork) {
-      this.notifyError(true, aCallback, "invalid network information");
+    if (!aInterfaceName) {
+      this.notifyError(true, aCallback, "invalid network interface name");
       return;
     }
 
     if (!aConfig) {
       this.notifyError(true, aCallback, "invalid configuration");
       return;
     }
 
@@ -625,32 +626,34 @@ TetheringService.prototype = {
     this.tetheringSettings[SETTINGS_DUN_REQUIRED] =
       libcutils.property_get("ro.tethering.dun_required") === "1";
 
     if (!aEnable) {
       this.enableWifiTethering(false, aConfig, aCallback);
       return;
     }
 
-    this._tetheringInterface[TETHERING_TYPE_WIFI].internalInterface = aNetwork.name;
+    this._tetheringInterface[TETHERING_TYPE_WIFI].internalInterface =
+      aInterfaceName;
 
     if (this.tetheringSettings[SETTINGS_DUN_REQUIRED]) {
-      this.handleDunConnection(true, (aNetwork) => {
-        if (!aNetwork) {
+      this.handleDunConnection(true, (aNetworkInfo) => {
+        if (!aNetworkInfo) {
           this.notifyError(true, aCallback, "Dun connection failed");
           return;
         }
-        this._tetheringInterface[TETHERING_TYPE_WIFI].externalInterface = aNetwork.name;
+        this._tetheringInterface[TETHERING_TYPE_WIFI].externalInterface =
+          aNetworkInfo.name;
         this.enableWifiTethering(true, aConfig, aCallback);
       });
       return;
     }
 
-    let mobile = this.getNetworkInterface(
-      Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE, this._dataDefaultServiceId);
+    let mobile = this.getNetworkInfo(
+      Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE, this._dataDefaultServiceId);
     // Update the real interface name
     if (mobile && mobile.name) {
       this._tetheringInterface[TETHERING_TYPE_WIFI].externalInterface = mobile.name;
     }
 
     this.enableWifiTethering(true, aConfig, aCallback);
   },
 
@@ -740,67 +743,67 @@ TetheringService.prototype = {
     if (aSuccess) {
       // Update the external interface.
       this._tetheringInterface[TETHERING_TYPE_USB].externalInterface =
         aExternalIfname;
       debug("Change the interface name to " + aExternalIfname);
     }
   },
 
-  onConnectionChanged: function(aNetwork) {
-    if (aNetwork.state != Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED) {
+  onConnectionChanged: function(aNetworkInfo) {
+    if (aNetworkInfo.state != Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED) {
       debug("We are only interested in CONNECTED event");
       return;
     }
 
     if (this.tetheringSettings[SETTINGS_DUN_REQUIRED] &&
-        aNetwork.type === Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN) {
+        aNetworkInfo.type === Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN) {
       this.dunConnectTimer.cancel();
       debug("DUN data call connected, process callbacks.");
       while (this._pendingTetheringRequests.length > 0) {
         let callback = this._pendingTetheringRequests.shift();
         if (typeof callback === 'function') {
-          callback(aNetwork);
+          callback(aNetworkInfo);
         }
       }
       return;
     }
 
     if (!this.tetheringSettings[SETTINGS_USB_ENABLED]) {
       debug("Usb tethering settings is not enabled");
       return;
     }
 
     if (this.tetheringSettings[SETTINGS_DUN_REQUIRED] &&
-        aNetwork.type === Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN &&
+        aNetworkInfo.type === Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN &&
         this._tetheringInterface[TETHERING_TYPE_USB].externalInterface ===
-        aNetwork.name) {
+        aNetworkInfo.name) {
       debug("Dun required and dun interface is the same");
       return;
     }
 
     if (this._tetheringInterface[TETHERING_TYPE_USB].externalInterface ===
-        gNetworkManager.active.name) {
+        gNetworkManager.activeNetworkInfo.name) {
       debug("The active interface is the same");
       return;
     }
 
     let previous = {
       internalIfname: this._tetheringInterface[TETHERING_TYPE_USB].internalInterface,
       externalIfname: this._tetheringInterface[TETHERING_TYPE_USB].externalInterface
     };
 
     let current = {
       internalIfname: this._tetheringInterface[TETHERING_TYPE_USB].internalInterface,
-      externalIfname: aNetwork.name
+      externalIfname: aNetworkInfo.name
     };
 
     let callback = (() => {
       // Update external network interface.
-      debug("Update upstream interface to " + aNetwork.name);
+      debug("Update upstream interface to " + aNetworkInfo.name);
       gNetworkService.updateUpStream(previous, current,
                                      this.onConnectionChangedReport.bind(this));
     });
 
     if (this._usbTetheringAction === TETHERING_STATE_ONGOING) {
       debug("Postpone the event and handle it when state is idle.");
       this.wantConnectionEvent = callback;
       return;
--- a/dom/system/gonk/moz.build
+++ b/dom/system/gonk/moz.build
@@ -11,16 +11,17 @@
 # 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.
 
 XPIDL_SOURCES += [
     'nsIAudioManager.idl',
+    'nsINetworkInterface.idl',
     'nsINetworkInterfaceListService.idl',
     'nsINetworkManager.idl',
     'nsINetworkService.idl',
     'nsINetworkWorker.idl',
     'nsISystemWorkerManager.idl',
     'nsITetheringService.idl',
     'nsIVolume.idl',
     'nsIVolumeMountLock.idl',
--- a/dom/system/gonk/nsIDataCallManager.idl
+++ b/dom/system/gonk/nsIDataCallManager.idl
@@ -1,17 +1,17 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsISupports.idl"
-#include "nsINetworkManager.idl"
+#include "nsINetworkInterface.idl"
 
-[scriptable, uuid(b8ce8528-fce8-4b5e-9d0a-c3247296ccaf)]
-interface nsIRilNetworkInterface : nsINetworkInterface
+[scriptable, uuid(501b7041-0754-4ddb-9174-946e2c2ebd83)]
+interface nsIRilNetworkInfo : nsINetworkInfo
 {
   readonly attribute unsigned long serviceId;
   readonly attribute DOMString iccId;
 
   /* The following attributes are for MMS proxy settings. */
   readonly attribute DOMString mmsc;     // Empty string if not set.
   readonly attribute DOMString mmsProxy; // Empty string if not set.
   readonly attribute long      mmsPort;  // -1 if not set.
new file mode 100644
--- /dev/null
+++ b/dom/system/gonk/nsINetworkInterface.idl
@@ -0,0 +1,100 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this file,
+ * You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "nsISupports.idl"
+
+[scriptable, uuid(f439ab5d-64bd-4a6c-8863-30235fa784d2)]
+interface nsINetworkInfo : nsISupports
+{
+  const long NETWORK_STATE_UNKNOWN       = -1;
+  const long NETWORK_STATE_CONNECTING    = 0;
+  const long NETWORK_STATE_CONNECTED     = 1;
+  const long NETWORK_STATE_DISCONNECTING = 2;
+  const long NETWORK_STATE_DISCONNECTED  = 3;
+
+  /**
+   * Current network state, one of the NETWORK_STATE_* constants.
+   *
+   * When this changes, network interface implementations notify with
+   * updateNetworkInterface() API.
+   */
+  readonly attribute long state;
+
+  const long NETWORK_TYPE_UNKNOWN     = -1;
+  const long NETWORK_TYPE_WIFI        = 0;
+  const long NETWORK_TYPE_MOBILE      = 1;
+  const long NETWORK_TYPE_MOBILE_MMS  = 2;
+  const long NETWORK_TYPE_MOBILE_SUPL = 3;
+  const long NETWORK_TYPE_WIFI_P2P    = 4;
+  const long NETWORK_TYPE_MOBILE_IMS  = 5;
+  const long NETWORK_TYPE_MOBILE_DUN  = 6;
+  const long NETWORK_TYPE_MOBILE_FOTA = 7;
+
+  /**
+   * Network type. One of the NETWORK_TYPE_* constants.
+   */
+  readonly attribute long type;
+
+  /**
+   * Interface name of the network interface this network info belongs to.
+   */
+  readonly attribute DOMString name;
+
+  /**
+   * Get the list of ip addresses and prefix lengths, ip address could be IPv4
+   * or IPv6, typically 1 IPv4 or 1 IPv6 or one of each.
+   *
+   * @param ips
+   *        The list of ip addresses retrieved.
+   * @param prefixLengths
+   *        The list of prefix lengths retrieved.
+   *
+   * @returns the length of the lists.
+   */
+  void getAddresses([array, size_is(count)] out wstring ips,
+                    [array, size_is(count)] out unsigned long prefixLengths,
+                    [retval] out unsigned long count);
+
+  /**
+   * Get the list of gateways, could be IPv4 or IPv6, typically 1 IPv4 or 1
+   * IPv6 or one of each.
+   *
+   * @param count
+   *        The length of the list of gateways
+   *
+   * @returns the list of gateways.
+   */
+  void getGateways([optional] out unsigned long count,
+                   [array, size_is(count), retval] out wstring gateways);
+
+  /**
+   * Get the list of dnses, could be IPv4 or IPv6.
+   *
+   * @param count
+   *        The length of the list of dnses.
+   *
+   * @returns the list of dnses.
+   */
+  void getDnses([optional] out unsigned long count,
+                [array, size_is(count), retval] out wstring dnses);
+};
+
+[scriptable, uuid(9a025351-8684-4ab5-a0c1-f21a9f83d405)]
+interface nsINetworkInterface : nsISupports
+{
+  /**
+   * The network information about this network interface.
+   */
+  readonly attribute nsINetworkInfo info;
+
+  /**
+   * The host name of the http proxy server.
+   */
+  readonly attribute DOMString httpProxyHost;
+
+  /*
+   * The port number of the http proxy server.
+   */
+  readonly attribute long httpProxyPort;
+};
--- a/dom/system/gonk/nsINetworkInterfaceListService.idl
+++ b/dom/system/gonk/nsINetworkInterfaceListService.idl
@@ -1,28 +1,29 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
-#include "nsINetworkManager.idl"
 #include "nsISupports.idl"
 
-[scriptable, uuid(b44d74db-c9d6-41dd-98ae-a56918d6e6ad)]
+interface nsINetworkInfo;
+
+[scriptable, uuid(55779d32-1e28-4f43-af87-09d04bc3cce9)]
 interface nsINetworkInterfaceList : nsISupports
 {
   /**
    * Number of the network interfaces that is available.
    */
   long getNumberOfInterface();
 
   /**
-   * Get the i-th interface from the list.
+   * Get the i-th interface info info from the list.
    * @param interfaceIndex index of interface, from 0 to number of interface - 1.
    */
-  nsINetworkInterface getInterface(in long interfaceIndex);
+  nsINetworkInfo getInterfaceInfo(in long interfaceIndex);
 };
 
 [scriptable, uuid(21d7fc8b-28c4-4a4f-a15e-1f9defbc2cec)]
 interface nsINetworkInterfaceListService : nsISupports
 {
   const long LIST_NOT_INCLUDE_MMS_INTERFACES  = (1 << 0);
   const long LIST_NOT_INCLUDE_SUPL_INTERFACES = (1 << 1);
   const long LIST_NOT_INCLUDE_IMS_INTERFACES  = (1 << 2);
--- a/dom/system/gonk/nsINetworkManager.idl
+++ b/dom/system/gonk/nsINetworkManager.idl
@@ -1,107 +1,21 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsISupports.idl"
 
-/**
- * Information about networks that is exposed to network manager API consumers.
- */
-[scriptable, uuid(12da2bfd-0801-40d9-9c2e-768868526065)]
-interface nsINetworkInterface : nsISupports
-{
-  const long NETWORK_STATE_UNKNOWN = -1;
-  const long NETWORK_STATE_CONNECTING = 0;
-  const long NETWORK_STATE_CONNECTED = 1;
-  const long NETWORK_STATE_DISCONNECTING = 2;
-  const long NETWORK_STATE_DISCONNECTED = 3;
-
-  /**
-   * Current network state, one of the NETWORK_STATE_* constants.
-   *
-   * When this changes, network interface implementations notify with
-   * updateNetworkInterface() API.
-   */
-  readonly attribute long state;
-
-  const long NETWORK_TYPE_UNKNOWN     = -1;
-  const long NETWORK_TYPE_WIFI        = 0;
-  const long NETWORK_TYPE_MOBILE      = 1;
-  const long NETWORK_TYPE_MOBILE_MMS  = 2;
-  const long NETWORK_TYPE_MOBILE_SUPL = 3;
-  const long NETWORK_TYPE_WIFI_P2P    = 4;
-  const long NETWORK_TYPE_MOBILE_IMS  = 5;
-  const long NETWORK_TYPE_MOBILE_DUN  = 6;
-  const long NETWORK_TYPE_MOBILE_FOTA = 7;
-
-  /**
-   * Network type. One of the NETWORK_TYPE_* constants.
-   */
-  readonly attribute long type;
-
-  /**
-   * Name of the network interface. This identifier is unique.
-   */
-  readonly attribute DOMString name;
-
-  /**
-   * The host name of the http proxy server.
-   */
-  readonly attribute DOMString httpProxyHost;
-
-  /*
-   * The port number of the http proxy server.
-   */
-  readonly attribute long httpProxyPort;
-
-  /**
-   * Get the list of ip addresses and prefix lengths, ip address could be IPv4
-   * or IPv6, typically 1 IPv4 or 1 IPv6 or one of each.
-   *
-   * @param ips
-   *        The list of ip addresses retrieved.
-   * @param prefixLengths
-   *        The list of prefix lengths retrieved.
-   *
-   * @returns the length of the lists.
-   */
-  void getAddresses([array, size_is(count)] out wstring ips,
-                    [array, size_is(count)] out unsigned long prefixLengths,
-                    [retval] out unsigned long count);
-
-  /**
-   * Get the list of gateways, could be IPv4 or IPv6, typically 1 IPv4 or 1
-   * IPv6 or one of each.
-   *
-   * @param count
-   *        The length of the list of gateways
-   *
-   * @returns the list of gateways.
-   */
-  void getGateways([optional] out unsigned long count,
-                   [array, size_is(count), retval] out wstring gateways);
-
-  /**
-   * Get the list of dnses, could be IPv4 or IPv6.
-   *
-   * @param count
-   *        The length of the list of dnses.
-   *
-   * @returns the list of dnses.
-   */
-  void getDnses([optional] out unsigned long count,
-                [array, size_is(count), retval] out wstring dnses);
-};
+interface nsINetworkInfo;
+interface nsINetworkInterface;
 
 /**
  * Manage network interfaces.
  */
-[scriptable, uuid(b0ab71bf-4b38-4796-8a3c-4141255f4259)]
+[scriptable, uuid(e5ffe335-078e-4b25-87f1-02429bd2e458)]
 interface nsINetworkManager : nsISupports
 {
   /**
    * Register the given network interface with the network manager.
    *
    * Consumers will be notified with the 'network-interface-registered'
    * observer notification.
    *
@@ -136,40 +50,41 @@ interface nsINetworkManager : nsISupport
    * registered.
    *
    * @param network
    *        Network interface to unregister.
    */
   void unregisterNetworkInterface(in nsINetworkInterface network);
 
   /**
-   * Object containing all known network connections, keyed by their
+   * Object containing all known network information, keyed by their
    * network id. Network id is composed of a sub-id + '-' + network
    * type. For mobile network types, sub-id is 'ril' + service id; for
    * non-mobile network types, sub-id is always 'device'.
    */
-  readonly attribute jsval networkInterfaces;
+  readonly attribute jsval allNetworkInfo;
 
   /**
    * The preferred network type. One of the
    * nsINetworkInterface::NETWORK_TYPE_* constants.
    *
    * This attribute is used for setting default route to favor
    * interfaces with given type.  This can be overriden by calling
    * overrideDefaultRoute().
    */
   attribute long preferredNetworkType;
 
   /**
-   * The network interface handling all data traffic.
+   * The network information of the network interface handling all network
+   * traffic.
    *
    * When this changes, the 'network-active-changed' observer
    * notification is dispatched.
    */
-  readonly attribute nsINetworkInterface active;
+  readonly attribute nsINetworkInfo activeNetworkInfo;
 
   /**
    * Override the default behaviour for preferredNetworkType and route
    * all network traffic through the the specified interface.
    *
    * Consumers can observe changes to the active network by subscribing to
    * the 'network-active-changed' observer notification.
    *
@@ -178,34 +93,34 @@ interface nsINetworkManager : nsISupport
    *        a previous override is canceled.
    */
   long overrideActive(in nsINetworkInterface network);
 
   /**
    * Add host route to the specified network into routing table.
    *
    * @param network
-   *        The network interface where the host to be routed to.
+   *        The network information for the host to be routed to.
    * @param host
    *        The host to be added.
    *        The host will be resolved in advance if it's not an ip-address.
    *
    * @return a Promise
    *         resolved if added; rejected, otherwise.
    */
-  jsval addHostRoute(in nsINetworkInterface network,
+  jsval addHostRoute(in nsINetworkInfo network,
                      in DOMString host);
 
   /**
    * Remove host route to the specified network from routing table.
    *
    * @param network
-   *        The network interface where the routing to be removed from.
+   *        The network information for the routing to be removed from.
    * @param host
    *        The host routed to the network.
    *        The host will be resolved in advance if it's not an ip-address.
    *
    * @return a Promise
    *         resolved if removed; rejected, otherwise.
    */
-  jsval removeHostRoute(in nsINetworkInterface network,
+  jsval removeHostRoute(in nsINetworkInfo network,
                         in DOMString host);
 };
--- a/dom/system/gonk/nsITetheringService.idl
+++ b/dom/system/gonk/nsITetheringService.idl
@@ -2,29 +2,29 @@
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 #include "nsISupports.idl"
 
 interface nsINetworkInterface;
 interface nsIWifiTetheringCallback;
 
-[scriptable, uuid(80d65940-bd99-458f-8529-e438c7348087)]
+[scriptable, uuid(993b79df-f10e-4697-a5dc-5981cf8ff7e6)]
 interface nsITetheringService : nsISupports
 {
   /**
    * Enable or disable Wifi Tethering
    *
    * @param enabled
    *        Boolean that indicates whether tethering should be enabled (true) or
    *        disabled (false).
-   * @param networkInterface
-   *        The Wifi network interface with at least name of network interface.
+   * @param interfaceName
+   *        The Wifi network interface name for internal interface.
    * @param config
    *        The Wifi Tethering configuration from settings db.
    * @param callback
    *        Callback function used to report status to WifiManager.
    */
   void setWifiTethering(in boolean enabled,
-                        in nsINetworkInterface networkInterface,
+                        in DOMString interfaceName,
                         in jsval config,
                         in nsIWifiTetheringCallback callback);
 };
\ No newline at end of file
--- a/dom/system/gonk/tests/marionette/head.js
+++ b/dom/system/gonk/tests/marionette/head.js
@@ -4,28 +4,28 @@
 MARIONETTE_CONTEXT = "chrome";
 
 const SETTINGS_KEY_DATA_ENABLED = "ril.data.enabled";
 const SETTINGS_KEY_DATA_APN_SETTINGS  = "ril.data.apnSettings";
 
 const TOPIC_CONNECTION_STATE_CHANGED = "network-connection-state-changed";
 const TOPIC_NETWORK_ACTIVE_CHANGED = "network-active-changed";
 
-const NETWORK_STATE_UNKNOWN = Ci.nsINetworkInterface.NETWORK_STATE_UNKNOWN;
-const NETWORK_STATE_CONNECTING = Ci.nsINetworkInterface.NETWORK_STATE_CONNECTING;
-const NETWORK_STATE_CONNECTED = Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED;
-const NETWORK_STATE_DISCONNECTING = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTING;
-const NETWORK_STATE_DISCONNECTED = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED;
+const NETWORK_STATE_UNKNOWN = Ci.nsINetworkInfo.NETWORK_STATE_UNKNOWN;
+const NETWORK_STATE_CONNECTING = Ci.nsINetworkInfo.NETWORK_STATE_CONNECTING;
+const NETWORK_STATE_CONNECTED = Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED;
+const NETWORK_STATE_DISCONNECTING = Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTING;
+const NETWORK_STATE_DISCONNECTED = Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED;
 
-const NETWORK_TYPE_MOBILE = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE;
-const NETWORK_TYPE_MOBILE_MMS = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS;
-const NETWORK_TYPE_MOBILE_SUPL = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL;
-const NETWORK_TYPE_MOBILE_IMS = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_IMS;
-const NETWORK_TYPE_MOBILE_DUN = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_DUN;
-const NETWORK_TYPE_MOBILE_FOTA = Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_FOTA;
+const NETWORK_TYPE_MOBILE = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE;
+const NETWORK_TYPE_MOBILE_MMS = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_MMS;
+const NETWORK_TYPE_MOBILE_SUPL = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_SUPL;
+const NETWORK_TYPE_MOBILE_IMS = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_IMS;
+const NETWORK_TYPE_MOBILE_DUN = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_DUN;
+const NETWORK_TYPE_MOBILE_FOTA = Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_FOTA;
 
 const networkTypes = [
   NETWORK_TYPE_MOBILE,
   NETWORK_TYPE_MOBILE_MMS,
   NETWORK_TYPE_MOBILE_SUPL,
   NETWORK_TYPE_MOBILE_IMS,
   NETWORK_TYPE_MOBILE_DUN,
   NETWORK_TYPE_MOBILE_FOTA
@@ -139,23 +139,23 @@ function waitForObserverEvent(aTopic) {
  *        A boolean state.
  *
  * @return A deferred promise.
  */
 function setDataEnabledAndWait(aEnabled) {
   let promises = [];
   promises.push(waitForObserverEvent(TOPIC_CONNECTION_STATE_CHANGED)
     .then(function(aSubject) {
-      ok(aSubject instanceof Ci.nsIRilNetworkInterface,
-         "subject should be an instance of nsIRILNetworkInterface");
+      ok(aSubject instanceof Ci.nsIRilNetworkInfo,
+         "subject should be an instance of nsIRilNetworkInfo");
       is(aSubject.type, NETWORK_TYPE_MOBILE,
          "subject.type should be " + NETWORK_TYPE_MOBILE);
       is(aSubject.state,
-         aEnabled ? Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED
-                  : Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED,
+         aEnabled ? Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED
+                  : Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED,
          "subject.state should be " + aEnabled ? "CONNECTED" : "DISCONNECTED");
     }));
   promises.push(setSettings(SETTINGS_KEY_DATA_ENABLED, aEnabled));
 
   return Promise.all(promises);
 }
 
 /**
@@ -170,21 +170,21 @@ function setDataEnabledAndWait(aEnabled)
  * @return A deferred promise.
  */
 function setupDataCallAndWait(aNetworkType) {
   log("setupDataCallAndWait: " + aNetworkType);
 
   let promises = [];
   promises.push(waitForObserverEvent(TOPIC_CONNECTION_STATE_CHANGED)
     .then(function(aSubject) {
-      ok(aSubject instanceof Ci.nsIRilNetworkInterface,
-         "subject should be an instance of nsIRILNetworkInterface");
+      ok(aSubject instanceof Ci.nsIRilNetworkInfo,
+         "subject should be an instance of nsIRilNetworkInfo");
       is(aSubject.type, aNetworkType,
          "subject.type should be " + aNetworkType);
-      is(aSubject.state, Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED,
+      is(aSubject.state, Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED,
          "subject.state should be CONNECTED");
     }));
   promises.push(radioInterface.setupDataCallByType(aNetworkType));
 
   return Promise.all(promises);
 }
 
 /**
@@ -199,21 +199,21 @@ function setupDataCallAndWait(aNetworkTy
  * @return A deferred promise.
  */
 function deactivateDataCallAndWait(aNetworkType) {
   log("deactivateDataCallAndWait: " + aNetworkType);
 
   let promises = [];
   promises.push(waitForObserverEvent(TOPIC_CONNECTION_STATE_CHANGED)
     .then(function(aSubject) {
-      ok(aSubject instanceof Ci.nsIRilNetworkInterface,
-         "subject should be an instance of nsIRILNetworkInterface");
+      ok(aSubject instanceof Ci.nsIRilNetworkInfo,
+         "subject should be an instance of nsIRilNetworkInfo");
       is(aSubject.type, aNetworkType,
          "subject.type should be " + aNetworkType);
-      is(aSubject.state, Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED,
+      is(aSubject.state, Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED,
          "subject.state should be DISCONNECTED");
     }));
   promises.push(radioInterface.deactivateDataCallByType(aNetworkType));
 
   return Promise.all(promises);
 }
 
 /**
--- a/dom/system/gonk/tests/marionette/test_network_active_changed.js
+++ b/dom/system/gonk/tests/marionette/test_network_active_changed.js
@@ -8,42 +8,42 @@ let networkManager =
   Cc["@mozilla.org/network/manager;1"].getService(Ci.nsINetworkManager);
 ok(networkManager,
    "networkManager.constructor is " + networkManager.constructor);
 
 function testInitialState() {
   return getSettings(SETTINGS_KEY_DATA_ENABLED)
     .then((enabled) => {
       is(enabled, false, "data should be off by default");
-      is(networkManager.active, null,
-         "networkManager.active should be null by default");
+      is(networkManager.activeNetworkInfo, null,
+         "networkManager.activeNetworkInfo should be null by default");
     });
 }
 
 function testActiveNetworkChangedBySwitchingDataCall(aDataCallEnabled) {
   log("Test active network by switching dataCallEnabled to " + aDataCallEnabled);
 
   let promises = [];
   promises.push(waitForObserverEvent(TOPIC_NETWORK_ACTIVE_CHANGED));
   promises.push(setSettings(SETTINGS_KEY_DATA_ENABLED, aDataCallEnabled));
 
   return Promise.all(promises).then(function(results) {
     let subject = results[0];
 
     if (aDataCallEnabled) {
-      ok(subject instanceof Ci.nsINetworkInterface,
-         "subject should be an instance of nsINetworkInterface");
-      ok(subject instanceof Ci.nsIRilNetworkInterface,
-         "subject should be an instance of nsIRILNetworkInterface");
+      ok(subject instanceof Ci.nsINetworkInfo,
+         "subject should be an instance of nsINetworkInfo");
+      ok(subject instanceof Ci.nsIRilNetworkInfo,
+         "subject should be an instance of nsIRilNetworkInfo");
       is(subject.type, NETWORK_TYPE_MOBILE,
          "subject.type should be NETWORK_TYPE_MOBILE");
     }
 
-    is(subject, networkManager.active,
-       "subject should be equal with networkManager.active");
+    is(subject, networkManager.activeNetworkInfo,
+       "subject should be equal with networkManager.activeNetworkInfo");
   });
 }
 
 // Start test
 startTestBase(function() {
   return testInitialState()
     // Test active network changed by enabling data call.
     .then(() => testActiveNetworkChangedBySwitchingDataCall(true))
--- a/dom/system/gonk/tests/marionette/test_network_interface_list_service.js
+++ b/dom/system/gonk/tests/marionette/test_network_interface_list_service.js
@@ -1,71 +1,71 @@
 /* Any copyright is dedicated to the Public Domain.
  * http://creativecommons.org/publicdomain/zero/1.0/ */
 
 MARIONETTE_TIMEOUT = 60000;
 MARIONETTE_HEAD_JS = "head.js";
 
-function getNetworkInterface(aType) {
+function getNetworkInfo(aType) {
   let networkListService =
     Cc["@mozilla.org/network/interface-list-service;1"].
       getService(Ci.nsINetworkInterfaceListService);
   // Get all available interfaces
   let networkList = networkListService.getDataInterfaceList(0);
 
   // Try to get nsINetworkInterface for aType.
   let numberOfInterface = networkList.getNumberOfInterface();
   for (let i = 0; i < numberOfInterface; i++) {
-    let iface = networkList.getInterface(i);
-    if (iface.type === aType) {
-      return iface;
+    let info = networkList.getInterfaceInfo(i);
+    if (info.type === aType) {
+      return info;
     }
   }
 
   return null;
 }
 
 // Test getDataInterfaceList by enabling/disabling mobile data.
 function testGetDataInterfaceList(aMobileDataEnabled) {
   log("Test getDataInterfaceList with mobile data " +
       aMobileDataEnabled ? "enabled" : "disabled");
 
   return setDataEnabledAndWait(aMobileDataEnabled)
-    .then(() => getNetworkInterface(NETWORK_TYPE_MOBILE))
-    .then((networkInterface) => {
-      if (!networkInterface) {
-        ok(false, "Should get an valid nsINetworkInterface for mobile");
+    .then(() => getNetworkInfo(NETWORK_TYPE_MOBILE))
+    .then((networkInfo) => {
+      if (!networkInfo) {
+        ok(false, "Should get an valid nsINetworkInfo for mobile");
         return;
       }
 
-      ok(networkInterface instanceof Ci.nsINetworkInterface,
-         "networkInterface should be an instance of nsINetworkInterface");
+      ok(networkInfo instanceof Ci.nsINetworkInfo,
+         "networkInfo should be an instance of nsINetworkInfo");
 
       let ipAddresses = {};
       let prefixs = {};
       let numOfGateways = {};
       let numOfDnses = {};
-      let numOfIpAddresses = networkInterface.getAddresses(ipAddresses, prefixs);
-      let gateways = networkInterface.getGateways(numOfGateways);
-      let dnses = networkInterface.getDnses(numOfDnses);
+      let numOfIpAddresses = networkInfo.getAddresses(ipAddresses, prefixs);
+      let gateways = networkInfo.getGateways(numOfGateways);
+      let dnses = networkInfo.getDnses(numOfDnses);
 
       if (aMobileDataEnabled) {
         // Mobile data is enabled.
-        is(networkInterface.state, NETWORK_STATE_CONNECTED, "check state");
+        is(networkInfo.state, NETWORK_STATE_CONNECTED, "check state");
         ok(numOfIpAddresses > 0, "check number of ipAddresses");
         ok(ipAddresses.value.length > 0, "check ipAddresses.length");
         ok(prefixs.value.length > 0, "check prefixs.length");
         ok(numOfGateways.value > 0, "check number of gateways");
         ok(prefixs.value.length > 0, "check prefixs.length");
         ok(gateways.length > 0, "check gateways.length");
         ok(numOfDnses.value > 0, "check number of dnses");
         ok(dnses.length > 0, "check dnses.length");
       } else {
         // Mobile data is disabled.
-        is(networkInterface.state, NETWORK_STATE_DISCONNECTED, "check state");
+        is(networkInfo.state, NETWORK_STATE_DISCONNECTED, "check state");
         is(numOfIpAddresses, 0, "check number of ipAddresses");
         is(ipAddresses.value.length, 0, "check ipAddresses.length");
         is(prefixs.value.length, 0, "check prefixs.length");
         is(numOfGateways.value, 0, "check number of gateways");
         is(prefixs.value.length, 0, "check prefixs.length");
         is(gateways.length, 0, "check gateways.length");
         is(numOfDnses.value, 0, "check number of dnses");
         is(dnses.length, 0, "check dnses.length");
--- a/dom/wifi/WifiP2pManager.jsm
+++ b/dom/wifi/WifiP2pManager.jsm
@@ -485,49 +485,54 @@ function P2pStateMachine(aP2pCommand, aN
     address: "",
     deviceName: DEFAULT_P2P_DEVICE_NAME + "_" + libcutils.property_get("ro.build.product"),
     wpsCapabilities: [WPS_METHOD_PBC, WPS_METHOD_KEYPAD, WPS_METHOD_DISPLAY]
   };
 
   let _p2pNetworkInterface = {
     QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInterface]),
 
-    state: Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED,
-    type: Ci.nsINetworkInterface.NETWORK_TYPE_WIFI_P2P,
-    name: P2P_INTERFACE_NAME,
-    ips: [],
-    prefixLengths: [],
-    dnses: [],
-    gateways: [],
+    info: {
+      QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInfo]),
+
+      state: Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED,
+      type: Ci.nsINetworkInfo.NETWORK_TYPE_WIFI_P2P,
+      name: P2P_INTERFACE_NAME,
+      ips: [],
+      prefixLengths: [],
+      dnses: [],
+      gateways: [],
+
+      getAddresses: function (ips, prefixLengths) {
+        ips.value = this.ips.slice();
+        prefixLengths.value = this.prefixLengths.slice();
+
+        return this.ips.length;
+      },
+
+      getGateways: function (count) {
+        if (count) {
+          count.value = this.gateways.length;
+        }
+        return this.gateways.slice();
+      },
+
+      getDnses: function (count) {
+        if (count) {
+          count.value = this.dnses.length;
+        }
+        return this.dnses.slice();
+      }
+    },
+
     httpProxyHost: null,
     httpProxyPort: null,
 
     // help
-    registered: false,
-
-    getAddresses: function (ips, prefixLengths) {
-      ips.value = this.ips.slice();
-      prefixLengths.value = this.prefixLengths.slice();
-
-      return this.ips.length;
-    },
-
-    getGateways: function (count) {
-      if (count) {
-        count.value = this.gateways.length;
-      }
-      return this.gateways.slice();
-    },
-
-    getDnses: function (count) {
-      if (count) {
-        count.value = this.dnses.length;
-      }
-      return this.dnses.slice();
-    }
+    registered: false
   };
 
   //---------------------------------------------------------
   // State machine APIs.
   //---------------------------------------------------------
 
   // Register the observer which is implemented in WifiP2pWorkerObserver.jsm.
   //
@@ -1414,20 +1419,20 @@ function P2pStateMachine(aP2pCommand, aN
       aNetUtil.startDhcpServer(dhcpServerConfig, function (success) {
         if (!success) {
           debug('Failed to start DHCP server');
           onFailure();
           return;
         }
 
         // Update p2p network interface.
-        _p2pNetworkInterface.state = Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED;
-        _p2pNetworkInterface.ips = [GO_NETWORK_INTERFACE.ip];
-        _p2pNetworkInterface.prefixLengths = [GO_NETWORK_INTERFACE.maskLength];
-        _p2pNetworkInterface.gateways = [GO_NETWORK_INTERFACE.ip];
+        _p2pNetworkInterface.info.state = Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED;
+        _p2pNetworkInterface.info.ips = [GO_NETWORK_INTERFACE.ip];
+        _p2pNetworkInterface.info.prefixLengths = [GO_NETWORK_INTERFACE.maskLength];
+        _p2pNetworkInterface.info.gateways = [GO_NETWORK_INTERFACE.ip];
         handleP2pNetworkInterfaceStateChanged();
 
         _groupInfo.networkInterface = _p2pNetworkInterface;
 
         debug('Everything is done. Happy p2p GO~');
         onSuccess();
       });
 
@@ -1449,43 +1454,43 @@ function P2pStateMachine(aP2pCommand, aN
       debug("DHCP request success: " + JSON.stringify(dhcpData.info));
 
       // Update p2p network interface.
       let maskLength =
         netHelpers.getMaskLength(netHelpers.stringToIP(dhcpData.info.mask_str));
       if (!maskLength) {
         maskLength = 32; // max prefix for IPv4.
       }
-      _p2pNetworkInterface.state = Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED;
-      _p2pNetworkInterface.ips = [dhcpData.info.ipaddr_str];
-      _p2pNetworkInterface.prefixLengths = [maskLength];
+      _p2pNetworkInterface.info.state = Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED;
+      _p2pNetworkInterface.info.ips = [dhcpData.info.ipaddr_str];
+      _p2pNetworkInterface.info.prefixLengths = [maskLength];
       if (typeof dhcpData.info.dns1_str == "string" &&
           dhcpData.info.dns1_str.length) {
-        _p2pNetworkInterface.dnses.push(dhcpData.info.dns1_str);
+        _p2pNetworkInterface.info.dnses.push(dhcpData.info.dns1_str);
       }
       if (typeof dhcpData.info.dns2_str == "string" &&
           dhcpData.info.dns2_str.length) {
-        _p2pNetworkInterface.dnses.push(dhcpData.info.dns2_str);
+        _p2pNetworkInterface.info.dnses.push(dhcpData.info.dns2_str);
       }
-      _p2pNetworkInterface.gateways = [dhcpData.info.gateway_str];
+      _p2pNetworkInterface.info.gateways = [dhcpData.info.gateway_str];
       handleP2pNetworkInterfaceStateChanged();
 
       _groupInfo.networkInterface = _p2pNetworkInterface;
 
       debug('Happy p2p client~');
       onSuccess();
     });
   }
 
   function resetP2pNetworkInterface() {
-    _p2pNetworkInterface.state = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED;
-    _p2pNetworkInterface.ips = [];
-    _p2pNetworkInterface.prefixLengths = [];
-    _p2pNetworkInterface.dnses = [];
-    _p2pNetworkInterface.gateways = [];
+    _p2pNetworkInterface.info.state = Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED;
+    _p2pNetworkInterface.info.ips = [];
+    _p2pNetworkInterface.info.prefixLengths = [];
+    _p2pNetworkInterface.info.dnses = [];
+    _p2pNetworkInterface.info.gateways = [];
   }
 
   function registerP2pNetworkInteface() {
     if (!_p2pNetworkInterface.registered) {
       resetP2pNetworkInterface();
       gNetworkManager.registerNetworkInterface(_p2pNetworkInterface);
       _p2pNetworkInterface.registered = true;
     }
@@ -1518,17 +1523,17 @@ function P2pStateMachine(aP2pCommand, aN
     }
     if (_groupInfo.ifname !== aInfo.ifname ||
         _groupInfo.role   !== aInfo.role) {
       debug('Unmatched group info: ' + JSON.stringify(_groupInfo) +
             ' v.s. ' + JSON.stringify(aInfo));
     }
 
     // Update p2p network interface.
-    _p2pNetworkInterface.state = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED;
+    _p2pNetworkInterface.info.state = Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED;
     handleP2pNetworkInterfaceStateChanged();
 
     if (P2P_ROLE_GO === aInfo.role) {
       aNetUtil.stopDhcpServer(function(success) {
         debug('Stop DHCP server result: ' + success);
         aCallback(true);
       });
     } else {
--- a/dom/wifi/WifiWorker.js
+++ b/dom/wifi/WifiWorker.js
@@ -398,18 +398,18 @@ var WifiManager = (function() {
     if (!network)
       return;
 
     // If we got here, arg network must be the currentNetwork, so we just update
     // WifiNetworkInterface correspondingly and notify NetworkManager.
     WifiNetworkInterface.httpProxyHost = network.httpProxyHost;
     WifiNetworkInterface.httpProxyPort = network.httpProxyPort;
 
-    if (WifiNetworkInterface.state ==
-        Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED) {
+    if (WifiNetworkInterface.info.state ==
+        Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED) {
       gNetworkManager.updateNetworkInterface(WifiNetworkInterface);
     }
   }
 
   var staticIpConfig = Object.create(null);
   function setStaticIpMode(network, info, callback) {
     let setNetworkKey = getNetworkKey(network);
     let curNetworkKey = null;
@@ -1009,26 +1009,27 @@ var WifiManager = (function() {
     if (enabled === manager.isWifiEnabled(manager.state)) {
       callback("no change");
       return;
     }
 
     if (enabled) {
       manager.state = "INITIALIZING";
       // Register as network interface.
-      WifiNetworkInterface.name = manager.ifname;
+      WifiNetworkInterface.info.name = manager.ifname;
       if (!WifiNetworkInterface.registered) {
         gNetworkManager.registerNetworkInterface(WifiNetworkInterface);
         WifiNetworkInterface.registered = true;
       }
-      WifiNetworkInterface.state = Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED;
-      WifiNetworkInterface.ips = [];
-      WifiNetworkInterface.prefixLengths = [];
-      WifiNetworkInterface.gateways = [];
-      WifiNetworkInterface.dnses = [];
+      WifiNetworkInterface.info.state =
+        Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED;
+      WifiNetworkInterface.info.ips = [];
+      WifiNetworkInterface.info.prefixLengths = [];
+      WifiNetworkInterface.info.gateways = [];
+      WifiNetworkInterface.info.dnses = [];
       gNetworkManager.updateNetworkInterface(WifiNetworkInterface);
 
       prepareForStartup(function() {
         loadDriver(function (status) {
           if (status < 0) {
             callback(status);
             manager.state = "UNINITIALIZED";
             return;
@@ -1163,18 +1164,20 @@ var WifiManager = (function() {
         function getWifiHotspotStatus() {
           wifiCommand.hostapdGetStations(function(result) {
             notify("stationinfoupdate", {station: result});
           });
         }
 
         function doStartWifiTethering() {
           cancelWaitForDriverReadyTimer();
-          WifiNetworkInterface.name = libcutils.property_get("wifi.tethering.interface", manager.ifname);
-          gTetheringService.setWifiTethering(enabled, WifiNetworkInterface,
+          WifiNetworkInterface.info.name =
+            libcutils.property_get("wifi.tethering.interface", manager.ifname);
+          gTetheringService.setWifiTethering(enabled,
+                                             WifiNetworkInterface.info.name,
                                              configuration, function(result) {
             if (result) {
               manager.tetheringState = "UNINITIALIZED";
             } else {
               manager.tetheringState = "COMPLETED";
               wifiCommand.connectToHostapd(function(result) {
                 if (result) {
                   return;
@@ -1778,65 +1781,69 @@ function isWepHexKey(s) {
 let WifiNetworkInterface = {
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInterface]),
 
   registered: false,
 
   // nsINetworkInterface
 
-  NETWORK_STATE_UNKNOWN:       Ci.nsINetworkInterface.NETWORK_STATE_UNKNOWN,
-  NETWORK_STATE_CONNECTING:    Ci.nsINetworkInterface.CONNECTING,
-  NETWORK_STATE_CONNECTED:     Ci.nsINetworkInterface.CONNECTED,
-  NETWORK_STATE_DISCONNECTING: Ci.nsINetworkInterface.DISCONNECTING,
-  NETWORK_STATE_DISCONNECTED:  Ci.nsINetworkInterface.DISCONNECTED,
-
-  state: Ci.nsINetworkInterface.NETWORK_STATE_UNKNOWN,
-
-  NETWORK_TYPE_WIFI:        Ci.nsINetworkInterface.NETWORK_TYPE_WIFI,
-  NETWORK_TYPE_MOBILE:      Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE,
-  NETWORK_TYPE_MOBILE_MMS:  Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_MMS,
-  NETWORK_TYPE_MOBILE_SUPL: Ci.nsINetworkInterface.NETWORK_TYPE_MOBILE_SUPL,
-
-  type: Ci.nsINetworkInterface.NETWORK_TYPE_WIFI,
-
-  name: null,
-
-  ips: [],
-
-  prefixLengths: [],
-
-  dnses: [],
-
-  gateways: [],
+  NETWORK_STATE_UNKNOWN:       Ci.nsINetworkInfo.NETWORK_STATE_UNKNOWN,
+  NETWORK_STATE_CONNECTING:    Ci.nsINetworkInfo.CONNECTING,
+  NETWORK_STATE_CONNECTED:     Ci.nsINetworkInfo.CONNECTED,
+  NETWORK_STATE_DISCONNECTING: Ci.nsINetworkInfo.DISCONNECTING,
+  NETWORK_STATE_DISCONNECTED:  Ci.nsINetworkInfo.DISCONNECTED,
+
+  NETWORK_TYPE_WIFI:        Ci.nsINetworkInfo.NETWORK_TYPE_WIFI,
+  NETWORK_TYPE_MOBILE:      Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE,
+  NETWORK_TYPE_MOBILE_MMS:  Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_MMS,
+  NETWORK_TYPE_MOBILE_SUPL: Ci.nsINetworkInfo.NETWORK_TYPE_MOBILE_SUPL,
+
+  info: {
+    QueryInterface: XPCOMUtils.generateQI([Ci.nsINetworkInfo]),
+
+    state: Ci.nsINetworkInfo.NETWORK_STATE_UNKNOWN,
+
+    type: Ci.nsINetworkInfo.NETWORK_TYPE_WIFI,
+
+    name: null,
+
+    ips: [],
+
+    prefixLengths: [],
+
+    dnses: [],
+
+    gateways: [],
+
+    getAddresses: function (ips, prefixLengths) {
+      ips.value = this.ips.slice();
+      prefixLengths.value = this.prefixLengths.slice();
+
+      return this.ips.length;
+    },
+
+    getGateways: function (count) {
+      if (count) {
+        count.value = this.gateways.length;
+      }
+      return this.gateways.slice();
+    },
+
+    getDnses: function (count) {
+      if (count) {
+        count.value = this.dnses.length;
+      }
+      return this.dnses.slice();
+    }
+  },
 
   httpProxyHost: null,
 
-  httpProxyPort: null,
-
-  getAddresses: function (ips, prefixLengths) {
-    ips.value = this.ips.slice();
-    prefixLengths.value = this.prefixLengths.slice();
-
-    return this.ips.length;
-  },
-
-  getGateways: function (count) {
-    if (count) {
-      count.value = this.gateways.length;
-    }
-    return this.gateways.slice();
-  },
-
-  getDnses: function (count) {
-    if (count) {
-      count.value = this.dnses.length;
-    }
-    return this.dnses.slice();
-  }
+  httpProxyPort: null
 };
 
 function WifiScanResult() {}
 
 // TODO Make the difference between a DOM-based network object and our
 // networks objects much clearer.
 let netToDOM;
 let netFromDOM;
@@ -2247,18 +2254,18 @@ function WifiWorker() {
         // wifi connection complete, turn on the power saving mode.
         WifiManager.setPowerSavingMode(true);
         // BSSID is read after connected, update it.
         self.currentNetwork.bssid = WifiManager.connectionInfo.bssid;
         break;
       case "DISCONNECTED":
         // wpa_supplicant may give us a "DISCONNECTED" event even if
         // we are already in "DISCONNECTED" state.
-        if ((WifiNetworkInterface.state ===
-             Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED) &&
+        if ((WifiNetworkInterface.info.state ===
+             Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED) &&
              (this.prevState === "INITIALIZING" ||
               this.prevState === "DISCONNECTED" ||
               this.prevState === "INTERFACE_DISABLED" ||
               this.prevState === "INACTIVE" ||
               this.prevState === "UNINITIALIZED")) {
           // When in disconnected mode, need to turn on wifi power saving mode.
           WifiManager.setPowerSavingMode(true);
           return;
@@ -2280,23 +2287,26 @@ function WifiWorker() {
           // We've disconnected from a network because of a call to forgetNetwork.
           // Reconnect to the next available network (if any).
           if (self._reconnectOnDisconnect) {
             self._reconnectOnDisconnect = false;
             WifiManager.reconnect(function(){});
           }
         });
 
-        WifiNetworkInterface.state =
-          Ci.nsINetworkInterface.NETWORK_STATE_DISCONNECTED;
-        WifiNetworkInterface.ips = [];
-        WifiNetworkInterface.prefixLengths = [];
-        WifiNetworkInterface.gateways = [];
-        WifiNetworkInterface.dnses = [];
+        WifiNetworkInterface.info.state =
+          Ci.nsINetworkInfo.NETWORK_STATE_DISCONNECTED;
+
+        // Update network infterface first then clear properties.
         gNetworkManager.updateNetworkInterface(WifiNetworkInterface);
+        WifiNetworkInterface.info.ips = [];
+        WifiNetworkInterface.info.prefixLengths = [];
+        WifiNetworkInterface.info.gateways = [];
+        WifiNetworkInterface.info.dnses = [];
+
 
         break;
       case "WPS_TIMEOUT":
         self._fireEvent("onwpstimeout", {});
         break;
       case "WPS_FAIL":
         self._fireEvent("onwpsfail", {});
         break;
@@ -2328,28 +2338,28 @@ function WifiWorker() {
     }
 
     let netConnect = WifiManager.getHttpProxyNetwork(self.currentNetwork);
     if (netConnect) {
       WifiNetworkInterface.httpProxyHost = netConnect.httpProxyHost;
       WifiNetworkInterface.httpProxyPort = netConnect.httpProxyPort;
     }
 
-    WifiNetworkInterface.state =
-      Ci.nsINetworkInterface.NETWORK_STATE_CONNECTED;
-    WifiNetworkInterface.ips = [this.info.ipaddr_str];
-    WifiNetworkInterface.prefixLengths = [maskLength];
-    WifiNetworkInterface.gateways = [this.info.gateway_str];
+    WifiNetworkInterface.info.state =
+      Ci.nsINetworkInfo.NETWORK_STATE_CONNECTED;
+    WifiNetworkInterface.info.ips = [this.info.ipaddr_str];
+    WifiNetworkInterface.info.prefixLengths = [maskLength];
+    WifiNetworkInterface.info.gateways = [this.info.gateway_str];
     if (typeof this.info.dns1_str == "string" &&
         this.info.dns1_str.length) {
-      WifiNetworkInterface.dnses.push(this.info.dns1_str);
+      WifiNetworkInterface.info.dnses.push(this.info.dns1_str);
     }
     if (typeof this.info.dns2_str == "string" &&
         this.info.dns2_str.length) {
-      WifiNetworkInterface.dnses.push(this.info.dns2_str);
+      WifiNetworkInterface.info.dnses.push(this.info.dns2_str);
     }
     gNetworkManager.updateNetworkInterface(WifiNetworkInterface);
 
     self.ipAddress = this.info.ipaddr_str;
 
     // We start the connection information timer when we associate, but
     // don't have our IP address until here. Make sure that we fire a new
     // connectionInformation event with the IP address the next time the
--- a/media/mtransport/gonk_addrs.cpp
+++ b/media/mtransport/gonk_addrs.cpp
@@ -7,17 +7,17 @@ extern "C" {
 #include <arpa/inet.h>
 #include "r_types.h"
 #include "stun.h"
 #include "addrs.h"
 }
 
 #include <vector>
 #include <string>
-#include "nsINetworkManager.h"
+#include "nsINetworkInterface.h"
 #include "nsINetworkInterfaceListService.h"
 #include "runnable_utils.h"
 #include "nsCOMPtr.h"
 #include "nsMemory.h"
 #include "nsThreadUtils.h"
 #include "nsServiceManagerUtils.h"
 #include "mozilla/SyncRunnable.h"
 
@@ -53,30 +53,30 @@ GetInterfaces(std::vector<NetworkInterfa
 
   // Translate nsINetworkInterfaceList to NetworkInterface.
   int32_t listLength;
   NS_ENSURE_SUCCESS(networkList->GetNumberOfInterface(&listLength),
                     NS_ERROR_FAILURE);
   aInterfaces->clear();
 
   for (int32_t i = 0; i < listLength; i++) {
-    nsCOMPtr<nsINetworkInterface> iface;
-    if (NS_FAILED(networkList->GetInterface(i, getter_AddRefs(iface)))) {
+    nsCOMPtr<nsINetworkInfo> info;
+    if (NS_FAILED(networkList->GetInterfaceInfo(i, getter_AddRefs(info)))) {
       continue;
     }
 
     char16_t **ips = nullptr;
     uint32_t *prefixs = nullptr;
     uint32_t count = 0;
     bool isAddressGot = false;
     NetworkInterface interface;
     memset(&(interface.addr), 0, sizeof(interface.addr));
     interface.addr.sin_family = AF_INET;
 
-    if (NS_FAILED(iface->GetAddresses(&ips, &prefixs, &count))) {
+    if (NS_FAILED(info->GetAddresses(&ips, &prefixs, &count))) {
       continue;
     }
 
     for (uint32_t j = 0; j < count; j++) {
       nsAutoString ip;
 
       ip.Assign(ips[j]);
       if (inet_pton(AF_INET, NS_ConvertUTF16toUTF8(ip).get(),
@@ -89,30 +89,30 @@ GetInterfaces(std::vector<NetworkInterfa
     free(prefixs);
     NS_FREE_XPCOM_ALLOCATED_POINTER_ARRAY(count, ips);
 
     if (!isAddressGot) {
       continue;
     }
 
     nsAutoString ifaceName;
-    if (NS_FAILED(iface->GetName(ifaceName))) {
+    if (NS_FAILED(info->GetName(ifaceName))) {
       continue;
     }
     interface.name = NS_ConvertUTF16toUTF8(ifaceName).get();
 
     int32_t type;
-    if (NS_FAILED(iface->GetType(&type))) {
+    if (NS_FAILED(info->GetType(&type))) {
       continue;
     }
     switch (type) {
-      case nsINetworkInterface::NETWORK_TYPE_WIFI:
+      case nsINetworkInfo::NETWORK_TYPE_WIFI:
         interface.type = NR_INTERFACE_TYPE_WIFI;
         break;
-      case nsINetworkInterface::NETWORK_TYPE_MOBILE:
+      case nsINetworkInfo::NETWORK_TYPE_MOBILE:
         interface.type = NR_INTERFACE_TYPE_MOBILE;
         break;
     }
 
     aInterfaces->push_back(interface);
   }
   return NS_OK;
 }
--- a/mobile/android/app/mobile.js
+++ b/mobile/android/app/mobile.js
@@ -290,22 +290,19 @@ pref("browser.search.loadFromJars", true
 pref("browser.search.jarURIs", "chrome://browser/locale/searchplugins/");
 
 // tell the search service that we don't really expose the "current engine"
 pref("browser.search.noCurrentEngine", true);
 
 // Control media casting & mirroring features
 pref("browser.casting.enabled", true);
 #ifdef RELEASE_BUILD
-// Roku does not yet support mirroring in production
-pref("browser.mirroring.enabled.roku", false);
 // Chromecast mirroring is broken (bug 1131084)
 pref("browser.mirroring.enabled", false);
 #else
-pref("browser.mirroring.enabled.roku", true);
 pref("browser.mirroring.enabled", true);
 #endif
 
 // Enable sparse localization by setting a few package locale overrides
 pref("chrome.override_package.global", "browser");
 pref("chrome.override_package.mozapps", "browser");
 pref("chrome.override_package.passwordmgr", "browser");
 
--- a/mobile/android/base/locales/en-US/android_strings.dtd
+++ b/mobile/android/base/locales/en-US/android_strings.dtd
@@ -547,22 +547,23 @@ domain name (above) and an organization 
 example.com
 which is run by
 Example Enterprises, Inc.
 
 The layout of the identity dialog prevents combining this into a single string with
 substitution variables.  If it is difficult to translate the sense of the string
 with that structure, consider a translation which ignores the preceding domain and
 just addresses the organization to follow, e.g. "This site is run by " -->
-<!ENTITY identity_run_by "which is run by">
-<!ENTITY identity_no_info "This website does not supply identity information.">
-<!ENTITY identity_not_encrypted "Your connection to this website is not encrypted.">
-<!ENTITY identity_encrypted "Encrypted">
+<!ENTITY identity_connection_secure "Secure Connection">
+<!ENTITY identity_connection_insecure "Insecure connection">
 
 <!-- Mixed content notifications in site identity popup -->
+<!ENTITY mixed_content_blocked_all "&brandShortName; has blocked insecure elements on this page.">
+<!ENTITY mixed_content_protection_disabled "You have disabled protection from insecure elements.">
+
 <!ENTITY loaded_mixed_content_message "This page is displaying content that isn\'t secure.">
 <!ENTITY blocked_mixed_content_message_top "&brandShortName; has blocked content that isn\'t secure.">
 <!ENTITY blocked_mixed_content_message_bottom "Most websites will still work properly even when this content is blocked.">
 
 <!-- Tracking content notifications in site identity popup -->
 <!ENTITY doorhanger_tracking_title "Tracking protection">
 <!ENTITY doorhanger_tracking_state_enabled "Enabled">
 <!ENTITY doorhanger_tracking_state_disabled "Disabled">
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0ae0dd3bee6c98a96fbe47af45341d202b4edf1a
GIT binary patch
literal 1360
zc$@)H1+V&vP)<h;3K|Lk000e1NJLTq0024w002A)1^@s6H{z)^00001b5ch_0Itp)
z=>Px)3Q0skRA>d|noVpQMHGPFTd$)erUbQWqk<4cTmVraRiGk)L~}@gT--zmgbEi<
z^j2{I^#tNX5aobC+&FM(CCaa3yOk{=SzIEjx^RF)swyp&ib&KJ5jT+9v3GdS&bYgq
zo%MQmV|&dUJb!QIy>I8&GlQ_nZg%#EaiLXGAdG_oa2E);A3$tF#J?!K2q+d1p`Zbr
zOQlkOY?e8=Sruoq`8{=`_PziyNjiw5y+gpWsN;K6hYy$9OK+4A`}XO-m6uLIOnkNb
z!u)q;iO@mw`TW*9)wNFn@Td^NSN+t&XA&dB$0jEym(9kyh1Vg^(1(2y5NoK3SIn@!
z3{fe}<#La$)gen=^AVMd=XAs?I_fW{QU`x-SH=P<g>A5*fo3x2o-x2EP%GXmbp`cl
z9G7FLPq@K4LQ2IZ*ib;zg~EeSsa_BQ#-)zXe8d|%if3t}x@@o06;cYX!+M$|WEm&F
zR4T<qrJCLpNLDDs_L_jx)Ke_BdV*}0*P#xt>Q2UYl6L*ir8j7q*yE`T0*yB;(PVLp
z0JaguQ=ZBScsiXudz^H9%z8XSHjT<Wfr+Dmx^A&pyyx%o$^zB5qgkio7jagL$4*Qg
zI&{e{k<At!t%<b{2z<((XN}|X=y3dj{WCKaT0)w$t5v`$mf4Mom+<1nwLmReF0Z^!
zwYx&ng!1<EkrzI4vVzl6sRQ%mO{X)tx2SubRLN00j#XCveT^UwG?oyxpv-AOa)PDb
zO9`(&t&-DjvYMuS=mu#n%W~Acl%QxBF#hEiGkzdhk8jZLi^cnByghF=))Gd%7LVb(
zmb5mJp?K^a8o$@<VhzZzPr=B-rLFcnhq$FBWxj9F*zMIPsjDfwzJ~Z&GMTJMMP7WC
z=W=FQ37MGx)tsyfJ3_LsZ%`UDv^iHhS`6~)Ty>7QTv(8-%{ORWxPy+3j$T#csB>hw
zFd+khQj2a;n+q^8F|p#7ugc?cVM7K4Rhb$roi_vHH1Px-lXfeVlZjoh8*#bgNt748
zs8dcnPKAAsQK!m+q)AA>>ts9KeF3`Jko*yP4%!XKo`ZG^vZtWkgzOn;5Xfw{G|Gl|
z>bgEggFw#aa!2Z7@y$*lS-z{FK_QJgd_#XEhWvoGJz?Negyq}+9H%3Xy#mG9T_w1S
zP6Zyi8@GiJel(|Obpv*u{`~RbE0?#M(-mRMW`J9gA!*wgZ~l!Fzsqtca2XKJk8MeO
z;<oK{1uYZ`J60>zpXlK0VOg;sKgizI0_mch4!y4q>9M`^SMP?Cm}}Qvy;D0G1xN;C
zJ1ccVc|zd|O4~8MH}UPd(UKP94A^gpn<B2D^qqE^WIGCW9kOAa+TJ#x9kI29djr{0
z?-&Rjv>zdvJXFwrg$xz6pCLm7?RUsfK%)Q|7&I!7fk2}K=^Hd^kiI~p2-z`cR3SS8
zjWVQX(5ORt0v!a%wxELo=?cmRS$=P|ydHnB0o`(rw`uaU&d;q@KSJ`y-0(L|Li)MY
z>Q~4Opo0o&0Ucz>7U-ZuHbDOmkPT3NgFa{z4};mA#t-fJ4Z1zU7FXYe*aZ7Es__GR
zerWFk8+l0n_>Fbc1vXNU{03juqgopV2iQnKGN1rB-xibwBrM$}ek)%tb9z7Tc-X#m
zSJiawgpAmI*ZWZxo|~H+S-N>EO@hzS)ts;Q19qih#<{z4OETnCGWm<D?*9OzT=tI?
Sx5D%Q0000<MNUMnLSTX=kcIC6
rename from mobile/android/base/resources/drawable-hdpi/lock_identified.png
rename to mobile/android/base/resources/drawable-hdpi/lock_secure.png
deleted file mode 100644
index 3bdf7f8174e81585c512f60a94d79bb013df8f61..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
--- a/mobile/android/base/resources/drawable-large-v11/site_security_level.xml
+++ b/mobile/android/base/resources/drawable-large-v11/site_security_level.xml
@@ -1,14 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <level-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item android:maxLevel="0" android:drawable="@drawable/site_security_unknown"/>
-    <item android:maxLevel="1" android:drawable="@drawable/lock_identified"/>
-    <item android:maxLevel="2" android:drawable="@drawable/lock_verified"/>
+    <item android:maxLevel="1" android:drawable="@drawable/lock_secure"/>
+    <!-- Bug 1185600 will handle Passive Mixed Content and resolve this icon duplication -->
+    <item android:maxLevel="2" android:drawable="@drawable/lock_secure"/>
     <item android:maxLevel="3" android:drawable="@drawable/shield_enabled"/>
     <item android:maxLevel="4" android:drawable="@drawable/shield_disabled"/>
+    <item android:maxLevel="5" android:drawable="@drawable/lock_disabled"/>
 
 </level-list>
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..fca4d9d603a5c714c91acff994ba44c6140c913f
GIT binary patch
literal 1638
zc$@)d2ATPZP)<h;3K|Lk000e1NJLTq002$^002-31^@s6w{}DJ00001b5ch_0Itp)
z=>Px*AW1|)RCodHoK0*SMHGN%Hm=*mNdrm*B8U@*f~b0E5L}8xN)927>of>)K;puc
z_5zWR_$d+sAtD4)B_wY2!~qFn*BEjrK>~6>&7~XwQBIW_=ubr3Bn`2>!+UndT|4{p
z#-81*cXy>^W@p~Mnfdn3&yHt?vk+XRQt9DxRpf*)M;YTILa-6W1pMK}|KXhd%>=u`
z4E|FOGr!Gdvwzm(cJDvmt)v$g7Vg{JD!*b1c7h3UP%R()F97?+K&JPT@$vB+YR`I0
z|N7*?L!wgocrVMmaA0})y4@3jgIio&?7y|P@v3Q>uR(_T?J}hhw#E$O%s}tnk8}Y<
zXsl8>4^}@6a4x2K<{3M9fr88Di!*|YPa#wHE5Pv<<@}l<_)EFmvG2Tvoh7W$q?8l9
zK)?whc%fK&8{E_AmzmP(a?S<l`*3g|^XAytSVdL09W<%K4xTTCkO`u@w6xTF_1fxL
z!Nl{{aKHSV@xtK#%yTO6+@Q&Pw!$-HgdZ+iSCG)K4Df=E-@LW{IiyW08wFZjFFUj)
z*3bVjIy#K^zFJ)V+&8D86L<#`3i^VoduICh)G4=gsnD!C(DG6#c9is1tPfKCwT=MV
zG^)IAIk32sg+l3BC%x@JLtW59UmvVy?)YMHIOMo_d+n0;-qVSKLpT)fG9SA4vD}d(
zx2+=WLWBDG{V>a9N0yg2e6ctjr>R5ZWoX#H<c9HLI%OQVXMg_y{-GbkFb-OlvK4@r
zAG+Cx#OlBAS><#<Lw(vU4!;OCHn(78PaoU@l&{l!jM>S_Nqo-n!cViUvN;DGzzIj8
zmI!F;Hut4d4^B)>tm=Y>Nu*lR>G&3)odhM+F9OprjMsD7V{?>*x53Upr!xzk&Ij;}
zXN`fjZr^|9>dOFaL4FZX(rU<9s%ImNlCV{n;)f4%vNfncv!;!p@mXt_n?JpB`IJs*
zn3mS6id6~T?j^TE$T+N?)48b`dEbsZpD%vpRc+H(SJ=qe&sfjKx>^zrmL`>Wnz|IE
zxHvULk;6tF+ccW2vs7J&bBEy<G|Z7!aP|2#=Yq-@F!On@jzG$~xu^qm*~$0`4b#&K
z4lHSV^3kp+mN0|c7S<v`_uA<48yaR#D>xXtk-+US*abQncga>=K|s?E?(THAdtv+f
z`mVT3&||H-f`aA)INJCPrhL}uXxt^Gt{|cL0nWXYKE(zN4U3`u%fTl$j%x8Us^Y^q
z%`w64h^_`Fzdd`(iZkUNgIh0X7_YTgr6j0JMnZ$0yf!0C)~f*;rqz|;b{kq(f(rw*
zt^*eqXk7&^OwhUpT-cy>1-LLm3q3fU(BP-SqgY^FS7?VLI-%u@#W9mr&*_4OdO`_K
zH#A|2A`F!KA`Pw^py3Np`mtudSbU0^ViwlYJPvbj59oY@s7vQ82exTgJ-scBufPhi
z3$RRfZhC6!M{1eK;N}a(H$dsTxB`i)Tt#kopf%;tgdeZpf`vNoH-$RfkRYI?iK_Sk
zbokOH>V$?JK?iM`$$R+I6w9N5fa)0oXlPpoHbv<1x=7&aZJL)V_4p83S|jt+vXa1s
zy(8$bdN!cdJ+w}b2(CqUhqqz0G}R&n4lWAN5OSd4q5>^Ya8ZI57`UiG3j|ygq4^Fj
zs?dA|7iDO^fr~mcU%<ryns#t;fu<E)oS<m~7dL2Hz{L?-$Kc`$ts`)8hSoN?xI=3T
zTmlWTDbB|w(CW~Xz$MV`LL-Aqpfy9oJJ03%xRyiLJ_5bJM(r$2kRh(%<N_ES`v{^0
z4PTJsk2MmSj(r5U0H%Xw2|*eXIW1dox}nil4UzL43c(%V5@@vd(gZGnMuUb@4R8rG
zI<yA31ezMO8n^_SIy8JDg{P0gX>}cMU8JwMZ7-u?d&<BgTVXxxMRLY$_It(+8nQC*
zs8&3(l>{$=*08TyuS$ZKKx;s&S)9Ccg%>Mmd_^*Ga~tD06taaED`>D|1~-ckt|o9h
z;Kd9Yl;6Z1HUw_YTatcz;*lXdeH0JUl!_wWdn)a$ah#8P^q1dvoLXOnJv(ro>(8)!
k|1iKDl0duLZEr8v|8-?x7l3Ms0RR9107*qoM6N<$g7ncCN&o-=
rename from mobile/android/base/resources/drawable-xhdpi/lock_identified.png
rename to mobile/android/base/resources/drawable-xhdpi/lock_secure.png
deleted file mode 100644
index 6b66211421b0a11f53bffedec59f81afb5d279a1..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
GIT binary patch
literal 0
Hc$@<O00001
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0ccccca49da7924f98166614e982441658048a29
GIT binary patch
literal 2630
zc$@)73c2-(P)<h;3K|Lk000e1NJLTq0049V004Lh1^@s6BUsj400001b5ch_0Itp)
z=>Px<07*naRCodHooi?uMI69q_AZz7e0@sQfLMi6EJe^(eBgr=A!)9;#s^6J;wMEA
zE#d=3L98N(7C{8{lZxQ0ioIMC5|AK@+7D;_U~PSTP^nf)L{!>K(%kL%|8KM5a<_Lo
zuiM$Zn}xf*oBcm#{=c2s*_nM%(jiN+SjrMIf4%Egx4RDALK)ja7`=cIb`BH~KZH<v
zk`i{35%N1_&QFB09~n&@%4VEHLqkKSJeh=l(In@8c6N4Sd3ohd%E+w%?rJDYMy5QJ
z(hBGwqSQIi*ONLhJUsk|jGZ{>Bob(0YU)O}>OMjV9cGNBH3!m#n*3pkr1$0X!{2GP
zEo|<m8?NYIEHA#7rgZPt(y=391`-9dFgZEsx@;d|<od9JY1r;kN)C{8YTww%$WaaU
zgiV}*xim)@+Xl)DX@~9%gPI7SGcz+6E}pLJhk}g@M@3x$YwY{IX=m@q$jE}aIX(+@
zFny&^sIdn+F)_WX%G`GeVdwd!GO>n0ouFxFd`~X-S-br=f$6(#3DxnX;<)~}F!@lG
zRVPiu#MnU3c)+c=bA>|jaX4<bts;cL#H{pJTsC)f$7R?IH!N+-Sc4~lgz4$&-sP(M
zI&s-u0&0<oLa%s+opaXsErWyq=yb{fv({Z;O^qE;fZ4xXsTQD0Tw9y_*!`yDt2Djv
z=F!m|WgU4Fgz39%fEueN*Q=RHfQjLR9j?m${HRna_4v`1T}#45cMZ*NtblsWY}{*R
z4K+BH4*z!IkGEkh9Y+P2eoodwjZKq_9U$24U-WaCsI^01xn*?s{i1o+0JGMm*Zjr;
z=$TU!?9CGCJ-xPMCVo4_*|ld+Zid&lW|(K(QZi>8s5fY^TsanpQxjeoL2@t*`OAjB
zo^3pX{Oy5Bk8H^H?KEB^yb&P7g9br>MAKk!f79af$}?el?S#4c^KTZ6)=+P3w#w$h
zf*`mZhU&<dFm-m2IPB|;<DAH5vnS9-xm+GN?YaZRrQ2cZYz%s;*Fmz*ox19zooiq;
zsT7pwcEd!Ux@Rha%F#5<8)$F3Rcr&C>@UIR<-SaMKQw#uO|*Z6bo_h@pZz%fwsgAk
z5cE<XfKMN!sV*s)1$qgL+)!^Q3Yh5ASPg}a&`mI`_i25>W&Xpg$Va3%^WfOf&~X|4
zgR`?2k>%4bF-C5a(XZEmG2hF_a=CB)^r&E>Kb_5upMS1(l~f<*5^Ny^HIl*SiLw0X
z?Xob@JnEtiw1qZXxa8YZW%v4mQNl!@MrvrG@X7g%F8v10oOF}#1)e(NW1}PQ`@z$(
zK3JT-gTU+#<V`v@khlLf^!5x~`s`!b#q!#GrjG34Wi(!I7CS&e294BEmoAN~z+5fJ
zle%G|-Bp`U1_g^Z4a#;d`Th7kQNzUi83Bsd0PzMVNDhygWBJ|B1#Q!jhPJ)qvZS$8
z`4s7Y=gntUuQZUfQl}PDGkxjEf#TJ9s~2?nc@SDdbGC#XAR#3gVesMk64XVQ18==X
z(trPTmY`~LaZZ?MAabC1sU`T8x;hUt3_*Tbr2~XEcoy`5zIbGP86Re5{!c$ieJubJ
zokb25ubWjUrHkj83i?8-tG-+wr8vOEd`1rxE`sI>P@oKq0JRu22vku?^nBr{Q^*n*
zn3&DTfqGZ8hXknUW*p9odI|9vCzu$T$bsVR3DQhpY*t!VR<VW8xWU9CMh+BuxM%J&
zkq9sjv`eTdsWkH$N0?a9$bo`SX`ueBi4q|}<shGNg^5Ko0aW^wWpHrtq#zGv@p_+e
zhG`0@a*$0Kh&xORRAA3Y0!#~(6KGOkVsWIWuQ+3ocrl#M{1?V%O%CUY1knO*5iNgm
zI&*5Vg_PhX!LeCE>qdIHqIonT@53}P1*TG96Q?aI`He(3sW34(7HHirl4O_`XotbH
zKx=>|y=MAFu}v;SqElen8roqnyB=sK)l7tmOV>8Jod~mQfp#j)t_0f2FuM+D)G#L}
zCj%c2g@JF^(ly6W6EIg?qWfm%(EXq*fEt6zSbr!1%>o?{w3}e!zR}S@yA37+mA<JJ
zm1~z`apuYjtL$(n-RQb*tBLccYV`zvKg}zj`TMWzz#FgLl{)#~MqZszxfYYt*a7m6
znT^eC(>yzl0}s|@^J$tcjgAf<4)xC=pbT_kVrq}e+~?swcKLf&I5H|C67@AeEnsqI
z8}3K_9v)uxSU#UCa4Q7}Dgiw>G5G@At*rd4gn)cWCnXVPZDHXS#uwp+<40=KM1D&j
zLq9GQAGI)>HnSoO*2!W_3&kmEpi(t-YHI4@l`8uIocFHFjln-jubH)>gIc=WlcHO4
zx!kX{={&!sYUoPEz0bmgL4(E)5KqiQWiYlF<50l>0V$yHaG+fQwu~foQq5c+Ksvns
zKi@wops;6d;xpe~sm_Io56otl$V5*LC?RLdIMb=q$uL*rBo$*>pgP$I+v)<C!ZGm`
z5(m`6^w9;c69v@542D>nni!xKW-YenzY_t}!fXz(eoO3uTA207TK|tVPz$p)yr8YI
z1!`di;R;WSB~S}999%Pr*a5XLo1x-Mj}=f0lMh-esn`IuFk4~b-xdp?7A8NiFiGP;
zEzB@PV%v=ZwJ^nC@kkp3YGLx=5tlIn)WQ@8#j6oHPz#e6jhtMhKrKu;NFrL10ktqi
zu*l0s0@T8k2PCT5cAyrfC=xaKwgR;<)!@izw+*O;DT6~@r!7D&Om#4_7PJGkFlABb
z(bEdl!qfvr#fmnd7N!aYeY#qJTA2EPs9I76YGJA((5tTm)WXyYLx(kKpcbZ%@awlB
z1=PaS4?>s4R!{s2^ns6Ci}GDyIv(m2Sdb1)6awl$J1?qtfmxX1dmVR^>%)xdU0@cb
zI84;w0%~E(1=oaDC{PR21QvOpErD8?@_{v_*%YXSX$py&-$0-irdm)<YBvD2Fiql6
z_q`6Ng{dA;(-zi%T9~F$=<)9XwJ`MrGY(c93o{NF^yMMFSYCV&9?q)o9bIy-!q8Wu
zF1O^QDcuV(SkMv&3sXxNRg5@WOUI6+9lBE)s)eb-L7T4EDN=@NVQK@SYH01WMH;Gw
zsmegB{u)rUDh$=a)C!}{Shemy*WYzOQG*+*g~=6Qc_BJ4quT%!jf6tAFlAybq(dny
z2`Q`!2Li=yO`%$tGI18xp$>gVSP2wD-+gv;$7S2#C71Xv>3(8i%EVY)hmyl%qr0zy
zcc8hV%1vviZ)mNiQZlz8+qZM`=if98Lf8ws{Ag)dQ@W5MncHPxqW91m8kWUkvADUy
z=ojsJv0Iq`j@k}26Jh4_LqE%wOBpD<Nsktb(>Zwc@ZE&6t+0=5f;6G)ePuJ>0eWz1
oLg%pqgvZQ$F86_K&GcjOKMG|hHz^0BhX4Qo07*qoM6N<$f(8ukJpcdz
rename from mobile/android/base/resources/drawable-xxhdpi/lock_identified.png
rename to mobile/android/base/resources/drawable-xxhdpi/lock_secure.png
--- a/mobile/android/base/resources/drawable/site_security_level.xml
+++ b/mobile/android/base/resources/drawable/site_security_level.xml
@@ -1,14 +1,16 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!-- This Source Code Form is subject to the terms of the Mozilla Public
    - License, v. 2.0. If a copy of the MPL was not distributed with this
    - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
 
 <level-list xmlns:android="http://schemas.android.com/apk/res/android">
 
     <item android:maxLevel="0" android:drawable="@android:color/transparent"/>
-    <item android:maxLevel="1" android:drawable="@drawable/lock_identified"/>
-    <item android:maxLevel="2" android:drawable="@drawable/lock_verified"/>
+    <item android:maxLevel="1" android:drawable="@drawable/lock_secure"/>
+    <!-- Bug 1185600 will handle Passive Mixed Content and resolve this icon duplication -->
+    <item android:maxLevel="2" android:drawable="@drawable/lock_secure"/>
     <item android:maxLevel="3" android:drawable="@drawable/shield_enabled"/>
     <item android:maxLevel="4" android:drawable="@drawable/shield_disabled"/>
+    <item android:maxLevel="5" android:drawable="@drawable/lock_disabled"/>
 
 </level-list>
--- a/mobile/android/base/resources/layout/site_identity.xml
+++ b/mobile/android/base/resources/layout/site_identity.xml
@@ -8,17 +8,17 @@
               android:layout_height="wrap_content"
               android:orientation="vertical">
 
     <LinearLayout android:layout_width="match_parent"
                   android:layout_height="wrap_content"
                   android:orientation="horizontal"
                   android:paddingLeft="@dimen/doorhanger_section_padding_small"
                   android:paddingRight="@dimen/doorhanger_section_padding_small"
-                  android:paddingBottom="@dimen/doorhanger_section_padding_medium"
+                  android:paddingBottom="@dimen/doorhanger_section_padding_large"
                   android:paddingTop="@dimen/doorhanger_section_padding_medium">
 
         <ImageView android:id="@+id/site_identity_icon"
                    android:layout_width="@dimen/doorhanger_icon_size"
                    android:layout_height="@dimen/doorhanger_icon_size"
                    android:gravity="center_horizontal"
                    android:padding="@dimen/doorhanger_section_padding_small"
                    android:layout_marginRight="@dimen/doorhanger_section_padding_small"/>
@@ -26,73 +26,62 @@
         <LinearLayout android:layout_width="0dp"
                      android:layout_height="wrap_content"
                      android:orientation="vertical"
                      android:layout_weight="1.0">
 
             <TextView android:id="@+id/site_identity_title"
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
-                      android:layout_marginBottom="@dimen/doorhanger_subsection_padding"
                       android:textAppearance="@style/TextAppearance.DoorHanger.Medium.Light"/>
 
-            <include layout="@layout/site_identity_unknown" />
+            <TextView android:id="@+id/site_identity_state"
+                      android:layout_width="match_parent"
+                      android:layout_height="wrap_content"
+                      android:layout_marginTop="@dimen/doorhanger_subsection_padding"
+                      android:textAppearance="@style/TextAppearance.DoorHanger.Medium.Bold"/>
+
+            <TextView android:id="@+id/mixed_content_activity"
+                      android:layout_width="match_parent"
+                      android:layout_height="wrap_content"
+                      android:layout_marginTop="@dimen/doorhanger_section_padding_medium"
+                      android:textAppearance="@style/TextAppearance.DoorHanger.Medium"
+                      android:visibility="gone"/>
 
             <LinearLayout android:id="@+id/site_identity_known_container"
                           android:layout_width="match_parent"
                           android:layout_height="wrap_content"
                           android:visibility="gone"
                           android:orientation="vertical">
 
-                <TextView android:id="@+id/site_identity_encrypted"
+                <TextView android:id="@+id/owner"
                           android:layout_width="match_parent"
                           android:layout_height="wrap_content"
-                          android:layout_marginBottom="@dimen/doorhanger_section_padding_medium"
-                          android:textAppearance="@style/TextAppearance.DoorHanger.Medium.Bold"
-                          android:textColor="@color/affirmative_green"
-                          android:text="@string/identity_encrypted"/>
-
-                <TextView android:layout_width="wrap_content"
-                          android:layout_height="wrap_content"
-                          android:textAppearance="@style/TextAppearance.DoorHanger.Medium.Light"
-                          android:text="@string/identity_connected_to"/>
-
-                <TextView android:id="@+id/host"
-                          android:layout_width="wrap_content"
-                          android:layout_height="wrap_content"
+                          android:layout_marginTop="@dimen/doorhanger_section_padding_small"
                           android:textAppearance="@style/TextAppearance.DoorHanger.Medium"
                           android:textStyle="bold"/>
 
-                <TextView android:id="@+id/owner_label"
-                          android:layout_width="wrap_content"
+                <TextView android:id="@+id/owner_supplemental"
+                          android:layout_width="match_parent"
                           android:layout_height="wrap_content"
-                          android:textAppearance="@style/TextAppearance.DoorHanger.Medium.Light"
-                          android:text="@string/identity_run_by"
-                          android:layout_marginTop="@dimen/doorhanger_section_padding_medium"/>
-
-                <TextView android:id="@+id/owner"
-                          android:layout_width="wrap_content"
-                          android:layout_height="wrap_content"
-                          android:textAppearance="@style/TextAppearance.DoorHanger.Medium"
-                          android:textStyle="bold"/>
+                          android:textAppearance="@style/TextAppearance.DoorHanger.Medium"/>
 
                 <TextView android:id="@+id/verifier"
-                          android:layout_width="wrap_content"
+                          android:layout_width="match_parent"
                           android:layout_height="wrap_content"
-                          android:textAppearance="@style/TextAppearance.DoorHanger.Medium.Light"
-                          android:layout_marginTop="@dimen/doorhanger_section_padding_medium"/>
+                          android:layout_marginTop="@dimen/doorhanger_section_padding_medium"
+                          android:textAppearance="@style/TextAppearance.DoorHanger.Medium.Light"/>
 
             </LinearLayout>
             <TextView android:id="@+id/site_settings_link"
                       android:layout_width="match_parent"
                       android:layout_height="wrap_content"
                       android:textAppearance="@style/TextAppearance.DoorHanger.Medium"
                       android:textColor="@color/link_blue"
                       android:layout_marginTop="@dimen/doorhanger_section_padding_large"
-                      android:layout_marginBottom="@dimen/doorhanger_section_padding_medium"
                       android:text="@string/contextmenu_site_settings"
                       android:visibility="gone"/>
          </LinearLayout>
     </LinearLayout>
 
     <View android:id="@+id/divider_doorhanger"
           android:layout_width="match_parent"
           android:layout_height="1dp"
deleted file mode 100644
--- a/mobile/android/base/resources/layout/site_identity_unknown.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- This Source Code Form is subject to the terms of the Mozilla Public
-   - License, v. 2.0. If a copy of the MPL was not distributed with this
-   - file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
-
-<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
-              android:id="@+id/site_identity_unknown_container"
-              android:layout_width="match_parent"
-              android:layout_height="wrap_content"
-              android:orientation="vertical"
-              android:visibility="gone">
-
-    <TextView android:layout_width="wrap_content"
-              android:layout_height="wrap_content"
-              android:textAppearance="@style/TextAppearance.DoorHanger.Medium"
-              android:text="@string/identity_no_info"/>
-
-    <TextView android:layout_width="wrap_content"
-              android:layout_height="wrap_content"
-              android:textAppearance="@style/TextAppearance.DoorHanger.Medium"
-              android:text="@string/identity_not_encrypted"
-              android:paddingTop="@dimen/doorhanger_section_padding_medium"/>
-
-</LinearLayout>
--- a/mobile/android/base/strings.xml.in
+++ b/mobile/android/base/strings.xml.in
@@ -455,24 +455,21 @@
   <string name="bookmarkdefaults_title_support">@bookmarks_support@</string>
   <string name="bookmarkdefaults_url_support">https://support.mozilla.org/products/mobile</string>
 
   <!-- Icon is automatically generated from R.drawable.bookmarkdefaults_favicon_marketplace -->
   <string name="bookmarkdefaults_title_marketplace">@bookmarks_marketplace@</string>
   <string name="bookmarkdefaults_url_marketplace">https://marketplace.firefox.com/</string>
 
   <!-- Site identity popup -->
-  <string name="identity_connected_to">&identity_connected_to;</string>
-  <string name="identity_run_by">&identity_run_by;</string>
-  <string name="identity_no_info">&identity_no_info;</string>
-  <string name="identity_not_encrypted">&identity_not_encrypted;</string>
-  <string name="identity_encrypted">&identity_encrypted;</string>
-  <string name="loaded_mixed_content_message">&loaded_mixed_content_message;</string>
-  <string name="blocked_mixed_content_message_top">&blocked_mixed_content_message_top;</string>
-  <string name="blocked_mixed_content_message_bottom">&blocked_mixed_content_message_bottom;</string>
+  <string name="identity_connection_secure">&identity_connection_secure;</string>
+  <string name="identity_connection_insecure">&identity_connection_insecure;</string>
+
+  <string name="mixed_content_blocked_all">&mixed_content_blocked_all;</string>
+  <string name="mixed_content_protection_disabled">&mixed_content_protection_disabled;</string>
 
   <string name="doorhanger_tracking_title">&doorhanger_tracking_title;</string>
   <string name="doorhanger_tracking_state_enabled">&doorhanger_tracking_state_enabled;</string>
   <string name="doorhanger_tracking_state_disabled">&doorhanger_tracking_state_disabled;</string>
   <string name="doorhanger_tracking_message_enabled">&doorhanger_tracking_message_enabled1;</string>
   <string name="doorhanger_tracking_message_disabled">&doorhanger_tracking_message_disabled1;</string>
 
   <string name="learn_more">&learn_more;</string>
--- a/mobile/android/base/toolbar/SiteIdentityPopup.java
+++ b/mobile/android/base/toolbar/SiteIdentityPopup.java
@@ -1,19 +1,21 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this file,
  * You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 package org.mozilla.gecko.toolbar;
 
 import android.content.ClipData;
 import android.content.ClipboardManager;
+import android.content.res.Resources;
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.graphics.drawable.Drawable;
+import android.support.v4.content.ContextCompat;
 import android.widget.ImageView;
 import android.widget.Toast;
 import org.json.JSONException;
 import org.json.JSONArray;
 import org.mozilla.gecko.AboutPages;
 import org.mozilla.gecko.AppConstants;
 import org.mozilla.gecko.EventDispatcher;
 import org.mozilla.gecko.R;
@@ -47,52 +49,50 @@ import org.mozilla.gecko.widget.SiteLogi
  * an arrow panel popup hanging from the lock icon in the browser toolbar.
  */
 public class SiteIdentityPopup extends AnchoredPopup implements GeckoEventListener {
 
     public static enum ButtonType { DISABLE, ENABLE, KEEP_BLOCKING, CANCEL, COPY };
 
     private static final String LOGTAG = "GeckoSiteIdentityPopup";
 
-    private static final String MIXED_CONTENT_SUPPORT_URL =
-        "https://support.mozilla.org/kb/how-does-insecure-content-affect-safety-android";
-
     private static final String TRACKING_CONTENT_SUPPORT_URL =
         "https://support.mozilla.org/kb/firefox-android-tracking-protection";
 
     // Placeholder string.
     private final static String FORMAT_S = "%s";
 
+    private final Resources mResources;
     private SiteIdentity mSiteIdentity;
 
     private LinearLayout mIdentity;
 
     private LinearLayout mIdentityKnownContainer;
-    private LinearLayout mIdentityUnknownContainer;
 
     private ImageView mIcon;
     private TextView mTitle;
-    private TextView mEncrypted;
-    private TextView mHost;
-    private TextView mOwnerLabel;
+    private TextView mSecurityState;
+    private TextView mMixedContentActivity;
     private TextView mOwner;
+    private TextView mOwnerSupplemental;
     private TextView mVerifier;
     private TextView mSiteSettingsLink;
 
     private View mDivider;
 
-    private DoorHanger mMixedContentNotification;
     private DoorHanger mTrackingContentNotification;
     private DoorHanger mSelectLoginDoorhanger;
 
     private final OnButtonClickListener mContentButtonClickListener;
 
     public SiteIdentityPopup(Context context) {
         super(context);
 
+        mResources = mContext.getResources();
+
         mContentButtonClickListener = new ContentNotificationButtonListener();
         EventDispatcher.getInstance().registerGeckoThreadListener(this, "Doorhanger:Logins");
         EventDispatcher.getInstance().registerGeckoThreadListener(this, "Permissions:CheckResult");
     }
 
     @Override
     protected void init() {
         super.init();
@@ -102,38 +102,37 @@ public class SiteIdentityPopup extends A
         setFocusable(true);
 
         LayoutInflater inflater = LayoutInflater.from(mContext);
         mIdentity = (LinearLayout) inflater.inflate(R.layout.site_identity, null);
         mContent.addView(mIdentity);
 
         mIdentityKnownContainer =
                 (LinearLayout) mIdentity.findViewById(R.id.site_identity_known_container);
-        mIdentityUnknownContainer =
-                (LinearLayout) mIdentity.findViewById(R.id.site_identity_unknown_container);
-
 
         mIcon = (ImageView) mIdentity.findViewById(R.id.site_identity_icon);
         mTitle = (TextView) mIdentity.findViewById(R.id.site_identity_title);
-        mEncrypted = (TextView) mIdentityKnownContainer.findViewById(R.id.site_identity_encrypted);
-        mHost = (TextView) mIdentityKnownContainer.findViewById(R.id.host);
-        mOwnerLabel = (TextView) mIdentityKnownContainer.findViewById(R.id.owner_label);
+        mSecurityState = (TextView) mIdentity.findViewById(R.id.site_identity_state);
+        mMixedContentActivity = (TextView) mIdentity.findViewById(R.id.mixed_content_activity);
+
         mOwner = (TextView) mIdentityKnownContainer.findViewById(R.id.owner);
+        mOwnerSupplemental = (TextView) mIdentityKnownContainer.findViewById(R.id.owner_supplemental);
         mVerifier = (TextView) mIdentityKnownContainer.findViewById(R.id.verifier);
         mDivider = mIdentity.findViewById(R.id.divider_doorhanger);
 
         mSiteSettingsLink = (TextView) mIdentity.findViewById(R.id.site_settings_link);
     }
 
     private void updateIdentity(final SiteIdentity siteIdentity) {
         if (!mInflated) {
             init();
         }
 
         final boolean isIdentityKnown = (siteIdentity.getSecurityMode() != SecurityMode.UNKNOWN);
+        updateConnectionState(siteIdentity);
         toggleIdentityKnownContainerVisibility(isIdentityKnown);
 
         if (isIdentityKnown) {
             updateIdentityInformation(siteIdentity);
         }
 
         GeckoAppShell.sendEventToGecko(GeckoEvent.createBroadcastEvent(
             "Permissions:Check", null));
@@ -277,88 +276,77 @@ public class SiteIdentityPopup extends A
     private void removeSelectLoginDoorhanger() {
         if (mSelectLoginDoorhanger != null) {
             mContent.removeView(mSelectLoginDoorhanger);
             mSelectLoginDoorhanger = null;
         }
     }
 
     private void toggleIdentityKnownContainerVisibility(final boolean isIdentityKnown) {
-        if (isIdentityKnown) {
-            mIdentityKnownContainer.setVisibility(View.VISIBLE);
-            mIdentityUnknownContainer.setVisibility(View.GONE);
+        final int identityInfoVisibility = isIdentityKnown ? View.VISIBLE : View.GONE;
+        mIdentityKnownContainer.setVisibility(identityInfoVisibility);
+    }
+
+    private void updateConnectionState(final SiteIdentity siteIdentity) {
+        if (siteIdentity.getEncrypted()) {
+            mIcon.setImageResource(R.drawable.lock_secure);
+
+            mSecurityState.setTextColor(mResources.getColor(R.color.affirmative_green));
+            final Drawable stateIcon = ContextCompat.getDrawable(mContext, R.drawable.img_check);
+            stateIcon.setBounds(0, 0, stateIcon.getIntrinsicWidth()/2, stateIcon.getIntrinsicHeight()/2);
+            mSecurityState.setCompoundDrawables(stateIcon, null, null, null);
+            mSecurityState.setCompoundDrawablePadding((int) mResources.getDimension(R.dimen.doorhanger_drawable_padding));
+            mSecurityState.setText(R.string.identity_connection_secure);
+
+            if (siteIdentity.getMixedMode() == MixedMode.MIXED_CONTENT_BLOCKED) {
+                mMixedContentActivity.setVisibility(View.VISIBLE);
+                mMixedContentActivity.setText(R.string.mixed_content_blocked_all);
+            } else {
+                mMixedContentActivity.setVisibility(View.GONE);
+            }
         } else {
-            mIcon.setImageResource(R.drawable.globe_light);
-            mIdentityKnownContainer.setVisibility(View.GONE);
-            mIdentityUnknownContainer.setVisibility(View.VISIBLE);
+            if (siteIdentity.getMixedMode() == MixedMode.MIXED_CONTENT_LOADED) {
+                mIcon.setImageResource(R.drawable.lock_disabled);
+                mMixedContentActivity.setVisibility(View.VISIBLE);
+                mMixedContentActivity.setText(R.string.mixed_content_protection_disabled);
+            } else {
+                mIcon.setImageResource(R.drawable.globe_light);
+                mMixedContentActivity.setVisibility(View.GONE);
+            }
+
+            mSecurityState.setText(R.string.identity_connection_insecure);
+            mSecurityState.setTextColor(mResources.getColor(R.color.placeholder_active_grey));
+            mSecurityState.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
+            mSecurityState.setCompoundDrawablePadding(0);
         }
     }
 
     private void updateIdentityInformation(final SiteIdentity siteIdentity) {
-        if (siteIdentity.getEncrypted()) {
-            mEncrypted.setVisibility(View.VISIBLE);
-            mIcon.setImageResource(R.drawable.lock_identified);
-        } else {
-            mEncrypted.setVisibility(View.GONE);
-        }
-
-        mHost.setText(siteIdentity.getHost());
-
         String owner = siteIdentity.getOwner();
         if (owner == null) {
-            mOwnerLabel.setVisibility(View.GONE);
             mOwner.setVisibility(View.GONE);
+            mOwnerSupplemental.setVisibility(View.GONE);
         } else {
-            mOwnerLabel.setVisibility(View.VISIBLE);
             mOwner.setVisibility(View.VISIBLE);
+            mOwner.setText(owner);
 
             // Supplemental data is optional.
             final String supplemental = siteIdentity.getSupplemental();
             if (!TextUtils.isEmpty(supplemental)) {
-                owner += "\n" + supplemental;
+                mOwnerSupplemental.setText(supplemental);
+                mOwnerSupplemental.setVisibility(View.VISIBLE);
+            } else {
+                mOwnerSupplemental.setVisibility(View.GONE);
             }
-            mOwner.setText(owner);
         }
 
         final String verifier = siteIdentity.getVerifier();
         mVerifier.setText(verifier);
     }
 
-    private void addMixedContentNotification(boolean blocked) {
-        // Remove any existing mixed content notification.
-        removeMixedContentNotification();
-
-        final DoorhangerConfig config = new DoorhangerConfig(DoorHanger.Type.MIXED_CONTENT, mContentButtonClickListener);
-        int icon;
-        if (blocked) {
-            icon = R.drawable.shield_enabled;
-            config.setMessage(mContext.getString(R.string.blocked_mixed_content_message_top) + "\n\n" +
-                      mContext.getString(R.string.blocked_mixed_content_message_bottom));
-        } else {
-            icon = R.drawable.shield_disabled;
-            config.setMessage(mContext.getString(R.string.loaded_mixed_content_message));
-        }
-
-        config.setLink(mContext.getString(R.string.learn_more), MIXED_CONTENT_SUPPORT_URL);
-        addNotificationButtons(config, blocked);
-
-        mMixedContentNotification = DoorHanger.Get(mContext, config);
-        mMixedContentNotification.setIcon(icon);
-
-        mContent.addView(mMixedContentNotification);
-        mDivider.setVisibility(View.VISIBLE);
-    }
-
-    private void removeMixedContentNotification() {
-        if (mMixedContentNotification != null) {
-            mContent.removeView(mMixedContentNotification);
-            mMixedContentNotification = null;
-        }
-    }
-
     private void addTrackingContentNotification(boolean blocked) {
         // Remove any existing tracking content notification.
         removeTrackingContentNotification();
 
         final DoorhangerConfig config = new DoorhangerConfig(DoorHanger.Type.TRACKING, mContentButtonClickListener);
 
         final int icon = blocked ? R.drawable.shield_enabled: R.drawable.shield_disabled;
 
@@ -418,36 +406,35 @@ public class SiteIdentityPopup extends A
         final Tab selectedTab = Tabs.getInstance().getSelectedTab();
         if (selectedTab != null && AboutPages.isAboutPage(selectedTab.getURL())) {
             Log.d(LOGTAG, "We don't show site identity popups for about: pages");
             return;
         }
 
         updateIdentity(mSiteIdentity);
 
-        final MixedMode mixedMode = mSiteIdentity.getMixedMode();
-        if (mixedMode != MixedMode.UNKNOWN) {
-            addMixedContentNotification(mixedMode == MixedMode.MIXED_CONTENT_BLOCKED);
-        }
-
         final TrackingMode trackingMode = mSiteIdentity.getTrackingMode();
         if (trackingMode != TrackingMode.UNKNOWN) {
             addTrackingContentNotification(trackingMode == TrackingMode.TRACKING_CONTENT_BLOCKED);
         }
 
         try {
             addSelectLoginDoorhanger(selectedTab);
         } catch (JSONException e) {
             Log.e(LOGTAG, "Error adding selectLogin doorhanger", e);
         }
 
         mTitle.setText(selectedTab.getBaseDomain());
         final Bitmap favicon = selectedTab.getFavicon();
         if (favicon != null) {
-            mTitle.setCompoundDrawablesWithIntrinsicBounds(new BitmapDrawable(mContext.getResources(), favicon), null, null, null);
+            final Drawable faviconDrawable = new BitmapDrawable(mResources, favicon);
+            final int dimen = (int) mResources.getDimension(R.dimen.browser_toolbar_favicon_size);
+            faviconDrawable.setBounds(0, 0, dimen, dimen);
+
+            mTitle.setCompoundDrawables(faviconDrawable, null, null, null);
             mTitle.setCompoundDrawablePadding((int) mContext.getResources().getDimension(R.dimen.doorhanger_drawable_padding));
         }
 
         showDividers();
 
         super.show();
     }
 
@@ -478,17 +465,16 @@ public class SiteIdentityPopup extends A
     void destroy() {
         EventDispatcher.getInstance().unregisterGeckoThreadListener(this, "Doorhanger:Logins");
         EventDispatcher.getInstance().unregisterGeckoThreadListener(this, "Permissions:CheckResult");
     }
 
     @Override
     public void dismiss() {
         super.dismiss();
-        removeMixedContentNotification();
         removeTrackingContentNotification();
         removeSelectLoginDoorhanger();
         mTitle.setCompoundDrawablesWithIntrinsicBounds(null, null, null, null);
         mDivider.setVisibility(View.GONE);
     }
 
     private class ContentNotificationButtonListener implements OnButtonClickListener {
         @Override
--- a/mobile/android/base/toolbar/ToolbarDisplayLayout.java
+++ b/mobile/android/base/toolbar/ToolbarDisplayLayout.java
@@ -122,16 +122,17 @@ public class ToolbarDisplayLayout extend
     private TranslateAnimation mTitleSlideLeft;
     private TranslateAnimation mTitleSlideRight;
 
     private final SiteIdentityPopup mSiteIdentityPopup;
     private int mSecurityImageLevel;
 
     private final int LEVEL_SHIELD_ENABLED = 3;
     private final int LEVEL_SHIELD_DISABLED = 4;
+    private final int LEVEL_LOCK_DISABLED = 5;
 
     private PropertyAnimator mForwardAnim;
 
     private final ForegroundColorSpan mUrlColor;
     private final ForegroundColorSpan mBlockedColor;
     private final ForegroundColorSpan mDomainColor;
     private final ForegroundColorSpan mPrivateDomainColor;
 
@@ -430,22 +431,22 @@ public class ToolbarDisplayLayout extend
             trackingMode = siteIdentity.getTrackingMode();
         }
 
         // This is a bit tricky, but we have one icon and three potential indicators.
         // Default to the identity level
         int imageLevel = securityMode.ordinal();
 
         // Check to see if any protection was overridden first
-        if (trackingMode == TrackingMode.TRACKING_CONTENT_LOADED ||
-            mixedMode == MixedMode.MIXED_CONTENT_LOADED) {
-          imageLevel = LEVEL_SHIELD_DISABLED;
-        } else if (trackingMode == TrackingMode.TRACKING_CONTENT_BLOCKED ||
-                   mixedMode == MixedMode.MIXED_CONTENT_BLOCKED) {
-          imageLevel = LEVEL_SHIELD_ENABLED;
+        if (trackingMode == TrackingMode.TRACKING_CONTENT_LOADED) {
+            imageLevel = LEVEL_SHIELD_DISABLED;
+        } else if (trackingMode == TrackingMode.TRACKING_CONTENT_BLOCKED) {
+            imageLevel = LEVEL_SHIELD_ENABLED;
+        } else if (mixedMode == MixedMode.MIXED_CONTENT_LOADED) {
+            imageLevel = LEVEL_LOCK_DISABLED;
         }
 
         if (mSecurityImageLevel != imageLevel) {
             mSecurityImageLevel = imageLevel;
             mSiteSecurity.setImageLevel(mSecurityImageLevel);
             updatePageActions(flags);
         }
     }
--- a/mobile/android/chrome/content/CastingApps.js
+++ b/mobile/android/chrome/content/CastingApps.js
@@ -11,17 +11,16 @@ XPCOMUtils.defineLazyModuleGetter(this, 
 // JSM files, but we left them here to allow for better lazy JSM loading.
 var rokuDevice = {
   id: "roku:ecp",
   target: "roku:ecp",
   factory: function(aService) {
     Cu.import("resource://gre/modules/RokuApp.jsm");
     return new RokuApp(aService);
   },
-  mirror: Services.prefs.getBoolPref("browser.mirroring.enabled.roku"),
   types: ["video/mp4"],
   extensions: ["mp4"]
 };
 
 var matchstickDevice = {
   id: "matchstick:dial",
   target: "urn:dial-multiscreen-org:service:dial:1",
   filters: {
--- a/mobile/android/chrome/content/browser.js
+++ b/mobile/android/chrome/content/browser.js
@@ -7111,17 +7111,17 @@ var IdentityHandler = {
 
   getMixedMode: function getMixedMode(aState) {
     if (aState & Ci.nsIWebProgressListener.STATE_BLOCKED_MIXED_ACTIVE_CONTENT) {
       return this.MIXED_MODE_CONTENT_BLOCKED;
     }
 
     // Only show an indicator for loaded mixed content if the pref to block it is enabled
     if ((aState & Ci.nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT) &&
-         Services.prefs.getBoolPref("security.mixed_content.block_active_content")) {
+         !Services.prefs.getBoolPref("security.mixed_content.block_active_content")) {
       return this.MIXED_MODE_CONTENT_LOADED;
     }
 
     return this.MIXED_MODE_UNKNOWN;
   },
 
   getTrackingMode: function getTrackingMode(aState, aBrowser) {
     if (aState & Ci.nsIWebProgressListener.STATE_BLOCKED_TRACKING_CONTENT) {
--- a/netwerk/base/NetStatistics.h
+++ b/netwerk/base/NetStatistics.h
@@ -6,93 +6,94 @@
 
 #ifndef NetStatistics_h__
 #define NetStatistics_h__
 
 #include "mozilla/Assertions.h"
 
 #include "nsCOMPtr.h"
 #include "nsError.h"
+#include "nsINetworkInterface.h"
 #include "nsINetworkManager.h"
 #include "nsINetworkStatsServiceProxy.h"
 #include "nsThreadUtils.h"
 #include "nsProxyRelease.h"
 
 namespace mozilla {
 namespace net {
 
 // The following members are used for network per-app metering.
 const static uint64_t NETWORK_STATS_THRESHOLD = 65536;
 const static char NETWORK_STATS_NO_SERVICE_TYPE[] = "";
 
 inline nsresult
-GetActiveNetworkInterface(nsCOMPtr<nsINetworkInterface> &aNetworkInterface)
+GetActiveNetworkInfo(nsCOMPtr<nsINetworkInfo> &aNetworkInfo)
 {
   MOZ_ASSERT(NS_IsMainThread());
 
   nsresult rv;
   nsCOMPtr<nsINetworkManager> networkManager =
     do_GetService("@mozilla.org/network/manager;1", &rv);
 
   if (NS_FAILED(rv) || !networkManager) {
-    aNetworkInterface = nullptr;
+    aNetworkInfo = nullptr;
     return rv;
   }
 
-  networkManager->GetActive(getter_AddRefs(aNetworkInterface));
+  networkManager->GetActiveNetworkInfo(getter_AddRefs(aNetworkInfo));
 
   return NS_OK;
 }
 
 class SaveNetworkStatsEvent : public nsRunnable {
 public:
   SaveNetworkStatsEvent(uint32_t aAppId,
                         bool aIsInBrowser,
-                        nsMainThreadPtrHandle<nsINetworkInterface> &aActiveNetwork,
+                        nsMainThreadPtrHandle<nsINetworkInfo> &aActiveNetworkInfo,
                         uint64_t aCountRecv,
                         uint64_t aCountSent,
                         bool aIsAccumulative)
     : mAppId(aAppId),
       mIsInBrowser(aIsInBrowser),
-      mActiveNetwork(aActiveNetwork),
+      mActiveNetworkInfo(aActiveNetworkInfo),
       mCountRecv(aCountRecv),
       mCountSent(aCountSent),
       mIsAccumulative(aIsAccumulative)
   {
     MOZ_ASSERT(mAppId != NECKO_NO_APP_ID);
-    MOZ_ASSERT(mActiveNetwork);
+    MOZ_ASSERT(mActiveNetworkInfo);
   }
 
   NS_IMETHOD Run()
   {
     MOZ_ASSERT(NS_IsMainThread());
 
     nsresult rv;
     nsCOMPtr<nsINetworkStatsServiceProxy> mNetworkStatsServiceProxy =
       do_GetService("@mozilla.org/networkstatsServiceProxy;1", &rv);
     if (NS_FAILED(rv)) {
       return rv;
     }
 
     // save the network stats through NetworkStatsServiceProxy
     mNetworkStatsServiceProxy->SaveAppStats(mAppId,
                                             mIsInBrowser,
-                                            mActiveNetwork,
+                                            mActiveNetworkInfo,
                                             PR_Now() / 1000,
                                             mCountRecv,
                                             mCountSent,
                                             mIsAccumulative,
                                             nullptr);
 
     return NS_OK;
   }
 private:
   uint32_t mAppId;
   bool     mIsInBrowser;
-  nsMainThreadPtrHandle<nsINetworkInterface> mActiveNetwork;
+  nsMainThreadPtrHandle<nsINetworkInfo> mActiveNetworkInfo;
   uint64_t mCountRecv;
   uint64_t mCountSent;
   bool mIsAccumulative;
 };
 
 } // namespace mozilla:net
 } // namespace mozilla
 
--- a/netwerk/base/nsIOService.cpp
+++ b/netwerk/base/nsIOService.cpp
@@ -44,16 +44,17 @@
 #include "mozilla/net/NeckoCommon.h"
 #include "mozilla/Telemetry.h"
 #include "mozilla/net/DNS.h"
 #include "CaptivePortalService.h"
 #include "ReferrerPolicy.h"
 
 #ifdef MOZ_WIDGET_GONK
 #include "nsINetworkManager.h"
+#include "nsINetworkInterface.h"
 #endif
 
 #if defined(XP_WIN)
 #include "nsNativeConnectionHelper.h"
 #endif
 
 using namespace mozilla;
 using mozilla::net::IsNeckoChild;
@@ -1316,28 +1317,28 @@ IsWifiActive()
     }
 #ifdef MOZ_WIDGET_GONK
     // On B2G we query the network manager for the active interface
     nsCOMPtr<nsINetworkManager> networkManager =
         do_GetService("@mozilla.org/network/manager;1");
     if (!networkManager) {
         return false;
     }
-    nsCOMPtr<nsINetworkInterface> active;
-    networkManager->GetActive(getter_AddRefs(active));
-    if (!active) {
+    nsCOMPtr<nsINetworkInfo> activeNetworkInfo;
+    networkManager->GetActiveNetworkInfo(getter_AddRefs(activeNetworkInfo));
+    if (!activeNetworkInfo) {
         return false;
     }
     int32_t type;
-    if (NS_FAILED(active->GetType(&type))) {
+    if (NS_FAILED(activeNetworkInfo->GetType(&type))) {
         return false;
     }
     switch (type) {
-    case nsINetworkInterface::NETWORK_TYPE_WIFI:
-    case nsINetworkInterface::NETWORK_TYPE_WIFI_P2P:
+    case nsINetworkInfo::NETWORK_TYPE_WIFI:
+    case nsINetworkInfo::NETWORK_TYPE_WIFI_P2P:
         return true;
     default:
         return false;
     }
 #else
     // On anything else than B2G we return true so than wifi-only
     // apps don't think they are offline.
     return true;
@@ -1428,29 +1429,29 @@ nsIOService::Observe(nsISupports *subjec
         if (mCaptivePortalService) {
             mCaptivePortalService->RecheckCaptivePortal();
         }
     } else if (!strcmp(topic, kNetworkActiveChanged)) {
 #ifdef MOZ_WIDGET_GONK
         if (IsNeckoChild()) {
           return NS_OK;
         }
-        nsCOMPtr<nsINetworkInterface> interface = do_QueryInterface(subject);
+        nsCOMPtr<nsINetworkInfo> interface = do_QueryInterface(subject);
         if (!interface) {
             return NS_ERROR_FAILURE;
         }
         int32_t state;
         if (NS_FAILED(interface->GetState(&state))) {
             return NS_ERROR_FAILURE;
         }
 
         bool wifiActive = IsWifiActive();
         int32_t newWifiState = wifiActive ?
-            nsINetworkInterface::NETWORK_TYPE_WIFI :
-            nsINetworkInterface::NETWORK_TYPE_MOBILE;
+            nsINetworkInfo::NETWORK_TYPE_WIFI :
+            nsINetworkInfo::NETWORK_TYPE_MOBILE;
         if (mPreviousWifiState != newWifiState) {
             // Notify wifi-only apps of their new status
             int32_t status = wifiActive ?
                 nsIAppOfflineInfo::ONLINE : nsIAppOfflineInfo::OFFLINE;
 
             EnumeratorParams params = {this, status};
             mAppsOfflineStatus.EnumerateRead(EnumerateWifiAppsChangingState, &params);
         }
--- a/netwerk/base/nsUDPSocket.cpp
+++ b/netwerk/base/nsUDPSocket.cpp
@@ -806,20 +806,20 @@ nsUDPSocket::InitWithAddress(const NetAd
     rv = aPrincipal->GetIsInBrowserElement(&mIsInBrowserElement);
     if (NS_FAILED(rv)) {
       return rv;
     }
   }
 
 #ifdef MOZ_WIDGET_GONK
   if (mAppId != NECKO_UNKNOWN_APP_ID) {
-    nsCOMPtr<nsINetworkInterface> activeNetwork;
-    GetActiveNetworkInterface(activeNetwork);
-    mActiveNetwork =
-      new nsMainThreadPtrHolder<nsINetworkInterface>(activeNetwork);
+    nsCOMPtr<nsINetworkInfo> activeNetworkInfo;
+    GetActiveNetworkInfo(activeNetworkInfo);
+    mActiveNetworkInfo =
+      new nsMainThreadPtrHolder<nsINetworkInfo>(activeNetworkInfo);
   }
 #endif
 
   uint16_t port;
   if (NS_FAILED(net::GetPort(aAddr, &port))) {
     NS_WARNING("invalid bind address");
     goto fail;
   }
@@ -913,30 +913,30 @@ nsUDPSocket::GetLocalAddr(nsINetAddr * *
 
   return NS_OK;
 }
 
 void
 nsUDPSocket::SaveNetworkStats(bool aEnforce)
 {
 #ifdef MOZ_WIDGET_GONK
-  if (!mActiveNetwork || mAppId == NECKO_UNKNOWN_APP_ID) {
+  if (!mActiveNetworkInfo || mAppId == NECKO_UNKNOWN_APP_ID) {
     return;
   }
 
   if (mByteReadCount == 0 && mByteWriteCount == 0) {
     return;
   }
 
   uint64_t total = mByteReadCount + mByteWriteCount;
   if (aEnforce || total > NETWORK_STATS_THRESHOLD) {
     // Create the event to save the network statistics.
     // the event is then dispathed to the main thread.
     nsRefPtr<nsRunnable> event =
-      new SaveNetworkStatsEvent(mAppId, mIsInBrowserElement, mActiveNetwork,
+      new SaveNetworkStatsEvent(mAppId, mIsInBrowserElement, mActiveNetworkInfo,
                                 mByteReadCount, mByteWriteCount, false);
     NS_DispatchToMainThread(event);
 
     // Reset the counters after saving.
     mByteReadCount = 0;
     mByteWriteCount = 0;
   }
 #endif
--- a/netwerk/base/nsUDPSocket.h
+++ b/netwerk/base/nsUDPSocket.h
@@ -8,17 +8,17 @@
 
 #include "nsIUDPSocket.h"
 #include "mozilla/Mutex.h"
 #include "nsIOutputStream.h"
 #include "nsAutoPtr.h"
 #include "nsCycleCollectionParticipant.h"
 
 #ifdef MOZ_WIDGET_GONK
-#include "nsINetworkManager.h"
+#include "nsINetworkInterface.h"
 #include "nsProxyRelease.h"
 #endif
 
 //-----------------------------------------------------------------------------
 
 class nsUDPSocket final : public nsASocketHandler
                         , public nsIUDPSocket
 {
@@ -67,17 +67,17 @@ private:
   nsCOMPtr<nsIUDPSocketListener>       mListener;
   nsCOMPtr<nsIEventTarget>             mListenerTarget;
   bool                                 mAttached;
   nsRefPtr<nsSocketTransportService>   mSts;
 
   uint64_t   mByteReadCount;
   uint64_t   mByteWriteCount;
 #ifdef MOZ_WIDGET_GONK
-  nsMainThreadPtrHandle<nsINetworkInterface> mActiveNetwork;
+  nsMainThreadPtrHandle<nsINetworkInfo> mActiveNetworkInfo;
 #endif
 };
 
 //-----------------------------------------------------------------------------
 
 class nsUDPMessage : public nsIUDPMessage
 {
 public:
--- a/netwerk/protocol/ftp/nsFtpConnectionThread.cpp
+++ b/netwerk/protocol/ftp/nsFtpConnectionThread.cpp
@@ -1612,20 +1612,20 @@ nsFtpState::Init(nsFtpChannel *channel)
     NS_ASSERTION(channel, "FTP: needs a channel");
 
     mChannel = channel; // a straight ref ptr to the channel
 
     // initialize counter for network metering
     mCountRecv = 0;
 
 #ifdef MOZ_WIDGET_GONK
-    nsCOMPtr<nsINetworkInterface> activeNetwork;
-    GetActiveNetworkInterface(activeNetwork);
-    mActiveNetwork =
-        new nsMainThreadPtrHolder<nsINetworkInterface>(activeNetwork);
+    nsCOMPtr<nsINetworkInfo> activeNetworkInfo;
+    GetActiveNetworkInfo(activeNetworkInfo);
+    mActiveNetworkInfo =
+        new nsMainThreadPtrHolder<nsINetworkInfo>(activeNetworkInfo);
 #endif
 
     mKeepRunning = true;
     mSuppliedEntityID = channel->EntityID();
 
     if (channel->UploadStream())
         mAction = PUT;
 
@@ -2100,17 +2100,17 @@ nsFtpState::SaveNetworkStats(bool enforc
 {
 #ifdef MOZ_WIDGET_GONK
     // Obtain app id
     uint32_t appId;
     bool isInBrowser;
     NS_GetAppInfo(mChannel, &appId, &isInBrowser);
 
     // Check if active network and appid are valid.
-    if (!mActiveNetwork || appId == NECKO_NO_APP_ID) {
+    if (!mActiveNetworkInfo || appId == NECKO_NO_APP_ID) {
         return NS_OK;
     }
 
     if (mCountRecv <= 0) {
         // There is no traffic, no need to save.
         return NS_OK;
     }
 
@@ -2119,17 +2119,17 @@ nsFtpState::SaveNetworkStats(bool enforc
     // threshold.
     if (!enforce && mCountRecv < NETWORK_STATS_THRESHOLD) {
         return NS_OK;
     }
 
     // Create the event to save the network statistics.
     // the event is then dispathed to the main thread.
     nsRefPtr<nsRunnable> event =
-        new SaveNetworkStatsEvent(appId, isInBrowser, mActiveNetwork,
+        new SaveNetworkStatsEvent(appId, isInBrowser, mActiveNetworkInfo,
                                   mCountRecv, 0, false);
     NS_DispatchToMainThread(event);
 
     // Reset the counters after saving.
     mCountRecv = 0;
 
     return NS_OK;
 #else
--- a/netwerk/protocol/ftp/nsFtpConnectionThread.h
+++ b/netwerk/protocol/ftp/nsFtpConnectionThread.h
@@ -13,17 +13,17 @@
 #include "nsIAsyncInputStream.h"
 #include "nsAutoPtr.h"
 #include "nsITransport.h"
 #include "mozilla/net/DNS.h"
 #include "nsFtpControlConnection.h"
 #include "nsIProtocolProxyCallback.h"
 
 #ifdef MOZ_WIDGET_GONK
-#include "nsINetworkManager.h"
+#include "nsINetworkInterface.h"
 #include "nsProxyRelease.h"
 #endif
 
 // ftp server types
 #define FTP_GENERIC_TYPE     0
 #define FTP_UNIX_TYPE        1
 #define FTP_VMS_TYPE         8
 #define FTP_NT_TYPE          9
@@ -213,17 +213,17 @@ private:
 
     nsCOMPtr<nsICancelable>  mProxyRequest;
     bool                     mDeferredCallbackPending;
 
 // These members are used for network per-app metering (bug 855948)
 // Currently, they are only available on gonk.
     uint64_t                           mCountRecv;
 #ifdef MOZ_WIDGET_GONK
-    nsMainThreadPtrHandle<nsINetworkInterface> mActiveNetwork;
+    nsMainThreadPtrHandle<nsINetworkInfo> mActiveNetworkInfo;
 #endif
     nsresult                           SaveNetworkStats(bool);
     void                               CountRecvBytes(uint64_t recvBytes)
     {
         mCountRecv += recvBytes;
         SaveNetworkStats(false);
     }
 };
--- a/netwerk/protocol/http/nsHttpTransaction.cpp
+++ b/netwerk/protocol/http/nsHttpTransaction.cpp
@@ -247,20 +247,20 @@ nsHttpTransaction::Init(uint32_t caps,
     mChannel = do_QueryInterface(eventsink);
     nsCOMPtr<nsIChannel> channel = do_QueryInterface(eventsink);
     if (channel) {
         NS_GetAppInfo(channel, &mAppId, &mIsInBrowser);
     }
 
 #ifdef MOZ_WIDGET_GONK
     if (mAppId != NECKO_NO_APP_ID) {
-        nsCOMPtr<nsINetworkInterface> activeNetwork;
-        GetActiveNetworkInterface(activeNetwork);
-        mActiveNetwork =
-            new nsMainThreadPtrHolder<nsINetworkInterface>(activeNetwork);
+        nsCOMPtr<nsINetworkInfo> activeNetworkInfo;
+        GetActiveNetworkInfo(activeNetworkInfo);
+        mActiveNetworkInfo =
+            new nsMainThreadPtrHolder<nsINetworkInfo>(activeNetworkInfo);
     }
 #endif
 
     nsCOMPtr<nsIHttpChannelInternal> httpChannelInternal =
         do_QueryInterface(eventsink);
     if (httpChannelInternal) {
         rv = httpChannelInternal->GetResponseTimeoutEnabled(
             &mResponseTimeoutEnabled);
@@ -818,17 +818,17 @@ nsHttpTransaction::WriteSegments(nsAHttp
     return rv;
 }
 
 nsresult
 nsHttpTransaction::SaveNetworkStats(bool enforce)
 {
 #ifdef MOZ_WIDGET_GONK
     // Check if active network and appid are valid.
-    if (!mActiveNetwork || mAppId == NECKO_NO_APP_ID) {
+    if (!mActiveNetworkInfo || mAppId == NECKO_NO_APP_ID) {
         return NS_OK;
     }
 
     if (mCountRecv <= 0 && mCountSent <= 0) {
         // There is no traffic, no need to save.
         return NS_OK;
     }
 
@@ -838,17 +838,17 @@ nsHttpTransaction::SaveNetworkStats(bool
     uint64_t totalBytes = mCountRecv + mCountSent;
     if (!enforce && totalBytes < NETWORK_STATS_THRESHOLD) {
         return NS_OK;
     }
 
     // Create the event to save the network statistics.
     // the event is then dispathed to the main thread.
     nsRefPtr<nsRunnable> event =
-        new SaveNetworkStatsEvent(mAppId, mIsInBrowser, mActiveNetwork,
+        new SaveNetworkStatsEvent(mAppId, mIsInBrowser, mActiveNetworkInfo,
                                   mCountRecv, mCountSent, false);
     NS_DispatchToMainThread(event);
 
     // Reset the counters after saving.
     mCountSent = 0;
     mCountRecv = 0;
 
     return NS_OK;
--- a/netwerk/protocol/http/nsHttpTransaction.h
+++ b/netwerk/protocol/http/nsHttpTransaction.h
@@ -14,17 +14,17 @@
 #include "nsThreadUtils.h"
 #include "nsILoadGroup.h"
 #include "nsIInterfaceRequestor.h"
 #include "TimingStruct.h"
 #include "Http2Push.h"
 #include "mozilla/net/DNS.h"
 
 #ifdef MOZ_WIDGET_GONK
-#include "nsINetworkManager.h"
+#include "nsINetworkInterface.h"
 #include "nsProxyRelease.h"
 #endif
 
 //-----------------------------------------------------------------------------
 
 class nsIHttpActivityObserver;
 class nsIEventTarget;
 class nsIInputStream;
@@ -403,17 +403,17 @@ private:
 
 // These members are used for network per-app metering (bug 746073)
 // Currently, they are only available on gonk.
     uint64_t                           mCountRecv;
     uint64_t                           mCountSent;
     uint32_t                           mAppId;
     bool                               mIsInBrowser;
 #ifdef MOZ_WIDGET_GONK
-    nsMainThreadPtrHandle<nsINetworkInterface> mActiveNetwork;
+    nsMainThreadPtrHandle<nsINetworkInfo> mActiveNetworkInfo;
 #endif
     nsresult                           SaveNetworkStats(bool);
     void                               CountRecvBytes(uint64_t recvBytes)
     {
         mCountRecv += recvBytes;
         SaveNetworkStats(false);
     }
     void                               CountSentBytes(uint64_t sentBytes)
--- a/netwerk/protocol/websocket/WebSocketChannel.cpp
+++ b/netwerk/protocol/websocket/WebSocketChannel.cpp
@@ -1371,20 +1371,20 @@ WebSocketChannel::BeginOpenInternal()
   }
 
   if (localChannel) {
     NS_GetAppInfo(localChannel, &mAppId, &mIsInBrowser);
   }
 
 #ifdef MOZ_WIDGET_GONK
   if (mAppId != NECKO_NO_APP_ID) {
-    nsCOMPtr<nsINetworkInterface> activeNetwork;
-    GetActiveNetworkInterface(activeNetwork);
-    mActiveNetwork =
-      new nsMainThreadPtrHolder<nsINetworkInterface>(activeNetwork);
+    nsCOMPtr<nsINetworkInfo> activeNetworkInfo;
+    GetActiveNetworkInfo(activeNetworkInfo);
+    mActiveNetworkInfo =
+      new nsMainThreadPtrHolder<nsINetworkInfo>(activeNetworkInfo);
   }
 #endif
 
   rv = localChannel->AsyncOpen(this, mHttpChannel);
   if (NS_FAILED(rv)) {
     LOG(("WebSocketChannel::BeginOpenInternal: cannot async open\n"));
     AbortSession(NS_ERROR_CONNECTION_REFUSED);
     return;
@@ -3704,17 +3704,17 @@ WebSocketChannel::OnDataAvailable(nsIReq
   return NS_OK;
 }
 
 nsresult
 WebSocketChannel::SaveNetworkStats(bool enforce)
 {
 #ifdef MOZ_WIDGET_GONK
   // Check if the active network and app id are valid.
-  if(!mActiveNetwork || mAppId == NECKO_NO_APP_ID) {
+  if(!mActiveNetworkInfo || mAppId == NECKO_NO_APP_ID) {
     return NS_OK;
   }
 
   uint64_t countRecv = 0;
   uint64_t countSent = 0;
 
   mCountRecv.exchange(countRecv);
   mCountSent.exchange(countSent);
@@ -3730,17 +3730,17 @@ WebSocketChannel::SaveNetworkStats(bool 
   uint64_t totalBytes = countRecv + countSent;
   if (!enforce && totalBytes < NETWORK_STATS_THRESHOLD) {
     return NS_OK;
   }
 
   // Create the event to save the network statistics.
   // the event is then dispathed to the main thread.
   nsRefPtr<nsRunnable> event =
-    new SaveNetworkStatsEvent(mAppId, mIsInBrowser, mActiveNetwork,
+    new SaveNetworkStatsEvent(mAppId, mIsInBrowser, mActiveNetworkInfo,
                               countRecv, countSent, false);
   NS_DispatchToMainThread(event);
 
   return NS_OK;
 #else
   return NS_ERROR_NOT_IMPLEMENTED;
 #endif
 }
--- a/netwerk/protocol/websocket/WebSocketChannel.h
+++ b/netwerk/protocol/websocket/WebSocketChannel.h
@@ -17,17 +17,17 @@
 #include "nsIObserver.h"
 #include "nsIProtocolProxyCallback.h"
 #include "nsIChannelEventSink.h"
 #include "nsIHttpChannelInternal.h"
 #include "nsIStringStream.h"
 #include "BaseWebSocketChannel.h"
 
 #ifdef MOZ_WIDGET_GONK
-#include "nsINetworkManager.h"
+#include "nsINetworkInterface.h"
 #include "nsProxyRelease.h"
 #endif
 
 #include "nsCOMPtr.h"
 #include "nsString.h"
 #include "nsDeque.h"
 #include "mozilla/Atomics.h"
 
@@ -286,17 +286,17 @@ private:
 
 // These members are used for network per-app metering (bug 855949)
 // Currently, they are only available on gonk.
   Atomic<uint64_t, Relaxed>       mCountRecv;
   Atomic<uint64_t, Relaxed>       mCountSent;
   uint32_t                        mAppId;
   bool                            mIsInBrowser;
 #ifdef MOZ_WIDGET_GONK
-  nsMainThreadPtrHandle<nsINetworkInterface> mActiveNetwork;
+  nsMainThreadPtrHandle<nsINetworkInfo> mActiveNetworkInfo;
 #endif
   nsresult                        SaveNetworkStats(bool);
   void                            CountRecvBytes(uint64_t recvBytes)
   {
     mCountRecv += recvBytes;
     SaveNetworkStats(false);
   }
   void                            CountSentBytes(uint64_t sentBytes)
--- a/testing/mozharness/mozharness.json
+++ b/testing/mozharness/mozharness.json
@@ -1,4 +1,4 @@
 {
     "repo": "https://hg.mozilla.org/build/mozharness",
-    "revision": "672af8a8da3e"
+    "revision": "d72df953784c"
 }
--- a/testing/mozharness/scripts/gaia_integration.py
+++ b/testing/mozharness/scripts/gaia_integration.py
@@ -43,16 +43,17 @@ class GaiaIntegrationTest(GaiaTest):
             dirs['abs_gaia_dir'] +
             '/node_modules/marionette-js-runner/host/python/runner-service')
         # Check whether python package is around since there exist versions
         # of gaia that depend on versions of marionette-js-runner without
         # the python stuff.
         if os.path.exists(gaia_runner_service):
             self.install_module('gaia-runner-service', gaia_runner_service)
         env['VIRTUALENV_PATH'] = self.query_virtualenv_path()
+        env['HOST_LOG'] = os.path.join(dirs['abs_log_dir'], 'gecko_output.log')
 
         cmd = [
             'make',
             'test-integration',
             'REPORTER=mocha-tbpl-reporter',
             'TEST_MANIFEST=./shared/test/integration/tbpl-manifest.json',
             'NODE_MODULE_SRC=npm-cache',
             'VIRTUALENV_EXISTS=1'
--- a/toolkit/components/perfmonitoring/PerformanceStats.jsm
+++ b/toolkit/components/perfmonitoring/PerformanceStats.jsm
@@ -44,17 +44,17 @@ XPCOMUtils.defineLazyServiceGetter(this,
   "@mozilla.org/toolkit/finalizationwitness;1",
   Ci.nsIFinalizationWitnessService
 );
 
 // The topic used to notify that a PerformanceMonitor has been garbage-collected
 // and that we can release/close the probes it holds.
 const FINALIZATION_TOPIC = "performancemonitor-finalize";
 
-const PROPERTIES_META_IMMUTABLE = ["addonId", "isSystem", "isChildProcess", "groupId"];
+const PROPERTIES_META_IMMUTABLE = ["addonId", "isSystem", "isChildProcess", "groupId", "processId"];
 const PROPERTIES_META = [...PROPERTIES_META_IMMUTABLE, "windowId", "title", "name"];
 
 // How long we wait for children processes to respond.
 const MAX_WAIT_FOR_CHILD_PROCESS_MS = 5000;
 
 let isContent = Services.appinfo.processType == Services.appinfo.PROCESS_TYPE_CONTENT;
 /**
  * Access to a low-level performance probe.
--- a/toolkit/components/perfmonitoring/nsIPerformanceStats.idl
+++ b/toolkit/components/perfmonitoring/nsIPerformanceStats.idl
@@ -17,17 +17,17 @@
 
 /**
  * Snapshot of the performance of a component, e.g. an add-on, a web
  * page, system built-ins, a module or the entire process itself.
  *
  * All values are monotonic and are updated only when
  * `nsIPerformanceStatsService.isStopwatchActive` is `true`.
  */
-[scriptable, uuid(1bc2d016-e9ae-4186-97c6-9478eddda245)]
+[scriptable, uuid(89440555-dd81-4a22-8747-049bcf0ab586)]
 interface nsIPerformanceStats: nsISupports {
   /**
    * An identifier unique to the component.
    *
    * This identifier is somewhat human-readable to aid with debugging,
    * but clients should not rely upon the format.
    */
   readonly attribute AString groupId;
@@ -87,29 +87,34 @@ interface nsIPerformanceStats: nsISuppor
   /**
    * `true` if this component is executed with system privileges
    * (e.g. the platform itself or an add-on), `false` otherwise
    * (e.g. webpages).
    */
   readonly attribute bool isSystem;
 
   /**
+   * The process running this group.
+   */
+  readonly attribute unsigned long long processId;
+
+  /**
    * Jank indicator.
    *
    * durations[i] == number of times execution of this group
    * lasted at lest 2^i ms.
    */
   void getDurations([optional] out unsigned long aCount,
                     [retval, array, size_is(aCount)]out unsigned long long aNumberOfOccurrences);
 };
 
 /**
  * A snapshot of the performance data of the process.
  */
-[scriptable, uuid(29ecebd0-908a-4b34-8f62-a6015dea1141)]
+[scriptable, uuid(2e0c50e2-3aff-4cc8-88a6-c0dc200da8fc)]
 interface nsIPerformanceSnapshot: nsISupports {
   /**
    * Data on all individual components.
    */
   nsIArray getComponentsData();
 
   /**
    * Information on the process itself.
--- a/toolkit/components/perfmonitoring/nsPerformanceStats.cpp
+++ b/toolkit/components/perfmonitoring/nsPerformanceStats.cpp
@@ -30,23 +30,25 @@
 class nsPerformanceStats: public nsIPerformanceStats {
 public:
   nsPerformanceStats(const nsAString& aName,
                      nsIPerformanceStats* aParent,
                      const nsAString& aGroupId,
                      const nsAString& aAddonId,
                      const nsAString& aTitle,
                      const uint64_t aWindowId,
+                     const uint64_t aProcessId,
                      const bool aIsSystem,
                      const js::PerformanceData& aPerformanceData)
     : mName(aName)
     , mGroupId(aGroupId)
     , mAddonId(aAddonId)
     , mTitle(aTitle)
     , mWindowId(aWindowId)
+    , mProcessId(aProcessId)
     , mIsSystem(aIsSystem)
     , mPerformanceData(aPerformanceData)
   {
     if (aParent) {
       mozilla::DebugOnly<nsresult> rv = aParent->GetGroupId(mParentId);
       MOZ_ASSERT(NS_SUCCEEDED(rv));
     }
   }
@@ -116,35 +118,44 @@ public:
 
   /* readonly attribute unsigned long long ticks; */
   NS_IMETHOD GetTicks(uint64_t *aTicks) override {
     *aTicks = mPerformanceData.ticks;
     return NS_OK;
   };
 
   /* void getDurations (out unsigned long aCount, [array, size_is (aCount), retval] out unsigned long long aNumberOfOccurrences); */
-  NS_IMETHODIMP GetDurations(uint32_t *aCount, uint64_t **aNumberOfOccurrences) override {
+  NS_IMETHOD GetDurations(uint32_t *aCount, uint64_t **aNumberOfOccurrences) override {
     const size_t length = mozilla::ArrayLength(mPerformanceData.durations);
     if (aCount) {
       *aCount = length;
     }
     *aNumberOfOccurrences = new uint64_t[length];
     for (size_t i = 0; i < length; ++i) {
       (*aNumberOfOccurrences)[i] = mPerformanceData.durations[i];
     }
     return NS_OK;
   };
 
+  /*
+    readonly attribute unsigned long long processId;
+  */
+  NS_IMETHODIMP GetProcessId(uint64_t* processId) override {
+    *processId = mProcessId;
+    return NS_OK;
+  }
+
 private:
   nsString mName;
   nsString mParentId;
   nsString mGroupId;
   nsString mAddonId;
   nsString mTitle;
   uint64_t mWindowId;
+  uint64_t mProcessId;
   bool mIsSystem;
 
   js::PerformanceData mPerformanceData;
 
   virtual ~nsPerformanceStats() {}
 };
 
 NS_IMPL_ISUPPORTS(nsPerformanceStats, nsIPerformanceStats)
@@ -353,17 +364,17 @@ nsPerformanceSnapshot::ImportStats(JSCon
   GetWindowData(cx, title, &windowId);
 
   nsString name;
   GetName(cx, global, name);
 
   bool isSystem = GetIsSystem(cx, global);
 
   nsCOMPtr<nsIPerformanceStats> result =
-    new nsPerformanceStats(name, parent, groupId, addonId, title, windowId, isSystem, performance);
+    new nsPerformanceStats(name, parent, groupId, addonId, title, windowId, mProcessId, isSystem, performance);
   return result.forget();
 }
 
 /*static*/ bool
 nsPerformanceSnapshot::IterPerformanceStatsCallback(JSContext* cx,
                                                     const js::PerformanceData& stats, const uint64_t id,
                                                     const uint64_t* parentId,
                                                     void* self) {
@@ -397,16 +408,17 @@ nsPerformanceSnapshot::Init(JSContext* c
   processGroupId.AssignLiteral("process: ");
   processGroupId.AppendInt(processId);
   mProcessData = new nsPerformanceStats(NS_LITERAL_STRING("<process>"), // name
                                         nullptr,                        // parent
                                         processGroupId,                 // group id
                                         NS_LITERAL_STRING(""),          // add-on id
                                         NS_LITERAL_STRING(""),          // title
                                         0,                              // window id
+                                        mProcessId,                     // process id
                                         true,                           // isSystem
                                         processStats);
   return NS_OK;
 }
 
 
 /* void getComponentsData (out nsIArray aComponents); */
 NS_IMETHODIMP nsPerformanceSnapshot::GetComponentsData(nsIArray * *aComponents)
--- a/toolkit/components/perfmonitoring/tests/browser/browser_compartments.js
+++ b/toolkit/components/perfmonitoring/tests/browser/browser_compartments.js
@@ -4,41 +4,45 @@
 "use strict";
 
 /**
  * Test that we see jank that takes place in a webpage,
  * and that jank from several iframes are actually charged
  * to the top window.
  */
 Cu.import("resource://gre/modules/PerformanceStats.jsm", this);
+Cu.import("resource://gre/modules/Services.jsm", this);
 Cu.import("resource://testing-common/ContentTask.jsm", this);
 
+
 const URL = "http://example.com/browser/toolkit/components/perfmonitoring/tests/browser/browser_compartments.html?test=" + Math.random();
 const PARENT_TITLE = `Main frame for test browser_compartments.js ${Math.random()}`;
 const FRAME_TITLE = `Subframe for test browser_compartments.js ${Math.random()}`;
 
+const PARENT_PID = Services.appinfo.processID;
+
 // This function is injected as source as a frameScript
 function frameScript() {
   try {
     "use strict";
 
     const { utils: Cu, classes: Cc, interfaces: Ci } = Components;
     Cu.import("resource://gre/modules/PerformanceStats.jsm");
-
+    Cu.import("resource://gre/modules/Services.jsm");
     let performanceStatsService =
       Cc["@mozilla.org/toolkit/performance-stats-service;1"].
       getService(Ci.nsIPerformanceStatsService);
 
     // Make sure that the stopwatch is now active.
     let monitor = PerformanceStats.getMonitor(["jank", "cpow", "ticks", "compartments"]);
 
     addMessageListener("compartments-test:getStatistics", () => {
       try {
         monitor.promiseSnapshot().then(snapshot => {
-          sendAsyncMessage("compartments-test:getStatistics", snapshot);
+          sendAsyncMessage("compartments-test:getStatistics", {snapshot, pid: Services.appinfo.processID});
         });
       } catch (ex) {
         Cu.reportError("Error in content (getStatistics): " + ex);
         Cu.reportError(ex.stack);
       }
     });
 
     addMessageListener("compartments-test:setTitles", titles => {
@@ -130,45 +134,51 @@ function monotinicity_tester(source, tes
   };
   let iteration = 0;
   let frameCheck = Task.async(function*() {
     if (isShuttingDown) {
       window.clearInterval(interval);
       return;
     }
     let name = `${testName}: ${iteration++}`;
-    let snapshot = yield source();
-    if (!snapshot) {
+    let result = yield source();
+    if (!result) {
       // This can happen at the end of the test when we attempt
       // to communicate too late with the content process.
       window.clearInterval(interval);
       return;
     }
+    let {pid, snapshot} = result;
 
     // Sanity check on the process data.
     sanityCheck(previous.processData, snapshot.processData);
     SilentAssert.equal(snapshot.processData.isSystem, true);
     SilentAssert.equal(snapshot.processData.name, "<process>");
     SilentAssert.equal(snapshot.processData.addonId, "");
+    SilentAssert.equal(snapshot.processData.processId, pid);
     previous.procesData = snapshot.processData;
 
     // Sanity check on components data.
     let map = new Map();
     for (let item of snapshot.componentsData) {
       for (let [probe, k] of [
         ["jank", "totalUserTime"],
         ["jank", "totalSystemTime"],
         ["cpow", "totalCPOWTime"]
       ]) {
         // Note that we cannot expect components data to be always smaller
         // than process data, as `getrusage` & co are not monotonic.
-        SilentAssert.leq(item[probe][k], 2 * snapshot.processData[probe][k],
-          `Sanity check (${testName}): ${k} of component is not impossibly larger than that of process`);
+        SilentAssert.leq(item[probe][k], 3 * snapshot.processData[probe][k],
+          `Sanity check (${name}): ${k} of component is not impossibly larger than that of process`);
       }
 
+      let isCorrectPid = (item.processId == pid && !item.isChildProcess)
+        || (item.processId != pid && item.isChildProcess);
+      SilentAssert.ok(isCorrectPid, `Pid check (${name}): the item comes from the right process`);
+
       let key = item.groupId;
       if (map.has(key)) {
         let old = map.get(key);
         Assert.ok(false, `Component ${key} has already been seen. Latest: ${item.title||item.addonId||item.name}, previous: ${old.title||old.addonId||old.name}`);
       }
       map.set(key, item);
     }
     for (let item of snapshot.componentsData) {
@@ -217,17 +227,17 @@ add_task(function* test() {
 
   info("Opening URL");
   newTab.linkedBrowser.loadURI(URL);
 
   if (Services.sysinfo.getPropertyAsAString("name") == "Windows_NT") {
     info("Deactivating sanity checks under Windows (bug 1151240)");
   } else {
     info("Setting up sanity checks");
-    monotinicity_tester(() => monitor.promiseSnapshot(), "parent process");
+    monotinicity_tester(() => monitor.promiseSnapshot().then(snapshot => ({snapshot, pid: PARENT_PID})), "parent process");
     monotinicity_tester(() => promiseContentResponseOrNull(browser, "compartments-test:getStatistics", null), "content process" );
   }
 
   let skipTotalUserTime = hasLowPrecision();
 
 
   while (true) {
     yield new Promise(resolve => setTimeout(resolve, 100));
@@ -237,17 +247,17 @@ add_task(function* test() {
     // repeatedly for the title to be changed, until this works.
     info("Setting titles");
     yield promiseContentResponse(browser, "compartments-test:setTitles", {
       parent: PARENT_TITLE,
       frames: FRAME_TITLE
     });
     info("Titles set");
 
-    let stats = (yield promiseContentResponse(browser, "compartments-test:getStatistics", null));
+    let {snapshot: stats} = (yield promiseContentResponse(browser, "compartments-test:getStatistics", null));
 
     let titles = [for(stat of stats.componentsData) stat.title];
 
     for (let stat of stats.componentsData) {
       info(`Compartment: ${stat.name} => ${stat.title} (${stat.isSystem?"system":"web"})`);
     }
 
     // While the webpage consists in three compartments, we should see only
--- a/toolkit/devtools/discovery/discovery.js
+++ b/toolkit/devtools/discovery/discovery.js
@@ -380,26 +380,26 @@ Discovery.prototype = {
     this._transports.update.destroy();
     this._transports.update = null;
   },
 
   observe: function(subject, topic, data) {
     if (topic !== "network-active-changed") {
       return;
     }
-    let activeNetwork = subject;
-    if (!activeNetwork) {
-      log("No active network");
+    let activeNetworkInfo = subject;
+    if (!activeNetworkInfo) {
+      log("No active network info");
       return;
     }
-    activeNetwork = activeNetwork.QueryInterface(Ci.nsINetworkInterface);
-    log("Active network changed to: " + activeNetwork.type);
+    activeNetworkInfo = activeNetworkInfo.QueryInterface(Ci.nsINetworkInfo);
+    log("Active network changed to: " + activeNetworkInfo.type);
     // UDP sockets go down when the device goes offline, so we'll restart them
     // when the active network goes back to WiFi.
-    if (activeNetwork.type === Ci.nsINetworkInterface.NETWORK_TYPE_WIFI) {
+    if (activeNetworkInfo.type === Ci.nsINetworkInfo.NETWORK_TYPE_WIFI) {
       this._restartListening();
     }
   },
 
   _restartListening: function() {
     if (this._transports.scan) {
       this._stopListeningForScan();
       this._startListeningForScan();
--- a/toolkit/modules/secondscreen/RokuApp.jsm
+++ b/toolkit/modules/secondscreen/RokuApp.jsm
@@ -7,36 +7,31 @@
 
 this.EXPORTED_SYMBOLS = ["RokuApp"];
 
 const { classes: Cc, interfaces: Ci, utils: Cu } = Components;
 
 Cu.import("resource://gre/modules/Services.jsm");
 Cu.import("resource://gre/modules/AppConstants.jsm");
 
-const WEBRTC_PLAYER_NAME = "WebRTC Player";
-const MIRROR_PORT = 8011;
-const JSON_MESSAGE_TERMINATOR = "\r\n";
-
 function log(msg) {
   //Services.console.logStringMessage(msg);
 }
 
 const PROTOCOL_VERSION = 1;
 
 /* RokuApp is a wrapper for interacting with a Roku channel.
  * The basic interactions all use a REST API.
  * spec: http://sdkdocs.roku.com/display/sdkdoc/External+Control+Guide
  */
 function RokuApp(service) {
   this.service = service;
   this.resourceURL = this.service.location;
   this.app = AppConstants.RELEASE_BUILD ? "Firefox" : "Firefox Nightly";
   this.mediaAppID = -1;
-  this.mirrorAppID = -1;
 }
 
 RokuApp.prototype = {
   status: function status(callback) {
     // We have no way to know if the app is running, so just return "unknown"
     // but we use this call to fetch the mediaAppID for the given app name
     let url = this.resourceURL + "query/apps";
     let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
@@ -46,18 +41,16 @@ RokuApp.prototype = {
 
     xhr.addEventListener("load", (function() {
       if (xhr.status == 200) {
         let doc = xhr.responseXML;
         let apps = doc.querySelectorAll("app");
         for (let app of apps) {
           if (app.textContent == this.app) {
             this.mediaAppID = app.id;
-          } else if (app.textContent == WEBRTC_PLAYER_NAME) {
-            this.mirrorAppID = app.id
           }
         }
       }
 
       // Since ECP has no way of telling us if an app is running, we always return "unknown"
       if (callback) {
         callback({ state: "unknown" });
       }
@@ -137,54 +130,16 @@ RokuApp.prototype = {
       if (callback) {
         callback(new RemoteMedia(this.resourceURL, listener));
       }
     } else {
       if (callback) {
         callback();
       }
     }
-  },
-
-  mirror: function(callback, win, viewport, mirrorStartedCallback, contentWindow) {
-    if (this.mirrorAppID == -1) {
-      // The status function may not have been called yet if mirrorAppID is -1
-      this.status(this._createRemoteMirror.bind(this, callback, win, viewport, mirrorStartedCallback, contentWindow));
-    } else {
-      this._createRemoteMirror(callback, win, viewport, mirrorStartedCallback, contentWindow);
-    }
-  },
-
-  _createRemoteMirror: function(callback, win, viewport, mirrorStartedCallback, contentWindow) {
-    if (this.mirrorAppID == -1) {
-      // TODO: Inform user to install Roku WebRTC Player Channel.
-      log("RokuApp: Failed to find Mirror App ID.");
-    } else {
-      let url = this.resourceURL + "launch/" + this.mirrorAppID;
-      let xhr = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance(Ci.nsIXMLHttpRequest);
-      xhr.open("POST", url, true);
-      xhr.overrideMimeType("text/plain");
-
-      xhr.addEventListener("load", (function() {
-        // 204 seems to be returned if the channel is already running
-        if ((xhr.status == 200) || (xhr.status == 204)) {
-          this.remoteMirror = new RemoteMirror(this.resourceURL, win, viewport, mirrorStartedCallback, contentWindow);
-        }
-      }).bind(this), false);
-
-      xhr.addEventListener("error", function() {
-        log("RokuApp: XHR Failed to launch application: " + WEBRTC_PLAYER_NAME);
-      }, false);
-
-      xhr.send(null);
-    }
-
-    if (callback) {
-      callback();
-    }
   }
 }
 
 /* RemoteMedia provides a wrapper for using TCP socket to control Roku apps.
  * The server implementation must be built into the Roku receiver app.
  */
 function RemoteMedia(url, listener) {
   this._url = url;
@@ -270,136 +225,8 @@ RemoteMedia.prototype = {
   load: function load(data) {
     this._sendMsg({ type: "LOAD", title: data.title, source: data.source, poster: data.poster });
   },
 
   get status() {
     return this._status;
   }
 }
-
-function RemoteMirror(url, win, viewport, mirrorStartedCallback, contentWindow) {
-  this._serverURI = Services.io.newURI(url , null, null);
-  this._window = win;
-  this._iceCandidates = [];
-  this.mirrorStarted = mirrorStartedCallback;
-
-  // This code insures the generated tab mirror is not wider than 1280 nor taller than 720
-  // Better dimensions should be chosen after the Roku Channel is working.
-  let windowId = contentWindow.QueryInterface(Ci.nsIInterfaceRequestor).getInterface(Ci.nsIDOMWindowUtils).outerWindowID;
-  const MAX_WIDTH = 1280;
-  const MAX_HEIGHT = 720;
-
-  let constraints = {
-    video: {
-      mediaSource: "browser",
-      browserWindow: windowId,
-      scrollWithPage: true,
-      advanced: [
-        {
-          width: { min: 0, max: MAX_WIDTH },
-          height: { min: 0, max: MAX_HEIGHT }
-        },
-        { aspectRatio: MAX_WIDTH/MAX_HEIGHT }
-      ]
-    }
-  };
-
-  this._window.navigator.mozGetUserMedia(constraints, this._onReceiveGUMStream.bind(this), function() {});
-}
-
-RemoteMirror.prototype = {
-  _sendOffer: function(offer) {
-    if (!this._baseSocket) {
-      this._baseSocket = Cc["@mozilla.org/tcp-socket;1"].createInstance(Ci.nsIDOMTCPSocket);
-    }
-    this._jsonOffer = JSON.stringify(offer);
-    this._socket = this._baseSocket.open(this._serverURI.host, MIRROR_PORT, { useSecureTransport: false, binaryType: "string" });
-    this._socket.onopen = this._onSocketOpen.bind(this);
-    this._socket.ondata = this._onSocketData.bind(this);
-    this._socket.onerror = this._onSocketError.bind(this);
-  },
-
-  _onReceiveGUMStream: function(stream) {
-    this._pc = new this._window.mozRTCPeerConnection;
-    this._pc.addStream(stream);
-    this._pc.onicecandidate = (evt => {
-      // Usually the last candidate is null, expected?
-      if (!evt.candidate) {
-        return;
-      }
-      let jsonCandidate = JSON.stringify(evt.candidate);
-      this._iceCandidates.push(jsonCandidate);
-      this._sendIceCandidates();
-    });
-
-    this._pc.createOffer(offer => {
-      this._pc.setLocalDescription(
-        new this._window.mozRTCSessionDescription(offer),
-        () => this._sendOffer(offer),
-        () => log("RemoteMirror: Failed to set local description."));
-    },
-    () => log("RemoteMirror: Failed to create offer."));
-  },
-
-  _stopMirror: function() {
-    if (this._socket) {
-      this._socket.close();
-      this._socket = null;
-    }
-    if (this._pc) {
-      this._pc.close();
-      this._pc = null;
-    }
-    this._jsonOffer = null;
-    this._iceCandidates = [];
-  },
-
-  _onSocketData: function(response) {
-    if (response.type == "data") {
-      response.data.split(JSON_MESSAGE_TERMINATOR).forEach(data => {
-        if (data) {
-          let parsedData = JSON.parse(data);
-          if (parsedData.type == "answer") {
-            this._pc.setRemoteDescription(
-              new this._window.mozRTCSessionDescription(parsedData),
-              () => this.mirrorStarted(this._stopMirror.bind(this)),
-              () => log("RemoteMirror: Failed to set remote description."));
-          } else {
-            this._pc.addIceCandidate(new this._window.mozRTCIceCandidate(parsedData))
-          }
-        } else {
-          log("RemoteMirror: data is null");
-        }
-      });
-    } else if (response.type == "error") {
-      log("RemoteMirror: Got socket error.");
-      this._stopMirror();
-    } else {
-      log("RemoteMirror: Got unhandled socket event: " + response.type);
-    }
-  },
-
-  _onSocketError: function(err) {
-    log("RemoteMirror: Error socket.onerror: " + (err.data ? err.data : "NO DATA"));
-    this._stopMirror();
-  },
-
-  _onSocketOpen: function() {
-    this._open = true;
-    if (this._jsonOffer) {
-      let jsonOffer = this._jsonOffer + JSON_MESSAGE_TERMINATOR;
-      this._socket.send(jsonOffer, jsonOffer.length);
-      this._jsonOffer = null;
-      this._sendIceCandidates();
-    }
-  },
-
-  _sendIceCandidates: function() {
-    if (this._socket && this._open) {
-      this._iceCandidates.forEach(value => {
-        value = value + JSON_MESSAGE_TERMINATOR;
-        this._socket.send(value, value.length);
-      });
-      this._iceCandidates = [];
-    }
-  }
-};