diff --git a/README.md b/README.md
index 09320cf..93b3e67 100644
--- a/README.md
+++ b/README.md
@@ -121,6 +121,11 @@
 - Firefox OS can't detect the type of cellular network connection.
     - `navigator.connection.type` is set to `Connection.CELL` for all cellular data.
 
+### Browser Quirks
+
+- Browser can't detect the type of network connection.
+`navigator.connection.type` is always set to `Connection.UNKNOWN` when online.
+
 # Network-related Events
 
 ## offline
diff --git a/plugin.xml b/plugin.xml
index 56e8405..870056e 100644
--- a/plugin.xml
+++ b/plugin.xml
@@ -166,8 +166,9 @@
 
     <!-- browser -->
     <platform name="browser">
-        <js-module src="src/browser/NetworkProxy.js" name="NetworkProxy">
-            <runs />
+        <js-module src="www/browser/network.js" name="browserNetwork">
+            <clobbers target="navigator.connection" />
+            <clobbers target="navigator.network.connection" />
         </js-module>
     </platform>
 </plugin>
diff --git a/src/browser/NetworkProxy.js b/src/browser/NetworkProxy.js
deleted file mode 100644
index efcf73f..0000000
--- a/src/browser/NetworkProxy.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-/*
-  Network API overview: http://www.w3.org/TR/netinfo-api/
-  and http://w3c.github.io/netinfo/
-*/
-
-var cordova = require('cordova'),
-    Connection = require('./Connection')
-
-module.exports = {
-    getConnectionInfo: function(successCallback, errorCallback) {
-        window.navigator.connection.type = Connection.NONE;
-
-        var xhr = new XMLHttpRequest();
-        xhr.open('GET', 'http://www.google.com', true);
-        
-        xhr.onload = function() {
-            if (xhr.readyState === 4 && xhr.status === 200) {
-                window.navigator.connection.type = Connection.WIFI;
-            } else {
-                window.navigator.connection.type = Connection.NONE;
-            }
-        };
-
-        xhr.send();
-
-        setTimeout(function() {
-            successCallback(window.navigator.connection.type);
-        }, 0);
-    }
-};
-
-require("cordova/exec/proxy").add("NetworkStatus", module.exports);
diff --git a/www/browser/network.js b/www/browser/network.js
new file mode 100644
index 0000000..72ec513
--- /dev/null
+++ b/www/browser/network.js
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+*/
+
+/*global module, require*/
+
+var cordova = require('cordova'),
+    Connection = require('./Connection');
+
+var DOCUMENT_EVENTS_CHECK_INTERVAL = 500; // ms
+// Flag that indicates that ew need to re-fire online/offline events at document level
+// (Workaround for Chrome, since it fires such events only for window object)
+var NEED_FIRE_DOCUMENT_EVENT_MANUALLY = false;
+
+function NetworkConnection() {
+    this.type = Connection.UNKNOWN;
+}
+
+/**
+ * Get connection info
+ *
+ * @param {Function} successCallback The function to call when the Connection data is available
+ */
+NetworkConnection.prototype.getInfo = function(successCallback) {
+    successCallback(this.type);
+};
+
+Object.defineProperty(NetworkConnection.prototype, 'type', {
+    get: function () {
+        // It is not possible to determine real connection type in browser
+        // so we always report Connection.UNKNOWN when online
+        return (window.navigator.onLine === false ? Connection.NONE : Connection.UNKNOWN);
+    },
+    configurable: true,
+    enumerable: true
+});
+
+// This function tries to detect if document online/offline events is being fired
+// after corresponding window events, and if not, then fires them manually
+// This is workaround for Chrome, which fires only window online/offline events
+// and regarding to plugin spec we need these events at document object
+var eventRedirectHandler = function (e) {
+    // NEED_FIRE_DOCUMENT_EVENT_MANUALLY flag is already set,
+    // just fire corresponding document event and return
+    if (NEED_FIRE_DOCUMENT_EVENT_MANUALLY) {
+        cordova.fireDocumentEvent(e.type);
+        return;
+    }
+
+    // Flag that indicates whether corresponding document even is fired
+    var documentStateEventFired = false;
+    var setDocumentStateEventFired = function() {
+        documentStateEventFired = true;
+    };
+    document.addEventListener(e.type, setDocumentStateEventFired);
+    setTimeout(function () {
+        // Remove unnecessary listener
+        document.removeEventListener(e.type, setDocumentStateEventFired);
+        // if document event hasn't been fired in specified interval (500 ms by default),
+        // then we're in chrome and need to fire it manually
+        if (!documentStateEventFired) {
+            NEED_FIRE_DOCUMENT_EVENT_MANUALLY = true;
+            cordova.fireDocumentEvent(e.type);
+        }
+    }, DOCUMENT_EVENTS_CHECK_INTERVAL);
+};
+
+// Subscribe to native online/offline events
+window.addEventListener('online', eventRedirectHandler);
+window.addEventListener('offline', eventRedirectHandler);
+
+var me = new NetworkConnection();
+
+require("cordova/exec/proxy").add("NetworkStatus", { getConnectionInfo: me.getConnectionInfo });
+
+module.exports = me;
diff --git a/www/network.js b/www/network.js
index 9ffb745..6896956 100644
--- a/www/network.js
+++ b/www/network.js
@@ -26,7 +26,9 @@
 // Link the onLine property with the Cordova-supplied network info.
 // This works because we clobber the navigator object with our own
 // object in bootstrap.js.
-if (typeof navigator != 'undefined') {
+// Browser platform do not need to define this property, because
+// it is already supported by modern browsers
+if (cordova.platforId !== 'browser' && typeof navigator != 'undefined') {
     utils.defineGetter(navigator, 'onLine', function() {
         return this.connection.type != 'none';
     });
