diff --git a/l10n_chrome/background.html b/l10n_chrome/background.html
deleted file mode 100644
index 5291759..0000000
--- a/l10n_chrome/background.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<html>
-<head></head>
-<body>
-<script>
-  /**
-   * Checks the notifications behavior
-   */
-  if (window.webkitNotifications.checkPermission() != 0) {
-    window.webkitNotifications.requestPermission();
-  }
-
-  /**
-   * Updates terms and stores them in localStorage
-   */
-  function updateTerms(force) {
-    // Update glossary terms every hour
-    glossaryLast = localStorage["glossaryLast"];
-    if (force || !glossaryLast || !localStorage["glossaryTerms"] || glossaryLast < Date.now() - 1000 * 60 * 60) {
-      // Download glossary items
-      /*
-       var notification = window.webkitNotifications.createNotification(
-       'icon-48.png', // The image.
-       "Téléchargement des termes", // The title.
-       'Les termes du glossaire sont en cours de mise à jour.'      // The body.
-       );
-       notification.show();
-       */
-      var xhr = new XMLHttpRequest();
-
-      xhr.onreadystatechange = function(data) {
-        if (xhr.readyState == 4) {
-          if (xhr.status == 200) {
-            var data = JSON.parse(xhr.responseText);
-            var terms = processJsonTerms(data.terms);
-            localStorage["glossaryTerms"] = JSON.stringify(terms);
-            localStorage["glossaryLast"] = Date.now();
-            //notification.cancel();
-          }
-        }
-      }
-      // Note that any URL fetched here must be matched by a permission in
-      // the manifest.json file!
-      var url = 'http://traduction.drupalfr.org/glossaire.json';
-      xhr.open('GET', url, true);
-      xhr.send();
-    }
-  }
-  // Try to update every ten seconds
-  setInterval(updateTerms, 10000);
-
-  /**
-   * Sanitizing function
-   */
-  function sanitize(term) {
-    if (term.indexOf(' (to)') > -1) {
-      term = term.substr(0, term.indexOf(' (to)'));
-    }
-    return term.toLowerCase();
-  }
-
-  /**
-   * Performs an XMLHttpRequest to Twitter's API to get trending topics.
-   * @param callback Function If the response from fetching url has a
-   *    HTTP status of 200, this function is called with a JSON decoded
-   *    response.  Otherwise, this function is called with null.
-   */
-  function fetchTerms(callback) {
-    var terms = JSON.parse(localStorage["glossaryTerms"]);
-    callback(terms);
-  }
-
-  /**
-   * Handles data sent via chrome.extension.sendRequest().
-   *
-   * @param request Object Data sent in the request.
-   * @param sender Object Origin of the request.
-   * @param callback Function The method to call when the request completes.
-   */
-  function onRequest(request, sender, callback) {
-    if (request.action == 'fetchTerms') {
-      fetchTerms(callback);
-    }
-    if (request.action == 'insertScripts') {
-      insertScripts(request, sender);
-    }
-  }
-
-  /**
-   * Mise en forme des termes récupérés
-   *
-   * @param data array of terms
-   */
-  function processJsonTerms(data) {
-    var terms = {};
-    for (var t in data) {
-      // Check if the form is already in the array
-      if (terms[sanitize(data[t].term.title)]) {
-        var isVerb = data[t].term.title.indexOf(' (to)') > -1;
-        var verb = isVerb ? data[t].term.field_traduction : terms[sanitize(data[t].term.title)];
-        var other = !isVerb ? data[t].term.field_traduction : terms[sanitize(data[t].term.title)];
-        terms[sanitize(data[t].term.title)] = "<ul><li><strong>Verbe :</strong> " + verb +
-                "</li><li><strong>Autre :</strong> " + other + "</li></ul>";
-      }
-      else {
-        terms[sanitize(data[t].term.title)] = data[t].term.field_traduction;
-      }
-    }
-    return terms;
-  }
-
-  /**
-   * Insert the scripts in the current tab
-   */
-  function insertScripts(a, b) {
-    chrome.tabs.insertCSS(null, {file:"style.css"})
-    chrome.tabs.executeScript(null, {file:"jquery.js"});
-    chrome.tabs.executeScript(null, {file:"jquery.tipsy.js"});
-    chrome.tabs.executeScript(null, {file:"script.js"});
-  }
-
-  // Wire up the listener.
-  chrome.extension.onRequest.addListener(onRequest);
-</script>
-</body>
-</html>
\ No newline at end of file
diff --git a/l10n_chrome/eventPage.js b/l10n_chrome/eventPage.js
new file mode 100644
index 0000000..8938df9
--- /dev/null
+++ b/l10n_chrome/eventPage.js
@@ -0,0 +1,120 @@
+/**
+ * Checks the notifications behavior
+ *
+ * DEPRECATED: http://stackoverflow.com/questions/23873149/window-webkitnotifications-checkpermission-not-working
+ */
+/* if (window.webkitNotifications.checkPermission() != 0) {
+  window.webkitNotifications.requestPermission();
+} */
+
+/**
+ * Updates terms and stores them in localStorage
+ */
+function updateTerms(force) {
+  // Update glossary terms every hour
+  glossaryLast = localStorage["glossaryLast"];
+  if (force || !glossaryLast || !localStorage["glossaryTerms"] || glossaryLast < Date.now() - 1000 * 60 * 60) {
+    // Download glossary items
+    /*
+     var notification = window.webkitNotifications.createNotification(
+     'icon-48.png', // The image.
+     "Téléchargement des termes", // The title.
+     'Les termes du glossaire sont en cours de mise à jour.'      // The body.
+     );
+     notification.show();
+     */
+    var xhr = new XMLHttpRequest();
+
+    xhr.onreadystatechange = function(data) {
+      if (xhr.readyState == 4) {
+        if (xhr.status == 200) {
+          var data = JSON.parse(xhr.responseText);
+          var terms = processJsonTerms(data.terms);
+          localStorage["glossaryTerms"] = JSON.stringify(terms);
+          localStorage["glossaryLast"] = Date.now();
+          //notification.cancel();
+        }
+      }
+    }
+    // Note that any URL fetched here must be matched by a permission in
+    // the manifest.json file!
+    var url = 'http://traduction.drupalfr.org/glossaire.json';
+    xhr.open('GET', url, true);
+    xhr.send();
+  }
+}
+// Try to update every ten seconds
+setInterval(updateTerms, 10000);
+
+/**
+ * Sanitizing function
+ */
+function sanitize(term) {
+  if (term.indexOf(' (to)') > -1) {
+    term = term.substr(0, term.indexOf(' (to)'));
+  }
+  return term.toLowerCase();
+}
+
+/**
+ * Performs an XMLHttpRequest to Twitter's API to get trending topics.
+ * @param callback Function If the response from fetching url has a
+ *    HTTP status of 200, this function is called with a JSON decoded
+ *    response.  Otherwise, this function is called with null.
+ */
+function fetchTerms(callback) {
+  var terms = JSON.parse(localStorage["glossaryTerms"]);
+  callback(terms);
+}
+
+/**
+ * Handles data sent via chrome.extension.sendMessage().
+ *
+ * @param request Object Data sent in the request.
+ * @param sender Object Origin of the request.
+ * @param callback Function The method to call when the request completes.
+ */
+function onMessage(request, sender, callback) {
+  if (request.action == 'fetchTerms') {
+    fetchTerms(callback);
+  }
+  if (request.action == 'insertScripts') {
+    insertScripts(request, sender);
+  }
+}
+
+/**
+ * Mise en forme des termes récupérés
+ *
+ * @param data array of terms
+ */
+function processJsonTerms(data) {
+  var terms = {};
+  for (var t in data) {
+    // Check if the form is already in the array
+    if (terms[sanitize(data[t].term.title)]) {
+      var isVerb = data[t].term.title.indexOf(' (to)') > -1;
+      var verb = isVerb ? data[t].term.field_traduction : terms[sanitize(data[t].term.title)];
+      var other = !isVerb ? data[t].term.field_traduction : terms[sanitize(data[t].term.title)];
+      terms[sanitize(data[t].term.title)] = "<ul><li><strong>Verbe :</strong> " + verb +
+              "</li><li><strong>Autre :</strong> " + other + "</li></ul>";
+    }
+    else {
+      terms[sanitize(data[t].term.title)] = data[t].term.field_traduction;
+    }
+  }
+  return terms;
+}
+
+/**
+ * Insert the scripts in the current tab
+ */
+function insertScripts(a, b) {
+  chrome.tabs.insertCSS(null, {file:"style.css"})
+  chrome.tabs.executeScript(null, {file:"jquery.js"});
+  chrome.tabs.executeScript(null, {file:"jquery.tipsy.js"});
+  chrome.tabs.executeScript(null, {file:"script.js"});
+}
+
+// Wire up the listener.
+chrome.runtime.onMessage.addListener(onMessage);
diff --git a/l10n_chrome/l10n_detection.js b/l10n_chrome/l10n_detection.js
index 382c62d..f0f3b72 100644
--- a/l10n_chrome/l10n_detection.js
+++ b/l10n_chrome/l10n_detection.js
@@ -3,5 +3,5 @@
  */
 // On localize.drupal.org or l10n_client enabled pages
 if ((location.host == "localize.drupal.org" && location.pathname == "/translate/languages/fr/translate") || document.getElementById('l10n-client')) {
-  chrome.extension.sendRequest({'action' : 'insertScripts'});
+  chrome.runtime.sendMessage({'action' : 'insertScripts'});
 }
diff --git a/l10n_chrome/manifest.json b/l10n_chrome/manifest.json
index 46a5649..7651050 100644
--- a/l10n_chrome/manifest.json
+++ b/l10n_chrome/manifest.json
@@ -1,4 +1,6 @@
 {
+  "manifest_version": 2,
+
   "name": "Localization for Chrome",
   "version": "1.5.1",
   "description": "Les termes du glossaire directement sur localize et dans l10n_client",
@@ -23,5 +25,8 @@
     "notifications",
     "tabs"
   ],
-  "background_page" : "background.html"
-}
\ No newline at end of file
+  "background" : {
+    "scripts": ["eventPage.js"],
+    "persistent": false
+  }
+}
diff --git a/l10n_chrome/script.js b/l10n_chrome/script.js
index 52017be..9d6b876 100644
--- a/l10n_chrome/script.js
+++ b/l10n_chrome/script.js
@@ -1,6 +1,6 @@
 // Send a request to fetch terms from localStorage.
 // Specify that parsing function should be called with the result.
-chrome.extension.sendRequest({'action' : 'fetchTerms'}, parseEnglishStrings);
+chrome.runtime.sendMessage({'action' : 'fetchTerms'}, parseEnglishStrings);
 
 /**
  * Callback function
