Merge f-t to m-c, a=merge
authorPhil Ringnalda <philringnalda@gmail.com>
Sat, 16 May 2015 09:40:17 -0700
changeset 244180 2f6ea66057fe37794d7fc061407495cdcece5443
parent 244162 cd5d7ff2df5716002c0b639ff983543db155368a (current diff)
parent 244179 7aa664ca77c9fb1a8be4a57bd15cb110c9ca5222 (diff)
child 244196 e816ab606d396047eeb694f6f471f5175c4d9a19
child 244204 1b8cf0204213cefc18b8c7019c8e9b9482391309
push id28768
push userphilringnalda@gmail.com
push dateSat, 16 May 2015 16:40:26 +0000
treeherdermozilla-central@2f6ea66057fe [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersmerge
milestone41.0a1
first release with
nightly linux32
2f6ea66057fe / 41.0a1 / 20150517030204 / files
nightly linux64
2f6ea66057fe / 41.0a1 / 20150517030204 / files
nightly mac
2f6ea66057fe / 41.0a1 / 20150517030204 / files
nightly win32
2f6ea66057fe / 41.0a1 / 20150517030204 / files
nightly win64
2f6ea66057fe / 41.0a1 / 20150517030204 / files
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
releases
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Merge f-t to m-c, a=merge
browser/devtools/performance/test/browser_retro-test.js
browser/devtools/timeline/moz.build
browser/devtools/timeline/panel.js
browser/devtools/timeline/timeline.js
browser/devtools/timeline/timeline.xul
browser/themes/linux/devtools/timeline.css
browser/themes/osx/devtools/timeline.css
browser/themes/shared/devtools/timeline.inc.css
browser/themes/windows/devtools/timeline.css
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -1444,24 +1444,16 @@ pref("devtools.performance.profiler.samp
 pref("devtools.performance.ui.invert-call-tree", true);
 pref("devtools.performance.ui.invert-flame-graph", false);
 pref("devtools.performance.ui.flatten-tree-recursion", true);
 pref("devtools.performance.ui.show-platform-data", false);
 pref("devtools.performance.ui.show-idle-blocks", true);
 pref("devtools.performance.ui.enable-memory", false);
 pref("devtools.performance.ui.enable-framerate", true);
 pref("devtools.performance.ui.show-jit-optimizations", false);
-// If in aurora/dev edition (40.0, will revert for 40.1), set default
-// to retro mode.
-// TODO bug 1160313
-#ifdef MOZ_DEV_EDITION
-  pref("devtools.performance.ui.retro-mode", true);
-#else
-  pref("devtools.performance.ui.retro-mode", false);
-#endif
 
 // The default cache UI setting
 pref("devtools.cache.disabled", false);
 
 // The default service workers UI setting
 pref("devtools.serviceWorkers.testing.enabled", false);
 
 // Enable the Network Monitor
--- a/browser/base/content/browser-addons.js
+++ b/browser/base/content/browser-addons.js
@@ -49,16 +49,32 @@ const gXPInstallObserver = {
     };
 
     try {
       options.displayOrigin = installInfo.originatingURI.host;
     } catch (e) {
       // originatingURI might be missing or 'host' might throw for non-nsStandardURL nsIURIs.
     }
 
+    let cancelInstallation = () => {
+      if (installInfo) {
+        for (let install of installInfo.installs)
+          install.cancel();
+      }
+
+      if (aTopic == "addon-install-confirmation")
+        this.acceptInstallation = null;
+
+      let tab = gBrowser.getTabForBrowser(browser);
+      if (tab)
+        tab.removeEventListener("TabClose", cancelInstallation);
+
+      window.removeEventListener("unload", cancelInstallation);
+    };
+
     switch (aTopic) {
     case "addon-install-disabled": {
       notificationID = "xpinstall-disabled";
 
       if (gPrefService.prefIsLocked("xpinstall.enabled")) {
         messageString = gNavigatorBundle.getString("xpinstallDisabledMessageLocked");
         buttons = [];
       }
@@ -165,21 +181,17 @@ const gXPInstallObserver = {
       break; }
     case "addon-install-confirmation": {
       let unsigned = installInfo.installs.filter(i => i.addon.signedState <= AddonManager.SIGNEDSTATE_MISSING);
       let someUnsigned = unsigned.length > 0 && unsigned.length < installInfo.installs.length;
 
       options.eventCallback = (aEvent) => {
         switch (aEvent) {
           case "removed":
-            if (installInfo) {
-              for (let install of installInfo.installs)
-                install.cancel();
-            }
-            this.acceptInstallation = null;
+            cancelInstallation();
             break;
           case "shown":
             let addonList = document.getElementById("addon-install-confirmation-content");
             while (addonList.firstChild)
               addonList.firstChild.remove();
 
             for (let install of installInfo.installs) {
               let container = document.createElement("hbox");
@@ -210,46 +222,54 @@ const gXPInstallObserver = {
             };
             break;
         }
       };
 
       options.learnMoreURL = Services.urlFormatter.formatURLPref("app.support.baseURL") +
                              "find-and-install-add-ons";
 
+      let notification = document.getElementById("addon-install-confirmation-notification");
       if (unsigned.length == installInfo.installs.length) {
         // None of the add-ons are verified
         messageString = gNavigatorBundle.getString("addonConfirmInstallUnsigned.message");
+        notification.setAttribute("warning", "true");
       }
       else if (unsigned.length == 0) {
         // All add-ons are verified or don't need to be verified
         messageString = gNavigatorBundle.getString("addonConfirmInstall.message");
+        notification.removeAttribute("warning");
       }
       else {
         // Some of the add-ons are unverified, the list of names will indicate
         // which
         messageString = gNavigatorBundle.getString("addonConfirmInstallSomeUnsigned.message");
+        notification.setAttribute("warning", "true");
       }
 
       messageString = PluralForm.get(installInfo.installs.length, messageString);
       messageString = messageString.replace("#1", brandShortName);
       messageString = messageString.replace("#2", installInfo.installs.length);
 
       let cancelButton = document.getElementById("addon-install-confirmation-cancel");
       cancelButton.label = gNavigatorBundle.getString("addonInstall.cancelButton.label");
       cancelButton.accessKey = gNavigatorBundle.getString("addonInstall.cancelButton.accesskey");
 
       let acceptButton = document.getElementById("addon-install-confirmation-accept");
       acceptButton.label = gNavigatorBundle.getString("addonInstall.acceptButton.label");
       acceptButton.accessKey = gNavigatorBundle.getString("addonInstall.acceptButton.accesskey");
 
       let showNotification = () => {
         let tab = gBrowser.getTabForBrowser(browser);
-        if (tab)
+        if (tab) {
           gBrowser.selectedTab = tab;
+          tab.addEventListener("TabClose", cancelInstallation);
+        }
+
+        window.addEventListener("unload", cancelInstallation);
 
         if (PopupNotifications.isPanelOpen) {
           let rect = document.getElementById("addon-progress-notification").getBoundingClientRect();
           let notification = document.getElementById("addon-install-confirmation-notification");
           notification.style.minHeight = rect.height + "px";
         }
 
         PopupNotifications.show(browser, notificationID, messageString, anchorID,
@@ -278,16 +298,17 @@ const gXPInstallObserver = {
       showNotification();
       break; }
     case "addon-install-complete": {
       let needsRestart = installInfo.installs.some(function(i) {
         return i.addon.pendingOperations != AddonManager.PENDING_NONE;
       });
 
       if (needsRestart) {
+        notificationID = "addon-install-restart";
         messageString = gNavigatorBundle.getString("addonsInstalledNeedsRestart");
         action = {
           label: gNavigatorBundle.getString("addonInstallRestartButton"),
           accessKey: gNavigatorBundle.getString("addonInstallRestartButton.accesskey"),
           callback: function() {
             BrowserUtils.restartApplication();
           }
         };
--- a/browser/base/content/browser-menubar.inc
+++ b/browser/base/content/browser-menubar.inc
@@ -395,17 +395,17 @@
                 label="&showAllBookmarks2.label;"
                 command="Browser:ShowAllBookmarks"
                 key="manBookmarkKb"/>
       <menuseparator id="organizeBookmarksSeparator"/>
       <menuitem id="menu_pocket" label="&pocketMenuitem.label;"
 #ifndef XP_MACOSX
                 class="menuitem-iconic"
 #endif
-                oncommand="openUILink(Pocket.listURL, event);"/>
+                oncommand="window.pktUI.openTabWithUrl(Pocket.listURL);"/>
       <menuseparator id="menu_pocketSeparator"/>
       <menuitem id="menu_bookmarkThisPage"
                 command="Browser:AddBookmarkAs"
                 observes="bookmarkThisPageBroadcaster"
                 key="addBookmarkAsKb"/>
       <menuitem id="subscribeToPageMenuitem"
 #ifndef XP_MACOSX
                 class="menuitem-iconic"
--- a/browser/base/content/test/general/browser_bug553455.js
+++ b/browser/base/content/test/general/browser_bug553455.js
@@ -24,16 +24,18 @@ var gApp = document.getElementById("bund
 var gVersion = Services.appinfo.version;
 
 function get_observer_topic(aNotificationId) {
   let topic = aNotificationId;
   if (topic == "xpinstall-disabled")
     topic = "addon-install-disabled";
   else if (topic == "addon-progress")
     topic = "addon-install-started";
+  else if (topic == "addon-install-restart")
+    topic = "addon-install-complete";
   return topic;
 }
 
 function wait_for_progress_notification(aCallback) {
   wait_for_notification(PROGRESS_NOTIFICATION, aCallback, "popupshowing");
 }
 
 function wait_for_notification(aId, aCallback, aEvent = "popupshown") {
@@ -209,17 +211,17 @@ function test_blocked_install() {
        "Should have seen the right origin host");
     is(notification.getAttribute("label"),
        gApp + " prevented this site from asking you to install software on your computer.",
        "Should have seen the right message");
 
     // Wait for the install confirmation dialog
     wait_for_install_dialog(function() {
       // Wait for the complete notification
-      wait_for_notification("addon-install-complete", function(aPanel) {
+      wait_for_notification("addon-install-restart", function(aPanel) {
         let notification = aPanel.childNodes[0];
         is(notification.button.label, "Restart Now", "Should have seen the right button");
         is(notification.getAttribute("label"),
            "XPI Test will be installed after you restart " + gApp + ".",
            "Should have seen the right message");
 
         AddonManager.getAllInstalls(function(aInstalls) {
         is(aInstalls.length, 1, "Should be one pending install");
@@ -255,17 +257,17 @@ function test_whitelisted_install() {
     gBrowser.selectedTab = originalTab;
 
     // Wait for the install confirmation dialog
     wait_for_install_dialog(function() {
       is(gBrowser.selectedTab, tab,
          "tab selected in response to the addon-install-confirmation notification");
 
       // Wait for the complete notification
-      wait_for_notification("addon-install-complete", function(aPanel) {
+      wait_for_notification("addon-install-restart", function(aPanel) {
         let notification = aPanel.childNodes[0];
         is(notification.button.label, "Restart Now", "Should have seen the right button");
         is(notification.getAttribute("label"),
            "XPI Test will be installed after you restart " + gApp + ".",
            "Should have seen the right message");
 
         AddonManager.getAllInstalls(function(aInstalls) {
           is(aInstalls.length, 1, "Should be one pending install");
@@ -414,17 +416,17 @@ function test_restartless() {
 },
 
 function test_multiple() {
   // Wait for the progress notification
   wait_for_progress_notification(function(aPanel) {
     // Wait for the install confirmation dialog
     wait_for_install_dialog(function() {
       // Wait for the complete notification
-      wait_for_notification("addon-install-complete", function(aPanel) {
+      wait_for_notification("addon-install-restart", function(aPanel) {
         let notification = aPanel.childNodes[0];
         is(notification.button.label, "Restart Now", "Should have seen the right button");
         is(notification.getAttribute("label"),
            "2 add-ons will be installed after you restart " + gApp + ".",
            "Should have seen the right message");
 
         AddonManager.getAllInstalls(function(aInstalls) {
           is(aInstalls.length, 1, "Should be one pending install");
@@ -477,17 +479,17 @@ function test_someunverified() {
       is(container.childNodes.length, 2, "Should be two items listed");
       is(container.childNodes[0].firstChild.getAttribute("value"), "XPI Test", "Should have the right add-on");
       is(container.childNodes[0].lastChild.getAttribute("class"),
          "addon-install-confirmation-unsigned", "Should have the unverified marker");
       is(container.childNodes[1].firstChild.getAttribute("value"), "Theme Test", "Should have the right add-on");
       is(container.childNodes[1].childNodes.length, 1, "Shouldn't have the unverified marker");
 
       // Wait for the complete notification
-      wait_for_notification("addon-install-complete", function(aPanel) {
+      wait_for_notification("addon-install-restart", function(aPanel) {
         AddonManager.getAddonsByIDs(["restartless-xpi@tests.mozilla.org",
                                      "theme-xpi@tests.mozilla.org"], function([a, t]) {
           a.uninstall();
           // Installing a new theme tries to switch to it, switch back to the
           // default theme.
           t.userDisabled = true;
           t.uninstall();
 
@@ -560,17 +562,17 @@ function test_allunverified() {
 },
 
 function test_url() {
   // Wait for the progress notification
   wait_for_progress_notification(function(aPanel) {
     // Wait for the install confirmation dialog
     wait_for_install_dialog(function() {
       // Wait for the complete notification
-      wait_for_notification("addon-install-complete", function(aPanel) {
+      wait_for_notification("addon-install-restart", function(aPanel) {
         let notification = aPanel.childNodes[0];
         is(notification.button.label, "Restart Now", "Should have seen the right button");
         is(notification.getAttribute("label"),
            "XPI Test will be installed after you restart " + gApp + ".",
            "Should have seen the right message");
 
         AddonManager.getAllInstalls(function(aInstalls) {
           is(aInstalls.length, 1, "Should be one pending install");
@@ -613,16 +615,45 @@ function test_localfile() {
     var path = cr.convertChromeURL(makeURI(CHROMEROOT + "corrupt.xpi")).spec;
   } catch (ex) {
     var path = CHROMEROOT + "corrupt.xpi";
   }
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.loadURI(path);
 },
 
+function test_tabclose() {
+  if (!Preferences.get("xpinstall.customConfirmationUI", false)) {
+    runNextTest();
+    return;
+  }
+
+  // Wait for the progress notification
+  wait_for_progress_notification(aPanel => {
+    // Wait for the install confirmation dialog
+    wait_for_install_dialog(() => {
+      AddonManager.getAllInstalls(aInstalls => {
+        is(aInstalls.length, 1, "Should be one pending install");
+
+        wait_for_notification_close(() => {
+          AddonManager.getAllInstalls(aInstalls => {
+            is(aInstalls.length, 0, "Should be no pending install since the tab is closed");
+            runNextTest();
+          });
+        });
+
+        gBrowser.removeTab(gBrowser.selectedTab);
+      });
+    });
+  });
+
+  gBrowser.selectedTab = gBrowser.addTab();
+  gBrowser.loadURI(TESTROOT + "unsigned.xpi");
+},
+
 function test_wronghost() {
   gBrowser.selectedTab = gBrowser.addTab();
   gBrowser.addEventListener("load", function() {
     if (gBrowser.currentURI.spec != TESTROOT2 + "enabled.html")
       return;
 
     gBrowser.removeEventListener("load", arguments.callee, true);
 
@@ -647,17 +678,17 @@ function test_wronghost() {
 },
 
 function test_reload() {
   // Wait for the progress notification
   wait_for_progress_notification(function(aPanel) {
     // Wait for the install confirmation dialog
     wait_for_install_dialog(function() {
       // Wait for the complete notification
-      wait_for_notification("addon-install-complete", function(aPanel) {
+      wait_for_notification("addon-install-restart", function(aPanel) {
         let notification = aPanel.childNodes[0];
         is(notification.button.label, "Restart Now", "Should have seen the right button");
         is(notification.getAttribute("label"),
            "XPI Test will be installed after you restart " + gApp + ".",
            "Should have seen the right message");
 
         function test_fail() {
           ok(false, "Reloading should not have hidden the notification");
@@ -700,17 +731,17 @@ function test_reload() {
 },
 
 function test_theme() {
   // Wait for the progress notification
   wait_for_progress_notification(function(aPanel) {
     // Wait for the install confirmation dialog
     wait_for_install_dialog(function() {
       // Wait for the complete notification
-      wait_for_notification("addon-install-complete", function(aPanel) {
+      wait_for_notification("addon-install-restart", function(aPanel) {
         let notification = aPanel.childNodes[0];
         is(notification.button.label, "Restart Now", "Should have seen the right button");
         is(notification.getAttribute("label"),
            "Theme Test will be installed after you restart " + gApp + ".",
            "Should have seen the right message");
 
         AddonManager.getAddonByID("{972ce4c6-7e08-4474-a285-3208198ce6fd}", function(aAddon) {
           ok(aAddon.userDisabled, "Should be switching away from the default theme.");
@@ -778,29 +809,29 @@ function test_renotify_blocked() {
 },
 
 function test_renotify_installed() {
   // Wait for the progress notification
   wait_for_progress_notification(function(aPanel) {
     // Wait for the install confirmation dialog
     wait_for_install_dialog(function() {
       // Wait for the complete notification
-      wait_for_notification("addon-install-complete", function(aPanel) {
+      wait_for_notification("addon-install-restart", function(aPanel) {
         // Dismiss the notification
         wait_for_notification_close(function () {
           // Install another
           executeSoon(function () {
             // Wait for the progress notification
             wait_for_progress_notification(function(aPanel) {
               // Wait for the install confirmation dialog
               wait_for_install_dialog(function() {
                 info("Timeouts after this probably mean bug 589954 regressed");
 
                 // Wait for the complete notification
-                wait_for_notification("addon-install-complete", function(aPanel) {
+                wait_for_notification("addon-install-restart", function(aPanel) {
                   AddonManager.getAllInstalls(function(aInstalls) {
                   is(aInstalls.length, 1, "Should be one pending installs");
                     aInstalls[0].cancel();
 
                     Services.perms.remove("example.com", "install");
                     wait_for_notification_close(runNextTest);
                     gBrowser.removeTab(gBrowser.selectedTab);
                   });
--- a/browser/base/content/urlbarBindings.xml
+++ b/browser/base/content/urlbarBindings.xml
@@ -2995,17 +2995,17 @@ file, You can obtain one at http://mozil
           // Use the popupid attribute to identify the notification type,
           // otherwise just rely on the panel id for common arrowpanels.
           let type = this._panel.firstChild.getAttribute("popupid") ||
                      this._panel.id;
           if (type == "password")
             return "passwords";
           if (type == "editBookmarkPanel")
             return "bookmarks";
-          if (type == "addon-install-complete") {
+          if (type == "addon-install-complete" || type == "addon-install-restart") {
             if (!Services.prefs.prefHasUserValue("services.sync.username"))
               return "addons";
             if (!Services.prefs.getBoolPref("services.sync.engine.addons"))
               return "addons-sync-disabled";
           }
           return null;
         ]]></getter>
       </property>
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -734,19 +734,16 @@ BrowserGlue.prototype = {
 
 #ifndef RELEASE_BUILD
     let themeName = gBrowserBundle.GetStringFromName("deveditionTheme.name");
     let vendorShortName = gBrandBundle.GetStringFromName("vendorShortName");
 
     LightweightThemeManager.addBuiltInTheme({
       id: "firefox-devedition@mozilla.org",
       name: themeName,
-#ifdef XP_WIN
-      accentcolor: "transparent",
-#endif
       headerURL: "resource:///chrome/browser/content/browser/defaultthemes/devedition.header.png",
       iconURL: "resource:///chrome/browser/content/browser/defaultthemes/devedition.icon.png",
       author: vendorShortName,
     });
 #endif
 
 #ifdef MOZ_CRASHREPORTER
     TabCrashReporter.init();
--- a/browser/components/pocket/main.js
+++ b/browser/components/pocket/main.js
@@ -37,17 +37,22 @@
 
 // TODO : Get the toolbar icons from Firefox's build (Nikki needs to give us a red saved icon)
 // TODO : [needs clarificaiton from Fx] Firefox's plan was to hide Pocket from context menus until the user logs in. Now that it's an extension I'm wondering if we still need to do this.
 // TODO : [needs clarificaiton from Fx] Reader mode (might be a something they need to do since it's in html, need to investigate their code)
 // TODO : [needs clarificaiton from Fx] Move prefs within pktApi.s to sqlite or a local file so it's not editable (and is safer)
 // TODO : [nice to have] - Immediately save, buffer the actions in a local queue and send (so it works offline, works like our native extensions)
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode", "resource://gre/modules/ReaderMode.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "AppConstants",
+  "resource://gre/modules/AppConstants.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "PrivateBrowsingUtils",
+  "resource://gre/modules/PrivateBrowsingUtils.jsm");
+XPCOMUtils.defineLazyModuleGetter(this, "ReaderMode",
+  "resource://gre/modules/ReaderMode.jsm");
 
 var pktUI = (function() {
 
 	// -- Initialization (on startup and new windows) -- //
 	var inited = false;
 	var _currentPanelDidShow;
     var _currentPanelDidHide;
 	var _isHidden = false;
@@ -611,21 +616,48 @@ var pktUI = (function() {
 	}
 
 	// -- Browser Navigation -- //
 
 	/**
      * Open a new tab with a given url and notify the iframe panel that it was opened
      */
 
-	function openTabWithUrl(url, activate) {
-        var tab = gBrowser.addTab(url);
-        if (activate) {
-            gBrowser.selectedTab = tab;
+	function openTabWithUrl(url) {
+        let recentWindow = Services.wm.getMostRecentWindow("navigator:browser");
+        if (!recentWindow) {
+          if (this.AppConstants.platform == "macosx") {
+            let hiddenWindow = Services.appShell.hiddenDOMWindow;
+            // If there are no open browser windows, open a new one.
+            hiddenWindow.openDialog("chrome://browser/content/", "_blank",
+                                    "chrome,all,dialog=no", url);
+          }
+          return;
         }
+
+        // If the user is in permanent private browsing than this is not an issue,
+        // since the current window will always share the same cookie jar as the other
+        // windows.
+        if (!PrivateBrowsingUtils.isWindowPrivate(recentWindow) ||
+            PrivateBrowsingUtils.permanentPrivateBrowsing) {
+          recentWindow.openUILinkIn(url, "tab");
+          return;
+        }
+
+        let windows = Services.wm.getEnumerator("navigator:browser");
+        while (windows.hasMoreElements()) {
+          let win = windows.getNext();
+          if (!PrivateBrowsingUtils.isWindowPrivate(win)) {
+            win.openUILinkIn(url, "tab");
+            return;
+          }
+        }
+
+        // If there were no non-private windows opened already.
+        recentWindow.openUILinkIn(url, "window");
 	}
 
 
     // -- Helper Functions -- //
 
     function getCurrentUrl() {
     	return getBrowser().currentURI.spec;
     }
@@ -784,16 +816,18 @@ var pktUI = (function() {
     
 	/**
      * Public functions
      */
     return {
     	onLoad: onLoad,
     	getPanelFrame: getPanelFrame,
 
+        openTabWithUrl: openTabWithUrl,
+
     	pocketButtonOnCommand: pocketButtonOnCommand,
     	pocketPanelDidShow: pocketPanelDidShow,
     	pocketPanelDidHide: pocketPanelDidHide,
 
         pocketContextSaveLinkOnCommand,
         pocketContextSavePageOnCommand,
 
         pocketBookmarkBarOpenPocketCommand,
--- a/browser/components/pocket/panels/css/signup.css
+++ b/browser/components/pocket/panels/css/signup.css
@@ -385,9 +385,15 @@
 .pkt_ext_signup_ru .pkt_ext_logo {
     padding-top: 15px;
 }
 .pkt_ext_signup_de .pkt_ext_introdetailhero .pkt_ext_tagline,
 .pkt_ext_signup_es .pkt_ext_introdetailhero .pkt_ext_tagline,
 .pkt_ext_signup_ja .pkt_ext_introdetailhero .pkt_ext_tagline,
 .pkt_ext_signup_ru .pkt_ext_introdetailhero .pkt_ext_tagline {
     font-size: 13px;
+}
+.pkt_ext_signup_overflow.pkt_ext_signup_de .signup-btn-firefox .logo,
+.pkt_ext_signup_overflow.pkt_ext_signup_es .signup-btn-firefox .logo,
+.pkt_ext_signup_overflow.pkt_ext_signup_ja .signup-btn-firefox .logo,
+.pkt_ext_signup_overflow.pkt_ext_signup_ru .signup-btn-firefox .logo {
+    display: none;
 }
\ No newline at end of file
--- a/browser/components/pocket/pktApi.js
+++ b/browser/components/pocket/pktApi.js
@@ -599,38 +599,31 @@ var pktApi = (function() {
             error: options.error
         });
     }
 
     /**
      * Helper function to get current signup AB group the user is in
      */
     function getSignupAB() {
-        if (!getSetting('signupAB'))
+    	var setting = getSetting('signupAB');
+        if (!setting || setting.contains('hero'))
         {
             var rand = (Math.floor(Math.random()*100+1));
-            if (rand > 95)
-            {
-                setSetting('signupAB','storyboard_nlm');
-            }
-            else if (rand > 90)
+            if (rand > 90)
             {
-                setSetting('signupAB','hero_nlm');
-            }
-            else if (rand > 45)
-            {
-                setSetting('signupAB','storyboard_lm');
+            	setting = 'storyboard_nlm';
             }
             else
             {
-                setSetting('signupAB','hero_lm');
+            	setting = 'storyboard_lm';
             }
-
+            setSetting('signupAB',setting);
         }
-        return getSetting('signupAB');
+        return setting;
     }
 
     /**
      * Public functions
      */
     return {
         isUserLoggedIn : isUserLoggedIn,
         clearUserData: clearUserData,
--- a/browser/devtools/performance/modules/graphs.js
+++ b/browser/devtools/performance/modules/graphs.js
@@ -21,19 +21,16 @@ loader.lazyRequireGetter(this, "Profiler
   "devtools/shared/profiler/global");
 loader.lazyRequireGetter(this, "TimelineGlobal",
   "devtools/shared/timeline/global");
 loader.lazyRequireGetter(this, "MarkersOverview",
   "devtools/shared/timeline/markers-overview", true);
 loader.lazyRequireGetter(this, "EventEmitter",
   "devtools/toolkit/event-emitter");
 
-// TODO get rid of retro mode in bug 1160313
-loader.lazyRequireGetter(this, "Services");
-
 /**
  * For line graphs
  */
 const HEIGHT = 35; // px
 const STROKE_WIDTH = 1; // px
 const DAMPEN_VALUES = 0.95;
 const CLIPHEAD_LINE_COLOR = "#666";
 const SELECTION_LINE_COLOR = "#555";
@@ -163,49 +160,29 @@ const GRAPH_DEFINITIONS = {
   timeline: {
     constructor: TimelineGraph,
     selector: "#markers-overview",
     needsBlueprints: true,
     primaryLink: true
   }
 };
 
-// TODO get rid of retro mode in bug 1160313
-const GRAPH_DEFINITIONS_RETRO = {
-  memory: {
-    constructor: MemoryGraph,
-    selector: "#memory-overview",
-  },
-  framerate: {
-    constructor: FramerateGraph,
-    selector: "#time-framerate",
-    needsBlueprints: true,
-    primaryLink: true
-  },
-  timeline: {
-    constructor: TimelineGraph,
-    selector: "#markers-overview",
-  }
-};
-
 /**
  * A controller for orchestrating the performance's tool overview graphs. Constructs,
  * syncs, toggles displays and defines the memory, framerate and timeline view.
  *
  * @param {object} definition
  * @param {DOMElement} root
  * @param {function} getBlueprint
  * @param {function} getTheme
  */
 function GraphsController ({ definition, root, getBlueprint, getTheme }) {
   this._graphs = {};
   this._enabled = new Set();
-  // TODO get rid of retro mode in bug 1160313
-  let RETRO_MODE = Services.prefs.getBoolPref("devtools.performance.ui.retro-mode");
-  this._definition = definition || (RETRO_MODE ? GRAPH_DEFINITIONS_RETRO : GRAPH_DEFINITIONS);
+  this._definition = definition || GRAPH_DEFINITIONS;
   this._root = root;
   this._getBlueprint = getBlueprint;
   this._getTheme = getTheme;
   this._primaryLink = Object.keys(this._definition).filter(name => this._definition[name].primaryLink)[0];
   this.$ = root.ownerDocument.querySelector.bind(root.ownerDocument);
 
   EventEmitter.decorate(this);
   this._onSelecting = this._onSelecting.bind(this);
--- a/browser/devtools/performance/performance-controller.js
+++ b/browser/devtools/performance/performance-controller.js
@@ -280,26 +280,21 @@ let PerformanceController = {
     this._nonBooleanPrefs[prefName] = prefValue;
   },
 
   /**
    * Starts recording with the PerformanceFront. Emits `EVENTS.RECORDING_STARTED`
    * when the front has started to record.
    */
   startRecording: Task.async(function *() {
-    // Store retro-mode here so we can easily list true/false
-    // values for reverting.
-    // TODO bug 1160313
-    let superMode = !this.getOption("retro-mode");
-
     let options = {
-      withMarkers: superMode ? true : false,
-      withMemory: superMode ? this.getOption("enable-memory") : false,
+      withMarkers: true,
+      withMemory: this.getOption("enable-memory"),
       withTicks: this.getOption("enable-framerate"),
-      withAllocations: superMode ? this.getOption("enable-memory") : false,
+      withAllocations: this.getOption("enable-memory"),
       allocationsSampleProbability: this.getPref("memory-sample-probability"),
       allocationsMaxLogLength: this.getPref("memory-max-log-length"),
       bufferSize: this.getPref("profiler-buffer-size"),
       sampleFrequency: this.getPref("profiler-sample-frequency")
     };
 
     yield gFront.startRecording(options);
   }),
--- a/browser/devtools/performance/test/browser.ini
+++ b/browser/devtools/performance/test/browser.ini
@@ -127,16 +127,15 @@ support-files =
 [browser_profiler_tree-view-01.js]
 [browser_profiler_tree-view-02.js]
 [browser_profiler_tree-view-03.js]
 [browser_profiler_tree-view-04.js]
 [browser_profiler_tree-view-05.js]
 [browser_profiler_tree-view-06.js]
 [browser_profiler_tree-view-07.js]
 [browser_profiler_tree-view-08.js]
+[browser_profiler_tree-view-09.js]
 [browser_profiler-frame-utils-01.js]
 [browser_timeline-blueprint.js]
 [browser_timeline-filters.js]
 [browser_timeline-waterfall-background.js]
 [browser_timeline-waterfall-generic.js]
 [browser_timeline-waterfall-sidebar.js]
-# remove in bug 1160313
-[browser_retro-test.js]
--- a/browser/devtools/performance/test/browser_profiler_tree-view-02.js
+++ b/browser/devtools/performance/test/browser_profiler_tree-view-02.js
@@ -16,17 +16,19 @@ function test() {
   // Don't display the synthesized (root) and the real (root) node twice.
   threadNode.calls = threadNode.calls[0].calls;
   let treeRoot = new CallView({ frame: threadNode });
 
   let container = document.createElement("vbox");
   treeRoot.autoExpandDepth = 0;
   treeRoot.attachTo(container);
 
-  let $$fun = node => container.querySelectorAll(".call-tree-cell[type=function] > " + node);
+  let $$ = node => container.querySelectorAll(node);
+  let $fun = (node, ancestor) => (ancestor || container).querySelector(".call-tree-cell[type=function] > " + node);
+  let $$fun = (node, ancestor) => (ancestor || container).querySelectorAll(".call-tree-cell[type=function] > " + node);
   let $$dur = i => container.querySelectorAll(".call-tree-cell[type=duration]")[i];
   let $$perc = i => container.querySelectorAll(".call-tree-cell[type=percentage]")[i];
   let $$sampl = i => container.querySelectorAll(".call-tree-cell[type=samples]")[i];
 
   is(container.childNodes.length, 1,
     "The container node should have one child available.");
   is(container.childNodes[0].className, "call-tree-item",
     "The root node in the tree has the correct class name.");
@@ -34,23 +36,23 @@ function test() {
   is($$dur(0).getAttribute("value"), "15 ms",
     "The root's duration cell displays the correct value.");
   is($$perc(0).getAttribute("value"), "100%",
     "The root's percentage cell displays the correct value.");
   is($$sampl(0).getAttribute("value"), "4",
     "The root's samples cell displays the correct value.");
   is($$fun(".call-tree-name")[0].getAttribute("value"), "(root)",
     "The root's function cell displays the correct name.");
-  is($$fun(".call-tree-url")[0].getAttribute("value"), "",
-    "The root's function cell displays the correct url.");
-  is($$fun(".call-tree-line")[0].getAttribute("value"), "",
-    "The root's function cell displays the correct line.");
-  is($$fun(".call-tree-host")[0].getAttribute("value"), "",
+  is($$fun(".call-tree-url")[0], null,
+    "The root's function cell displays no url.");
+  is($$fun(".call-tree-line")[0], null,
+    "The root's function cell displays no line.");
+  is($$fun(".call-tree-host")[0], null,
     "The root's function cell displays the correct host.");
-  is($$fun(".call-tree-category")[0].getAttribute("value"), "",
+  is($$fun(".call-tree-category")[0], null,
     "The root's function cell displays the correct category.");
 
   treeRoot.expand();
 
   is(container.childNodes.length, 2,
     "The container node should have two children available.");
   is(container.childNodes[0].className, "call-tree-item",
     "The root node in the tree has the correct class name.");
@@ -58,27 +60,27 @@ function test() {
     "The .A node in the tree has the correct class name.");
 
   is($$dur(1).getAttribute("value"), "15 ms",
     "The .A node's duration cell displays the correct value.");
   is($$perc(1).getAttribute("value"), "100%",
     "The .A node's percentage cell displays the correct value.");
   is($$sampl(1).getAttribute("value"), "4",
     "The .A node's samples cell displays the correct value.");
-  is($$fun(".call-tree-name")[1].getAttribute("value"), "A",
+  is($fun(".call-tree-name", $$(".call-tree-item")[1]).getAttribute("value"), "A",
     "The .A node's function cell displays the correct name.");
-  is($$fun(".call-tree-url")[1].getAttribute("value"), "baz",
+  is($fun(".call-tree-url", $$(".call-tree-item")[1]).getAttribute("value"), "baz",
     "The .A node's function cell displays the correct url.");
-  ok($$fun(".call-tree-url")[1].getAttribute("tooltiptext").includes("http://foo/bar/baz"),
+  ok($fun(".call-tree-url", $$(".call-tree-item")[1]).getAttribute("tooltiptext").includes("http://foo/bar/baz"),
     "The .A node's function cell displays the correct url tooltiptext.");
-  is($$fun(".call-tree-line")[1].getAttribute("value"), ":12",
+  is($fun(".call-tree-line", $$(".call-tree-item")[1]).getAttribute("value"), ":12",
     "The .A node's function cell displays the correct line.");
-  is($$fun(".call-tree-host")[1].getAttribute("value"), "foo",
+  is($fun(".call-tree-host", $$(".call-tree-item")[1]).getAttribute("value"), "foo",
     "The .A node's function cell displays the correct host.");
-  is($$fun(".call-tree-category")[1].getAttribute("value"), "Gecko",
+  is($fun(".call-tree-category", $$(".call-tree-item")[1]).getAttribute("value"), "Gecko",
     "The .A node's function cell displays the correct category.");
 
   let A = treeRoot.getChild();
   A.expand();
 
   is(container.childNodes.length, 4,
     "The container node should have four children available.");
   is(container.childNodes[2].className, "call-tree-item",
@@ -87,46 +89,46 @@ function test() {
     "The .E node in the tree has the correct class name.");
 
   is($$dur(2).getAttribute("value"), "8 ms",
     "The .A.B node's duration cell displays the correct value.");
   is($$perc(2).getAttribute("value"), "75%",
     "The .A.B node's percentage cell displays the correct value.");
   is($$sampl(2).getAttribute("value"), "3",
     "The .A.B node's samples cell displays the correct value.");
-  is($$fun(".call-tree-name")[2].getAttribute("value"), "B",
+  is($fun(".call-tree-name", $$(".call-tree-item")[2]).getAttribute("value"), "B",
     "The .A.B node's function cell displays the correct name.");
-  is($$fun(".call-tree-url")[2].getAttribute("value"), "baz",
+  is($fun(".call-tree-url", $$(".call-tree-item")[2]).getAttribute("value"), "baz",
     "The .A.B node's function cell displays the correct url.");
-  ok($$fun(".call-tree-url")[2].getAttribute("tooltiptext").includes("http://foo/bar/baz"),
+  ok($fun(".call-tree-url", $$(".call-tree-item")[2]).getAttribute("tooltiptext").includes("http://foo/bar/baz"),
     "The .A.B node's function cell displays the correct url tooltiptext.");
-  is($$fun(".call-tree-line")[2].getAttribute("value"), ":34",
+  is($fun(".call-tree-line", $$(".call-tree-item")[2]).getAttribute("value"), ":34",
     "The .A.B node's function cell displays the correct line.");
-  is($$fun(".call-tree-host")[2].getAttribute("value"), "foo",
+  is($fun(".call-tree-host", $$(".call-tree-item")[2]).getAttribute("value"), "foo",
     "The .A.B node's function cell displays the correct host.");
-  is($$fun(".call-tree-category")[2].getAttribute("value"), "Styles",
+  is($fun(".call-tree-category", $$(".call-tree-item")[2]).getAttribute("value"), "Styles",
     "The .A.B node's function cell displays the correct category.");
 
   is($$dur(3).getAttribute("value"), "7 ms",
     "The .A.E node's duration cell displays the correct value.");
   is($$perc(3).getAttribute("value"), "25%",
     "The .A.E node's percentage cell displays the correct value.");
   is($$sampl(3).getAttribute("value"), "1",
     "The .A.E node's samples cell displays the correct value.");
-  is($$fun(".call-tree-name")[3].getAttribute("value"), "E",
+  is($fun(".call-tree-name", $$(".call-tree-item")[3]).getAttribute("value"), "E",
     "The .A.E node's function cell displays the correct name.");
-  is($$fun(".call-tree-url")[3].getAttribute("value"), "baz",
+  is($fun(".call-tree-url", $$(".call-tree-item")[3]).getAttribute("value"), "baz",
     "The .A.E node's function cell displays the correct url.");
-  ok($$fun(".call-tree-url")[3].getAttribute("tooltiptext").includes("http://foo/bar/baz"),
+  ok($fun(".call-tree-url", $$(".call-tree-item")[3]).getAttribute("tooltiptext").includes("http://foo/bar/baz"),
     "The .A.E node's function cell displays the correct url tooltiptext.");
-  is($$fun(".call-tree-line")[3].getAttribute("value"), ":90",
+  is($fun(".call-tree-line", $$(".call-tree-item")[3]).getAttribute("value"), ":90",
     "The .A.E node's function cell displays the correct line.");
-  is($$fun(".call-tree-host")[3].getAttribute("value"), "foo",
+  is($fun(".call-tree-host", $$(".call-tree-item")[3]).getAttribute("value"), "foo",
     "The .A.E node's function cell displays the correct host.");
-  is($$fun(".call-tree-category")[3].getAttribute("value"), "GC",
+  is($fun(".call-tree-category", $$(".call-tree-item")[3]).getAttribute("value"), "GC",
     "The .A.E node's function cell displays the correct category.");
 
   finish();
 }
 
 let gThread = synthesizeProfileForTest([{
   time: 5,
   frames: [
--- a/browser/devtools/performance/test/browser_profiler_tree-view-04.js
+++ b/browser/devtools/performance/test/browser_profiler_tree-view-04.js
@@ -21,28 +21,28 @@ function test() {
   treeRoot.attachTo(container);
 
   is(treeRoot.target.getAttribute("origin"), "chrome",
     "The root node's 'origin' attribute is correct.");
   is(treeRoot.target.getAttribute("category"), "",
     "The root node's 'category' attribute is correct.");
   is(treeRoot.target.getAttribute("tooltiptext"), "",
     "The root node's 'tooltiptext' attribute is correct.");
-  ok(treeRoot.target.querySelector(".call-tree-category").hidden,
+  is(treeRoot.target.querySelector(".call-tree-category"), null,
     "The root node's category label cell should be hidden.");
 
   let A = treeRoot.getChild();
   let B = A.getChild();
   let D = B.getChild();
 
   is(D.target.getAttribute("origin"), "chrome",
     "The .A.B.D node's 'origin' attribute is correct.");
   is(D.target.getAttribute("category"), "gc",
     "The .A.B.D node's 'category' attribute is correct.");
-  is(D.target.getAttribute("tooltiptext"), "D (http://foo/bar/baz:78)",
+  is(D.target.getAttribute("tooltiptext"), "D (http://foo/bar/baz:78:1337)",
     "The .A.B.D node's 'tooltiptext' attribute is correct.");
   ok(!A.target.querySelector(".call-tree-category").hidden,
     "The .A.B.D node's category label cell should not be hidden.");
 
   is(D.target.childNodes.length, 6,
     "The number of columns displayed for tree items is correct.");
   is(D.target.childNodes[0].getAttribute("type"), "duration",
     "The first column displayed for tree items is correct.");
@@ -67,17 +67,17 @@ function test() {
     "The second node displayed for function cells is correct.");
   is(functionCell.childNodes[2].className, "plain call-tree-url",
     "The third node displayed for function cells is correct.");
   is(functionCell.childNodes[3].className, "plain call-tree-line",
     "The fourth node displayed for function cells is correct.");
   is(functionCell.childNodes[4].className, "plain call-tree-column",
     "The fifth node displayed for function cells is correct.");
   is(functionCell.childNodes[5].className, "plain call-tree-host",
-    "The fifth node displayed for function cells is correct.");
+    "The sixth node displayed for function cells is correct.");
   is(functionCell.childNodes[6].tagName, "spacer",
     "The seventh node displayed for function cells is correct.");
   is(functionCell.childNodes[7].className, "plain call-tree-category",
     "The eight node displayed for function cells is correct.");
 
   finish();
 }
 
@@ -90,25 +90,25 @@ let gThread = synthesizeProfileForTest([
     { category: CATEGORY_MASK('js'),     location: "C (http://foo/bar/baz:56)" }
   ]
 }, {
   time: 5 + 1,
   frames: [
     { category: CATEGORY_MASK('other'),  location: "(root)" },
     { category: CATEGORY_MASK('other'),  location: "A (http://foo/bar/baz:12)" },
     { category: CATEGORY_MASK('css'),    location: "B (http://foo/bar/baz:34)" },
-    { category: CATEGORY_MASK('gc', 1),  location: "D (http://foo/bar/baz:78)" }
+    { category: CATEGORY_MASK('gc', 1),  location: "D (http://foo/bar/baz:78:1337)" }
   ]
 }, {
   time: 5 + 1 + 2,
   frames: [
     { category: CATEGORY_MASK('other'),  location: "(root)" },
     { category: CATEGORY_MASK('other'),  location: "A (http://foo/bar/baz:12)" },
     { category: CATEGORY_MASK('css'),    location: "B (http://foo/bar/baz:34)" },
-    { category: CATEGORY_MASK('gc', 1),  location: "D (http://foo/bar/baz:78)" }
+    { category: CATEGORY_MASK('gc', 1),  location: "D (http://foo/bar/baz:78:1337)" }
   ]
 }, {
   time: 5 + 1 + 2 + 7,
   frames: [
     { category: CATEGORY_MASK('other'),   location: "(root)" },
     { category: CATEGORY_MASK('other'),   location: "A (http://foo/bar/baz:12)" },
     { category: CATEGORY_MASK('gc', 2),   location: "E (http://foo/bar/baz:90)" },
     { category: CATEGORY_MASK('network'), location: "F (http://foo/bar/baz:99)" }
--- a/browser/devtools/performance/test/browser_profiler_tree-view-05.js
+++ b/browser/devtools/performance/test/browser_profiler_tree-view-05.js
@@ -14,23 +14,23 @@ function test() {
   // Don't display the synthesized (root) and the real (root) node twice.
   threadNode.calls = threadNode.calls[0].calls;
   let treeRoot = new CallView({ frame: threadNode });
 
   let container = document.createElement("vbox");
   treeRoot.attachTo(container);
 
   let categories = container.querySelectorAll(".call-tree-category");
-  is(categories.length, 7,
+  is(categories.length, 5,
     "The call tree displays a correct number of categories.");
   ok(!container.hasAttribute("categories-hidden"),
     "All categories should be visible in the tree.");
 
   treeRoot.toggleCategories(false);
-  is(categories.length, 7,
+  is(categories.length, 5,
     "The call tree displays the same number of categories.");
   ok(container.hasAttribute("categories-hidden"),
     "All categories should now be hidden in the tree.");
 
   finish();
 }
 
 let gThread = synthesizeProfileForTest([{
new file mode 100644
--- /dev/null
+++ b/browser/devtools/performance/test/browser_profiler_tree-view-09.js
@@ -0,0 +1,56 @@
+/* Any copyright is dedicated to the Public Domain.
+   http://creativecommons.org/publicdomain/zero/1.0/ */
+
+/**
+ * Tests that the profiler's tree view sorts inverted call trees by
+ * "self cost" and not "total cost".
+ */
+
+let { CATEGORY_MASK } = devtools.require("devtools/shared/profiler/global");
+
+let test = Task.async(function*() {
+  let { ThreadNode } = devtools.require("devtools/shared/profiler/tree-model");
+  let { CallView } = devtools.require("devtools/shared/profiler/tree-view");
+
+  let threadNode = new ThreadNode(gSamples, { invertTree: true });
+  let treeRoot = new CallView({ frame: threadNode, inverted: true, autoExpandDepth: 1 });
+
+  let container = document.createElement("vbox");
+  treeRoot.attachTo(container);
+
+  is(treeRoot.getChild(0).frame.location, "B",
+    "The tree root's first child is the `B` function.");
+  is(treeRoot.getChild(1).frame.location, "A",
+    "The tree root's second child is the `A` function.");
+
+  finish();
+});
+
+let gSamples = synthesizeProfileForTest([{
+  time: 1,
+  frames: [
+    { location: "(root)" },
+    { location: "A" },
+    { location: "B" },
+  ]
+}, {
+  time: 2,
+  frames: [
+    { location: "(root)" },
+    { location: "A" },
+    { location: "B" }
+  ]
+}, {
+  time: 3,
+  frames: [
+    { location: "(root)" },
+    { location: "A" },
+    { location: "B" },
+  ]
+}, {
+  time: 4,
+  frames: [
+    { location: "(root)" },
+    { location: "A" }
+  ]
+}]);
deleted file mode 100644
--- a/browser/devtools/performance/test/browser_retro-test.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/* Any copyright is dedicated to the Public Domain.
-   http://creativecommons.org/publicdomain/zero/1.0/ */
-
-/**
- * Tests that only js-calltree view is on, default, and many things are hidden
- * when in retro mode.
- */
-const HIDDEN_OPTIONS = ["option-enable-memory", "option-invert-flame-graph", "option-show-jit-optimizations", "option-flatten-tree-recursion"];
-
-Services.prefs.setBoolPref("devtools.performance.ui.retro-mode", true);
-
-function spawnTest () {
-  let { panel } = yield initPerformance(SIMPLE_URL);
-  let { EVENTS, DetailsView, PerformanceController, $, $$, JsCallTreeView } = panel.panelWin;
-
-  yield startRecording(panel);
-  yield stopRecording(panel);
-
-  let model = PerformanceController.getCurrentRecording();
-
-  ok(model.getMemory().length === 0, "model did not record memory.");
-  ok(model.getTicks().length !== 0, "model did get ticks.");
-  ok(model.getAllocations().sites.length === 0, "model did get allocation data.");
-  ok(model.getAllocations().timestamps.length === 0, "model did get allocation data.");
-  ok(model.getAllocations().frames.length === 0, "model did get allocation data.");
-  ok(model.getAllocations().counts.length === 0, "model did get allocation data.");
-
-  ok(DetailsView.isViewSelected(JsCallTreeView),
-    "The jscalltree view is selected by default");
-
-  for (let option of $$("#performance-options-menupopup > menuitem")) {
-    if (HIDDEN_OPTIONS.indexOf(option.id) !== -1) {
-      ok(option.hidden === true, `${option.id} should be hidden.`);
-    } else {
-      ok(option.hidden === false, `${option.id} should be visible.`);
-    }
-  }
-
-  for (let viewbutton of $$("#performance-toolbar-controls-detail-views > toolbarbutton")) {
-    ok (viewbutton.hidden === true, `${viewbutton.id} should be hidden.`);
-  }
-
-  ok($("#markers-overview").hidden, "markers overview should be hidden.");
-  ok($("#memory-overview").hidden, "memory overview should be hidden.");
-  ok(!$("#time-framerate").hidden, "framerate should be shown.");
-
-  yield teardown(panel);
-  finish();
-}
--- a/browser/devtools/performance/test/head.js
+++ b/browser/devtools/performance/test/head.js
@@ -51,32 +51,27 @@ let DEFAULT_PREFS = [
   "devtools.performance.ui.show-idle-blocks",
   "devtools.performance.ui.enable-memory",
   "devtools.performance.ui.enable-framerate",
   "devtools.performance.ui.show-jit-optimizations",
   "devtools.performance.memory.sample-probability",
   "devtools.performance.memory.max-log-length",
   "devtools.performance.profiler.buffer-size",
   "devtools.performance.profiler.sample-frequency-khz",
-  "devtools.performance.ui.retro-mode",
 ].reduce((prefs, pref) => {
   prefs[pref] = Preferences.get(pref);
   return prefs;
 }, {});
 
 // Enable the new performance panel for all tests.
 Services.prefs.setBoolPref("devtools.performance.enabled", true);
 // Enable logging for all the tests. Both the debugger server and frontend will
 // be affected by this pref.
 Services.prefs.setBoolPref("devtools.debugger.log", false);
 
-// Disable retro mode.
-// TODO bug 1160313
-Services.prefs.setBoolPref("devtools.performance.ui.retro-mode", false);
-
 /**
  * Call manually in tests that use frame script utils after initializing
  * the tool. Must be called after initializing so we can detect
  * whether or not `content` is a CPOW or not. Call after init but before navigating
  * to different pages.
  */
 function loadFrameScripts () {
   mm = gBrowser.selectedBrowser.messageManager;
--- a/browser/devtools/performance/views/details.js
+++ b/browser/devtools/performance/views/details.js
@@ -87,22 +87,19 @@ let DetailsView = {
    * if currently selected. Called when a preference changes in `devtools.performance.ui.`.
    */
   setAvailableViews: Task.async(function* () {
     let recording = PerformanceController.getCurrentRecording();
     let isCompleted = recording && recording.isCompleted();
     let invalidCurrentView = false;
 
     for (let [name, { view }] of Iterator(this.components)) {
-      // TODO bug 1160313 get rid of retro mode checks.
-      let isRetro = PerformanceController.getOption("retro-mode");
-      let isSupported = isRetro ? name === "js-calltree" : this._isViewSupported(name, true);
+      let isSupported = this._isViewSupported(name, true);
 
-      // TODO bug 1160313 hide all view buttons, but let js-calltree still be "supported"
-      $(`toolbarbutton[data-view=${name}]`).hidden = isRetro ? true : !isSupported;
+      $(`toolbarbutton[data-view=${name}]`).hidden = !isSupported;
 
       // If the view is currently selected and not supported, go back to the
       // default view.
       if (!isSupported && this.isViewSelected(view)) {
         invalidCurrentView = true;
       }
     }
 
--- a/browser/devtools/performance/views/toolbar.js
+++ b/browser/devtools/performance/views/toolbar.js
@@ -16,34 +16,16 @@ let ToolbarView = {
     this._onHiddenMarkersChanged = this._onHiddenMarkersChanged.bind(this);
     this._onPrefChanged = this._onPrefChanged.bind(this);
 
     this.optionsView = new OptionsView({
       branchName: BRANCH_NAME,
       menupopup: $("#performance-options-menupopup")
     });
 
-    // TODO bug 1160313 get rid of retro mode checks
-    // hide option buttons here, and any other buttons in the toolbar
-    // (details.js takes care of view buttons)
-    if (PerformanceController.getOption("retro-mode")) {
-      let RETRO_ELEMENTS = [
-        "#option-flatten-tree-recursion",
-        "#option-invert-flame-graph",
-        "#filter-button",
-        // TODO re-enable in bug 1163350
-        // "#option-enable-memory",
-        // TODO re-enable in bug 1163351
-        // "#option-show-jit-optimizations",
-      ];
-      for (let selector of RETRO_ELEMENTS) {
-        $(selector).hidden = true;
-      }
-    }
-
     yield this.optionsView.initialize();
     this.optionsView.on("pref-changed", this._onPrefChanged);
 
     this._buildMarkersFilterPopup();
     this._updateHiddenMarkersPopup();
     $("#performance-filter-menupopup").addEventListener("popupshowing", this._onFilterPopupShowing);
     $("#performance-filter-menupopup").addEventListener("popuphiding",  this._onFilterPopupHiding);
   }),
--- a/browser/devtools/shared/profiler/tree-view.js
+++ b/browser/devtools/shared/profiler/tree-view.js
@@ -13,17 +13,25 @@ loader.lazyImporter(this, "Heritage",
 loader.lazyImporter(this, "AbstractTreeItem",
   "resource:///modules/devtools/AbstractTreeItem.jsm");
 
 const MILLISECOND_UNITS = L10N.getStr("table.ms");
 const PERCENTAGE_UNITS = L10N.getStr("table.percentage");
 const URL_LABEL_TOOLTIP = L10N.getStr("table.url.tooltiptext");
 const CALL_TREE_INDENTATION = 16; // px
 
-const DEFAULT_SORTING_PREDICATE = (a, b) => a.frame.samples < b.frame.samples ? 1 : -1;
+const DEFAULT_SORTING_PREDICATE = (frameA, frameB) => {
+  let dataA = frameA.getDisplayedData();
+  let dataB = frameB.getDisplayedData();
+
+  return this.inverted
+    ? (dataA.selfPercentage < dataB.selfPercentage ? 1 : -1)
+    : (dataA.samples < dataB.samples ? 1 : -1);
+};
+
 const DEFAULT_AUTO_EXPAND_DEPTH = 3; // depth
 const DEFAULT_VISIBLE_CELLS = {
   duration: true,
   percentage: true,
   allocations: false,
   selfDuration: true,
   selfPercentage: true,
   selfAllocations: false,
@@ -113,82 +121,53 @@ CallView.prototype = Heritage.extend(Abs
    * Creates the view for this tree node.
    * @param nsIDOMNode document
    * @param nsIDOMNode arrowNode
    * @return nsIDOMNode
    */
   _displaySelf: function(document, arrowNode) {
     this.document = document;
 
+    let displayedData = this.getDisplayedData();
     let frameInfo = this.frame.getInfo();
-    let framePercentage = this._getPercentage(this.frame.samples);
 
-    let selfPercentage;
-    let selfDuration;
-    let totalAllocations;
-
-    let frameKey = this.frame.key;
-    if (this.visibleCells.selfPercentage) {
-      selfPercentage = this._getPercentage(this.root.frame.selfCount[frameKey]);
+    if (this.visibleCells.duration) {
+      var durationCell = this._createTimeCell(displayedData.totalDuration);
     }
     if (this.visibleCells.selfDuration) {
-      selfDuration = this.root.frame.selfDuration[frameKey];
-    }
-
-    if (!this.frame.calls.length) {
-      if (this.visibleCells.allocations) {
-        totalAllocations = this.frame.allocations;
-      }
-    } else {
-      if (this.visibleCells.allocations) {
-        let childrenAllocations = this.frame.calls.reduce((acc, node) => acc + node.allocations, 0);
-        totalAllocations = this.frame.allocations + childrenAllocations;
-      }
-    }
-
-    if (this.visibleCells.duration) {
-      var durationCell = this._createTimeCell(this.frame.duration);
-    }
-    if (this.visibleCells.selfDuration) {
-      var selfDurationCell = this._createTimeCell(selfDuration, true);
+      var selfDurationCell = this._createTimeCell(displayedData.selfDuration, true);
     }
     if (this.visibleCells.percentage) {
-      var percentageCell = this._createExecutionCell(framePercentage);
+      var percentageCell = this._createExecutionCell(displayedData.totalPercentage);
     }
     if (this.visibleCells.selfPercentage) {
-      var selfPercentageCell = this._createExecutionCell(selfPercentage, true);
+      var selfPercentageCell = this._createExecutionCell(displayedData.selfPercentage, true);
     }
     if (this.visibleCells.allocations) {
-      var allocationsCell = this._createAllocationsCell(totalAllocations);
+      var allocationsCell = this._createAllocationsCell(displayedData.totalAllocations);
     }
     if (this.visibleCells.selfAllocations) {
-      var selfAllocationsCell = this._createAllocationsCell(this.frame.allocations, true);
+      var selfAllocationsCell = this._createAllocationsCell(displayedData.selfAllocations, true);
     }
     if (this.visibleCells.samples) {
-      var samplesCell = this._createSamplesCell(this.frame.samples);
+      var samplesCell = this._createSamplesCell(displayedData.samples);
     }
     if (this.visibleCells.function) {
-      var functionCell = this._createFunctionCell(arrowNode, frameInfo, this.level);
+      var functionCell = this._createFunctionCell(arrowNode, displayedData.name, frameInfo, this.level);
     }
 
     let targetNode = document.createElement("hbox");
     targetNode.className = "call-tree-item";
     targetNode.setAttribute("origin", frameInfo.isContent ? "content" : "chrome");
     targetNode.setAttribute("category", frameInfo.categoryData.abbrev || "");
-    targetNode.setAttribute("tooltiptext", frameInfo.isMetaCategory ? frameInfo.categoryData.label :
-                                           this.frame.location || "");
+    targetNode.setAttribute("tooltiptext", displayedData.tooltiptext);
+
     if (this.hidden) {
       targetNode.style.display = "none";
     }
-
-    let isRoot = frameInfo.nodeType == "Thread";
-    if (isRoot) {
-      functionCell.querySelector(".call-tree-category").hidden = true;
-    }
-
     if (this.visibleCells.duration) {
       targetNode.appendChild(durationCell);
     }
     if (this.visibleCells.percentage) {
       targetNode.appendChild(percentageCell);
     }
     if (this.visibleCells.allocations) {
       targetNode.appendChild(allocationsCell);
@@ -208,23 +187,16 @@ CallView.prototype = Heritage.extend(Abs
     if (this.visibleCells.function) {
       targetNode.appendChild(functionCell);
     }
 
     return targetNode;
   },
 
   /**
-   * Calculate what percentage of all samples the given number of samples is.
-   */
-  _getPercentage: function(samples) {
-    return samples / this.root.frame.samples * 100;
-  },
-
-  /**
    * Populates this node in the call tree with the corresponding "callees".
    * These are defined in the `frame` data source for this call view.
    * @param array:AbstractTreeItem children
    */
   _populateSelf: function(children) {
     let newLevel = this.level + 1;
 
     for (let newFrame of this.frame.calls) {
@@ -233,17 +205,17 @@ CallView.prototype = Heritage.extend(Abs
         frame: newFrame,
         level: newLevel,
         inverted: this.inverted
       }));
     }
 
     // Sort the "callees" asc. by samples, before inserting them in the tree,
     // if no other sorting predicate was specified on this on the root item.
-    children.sort(this.sortingPredicate);
+    children.sort(this.sortingPredicate.bind(this));
   },
 
   /**
    * Functions creating each cell in this call view.
    * Invoked by `_displaySelf`.
    */
   _createTimeCell: function(duration, isSelf = false) {
     let cell = this.document.createElement("label");
@@ -272,75 +244,143 @@ CallView.prototype = Heritage.extend(Abs
   _createSamplesCell: function(count) {
     let cell = this.document.createElement("label");
     cell.className = "plain call-tree-cell";
     cell.setAttribute("type", "samples");
     cell.setAttribute("crop", "end");
     cell.setAttribute("value", count || "");
     return cell;
   },
-  _createFunctionCell: function(arrowNode, frameInfo, frameLevel) {
+  _createFunctionCell: function(arrowNode, frameName, frameInfo, frameLevel) {
     let cell = this.document.createElement("hbox");
     cell.className = "call-tree-cell";
     cell.style.MozMarginStart = (frameLevel * CALL_TREE_INDENTATION) + "px";
     cell.setAttribute("type", "function");
     cell.appendChild(arrowNode);
 
     let nameNode = this.document.createElement("label");
     nameNode.className = "plain call-tree-name";
     nameNode.setAttribute("flex", "1");
     nameNode.setAttribute("crop", "end");
-    nameNode.setAttribute("value", frameInfo.isMetaCategory
-                                     ? frameInfo.categoryData.label
-                                     : frameInfo.functionName || "");
+    nameNode.setAttribute("value", frameName);
     cell.appendChild(nameNode);
 
     // Don't render detailed labels for meta category frames
     if (!frameInfo.isMetaCategory) {
+      this._appendFunctionDetailsCells(cell, frameInfo);
+    }
+
+    // Don't render an expando-arrow for leaf nodes.
+    let hasDescendants = Object.keys(this.frame.calls).length > 0;
+    if (!hasDescendants) {
+      arrowNode.setAttribute("invisible", "");
+    }
+
+    return cell;
+  },
+  _appendFunctionDetailsCells: function(cell, frameInfo) {
+    if (frameInfo.fileName) {
       let urlNode = this.document.createElement("label");
       urlNode.className = "plain call-tree-url";
       urlNode.setAttribute("flex", "1");
       urlNode.setAttribute("crop", "end");
-      urlNode.setAttribute("value", frameInfo.fileName || "");
+      urlNode.setAttribute("value", frameInfo.fileName);
       urlNode.setAttribute("tooltiptext", URL_LABEL_TOOLTIP + " → " + frameInfo.url);
       urlNode.addEventListener("mousedown", this._onUrlClick);
       cell.appendChild(urlNode);
+    }
 
+    if (frameInfo.line) {
       let lineNode = this.document.createElement("label");
       lineNode.className = "plain call-tree-line";
-      lineNode.setAttribute("value", frameInfo.line ? ":" + frameInfo.line : "");
+      lineNode.setAttribute("value", ":" + frameInfo.line);
       cell.appendChild(lineNode);
+    }
 
+    if (frameInfo.column) {
       let columnNode = this.document.createElement("label");
       columnNode.className = "plain call-tree-column";
-      columnNode.setAttribute("value", frameInfo.column ? ":" + frameInfo.column : "");
+      columnNode.setAttribute("value", ":" + frameInfo.column);
       cell.appendChild(columnNode);
+    }
 
+    if (frameInfo.host) {
       let hostNode = this.document.createElement("label");
       hostNode.className = "plain call-tree-host";
-      hostNode.setAttribute("value", frameInfo.host || "");
+      hostNode.setAttribute("value", frameInfo.host);
       cell.appendChild(hostNode);
+    }
 
+    if (frameInfo.categoryData.label) {
       let spacerNode = this.document.createElement("spacer");
       spacerNode.setAttribute("flex", "10000");
       cell.appendChild(spacerNode);
 
       let categoryNode = this.document.createElement("label");
       categoryNode.className = "plain call-tree-category";
       categoryNode.style.color = frameInfo.categoryData.color;
-      categoryNode.setAttribute("value", frameInfo.categoryData.label || "");
+      categoryNode.setAttribute("value", frameInfo.categoryData.label);
       cell.appendChild(categoryNode);
     }
+  },
+
+  /**
+   * Gets the data displayed about this tree item, based on the FrameNode
+   * model associated with this view.
+   *
+   * @return object
+   */
+  getDisplayedData: function() {
+    if (this._cachedDisplayedData) {
+      return this._cachedDisplayedData;
+    }
+
+    let data = this._cachedDisplayedData = Object.create(null);
+    let frameInfo = this.frame.getInfo();
+
+    // Self/total duration.
+    if (this.visibleCells.duration) {
+      data.totalDuration = this.frame.duration;
+    }
+    if (this.visibleCells.selfDuration) {
+      data.selfDuration = this.root.frame.selfDuration[this.frame.key];
+    }
 
-    let hasDescendants = Object.keys(this.frame.calls).length > 0;
-    if (hasDescendants == false) {
-      arrowNode.setAttribute("invisible", "");
+    // Self/total samples percentage.
+    if (this.visibleCells.percentage) {
+      data.totalPercentage = this.frame.samples / this.root.frame.samples * 100;
+    }
+    if (this.visibleCells.selfPercentage) {
+      data.selfPercentage = this.root.frame.selfCount[this.frame.key] / this.root.frame.samples * 100;
     }
 
-    return cell;
+    // Self/total allocations count.
+    if (this.visibleCells.allocations) {
+      let childrenAllocations = this.frame.calls.reduce((acc, node) => acc + node.allocations, 0);
+      data.totalAllocations = this.frame.allocations + childrenAllocations;
+    }
+    if (this.visibleCells.selfAllocations) {
+      data.selfAllocations = this.frame.allocations;
+    }
+
+    // Raw samples.
+    if (this.visibleCells.samples) {
+      data.samples = this.frame.samples;
+    }
+
+    // Frame name (function location or some meta information).
+    data.name = frameInfo.isMetaCategory
+      ? frameInfo.categoryData.label
+      : frameInfo.functionName || "";
+
+    data.tooltiptext = frameInfo.isMetaCategory
+      ? frameInfo.categoryData.label
+      : this.frame.location || "";
+
+    return this._cachedDisplayedData;
   },
 
   /**
    * Toggles the category information hidden or visible.
    * @param boolean visible
    */
   toggleCategories: function(visible) {
     if (!visible) {
deleted file mode 100644
--- a/browser/devtools/timeline/moz.build
+++ /dev/null
@@ -1,8 +0,0 @@
-# vim: set filetype=python:
-# 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/.
-
-EXTRA_JS_MODULES.devtools.timeline += [
-    'panel.js',
-]
deleted file mode 100644
--- a/browser/devtools/timeline/panel.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* vim: set ft=javascript ts=2 et sw=2 tw=80: */
-/* 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/. */
-"use strict";
-
-const { Cc, Ci, Cu, Cr } = require("chrome");
-
-Cu.import("resource://gre/modules/Task.jsm");
-
-loader.lazyRequireGetter(this, "promise");
-loader.lazyRequireGetter(this, "EventEmitter",
-  "devtools/toolkit/event-emitter");
-
-loader.lazyRequireGetter(this, "TimelineFront",
-  "devtools/server/actors/timeline", true);
-
-function TimelinePanel(iframeWindow, toolbox) {
-  this.panelWin = iframeWindow;
-  this._toolbox = toolbox;
-
-  EventEmitter.decorate(this);
-};
-
-exports.TimelinePanel = TimelinePanel;
-
-TimelinePanel.prototype = {
-  /**
-   * Open is effectively an asynchronous constructor.
-   *
-   * @return object
-   *         A promise that is resolved when the timeline completes opening.
-   */
-  open: Task.async(function*() {
-    // Local debugging needs to make the target remote.
-    yield this.target.makeRemote();
-
-    this.panelWin.gToolbox = this._toolbox;
-    this.panelWin.gTarget = this.target;
-    this.panelWin.gFront = new TimelineFront(this.target.client, this.target.form);
-    yield this.panelWin.startupTimeline();
-
-    this.isReady = true;
-    this.emit("ready");
-    return this;
-  }),
-
-  // DevToolPanel API
-
-  get target() this._toolbox.target,
-
-  destroy: Task.async(function*() {
-    // Make sure this panel is not already destroyed.
-    if (this._destroyed) {
-      return;
-    }
-
-    yield this.panelWin.shutdownTimeline();
-    // Destroy front to ensure packet handler is removed from client
-    this.panelWin.gFront.destroy();
-    this.emit("destroyed");
-    this._destroyed = true;
-  })
-};
deleted file mode 100644
--- a/browser/devtools/timeline/timeline.js
+++ /dev/null
@@ -1,627 +0,0 @@
-/* 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/. */
-"use strict";
-
-const { classes: Cc, interfaces: Ci, utils: Cu, results: Cr } = Components;
-
-Cu.import("resource://gre/modules/Services.jsm");
-Cu.import("resource://gre/modules/Task.jsm");
-Cu.import("resource://gre/modules/devtools/Loader.jsm");
-Cu.import("resource:///modules/devtools/ViewHelpers.jsm");
-Cu.import("resource:///modules/devtools/gDevTools.jsm");
-
-devtools.lazyRequireGetter(this, "promise");
-devtools.lazyRequireGetter(this, "EventEmitter",
-  "devtools/toolkit/event-emitter");
-
-devtools.lazyRequireGetter(this, "MarkersOverview",
-  "devtools/shared/timeline/markers-overview", true);
-devtools.lazyRequireGetter(this, "MemoryOverview",
-  "devtools/shared/timeline/memory-overview", true);
-devtools.lazyRequireGetter(this, "Waterfall",
-  "devtools/shared/timeline/waterfall", true);
-devtools.lazyRequireGetter(this, "MarkerDetails",
-  "devtools/shared/timeline/marker-details", true);
-devtools.lazyRequireGetter(this, "TIMELINE_BLUEPRINT",
-  "devtools/shared/timeline/global", true);
-
-devtools.lazyImporter(this, "CanvasGraphUtils",
-  "resource:///modules/devtools/Graphs.jsm");
-
-devtools.lazyImporter(this, "PluralForm",
-  "resource://gre/modules/PluralForm.jsm");
-
-const OVERVIEW_UPDATE_INTERVAL = 200;
-const OVERVIEW_INITIAL_SELECTION_RATIO = 0.15;
-
-/**
- * Preference for devtools.timeline.hiddenMarkers.
- * Stores which markers should be hidden.
- */
-const Prefs = new ViewHelpers.Prefs("devtools.timeline", {
-  hiddenMarkers: ["Json", "hiddenMarkers"]
-});
-
-// The panel's window global is an EventEmitter firing the following events:
-const EVENTS = {
-  // When a recording is started or stopped, via the `stopwatch` button.
-  RECORDING_STARTED: "Timeline:RecordingStarted",
-  RECORDING_ENDED: "Timeline:RecordingEnded",
-
-  // When the overview graphs are populated with new markers.
-  OVERVIEW_UPDATED: "Timeline:OverviewUpdated",
-
-  // When the waterfall view is populated with new markers.
-  WATERFALL_UPDATED: "Timeline:WaterfallUpdated"
-};
-
-/**
- * The current target and the timeline front, set by this tool's host.
- */
-let gToolbox, gTarget, gFront;
-
-/**
- * Initializes the timeline controller and views.
- */
-let startupTimeline = Task.async(function*() {
-  yield TimelineView.initialize();
-  yield TimelineController.initialize();
-});
-
-/**
- * Destroys the timeline controller and views.
- */
-let shutdownTimeline = Task.async(function*() {
-  yield TimelineView.destroy();
-  yield TimelineController.destroy();
-  yield gFront.stop();
-});
-
-/**
- * Functions handling the timeline frontend controller.
- */
-let TimelineController = {
-  /**
-   * Permanent storage for the markers and the memory measurements streamed by
-   * the backend, along with the start and end timestamps.
-   */
-  _starTime: 0,
-  _endTime: 0,
-  _markers: [],
-  _memory: [],
-  _frames: [],
-
-  /**
-   * Initialization function, called when the tool is started.
-   */
-  initialize: function() {
-    this._onRecordingTick = this._onRecordingTick.bind(this);
-    this._onMarkers = this._onMarkers.bind(this);
-    this._onMemory = this._onMemory.bind(this);
-    this._onFrames = this._onFrames.bind(this);
-
-    gFront.on("markers", this._onMarkers);
-    gFront.on("memory", this._onMemory);
-    gFront.on("frames", this._onFrames);
-  },
-
-  /**
-   * Destruction function, called when the tool is closed.
-   */
-  destroy: function() {
-    gFront.off("markers", this._onMarkers);
-    gFront.off("memory", this._onMemory);
-    gFront.off("frames", this._onFrames);
-  },
-
-  /**
-   * Gets the { stat, end } time interval for this recording.
-   * @return object
-   */
-  getInterval: function() {
-    return { startTime: this._startTime, endTime: this._endTime };
-  },
-
-  /**
-   * Gets the accumulated markers in this recording.
-   * @return array
-   */
-  getMarkers: function() {
-    return this._markers;
-  },
-
-  /**
-   * Gets the accumulated memory measurements in this recording.
-   * @return array
-   */
-  getMemory: function() {
-    return this._memory;
-  },
-
-  /**
-   * Gets stack frame array reported by the actor.  The marker "stack"
-   * and "endStack" properties are indices into this array.  See
-   * actors/utils/stack.js for more details.
-   * @return array
-   */
-  getFrames: function() {
-    return this._frames;
-  },
-
-  /**
-   * Updates the views to show or hide the memory recording data.
-   */
-  updateMemoryRecording: Task.async(function*() {
-    if ($("#memory-checkbox").checked) {
-      yield TimelineView.showMemoryOverview();
-    } else {
-      yield TimelineView.hideMemoryOverview();
-    }
-  }),
-
-  /**
-   * Starts/stops the timeline recording and streaming.
-   */
-  toggleRecording: Task.async(function*() {
-    let isRecording = yield gFront.isRecording();
-    if (isRecording == false) {
-      yield this._startRecording();
-    } else {
-      yield this._stopRecording();
-    }
-  }),
-
-  /**
-   * Starts the recording, updating the UI as needed.
-   */
-  _startRecording: function*() {
-    TimelineView.handleRecordingStarted();
-
-    let withMemory = $("#memory-checkbox").checked;
-    let startTime = yield gFront.start({ withMemory });
-
-    // Times must come from the actor in order to be self-consistent.
-    // However, we also want to update the view with the elapsed time
-    // even when the actor is not generating data.  To do this we get
-    // the local time and use it to compute a reasonable elapsed time.
-    // See _onRecordingTick.
-    this._localStartTime = performance.now();
-    this._startTime = startTime;
-    this._endTime = startTime;
-    this._markers = [];
-    this._memory = [];
-    this._frames = [];
-    this._updateId = setInterval(this._onRecordingTick, OVERVIEW_UPDATE_INTERVAL);
-  },
-
-  /**
-   * Stops the recording, updating the UI as needed.
-   */
-  _stopRecording: function*() {
-    clearInterval(this._updateId);
-
-    // Sorting markers is only important when displayed in the waterfall.
-    this._markers = this._markers.sort((a,b) => (a.start > b.start));
-
-    TimelineView.handleRecordingUpdate();
-    TimelineView.handleRecordingEnded();
-    yield gFront.stop();
-  },
-
-  /**
-   * Used in tests. Stops the recording, discarding the accumulated markers and
-   * updating the UI as needed.
-   */
-  _stopRecordingAndDiscardData: function*() {
-    // Clear the markers before calling async method _stopRecording to properly
-    // reset the selection if markers were already received. Bug 1092452.
-    this._markers.length = 0;
-    this._memory.length = 0;
-
-    yield this._stopRecording();
-
-    // Clear the markers after _stopRecording has finished. It's possible that
-    // server sent new markers before it received the request to stop sending
-    // them and client received them while we were waiting for _stopRecording
-    // to finish. Bug 1067287.
-    this._markers.length = 0;
-    this._memory.length = 0;
-  },
-
-  /**
-   * Callback handling the "markers" event on the timeline front.
-   *
-   * @param array markers
-   *        A list of new markers collected since the last time this
-   *        function was invoked.
-   * @param number endTime
-   *        A time after the last marker in markers was collected.
-   */
-  _onMarkers: function(markers, endTime) {
-    for (let marker of markers) {
-      marker.start -= this._startTime;
-      marker.end -= this._startTime;
-    }
-    Array.prototype.push.apply(this._markers, markers);
-    this._endTime = endTime;
-  },
-
-  /**
-   * Callback handling the "memory" event on the timeline front.
-   *
-   * @param number delta
-   *        The number of milliseconds elapsed since epoch.
-   * @param object measurement
-   *        A detailed breakdown of the current memory usage.
-   */
-  _onMemory: function(delta, measurement) {
-    this._memory.push({
-      delta: delta - this._startTime,
-      value: measurement.total / 1024 / 1024
-    });
-  },
-
-  /**
-   * Callback handling the "frames" event on the timeline front.
-   *
-   * @param number delta
-   *        The number of milliseconds elapsed since epoch.
-   * @param object frames
-   *        Newly generated frame objects.
-   */
-  _onFrames: function(delta, frames) {
-    Array.prototype.push.apply(this._frames, frames);
-  },
-
-  /**
-   * Callback invoked at a fixed interval while recording.
-   * Updates the current time and the timeline overview.
-   */
-  _onRecordingTick: function() {
-    // Compute an approximate ending time for the view.  This is
-    // needed to ensure that the view updates even when new data is
-    // not being generated.
-    let fakeTime = this._startTime + (performance.now() - this._localStartTime);
-    if (fakeTime > this._endTime) {
-      this._endTime = fakeTime;
-    }
-    TimelineView.handleRecordingUpdate();
-  }
-};
-
-/**
- * Functions handling the timeline frontend view.
- */
-let TimelineView = {
-  /**
-   * Initialization function, called when the tool is started.
-   */
-  initialize: Task.async(function*() {
-    let blueprint = this._getFilteredBluePrint();
-    this.markersOverview = new MarkersOverview($("#markers-overview"), blueprint);
-    this.waterfall = new Waterfall($("#timeline-waterfall"), $("#timeline-pane"), blueprint);
-    this.markerDetails = new MarkerDetails($("#timeline-waterfall-details"), $("#timeline-waterfall-container > splitter"));
-
-    this._onThemeChange = this._onThemeChange.bind(this);
-    this._onSelecting = this._onSelecting.bind(this);
-    this._onRefresh = this._onRefresh.bind(this);
-
-    gDevTools.on("pref-changed", this._onThemeChange);
-    this.markersOverview.on("selecting", this._onSelecting);
-    this.markersOverview.on("refresh", this._onRefresh);
-    this.markerDetails.on("resize", this._onRefresh);
-
-    this._onMarkerSelected = this._onMarkerSelected.bind(this);
-    this.waterfall.on("selected", this._onMarkerSelected);
-    this.waterfall.on("unselected", this._onMarkerSelected);
-
-    let theme = Services.prefs.getCharPref("devtools.theme");
-    this.markersOverview.setTheme(theme);
-
-    yield this.markersOverview.ready();
-
-    yield this.waterfall.recalculateBounds();
-
-    this._buildFilterPopup();
-  }),
-
-  /**
-   * Destruction function, called when the tool is closed.
-   */
-  destroy: function() {
-    gDevTools.off("pref-changed", this._onThemeChange);
-    this.markerDetails.off("resize", this._onRefresh);
-    this.markerDetails.destroy();
-    this.waterfall.off("selected", this._onMarkerSelected);
-    this.waterfall.off("unselected", this._onMarkerSelected);
-    this.waterfall.destroy();
-    this.markersOverview.off("selecting", this._onSelecting);
-    this.markersOverview.off("refresh", this._onRefresh);
-    this.markersOverview.destroy();
-
-    // The memory overview graph is not always available.
-    if (this.memoryOverview) {
-      this.memoryOverview.destroy();
-    }
-  },
-
-  /**
-   * Shows the memory overview graph.
-   */
-  showMemoryOverview: Task.async(function*() {
-    let theme = Services.prefs.getCharPref("devtools.theme");
-
-    this.memoryOverview = new MemoryOverview($("#memory-overview"));
-    this.memoryOverview.setTheme(theme);
-    yield this.memoryOverview.ready();
-
-    let memory = TimelineController.getMemory();
-    this.memoryOverview.setData(memory);
-
-    CanvasGraphUtils.linkAnimation(this.markersOverview, this.memoryOverview);
-    CanvasGraphUtils.linkSelection(this.markersOverview, this.memoryOverview);
-  }),
-
-  /**
-   * Hides the memory overview graph.
-   */
-  hideMemoryOverview: function() {
-    if (!this.memoryOverview) {
-      return;
-    }
-    this.memoryOverview.destroy();
-    this.memoryOverview = null;
-  },
-
-  /**
-   * A marker has been selected in the waterfall.
-   */
-  _onMarkerSelected: function(event, marker) {
-    if (event == "selected") {
-      this.markerDetails.render({
-        toolbox: gToolbox,
-        marker: marker,
-        frames: TimelineController.getFrames()
-      });
-    }
-    if (event == "unselected") {
-      this.markerDetails.empty();
-    }
-  },
-
-  /**
-   * Signals that a recording session has started and triggers the appropriate
-   * changes in the UI.
-   */
-  handleRecordingStarted: function() {
-    $("#record-button").setAttribute("checked", "true");
-    $("#memory-checkbox").setAttribute("disabled", "true");
-    $("#timeline-pane").selectedPanel = $("#recording-notice");
-
-    this.markersOverview.clearView();
-
-    // The memory overview graph is not always available.
-    if (this.memoryOverview) {
-      this.memoryOverview.clearView();
-    }
-
-    this.waterfall.clearView();
-
-    window.emit(EVENTS.RECORDING_STARTED);
-  },
-
-  /**
-   * Signals that a recording session has ended and triggers the appropriate
-   * changes in the UI.
-   */
-  handleRecordingEnded: function() {
-    $("#record-button").removeAttribute("checked");
-    $("#memory-checkbox").removeAttribute("disabled");
-    $("#timeline-pane").selectedPanel = $("#timeline-waterfall-container");
-
-    this.markersOverview.selectionEnabled = true;
-
-    // The memory overview graph is not always available.
-    if (this.memoryOverview) {
-      this.memoryOverview.selectionEnabled = true;
-    }
-
-    let interval = TimelineController.getInterval();
-    let markers = TimelineController.getMarkers();
-    let memory = TimelineController.getMemory();
-
-    if (markers.length) {
-      let start = markers[0].start * this.markersOverview.dataScaleX;
-      let end = start + this.markersOverview.width * OVERVIEW_INITIAL_SELECTION_RATIO;
-      this.markersOverview.setSelection({ start, end });
-    } else {
-      let startTime = interval.startTime;
-      let endTime = interval.endTime;
-      this.waterfall.setData({ markers, interval: { startTime, endTime } });
-    }
-
-    window.emit(EVENTS.RECORDING_ENDED);
-  },
-
-  /**
-   * Signals that a new set of markers was made available by the controller,
-   * or that the overview graph needs to be updated.
-   */
-  handleRecordingUpdate: function() {
-    let interval = TimelineController.getInterval();
-    let markers = TimelineController.getMarkers();
-    let memory = TimelineController.getMemory();
-
-    let duration = interval.endTime - interval.startTime;
-    this.markersOverview.setData({ markers, duration });
-
-    // The memory overview graph is not always available.
-    if (this.memoryOverview) {
-      this.memoryOverview.setData(memory);
-    }
-
-    window.emit(EVENTS.OVERVIEW_UPDATED);
-  },
-
-  /**
-   * Callback handling the "selecting" event on the timeline overview.
-   */
-  _onSelecting: function() {
-    if (!this.markersOverview.hasSelection() &&
-        !this.markersOverview.hasSelectionInProgress()) {
-      this.waterfall.clearView();
-      return;
-    }
-    this.waterfall.resetSelection();
-    this.updateWaterfall();
-  },
-
-  /**
-   * Rebuild the waterfall.
-   */
-  updateWaterfall: function() {
-    let selection = this.markersOverview.getSelection();
-    let start = selection.start / this.markersOverview.dataScaleX;
-    let end = selection.end / this.markersOverview.dataScaleX;
-
-    let markers = TimelineController.getMarkers();
-    let interval = TimelineController.getInterval();
-
-    let startTime = Math.min(start, end);
-    let endTime = Math.max(start, end);
-
-    this.waterfall.setData({ markers, interval: { startTime, endTime } });
-  },
-
-  /**
-   * Callback handling the "refresh" event on the timeline overview.
-   */
-  _onRefresh: function() {
-    this.waterfall.recalculateBounds();
-    this.updateWaterfall();
-  },
-
-  /**
-   * Rebuild a blueprint without hidden markers.
-   */
-  _getFilteredBluePrint: function() {
-    let hiddenMarkers = Prefs.hiddenMarkers;
-    let filteredBlueprint = Cu.cloneInto(TIMELINE_BLUEPRINT, {});
-    let maybeRemovedGroups = new Set();
-    let removedGroups = new Set();
-
-    // 1. Remove hidden markers from the blueprint.
-
-    for (let hiddenMarkerName of hiddenMarkers) {
-      maybeRemovedGroups.add(filteredBlueprint[hiddenMarkerName].group);
-      delete filteredBlueprint[hiddenMarkerName];
-    }
-
-    // 2. Get a list of all the groups that will be removed.
-
-    for (let removedGroup of maybeRemovedGroups) {
-      let markerNames = Object.keys(filteredBlueprint);
-      let allGroupsRemoved = markerNames.every(e => filteredBlueprint[e].group != removedGroup);
-      if (allGroupsRemoved) {
-        removedGroups.add(removedGroup);
-      }
-    }
-
-    // 3. Offset groups.
-
-    for (let removedGroup of removedGroups) {
-      for (let [, markerDetails] of Iterator(filteredBlueprint)) {
-        if (markerDetails.group > removedGroup) {
-          markerDetails.group--;
-        }
-      }
-    }
-
-    return filteredBlueprint;
-
-  },
-
-  /**
-   * When the list of hidden markers changes, update waterfall
-   * and overview.
-   */
-  _onHiddenMarkersChanged: function(e) {
-    let menuItems = $$("#timelineFilterPopup menuitem[marker-type]:not([checked])");
-    let hiddenMarkers = Array.map(menuItems, e => e.getAttribute("marker-type"));
-
-    Prefs.hiddenMarkers = hiddenMarkers;
-    let blueprint = this._getFilteredBluePrint();
-
-    this.waterfall.setBlueprint(blueprint);
-    this.updateWaterfall();
-
-    this.markersOverview.setBlueprint(blueprint);
-    this.markersOverview.refresh({ force: true });
-  },
-
-  /**
-   * Creates the filter popup.
-   */
-  _buildFilterPopup: function() {
-    let popup = $("#timelineFilterPopup");
-    let button = $("#filter-button");
-
-    popup.addEventListener("popupshowing", () => button.setAttribute("open", "true"));
-    popup.addEventListener("popuphiding",  () => button.removeAttribute("open"));
-
-    this._onHiddenMarkersChanged = this._onHiddenMarkersChanged.bind(this);
-
-    for (let [markerName, markerDetails] of Iterator(TIMELINE_BLUEPRINT)) {
-      let menuitem = document.createElement("menuitem");
-      menuitem.setAttribute("closemenu", "none");
-      menuitem.setAttribute("type", "checkbox");
-      menuitem.setAttribute("marker-type", markerName);
-      menuitem.setAttribute("label", markerDetails.label);
-      menuitem.setAttribute("flex", "1");
-      menuitem.setAttribute("align", "center");
-
-      menuitem.addEventListener("command", this._onHiddenMarkersChanged);
-
-      if (Prefs.hiddenMarkers.indexOf(markerName) == -1) {
-        menuitem.setAttribute("checked", "true");
-      }
-
-      // Style used by pseudo element ::before in timeline.css.in
-      let bulletStyle = `--bullet-bg: ${markerDetails.fill};`
-      bulletStyle += `--bullet-border: ${markerDetails.stroke}`;
-      menuitem.setAttribute("style", bulletStyle);
-
-      popup.appendChild(menuitem);
-    }
-  },
-
-  /*
-   * Called when the developer tools theme changes. Redraws
-   * the graphs with the new theme setting.
-   */
-  _onThemeChange: function (_, theme) {
-    if (this.memoryOverview) {
-      this.memoryOverview.setTheme(theme.newValue);
-      this.memoryOverview.refresh({ force: true });
-    }
-
-    this.markersOverview.setTheme(theme.newValue);
-    this.markersOverview.refresh({ force: true });
-  }
-};
-
-/**
- * Convenient way of emitting events from the panel window.
- */
-EventEmitter.decorate(this);
-
-/**
- * DOM query helpers.
- */
-function $(selector, target = document) {
-  return target.querySelector(selector);
-}
-function $$(selector, target = document) {
-  return target.querySelectorAll(selector);
-}
deleted file mode 100644
--- a/browser/devtools/timeline/timeline.xul
+++ /dev/null
@@ -1,86 +0,0 @@
-<?xml version="1.0"?>
-<!-- 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/. -->
-<?xml-stylesheet href="chrome://browser/skin/" type="text/css"?>
-<?xml-stylesheet href="chrome://browser/content/devtools/widgets.css" type="text/css"?>
-<?xml-stylesheet href="chrome://browser/skin/devtools/widgets.css" type="text/css"?>
-<?xml-stylesheet href="chrome://browser/skin/devtools/common.css" type="text/css"?>
-<?xml-stylesheet href="chrome://browser/skin/devtools/timeline.css" type="text/css"?>
-
-<!DOCTYPE window [
-  <!ENTITY % timelineDTD SYSTEM "chrome://browser/locale/devtools/timeline.dtd">
-  %timelineDTD;
-]>
-
-<window xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
-  <script src="chrome://browser/content/devtools/theme-switching.js"/>
-  <script type="application/javascript" src="timeline.js"/>
-
-  <popupset id="timelinePopupset">
-    <menupopup id="timelineFilterPopup" position="after_start"/>
-  </popupset>
-
-  <vbox class="theme-body" flex="1">
-    <toolbar id="timeline-toolbar"
-             class="devtools-toolbar">
-      <hbox id="recordings-controls"
-            class="devtools-toolbarbutton-group"
-            align="center">
-        <toolbarbutton id="record-button"
-                       class="devtools-toolbarbutton"
-                       oncommand="TimelineController.toggleRecording()"
-                       tooltiptext="&timelineUI.recordButton.tooltip;"/>
-        <toolbarbutton id="filter-button"
-                       popup="timelineFilterPopup"
-                       class="devtools-toolbarbutton"
-                       tooltiptext="&timelineUI.filterButton.tooltip;"/>
-        <checkbox id="memory-checkbox"
-                  label="&timelineUI.memoryCheckbox.label;"
-                  oncommand="TimelineController.updateMemoryRecording()"
-                  tooltiptext="&timelineUI.memoryCheckbox.tooltip;"/>
-        <label id="record-label"
-               value="&timelineUI.recordLabel;"/>
-      </hbox>
-    </toolbar>
-
-    <vbox id="markers-overview"/>
-    <vbox id="memory-overview"/>
-
-    <deck id="timeline-pane"
-          flex="1">
-      <hbox id="empty-notice"
-            class="notice-container"
-            align="center"
-            pack="center"
-            flex="1">
-        <label value="&timelineUI.emptyNotice1;"/>
-        <button id="profiling-notice-button"
-                class="devtools-toolbarbutton"
-                standalone="true"
-                oncommand="TimelineController.toggleRecording()"/>
-        <label value="&timelineUI.emptyNotice2;"/>
-      </hbox>
-
-      <hbox id="recording-notice"
-            class="notice-container"
-            align="center"
-            pack="center"
-            flex="1">
-        <label value="&timelineUI.stopNotice1;"/>
-        <button id="profiling-notice-button"
-                class="devtools-toolbarbutton"
-                standalone="true"
-                checked="true"
-                oncommand="TimelineController.toggleRecording()"/>
-        <label value="&timelineUI.stopNotice2;"/>
-      </hbox>
-
-      <hbox id="timeline-waterfall-container" class="devtools-responsive-container" flex="1">
-        <vbox id="timeline-waterfall" flex="1"/>
-        <splitter class="devtools-side-splitter"/>
-        <vbox id="timeline-waterfall-details" class="theme-sidebar" width="150" height="150"/>
-      </hbox>
-    </deck>
-  </vbox>
-</window>
--- a/browser/installer/windows/nsis/shared.nsh
+++ b/browser/installer/windows/nsis/shared.nsh
@@ -990,158 +990,32 @@
     Delete "$INSTDIR\chrome.manifest"
   ${EndIf}
 
   ; Remove talkback if it is present (remove after bug 386760 is fixed)
   ${If} ${FileExists} "$INSTDIR\extensions\talkback@mozilla.org"
     RmDir /r /REBOOTOK "$INSTDIR\extensions\talkback@mozilla.org"
   ${EndIf}
 
-  ; Remove the Java Console extension (bug 597235)
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0012-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0012-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0013-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0013-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0014-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0014-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0015-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0015-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0016-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0016-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0017-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0017-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0018-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0018-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0019-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0019-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0020-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0020-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0021-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0021-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0022-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0015-0000-0022-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0000-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0001-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0001-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0002-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0002-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0003-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0003-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0004-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0004-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0005-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0005-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0006-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0006-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0007-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0007-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0010-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0010-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0011-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0011-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0012-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0012-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0013-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0013-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0014-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0014-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0015-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0015-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0016-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0016-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0017-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0017-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0018-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0018-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0019-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0019-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0020-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0020-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0021-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0021-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0022-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0022-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0023-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0023-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0024-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0024-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0025-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0025-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0026-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0026-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0027-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0027-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0028-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0028-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0029-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0029-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0030-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0030-ABCDEFFEDCBA}"
-  ${EndIf}
+  ; Remove the Java Console extension (bug 1165156)
   ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0031-ABCDEFFEDCBA}"
     RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0031-ABCDEFFEDCBA}"
   ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0032-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0032-ABCDEFFEDCBA}"
+  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0034-ABCDEFFEDCBA}"
+    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0034-ABCDEFFEDCBA}"
+  ${EndIf}
+  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0039-ABCDEFFEDCBA}"
+    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0039-ABCDEFFEDCBA}"
+  ${EndIf}
+  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0045-ABCDEFFEDCBA}"
+    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0016-0000-0045-ABCDEFFEDCBA}"
   ${EndIf}
   ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0000-ABCDEFFEDCBA}"
     RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0000-ABCDEFFEDCBA}"
   ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0001-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0001-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0002-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0002-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0003-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0003-ABCDEFFEDCBA}"
-  ${EndIf}
-  ${If} ${FileExists} "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0004-ABCDEFFEDCBA}"
-    RmDir /r /REBOOTOK "$INSTDIR\extensions\{CAFEEFAC-0017-0000-0004-ABCDEFFEDCBA}"
-  ${EndIf}
 !macroend
 !define RemoveDeprecatedFiles "!insertmacro RemoveDeprecatedFiles"
 
 ; Converts specific partner distribution.ini from ansi to utf-8 (bug 882989)
 !macro FixDistributionsINI
   StrCpy $1 "$INSTDIR\distribution\distribution.ini"
   StrCpy $2 "$INSTDIR\distribution\utf8fix"
   StrCpy $0 "0" ; Default to not attempting to fix
deleted file mode 100644
--- a/browser/themes/linux/devtools/timeline.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/* 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 ../../shared/devtools/timeline.inc.css
--- a/browser/themes/linux/jar.mn
+++ b/browser/themes/linux/jar.mn
@@ -18,16 +18,24 @@ browser.jar:
   skin/classic/browser/aboutNetError_alert.svg                  (../shared/aboutNetError_alert.svg)
   skin/classic/browser/aboutSocialError.css                     (../shared/aboutSocialError.css)
 * skin/classic/browser/aboutProviderDirectory.css               (../shared/aboutProviderDirectory.css)
 #ifdef MOZ_SERVICES_SYNC
   skin/classic/browser/aboutSyncTabs.css
 #endif
   skin/classic/browser/aboutTabCrashed.css                      (../shared/aboutTabCrashed.css)
   skin/classic/browser/actionicon-tab.png
+  skin/classic/browser/addons/addon-install-blocked.svg     (../shared/addons/addon-install-blocked.svg)
+  skin/classic/browser/addons/addon-install-confirm.svg     (../shared/addons/addon-install-confirm.svg)
+  skin/classic/browser/addons/addon-install-downloading.svg (../shared/addons/addon-install-downloading.svg)
+  skin/classic/browser/addons/addon-install-error.svg       (../shared/addons/addon-install-error.svg)
+  skin/classic/browser/addons/addon-install-installed.svg   (../shared/addons/addon-install-installed.svg)
+  skin/classic/browser/addons/addon-install-restart.svg     (../shared/addons/addon-install-restart.svg)
+  skin/classic/browser/addons/addon-install-warning.svg     (../shared/addons/addon-install-warning.svg)
+  skin/classic/browser/addons/addon-install-anchor.svg      (../shared/addons/addon-install-anchor.svg)
 * skin/classic/browser/browser.css
 * skin/classic/browser/devedition.css
 * skin/classic/browser/browser-lightweightTheme.css
   skin/classic/browser/click-to-play-warning-stripes.png
   skin/classic/browser/content-contextmenu.svg
   skin/classic/browser/drm-icon.svg                         (../shared/drm-icon.svg)
 * skin/classic/browser/engineManager.css
   skin/classic/browser/fullscreen-darknoise.png
@@ -287,17 +295,16 @@ browser.jar:
   skin/classic/browser/devtools/breadcrumbs-scrollbutton@2x.png (../shared/devtools/images/breadcrumbs-scrollbutton@2x.png)
   skin/classic/browser/devtools/animationinspector.css          (../shared/devtools/animationinspector.css)
 * skin/classic/browser/devtools/canvasdebugger.css    (devtools/canvasdebugger.css)
 * skin/classic/browser/devtools/debugger.css          (devtools/debugger.css)
   skin/classic/browser/devtools/eyedropper.css        (../shared/devtools/eyedropper.css)
 * skin/classic/browser/devtools/netmonitor.css        (devtools/netmonitor.css)
 * skin/classic/browser/devtools/profiler.css          (devtools/profiler.css)
 * skin/classic/browser/devtools/performance.css       (devtools/performance.css)
-* skin/classic/browser/devtools/timeline.css          (devtools/timeline.css)
   skin/classic/browser/devtools/timeline-filter.svg   (../shared/devtools/images/timeline-filter.svg)
 * skin/classic/browser/devtools/scratchpad.css        (devtools/scratchpad.css)
 * skin/classic/browser/devtools/shadereditor.css      (devtools/shadereditor.css)
 * skin/classic/browser/devtools/splitview.css         (../shared/devtools/splitview.css)
   skin/classic/browser/devtools/styleeditor.css       (../shared/devtools/styleeditor.css)
   skin/classic/browser/devtools/storage.css           (../shared/devtools/storage.css)
 * skin/classic/browser/devtools/webaudioeditor.css    (devtools/webaudioeditor.css)
   skin/classic/browser/devtools/magnifying-glass.png        (../shared/devtools/images/magnifying-glass.png)
deleted file mode 100644
--- a/browser/themes/osx/devtools/timeline.css
+++ /dev/null
@@ -1,6 +0,0 @@
-/* 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 ../shared.inc
-%include ../../shared/devtools/timeline.inc.css
--- a/browser/themes/osx/jar.mn
+++ b/browser/themes/osx/jar.mn
@@ -18,16 +18,24 @@ browser.jar:
   skin/classic/browser/aboutSocialError.css                 (../shared/aboutSocialError.css)
 * skin/classic/browser/aboutProviderDirectory.css           (../shared/aboutProviderDirectory.css)
 #ifdef MOZ_SERVICES_SYNC
   skin/classic/browser/aboutSyncTabs.css
 #endif
   skin/classic/browser/aboutTabCrashed.css                  (../shared/aboutTabCrashed.css)
   skin/classic/browser/actionicon-tab.png
   skin/classic/browser/actionicon-tab@2x.png
+  skin/classic/browser/addons/addon-install-blocked.svg     (../shared/addons/addon-install-blocked.svg)
+  skin/classic/browser/addons/addon-install-confirm.svg     (../shared/addons/addon-install-confirm.svg)
+  skin/classic/browser/addons/addon-install-downloading.svg (../shared/addons/addon-install-downloading.svg)
+  skin/classic/browser/addons/addon-install-error.svg       (../shared/addons/addon-install-error.svg)
+  skin/classic/browser/addons/addon-install-installed.svg   (../shared/addons/addon-install-installed.svg)
+  skin/classic/browser/addons/addon-install-restart.svg     (../shared/addons/addon-install-restart.svg)
+  skin/classic/browser/addons/addon-install-warning.svg     (../shared/addons/addon-install-warning.svg)
+  skin/classic/browser/addons/addon-install-anchor.svg      (../shared/addons/addon-install-anchor.svg)
 * skin/classic/browser/browser.css                          (browser.css)
 * skin/classic/browser/devedition.css
 * skin/classic/browser/browser-lightweightTheme.css
   skin/classic/browser/click-to-play-warning-stripes.png
   skin/classic/browser/content-contextmenu.svg
   skin/classic/browser/drm-icon.svg                         (../shared/drm-icon.svg)
 * skin/classic/browser/engineManager.css                    (engineManager.css)
   skin/classic/browser/fullscreen-darknoise.png
@@ -420,17 +428,16 @@ browser.jar:
   skin/classic/browser/devtools/breadcrumbs-scrollbutton@2x.png (../shared/devtools/images/breadcrumbs-scrollbutton@2x.png)
   skin/classic/browser/devtools/animationinspector.css          (../shared/devtools/animationinspector.css)
 * skin/classic/browser/devtools/canvasdebugger.css          (devtools/canvasdebugger.css)
 * skin/classic/browser/devtools/debugger.css                (devtools/debugger.css)
   skin/classic/browser/devtools/eyedropper.css              (../shared/devtools/eyedropper.css)
 * skin/classic/browser/devtools/netmonitor.css              (devtools/netmonitor.css)
 * skin/classic/browser/devtools/profiler.css                (devtools/profiler.css)
 * skin/classic/browser/devtools/performance.css             (devtools/performance.css)
-* skin/classic/browser/devtools/timeline.css                (devtools/timeline.css)
   skin/classic/browser/devtools/timeline-filter.svg         (../shared/devtools/images/timeline-filter.svg)
 * skin/classic/browser/devtools/scratchpad.css              (devtools/scratchpad.css)
 * skin/classic/browser/devtools/shadereditor.css            (devtools/shadereditor.css)
 * skin/classic/browser/devtools/splitview.css               (../shared/devtools/splitview.css)
   skin/classic/browser/devtools/styleeditor.css             (../shared/devtools/styleeditor.css)
   skin/classic/browser/devtools/storage.css                 (../shared/devtools/storage.css)
 * skin/classic/browser/devtools/webaudioeditor.css          (devtools/webaudioeditor.css)
   skin/classic/browser/devtools/magnifying-glass.png        (../shared/devtools/images/magnifying-glass.png)
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/addons/addon-install-anchor.svg
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="48"
+     height="16"
+     viewBox="0 0 16 16">
+  <style>
+    g:not(:target) {
+      display: none;
+    }
+  </style>
+
+  <defs>
+
+    <style type="text/css">
+    <![CDATA[
+      
+      .style-icon-notification {
+        fill: #666666;
+      }
+
+      .style-icon-notification.hover {
+        fill: #808080;
+      }
+
+      .style-icon-notification.active {
+        fill: #4d4d4d;
+      }
+      
+    ]]>
+    </style>
+
+    <path id="shape-notifcations-addons" d="M10,15c0.5,0,1-0.4,1-1v-3c0,0,0-0.8,0.8-0.8c0.6,0,0.6,0.8,1.8,0.8c0.6,0,1.5-0.2,1.5-2c0-1.8-0.9-2-1.5-2 c-1.1,0-1.1,0.7-1.8,0.7C11,7.7,11,7,11,7V6c0-0.6-0.5-1-1-1H8c0,0-0.8,0-0.8-0.8C7.2,3.6,8,3.6,8,2.5C8,1.9,7.8,1,6,1 C4.2,1,4,1.9,4,2.5c0,1.1,0.8,1.1,0.8,1.8C4.8,5,4,5,4,5H2C1.5,5,1,5.4,1,6l0,1.5c0,0-0.1,1,1.1,1c0.8,0,0.9-1,1.9-1 C4.5,7.4,5,8,5,9c0,1-0.5,1.6-1,1.6c-1,0-1.1-1.1-1.9-1.1C0.9,9.5,1,10.8,1,10.8V14c0,0.6,0.5,1,1,1l2.6,0c0,0,1.1,0,1.1-1 c0-0.8-1-0.1-1-1.1c0-0.5,0.7-1.2,1.8-1.2s1.8,0.7,1.8,1.2c0,1-1.1,0.3-1.1,1.1c0,1,1.2,1,1.2,1H10z"/>
+
+  </defs>
+
+  <g id="default">
+    <use xlink:href="#shape-notifcations-addons" class="style-icon-notification" />
+  </g>
+  <g id="hover">
+    <use xlink:href="#shape-notifcations-addons" class="style-icon-notification hover" />
+  </g>
+  <g id="active">
+    <use xlink:href="#shape-notifcations-addons" class="style-icon-notification active" />
+  </g>
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/addons/addon-install-blocked.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="64"
+     height="64"
+     viewBox="0 0 64 64">
+       
+  <defs>
+
+    <style type="text/css">
+    <![CDATA[
+      .style-puzzle-piece {
+        fill: url('#gradient-linear-puzzle-piece');
+      }
+      
+      .style-badge-shadow {
+        fill: #0d131a; 
+        fill-opacity: .15;
+      }
+
+      .style-badge-background {
+        fill: #fff; 
+      }
+      
+      .style-badge-inside {
+        fill: #e62117; 
+      }
+      
+      .style-badge-icon {
+        fill: #fff; 
+      }
+      
+    ]]>
+    </style>
+
+    <linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
+      <stop offset="0%" stop-color="#999999" stop-opacity="1"/>
+      <stop offset="100%" stop-color="#8c8c8c" stop-opacity="1"/>
+    </linearGradient>
+
+  </defs>
+
+  <path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
+  <svg id="badge-state" width="32" height="32" x="32" y="0">
+    <ellipse class="style-badge-shadow"     rx="14" ry="15" cx="16" cy="17" />
+    <circle  class="style-badge-background" r="15"  cy="15" cx="16" />
+    <circle  class="style-badge-inside"     r="12"  cy="15" cx="16" />
+    <rect    class="style-badge-icon"       x="9" y="13" width="14" height="4" rx="1" ry="1" />
+  </svg>
+    
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/addons/addon-install-confirm.svg
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="64"
+     height="64"
+     viewBox="0 0 64 64">
+       
+  <defs>
+
+    <style type="text/css">
+    <![CDATA[
+      .style-puzzle-piece {
+        fill: url('#gradient-linear-puzzle-piece');
+      }
+      
+    ]]>
+    </style>
+
+    <linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
+      <stop offset="0%" stop-color="#66cc52" stop-opacity="1"/>
+      <stop offset="100%" stop-color="#60bf4c" stop-opacity="1"/>
+    </linearGradient>
+
+  </defs>
+
+  <path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
+    
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/addons/addon-install-downloading.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="64"
+     height="64"
+     viewBox="0 0 64 64">
+       
+  <defs>
+
+    <style type="text/css">
+    <![CDATA[
+      .style-puzzle-piece {
+        fill: url('#gradient-linear-puzzle-piece');
+      }
+      
+      .style-badge-shadow {
+        fill: #0d131a; 
+        fill-opacity: .15;
+      }
+
+      .style-badge-background {
+        fill: #fff; 
+      }
+      
+      .style-badge-inside {
+        fill: #55cc3d; 
+      }
+      
+      .style-badge-icon {
+        fill: #fff; 
+      }
+      
+    ]]>
+    </style>
+
+    <linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
+      <stop offset="0%" stop-color="#66cc52" stop-opacity="1"/>
+      <stop offset="100%" stop-color="#60bf4c" stop-opacity="1"/>
+    </linearGradient>
+
+  </defs>
+
+  <path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
+  <svg id="badge-state" width="32" height="32" x="32" y="0">
+    <ellipse class="style-badge-shadow"     rx="14" ry="15" cx="16" cy="17" />
+    <circle  class="style-badge-background" r="15"  cy="15" cx="16" />
+    <circle  class="style-badge-inside"     r="12"  cy="15" cx="16" />
+    <path    class="style-badge-icon" d="M22.7,16.1l-5.6,5.5C16.8,21.9,16.4,22,16,22c-0.4,0-0.7-0.1-1-0.4 l-5.6-5.5C8.8,15.5,8.9,15,9.8,15l3.2,0V9c0-0.6,0.5-1,1.1-1h4c0.6,0,1,0.4,1,1v6h3.2C23.1,15,23.3,15.5,22.7,16.1z"/>
+  </svg>
+    
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/addons/addon-install-error.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="64"
+     height="64"
+     viewBox="0 0 64 64">
+       
+  <defs>
+
+    <style type="text/css">
+    <![CDATA[
+      .style-puzzle-piece {
+        fill: url('#gradient-linear-puzzle-piece');
+      }
+      
+      .style-badge-shadow {
+        fill: #0d131a; 
+        fill-opacity: .15;
+      }
+
+      .style-badge-background {
+        fill: #fff; 
+      }
+      
+      .style-badge-inside {
+        fill: #e62117; 
+      }
+      
+      .style-badge-icon {
+        fill: #fff; 
+      }
+      
+    ]]>
+    </style>
+
+    <linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
+      <stop offset="0%" stop-color="#999999" stop-opacity="1"/>
+      <stop offset="100%" stop-color="#8c8c8c" stop-opacity="1"/>
+    </linearGradient>
+
+  </defs>
+
+  <path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
+  <svg id="badge-state" width="32" height="32" x="32" y="0">
+    <ellipse class="style-badge-shadow"     rx="14" ry="15" cx="16" cy="17" />
+    <circle  class="style-badge-background" r="15"  cy="15" cx="16" />
+    <circle  class="style-badge-inside"     r="12"  cy="15" cx="16" />
+    <path    class="style-badge-icon" d="M14.9,16.2c0,0,0.1,0.8,1.1,0.8c1,0,1.1-0.8,1.1-0.8 s0.7-3.5,0.8-5.2C18,9.3,18.4,7,16,7s-2,2.4-1.9,4C14.2,12.7,14.9,16.2,14.9,16.2z M16,19c-1.1,0-2,0.9-2,2c0,1.1,0.9,2,2,2 c1.1,0,2-0.9,2-2C18,19.9,17.1,19,16,19z" />
+  </svg>
+    
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/addons/addon-install-installed.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="64"
+     height="64"
+     viewBox="0 0 64 64">
+       
+  <defs>
+
+    <style type="text/css">
+    <![CDATA[
+      .style-puzzle-piece {
+        fill: url('#gradient-linear-puzzle-piece');
+      }
+      
+      .style-badge-shadow {
+        fill: #0d131a; 
+        fill-opacity: .15;
+      }
+
+      .style-badge-background {
+        fill: #fff; 
+      }
+      
+      .style-badge-inside {
+        fill: #55cc3d; 
+      }
+      
+      .style-badge-icon {
+        fill: #fff; 
+      }
+      
+    ]]>
+    </style>
+
+    <linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
+      <stop offset="0%" stop-color="#66cc52" stop-opacity="1"/>
+      <stop offset="100%" stop-color="#60bf4c" stop-opacity="1"/>
+    </linearGradient>
+
+  </defs>
+
+  <path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
+  <svg id="badge-state" width="32" height="32" x="32" y="0">
+    <ellipse class="style-badge-shadow"     rx="14" ry="15" cx="16" cy="17" />
+    <circle  class="style-badge-background" r="15"  cy="15" cx="16" />
+    <circle  class="style-badge-inside"     r="12"  cy="15" cx="16" />
+    <path    class="style-badge-icon" d="M22.8,12.3c0,0-6.7,8.1-6.9,8.3c-0.4,0.5-1.5,0.3-1.7,0 c-0.2-0.3-5-5.8-5-5.8c-0.3-0.3-0.3-0.7,0-1l1-1c0.4-0.4,0.9,0,1.2,0.3c0.3,0.4,3.4,3.8,3.4,3.8s5.2-6.1,5.4-6.4 c0.5-0.8,1.6-0.8,1.9-0.5l0.7,0.6C23.1,11.1,23.1,12,22.8,12.3z" />
+  </svg>
+    
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/addons/addon-install-restart.svg
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="64"
+     height="64"
+     viewBox="0 0 64 64">
+       
+  <defs>
+
+    <style type="text/css">
+    <![CDATA[
+      .style-puzzle-piece {
+        fill: url('#gradient-linear-puzzle-piece');
+        fill-opacity: .25;
+      }
+      
+      .style-puzzle-piece-outline {
+        fill: none;
+        stroke-width: 2;
+        stroke: #52b33e;
+        stroke-dasharray: 4 2;
+      }
+      
+      .style-badge-shadow {
+        fill: #0d131a; 
+        fill-opacity: .15;
+      }
+
+      .style-badge-background {
+        fill: #fff; 
+      }
+      
+      .style-badge-inside {
+        fill: #00a1e5; 
+      }
+      
+      .style-badge-icon {
+        fill: #fff; 
+      }
+      
+    ]]>
+    </style>
+
+    <linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
+      <stop offset="0%" stop-color="#66cc52" stop-opacity="1"/>
+      <stop offset="100%" stop-color="#60bf4c" stop-opacity="1"/>
+    </linearGradient>
+
+  </defs>
+
+  <path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
+<!--   <path id="puzzle-piece-outline" class="style-puzzle-piece-outline" d="M23.6,2.5c6.8,0,7.8,3.4,7.8,5.4c0,2.4-1.1,3.4-2.2,4.4c-0.8,0.7-1.6,1.5-1.6,2.7c0,2.8,3.7,3.5,3.9,3.5l0,0 h0H42c1.9,0,3.5,1.6,3.5,3.5l0,5.9c0,0.2,0.4,4.2,3.3,4.2c1.3,0,1.9-0.8,2.6-1.6c0.9-1,1.7-2.1,4.1-2.1c3.8,0,5.7,2.5,5.7,7.4 c0,2.3-0.6,7.7-5.7,7.7c-2.4,0-3.3-1.1-4.1-2.2c-0.7-0.8-1.3-1.7-2.6-1.7c-2.9,0-3.3,3.9-3.3,4.2l0,14.2c0,1.9-1.5,3.5-3.5,3.5 l-5.3,0c0,0-0.1,0-0.3,0c-4.9,0-5.4-2.8-5.4-3.9c0-1.2,0.7-2,1.6-2.9c1.1-1.1,2.3-2.4,2.3-4.7c0-2.4-2.9-5-7.1-5 c-3.3,0-6.9,1.9-6.9,5c0,2.4,1.2,3.6,2.3,4.7c0.9,0.9,1.6,1.7,1.6,2.9c0,1.2-0.5,3.9-5.4,3.9c-0.2,0-0.3,0-0.4,0H6 c-1.9,0-3.5-1.6-3.5-3.5l0-12.3c0,0-0.2-2.7,1.2-4.2c0.6-0.7,1.6-1.1,2.7-1.1c1.2,0,1.9,0.7,2.7,1.7c1,1.1,2.2,2.4,4.6,2.4 c3,0,4.5-3.4,4.5-6.8c0-4.5-2.3-6.5-4.5-6.5c-2.4,0-3.5,1.3-4.6,2.4c-0.8,0.9-1.5,1.7-2.7,1.7c-1.1,0-2-0.3-2.6-1 c-1.5-1.6-1.3-4.4-1.3-4.5l0-7.8c0-1.9,1.5-3.5,3.5-3.5h9.7h0l0,0c0.2,0,3.9-0.7,3.9-3.5c0-1.2-0.7-2-1.5-2.7c-0.9-0.9-2-2-2-4.4 C16.1,4.3,18.6,2.5,23.6,2.5"/> -->
+  <path id="puzzle-piece-outline" class="style-puzzle-piece-outline" d="M23.6,3c6.3,0,7.3,3,7.3,4.9c0,2.2-1,3.1-2,4c-0.8,0.8-1.8,1.6-1.8,3.1c0,2.6,2.7,3.7,4.3,4l0.1,0h0.1H42 c1.7,0,3,1.4,3,3v5.8v0l0,0c0.2,1.7,1.2,4.7,3.8,4.7c1.5,0,2.3-0.9,3-1.8c0.8-1,1.6-1.9,3.7-1.9c3.5,0,5.2,2.2,5.2,6.9 c0,6.2-3.2,7.2-5.2,7.2c-2.1,0-2.9-1-3.7-2c-0.7-0.9-1.5-1.9-3-1.9c-2.6,0-3.6,2.9-3.8,4.6l0,0l0,0L45,58c0,1.6-1.3,3-3,3h-5.2l0,0 l0,0c0,0-0.1,0-0.3,0c-4.5,0-4.9-2.4-4.9-3.4c0-1,0.5-1.6,1.5-2.6c1.1-1.1,2.4-2.5,2.4-5.1c0-3.3-3.9-5.5-7.6-5.5 c-4.6,0-7.4,2.8-7.4,5.5c0,2.6,1.4,4,2.5,5.1c1,1,1.5,1.6,1.5,2.6c0,3.1-3.4,3.4-4.9,3.4c-0.2,0-0.3,0-0.3,0l0,0h0H6 c-1.6,0-3-1.3-3-3l0-12.2l0,0l0,0c0,0-0.1-2.5,1.1-3.9c0.6-0.6,1.3-0.9,2.3-0.9c0.9,0,1.5,0.5,2.3,1.5c1,1.2,2.3,2.6,4.9,2.6 c3.3,0,5-3.6,5-7.3c0-3.4-1.6-7-5-7c-2.6,0-3.9,1.4-4.9,2.6c-0.9,1-1.4,1.5-2.3,1.5c-1,0-1.7-0.3-2.3-0.9C2.8,32.6,3,29.9,3,29.9 l0,0l0,0L3,22c0-1.7,1.3-3,3-3h9.7h0.1l0.1,0c1.6-0.3,4.3-1.4,4.3-4c0-1.4-0.9-2.3-1.6-3.1c-0.9-1-1.8-1.9-1.8-4.1 C16.6,4.6,18.9,3,23.6,3"/>
+  <svg id="badge-state" width="32" height="32" x="32" y="0">
+    <ellipse class="style-badge-shadow"     rx="14" ry="15" cx="16" cy="17" />
+    <circle  class="style-badge-background" r="15"  cy="15" cx="16" />
+    <circle  class="style-badge-inside"     r="12"  cy="15" cx="16" />
+    <path    class="style-badge-icon" d="M21,15h-6l2.4-2.4c-0.6-0.4-1.2-0.6-1.9-0.6c-2,0-3.5,1.6-3.5,3.5 c0,2,1.6,3.5,3.5,3.5c1,0,2-0.5,2.6-1.2l1.7,1c-1,1.3-2.6,2.1-4.3,2.1c-3,0-5.5-2.5-5.5-5.5c0-3,2.5-5.5,5.5-5.5 c1.3,0,2.4,0.4,3.3,1.2L21,9V15z"/>
+  </svg>
+    
+</svg>
new file mode 100644
--- /dev/null
+++ b/browser/themes/shared/addons/addon-install-warning.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+
+<svg version="1.1"
+     xmlns="http://www.w3.org/2000/svg"
+     xmlns:xlink="http://www.w3.org/1999/xlink"
+     width="64"
+     height="64"
+     viewBox="0 0 64 64">
+       
+  <defs>
+
+    <style type="text/css">
+    <![CDATA[
+      .style-puzzle-piece {
+        fill: url('#gradient-linear-puzzle-piece');
+      }
+      
+      .style-badge-shadow {
+        fill: #0d131a; 
+        fill-opacity: .15;
+      }
+
+      .style-badge-background {
+        fill: #fff; 
+      }
+      
+      .style-badge-inside {
+        fill: #ffcd02; 
+      }
+      
+      .style-badge-icon {
+        fill: #fff; 
+      }
+      
+    ]]>
+    </style>
+
+    <linearGradient id="gradient-linear-puzzle-piece" x1="0%" y1="0%" x2="0%" y2="100%">
+      <stop offset="0%" stop-color="#999999" stop-opacity="1"/>
+      <stop offset="100%" stop-color="#8c8c8c" stop-opacity="1"/>
+    </linearGradient>
+
+  </defs>
+
+  <path id="puzzle-piece" class="style-puzzle-piece" d="M42,62c2.2,0,4-1.8,4-4l0-14.2c0,0,0.4-3.7,2.8-3.7c2.4,0,2.2,3.9,6.7,3.9c2.3,0,6.2-1.2,6.2-8.2 c0-7-3.9-7.9-6.2-7.9c-4.5,0-4.3,3.7-6.7,3.7c-2.4,0-2.8-3.8-2.8-3.8V22c0-2.2-1.8-4-4-4H31.5c0,0-3.4-0.6-3.4-3 c0-2.4,3.8-2.6,3.8-7.1c0-2.3-1.3-5.9-8.3-5.9s-8,3.6-8,5.9c0,4.5,3.4,4.7,3.4,7.1c0,2.4-3.4,3-3.4,3H6c-2.2,0-4,1.8-4,4l0,7.8 c0,0-0.4,6,4.4,6c3.1,0,3.2-4.1,7.3-4.1c2,0,4,1.9,4,6c0,4.2-2,6.3-4,6.3c-4,0-4.2-4.1-7.3-4.1c-4.8,0-4.4,5.8-4.4,5.8L2,58 c0,2.2,1.8,4,4,4H19c0,0,6.3,0.4,6.3-4.4c0-3.1-4-3.6-4-7.7c0-2,2.2-4.5,6.4-4.5c4.2,0,6.6,2.5,6.6,4.5c0,4-3.9,4.6-3.9,7.7 c0,4.9,6.3,4.4,6.3,4.4H42z"/>
+  <svg id="badge-state" width="32" height="32" x="32" y="0">
+    <path class="style-badge-shadow" d="M29.5,25.8L18.7,4c-0.6-1.2-1.6-2-2.7-2c-1.1,0-2.1,0.7-2.7,2L2.5,25.8 c-0.6,1.2-0.6,2.5-0.1,3.6C2.9,30.4,4,31,5.2,31h21.6c1.2,0,2.3-0.6,2.8-1.6C30.2,28.4,30.1,27.1,29.5,25.8z" />
+    <path class="style-badge-background" d="M16,0c-1.7,0-3.2,1-4.1,2.7L1.7,21.9c-0.9,1.7-0.9,3.4,0,4.8C2.5,28.2,4.1,29,5.9,29H26 c1.9,0,3.4-0.8,4.3-2.2c0.9-1.4,0.8-3.2,0-4.8L20.1,2.7C19.2,1,17.7,0,16,0L16,0z" />
+    <path class="style-badge-inside" d="M5.9,26c-1.7,0-2.4-1.2-1.6-2.7L14.6,4.1c0.8-1.5,2.1-1.5,2.8,0l10.3,19.3 c0.8,1.5,0.1,2.7-1.6,2.7H5.9z" />
+    <path class="style-badge-icon" d="M14.9,17.6c0,0,0.1,0.7,1.1,0.7c1,0,1.1-0.7,1.1-0.7 s0.7-2.9,0.8-4.2c0.1-1.3,0.5-3.2-1.9-3.2c-2.4,0-2,1.9-1.9,3.2C14.2,14.8,14.9,17.6,14.9,17.6z M16,20c-1.1,0-2,0.9-2,2 c0,1.1,0.9,2,2,2c1.1,0,2-0.9,2-2C18,20.9,17.1,20,16,20z" />
+  </svg>
+
+</svg>
deleted file mode 100644
--- a/browser/themes/shared/devtools/timeline.inc.css
+++ /dev/null
@@ -1,246 +0,0 @@
-/* vim:set ts=2 sw=2 sts=2 et: */
-/* 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/. */
-
-#record-button {
-  list-style-image: url(profiler-stopwatch.svg);
-  min-width: 24px;
-}
-
-#record-button[checked] {
-  list-style-image: url(profiler-stopwatch-checked.svg);
-}
-
-#record-button:not([checked]) ~ #record-label {
-  visibility: hidden;
-}
-
-#memory-checkbox .checkbox-label {
-  line-height: 100%;
-}
-
-#filter-button {
-  list-style-image: url(timeline-filter.svg#filter);
-  min-width: 24px;
-}
-
-#filter-button[disabled] {
-  list-style-image: url(timeline-filter.svg#filter-disabled);
-}
-
-#filter-button[open] {
-  list-style-image: url(timeline-filter.svg#filter-open);
-}
-
-#timelineFilterPopup > menuitem:before {
-  content: "";
-  display: block;
-  width: 8px;
-  height: 8px;
-  margin: 0 8px;
-  border: 1px solid;
-  border-radius: 1px;
-  background-color: var(--bullet-bg);
-  border-color: var(--bullet-border);
-}
-
-.notice-container {
-  font-size: 120%;
-  padding-bottom: 35vh;
-}
-
-.theme-dark .notice-container {
-  background: #343c45; /* Toolbars */
-  color: #f5f7fa; /* Light foreground text */
-}
-
-.theme-light .notice-container {
-  background: #f0f1f2; /* Toolbars */
-  color: #585959; /* Grey foreground text */
-}
-
-#empty-notice button,
-#recording-notice button {
-  min-width: 30px;
-  min-height: 28px;
-  margin: 0;
-  list-style-image: url(profiler-stopwatch.svg);
-}
-
-#empty-notice button[checked],
-#recording-notice button[checked] {
-  list-style-image: url(profiler-stopwatch-checked.svg);
-}
-
-#empty-notice button .button-text,
-#recording-notice button .button-text {
-  display: none;
-}
-
-.theme-dark #timeline-pane {
-  border-top: 1px solid #000;
-}
-
-.theme-light #timeline-pane {
-  border-top: 1px solid #aaa;
-}
-
-.waterfall-list-contents {
-  /* Hack: force hardware acceleration */
-  transform: translateZ(1px);
-  overflow-x: hidden;
-  overflow-y: auto;
-}
-
-.waterfall-header-contents {
-  overflow-x: hidden;
-}
-
-.waterfall-background-ticks {
-  /* Background created on a <canvas> in js. */
-  /* @see browser/devtools/timeline/widgets/waterfall.js */
-  background-image: -moz-element(#waterfall-background);
-  background-repeat: repeat-y;
-  background-position: -1px center;
-}
-
-.waterfall-marker-container[is-spacer] {
-  pointer-events: none;
-}
-
-.theme-dark .waterfall-marker-container:not([is-spacer]):nth-child(2n) {
-  background-color: rgba(255,255,255,0.03);
-}
-
-.theme-light .waterfall-marker-container:not([is-spacer]):nth-child(2n) {
-  background-color: rgba(128,128,128,0.03);
-}
-
-.theme-dark .waterfall-marker-container:hover {
-  background-color: rgba(255,255,255,0.1) !important;
-}
-
-.theme-light .waterfall-marker-container:hover {
-  background-color: rgba(128,128,128,0.1) !important;
-}
-
-.waterfall-marker-item {
-  overflow: hidden;
-}
-
-.waterfall-sidebar {
-  -moz-border-end: 1px solid;
-}
-
-.theme-dark .waterfall-sidebar {
-  -moz-border-end-color: #000;
-}
-
-.theme-light .waterfall-sidebar {
-  -moz-border-end-color: #aaa;
-}
-
-.waterfall-marker-container:hover > .waterfall-sidebar {
-  background-color: transparent;
-}
-
-.waterfall-header-name {
-  padding: 4px;
-}
-
-.waterfall-header-tick {
-  width: 100px;
-  font-size: 9px;
-  transform-origin: left center;
-}
-
-.theme-dark .waterfall-header-tick {
-  color: #a9bacb;
-}
-
-.theme-light .waterfall-header-tick {
-  color: #292e33;
-}
-
-.waterfall-header-tick:not(:first-child) {
-  -moz-margin-start: -100px !important; /* Don't affect layout. */
-}
-
-.waterfall-marker-bullet {
-  width: 8px;
-  height: 8px;
-  -moz-margin-start: 8px;
-  -moz-margin-end: 6px;
-  border: 1px solid;
-  border-radius: 1px;
-}
-
-.waterfall-marker-name {
-  font-size: 95%;
-  padding-bottom: 1px !important;
-}
-
-.waterfall-marker-bar {
-  height: 9px;
-  border: 1px solid;
-  border-radius: 1px;
-  transform-origin: left center;
-}
-
-.theme-light .waterfall-marker-container.selected > .waterfall-sidebar,
-.theme-light .waterfall-marker-container.selected > .waterfall-marker-item {
-  background-color: #4c9ed9; /* Select Highlight Blue */
-  color: #f5f7fa; /* Light foreground text */
-}
-
-.theme-dark .waterfall-marker-container.selected > .waterfall-sidebar,
-.theme-dark .waterfall-marker-container.selected > .waterfall-marker-item {
-  background-color: #1d4f73; /* Select Highlight Blue */
-  color: #f5f7fa; /* Light foreground text */
-}
-
-.waterfall-marker-container.selected .waterfall-marker-bullet,
-.waterfall-marker-container.selected .waterfall-marker-bar {
-  border-color: initial!important;
-}
-
-.waterfall-marker-location {
-   color: -moz-nativehyperlinktext;
-}
-
-.waterfall-marker-location:hover,
-.waterfall-marker-location:focus {
-   text-decoration: underline;
-}
-
-#timeline-waterfall-details {
-  -moz-padding-start: 8px;
-  -moz-padding-end: 8px;
-  padding-top: 2vh;
-  overflow: auto;
-}
-
-.marker-details-bullet {
-  width: 8px;
-  height: 8px;
-  border: 1px solid;
-  border-radius: 1px;
-}
-
-#timeline-waterfall-details > * {
-  padding-top: 3px;
-}
-
-.marker-details-labelname {
-  -moz-padding-end: 4px;
-}
-
-.marker-details-type {
-  font-size: 1.2em;
-  font-weight: bold;
-}
-
-.marker-details-duration {
-  font-weight: bold;
-}
--- a/browser/themes/shared/notification-icons.inc.css
+++ b/browser/themes/shared/notification-icons.inc.css
@@ -14,24 +14,42 @@
   list-style-image: url(chrome://browser/skin/Geolocation-64.png);
 }
 
 .popup-notification-icon[popupid="push"] {
   list-style-image: url(chrome://browser/skin/Push-64.png);
 }
 
 .popup-notification-icon[popupid="xpinstall-disabled"],
-.popup-notification-icon[popupid="addon-progress"],
-.popup-notification-icon[popupid="addon-install-blocked"],
-.popup-notification-icon[popupid="addon-install-failed"],
-.popup-notification-icon[popupid="addon-install-confirmation"],
+.popup-notification-icon[popupid="addon-install-blocked"] {
+  list-style-image: url(chrome://browser/skin/addons/addon-install-blocked.svg);
+}
+
+.popup-notification-icon[popupid="addon-progress"] {
+  list-style-image: url(chrome://browser/skin/addons/addon-install-downloading.svg);
+}
+
+.popup-notification-icon[popupid="addon-install-failed"] {
+  list-style-image: url(chrome://browser/skin/addons/addon-install-error.svg);
+}
+
+.popup-notification-icon[popupid="addon-install-confirmation"] {
+  list-style-image: url(chrome://browser/skin/addons/addon-install-confirm.svg);
+}
+
+#addon-install-confirmation-notification[warning] .popup-notification-icon[popupid="addon-install-confirmation"] {
+  list-style-image: url(chrome://browser/skin/addons/addon-install-warning.svg);
+}
+
 .popup-notification-icon[popupid="addon-install-complete"] {
-  list-style-image: url(chrome://mozapps/skin/extensions/extensionGeneric.png);
-  width: 32px;
-  height: 32px;
+  list-style-image: url(chrome://browser/skin/addons/addon-install-installed.svg);
+}
+
+.popup-notification-icon[popupid="addon-install-restart"] {
+  list-style-image: url(chrome://browser/skin/addons/addon-install-restart.svg);
 }
 
 .popup-notification-icon[popupid="click-to-play-plugins"] {
   list-style-image: url(chrome://mozapps/skin/plugins/pluginBlocked-64.png);
 }
 
 .popup-notification-icon[popupid="web-notifications"] {
   list-style-image: url(chrome://browser/skin/notification-64.png);
@@ -123,17 +141,25 @@
   list-style-image: url(chrome://browser/skin/Geolocation-16.png);
 }
 
 #push-notification-icon {
   list-style-image: url(chrome://browser/skin/Push-16.png);
 }
 
 #addons-notification-icon {
-  list-style-image: url(chrome://mozapps/skin/extensions/extensionGeneric-16.png);
+  list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#default);
+}
+
+#addons-notification-icon:hover {
+  list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#hover);
+}
+
+#addons-notification-icon:hover:active {
+  list-style-image: url(chrome://browser/skin/addons/addon-install-anchor.svg#active);
 }
 
 .indexedDB-notification-icon,
 #indexedDB-notification-icon {
   list-style-image: url(chrome://global/skin/icons/question-16.png);
 }
 
 #password-notification-icon {
--- a/browser/themes/windows/devedition.css
+++ b/browser/themes/windows/devedition.css
@@ -5,32 +5,67 @@
 %include ../shared/devedition.inc.css
 
 :root[devtoolstheme="dark"],
 :root[devtoolstheme="light"] {
    /* Matches the #browser-border-start, #browser-border-end color */
   --chrome-nav-bar-separator-color: rgba(10, 31, 51, 0.35);
 }
 
+/* The window background is white due to no accentcolor in the lightweight
+   theme. It can't be changed to transparent when there is no compositor
+   (Win XP or 7 in classic / basic theme), or else dragging and focus become
+   broken. So instead just show the normal titlebar in that case, and override
+   the window color as transparent when the compositor is available. */
+@media not all and (-moz-windows-compositor) {
+  #main-window[tabsintitlebar] #titlebar:-moz-lwtheme {
+    visibility: visible;
+  }
+
+  #main-window {
+    background: var(--chrome-background-color) !important;
+  }
+}
+
+@media (-moz-windows-compositor) {
+  #main-window {
+    background: transparent !important;
+  }
+}
+
 #TabsToolbar::after {
   display: none;
 }
 
 #back-button > .toolbarbutton-icon,
 #forward-button > .toolbarbutton-icon {
   background: var(--chrome-nav-buttons-background) !important;
   border-radius: 0 !important;
   width: auto !important;
   height: auto !important;
   padding: 2px 5px !important;
   margin: 0 !important;
   border: 1px solid var(--chrome-nav-bar-controls-border-color) !important;
   box-shadow: none !important;
 }
 
+
+/* Force 1x image for back/forward button for now, otherwise it breaks the
+   layout - Bug 1165360. */
+@media (min-resolution: 1.1dppx) {
+  #back-button,
+  #forward-button {
+    list-style-image: url("chrome://browser/skin/Toolbar.png");
+  }
+  /* The back button region is already set in devedition.inc.css */
+  #forward-button {
+    -moz-image-region: rect(0px, 72px, 18px, 54px);
+  }
+}
+
 #forward-button > .toolbarbutton-icon {
   -moz-border-start: none !important;
 }
 
 /* Override a box shadow for disabled back button */
 #main-window:not([customizing]) #back-button[disabled] > .toolbarbutton-icon {
   box-shadow: none !important;
 }
deleted file mode 100644
--- a/browser/themes/windows/devtools/timeline.css
+++ /dev/null
@@ -1,5 +0,0 @@
-/* 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 ../../shared/devtools/timeline.inc.css
--- a/browser/themes/windows/jar.mn
+++ b/browser/themes/windows/jar.mn
@@ -17,16 +17,24 @@ browser.jar:
         skin/classic/browser/aboutNetError_alert.svg                 (../shared/aboutNetError_alert.svg)
         skin/classic/browser/aboutSocialError.css                    (../shared/aboutSocialError.css)
 *       skin/classic/browser/aboutProviderDirectory.css              (../shared/aboutProviderDirectory.css)
 #ifdef MOZ_SERVICES_SYNC
         skin/classic/browser/aboutSyncTabs.css
 #endif
         skin/classic/browser/aboutTabCrashed.css                     (../shared/aboutTabCrashed.css)
         skin/classic/browser/actionicon-tab.png
+        skin/classic/browser/addons/addon-install-blocked.svg        (../shared/addons/addon-install-blocked.svg)
+        skin/classic/browser/addons/addon-install-confirm.svg        (../shared/addons/addon-install-confirm.svg)
+        skin/classic/browser/addons/addon-install-downloading.svg    (../shared/addons/addon-install-downloading.svg)
+        skin/classic/browser/addons/addon-install-error.svg          (../shared/addons/addon-install-error.svg)
+        skin/classic/browser/addons/addon-install-installed.svg      (../shared/addons/addon-install-installed.svg)
+        skin/classic/browser/addons/addon-install-restart.svg        (../shared/addons/addon-install-restart.svg)
+        skin/classic/browser/addons/addon-install-warning.svg        (../shared/addons/addon-install-warning.svg)
+        skin/classic/browser/addons/addon-install-anchor.svg         (../shared/addons/addon-install-anchor.svg)
 *       skin/classic/browser/browser.css
 *       skin/classic/browser/devedition.css
 *       skin/classic/browser/browser-lightweightTheme.css
         skin/classic/browser/click-to-play-warning-stripes.png
         skin/classic/browser/content-contextmenu.svg
         skin/classic/browser/drm-icon.svg                            (../shared/drm-icon.svg)
 *       skin/classic/browser/engineManager.css
         skin/classic/browser/fullscreen-darknoise.png
@@ -363,17 +371,16 @@ browser.jar:
         skin/classic/browser/devtools/breadcrumbs-scrollbutton@2x.png (../shared/devtools/images/breadcrumbs-scrollbutton@2x.png)
         skin/classic/browser/devtools/animationinspector.css        (../shared/devtools/animationinspector.css)
         skin/classic/browser/devtools/eyedropper.css                (../shared/devtools/eyedropper.css)
 *       skin/classic/browser/devtools/canvasdebugger.css            (devtools/canvasdebugger.css)
 *       skin/classic/browser/devtools/debugger.css                  (devtools/debugger.css)
 *       skin/classic/browser/devtools/netmonitor.css                (devtools/netmonitor.css)
 *       skin/classic/browser/devtools/profiler.css                  (devtools/profiler.css)
 *       skin/classic/browser/devtools/performance.css               (devtools/performance.css)
-*       skin/classic/browser/devtools/timeline.css                  (devtools/timeline.css)
         skin/classic/browser/devtools/timeline-filter.svg           (../shared/devtools/images/timeline-filter.svg)
 *       skin/classic/browser/devtools/scratchpad.css                (devtools/scratchpad.css)
 *       skin/classic/browser/devtools/shadereditor.css              (devtools/shadereditor.css)
         skin/classic/browser/devtools/storage.css                   (../shared/devtools/storage.css)
 *       skin/classic/browser/devtools/splitview.css                 (../shared/devtools/splitview.css)
         skin/classic/browser/devtools/styleeditor.css               (../shared/devtools/styleeditor.css)
 *       skin/classic/browser/devtools/webaudioeditor.css            (devtools/webaudioeditor.css)
         skin/classic/browser/devtools/magnifying-glass.png          (../shared/devtools/images/magnifying-glass.png)