diff -u8pdNr exten-032/chrome/content/convert.js exten-042/chrome/content/convert.js
--- exten-032/chrome/content/convert.js	2009-04-09 00:39:40.000000000 +0200
+++ exten-042/chrome/content/convert.js	1970-01-01 01:00:00.000000000 +0100
@@ -1,67 +0,0 @@
-
-function convertFullListApplications() {
-  var i = 0;
-  var fullListApplications = "fullList.applications";
-  var oldFullListApplications = Cc["@mozilla.org/preferences-service;1"].
-                                getService(Ci.nsIPrefService).
-				                getBranch("extensions.tinderstatus.").
-                                getComplexValue("fullList.applications",
-                                Ci.nsISupportsString).data;
-  var newFullListApplications = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
-  newFullListApplications.data =
-    oldFullListApplications.split(",").
-                         map(function(v) v == "Firefox3.1" ? "Firefox3.5" : v).
-                         sort().
-                         filter(function(v, i, a) i == 0 || v != a[i-1]).
-                         join(",");
-  Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).
-               getBranch("extensions.tinderstatus.").
-               setComplexValue(fullListApplications, Ci.nsISupportsString, newFullListApplications);
-  fullListApplications = "fullList.applications" + ++i;
-  }
-
-function convertFullList() {
-  var i = 0;
-  var fullList = "fullList";
-  var oldFullList = Cc["@mozilla.org/preferences-service;1"].
-                    getService(Ci.nsIPrefService).
-					getBranch("extensions.tinderstatus.").
-                    getComplexValue("fullList",
-                    Ci.nsISupportsString).data;
-  var newFullList = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
-  newFullList.data =
-    oldFullList.split(",").
-                map(function(v) v == "Firefox3.1" ? "Firefox3.5" : v).
-                sort().
-                filter(function(v, i, a) i == 0 || v != a[i-1]).
-                join(",");
-  Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).
-               getBranch("extensions.tinderstatus.").
-               setComplexValue(fullList, Ci.nsISupportsString, newFullList);
-  fullList = "fullList" + ++i;
-  }
-
-function convertGotoTree() {
-  var i = 0;
-  var gotoTree = "gotoTree";
-    if (Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).
-	                                            getBranch("extensions.tinderstatus.").
-												prefHasUserValue(gotoTree)) {
-      var oldGotoTree = Cc["@mozilla.org/preferences-service;1"].
-                        getService(Ci.nsIPrefService).
-						getBranch("extensions.tinderstatus.").
-	                    getComplexValue("gotoTree",
-                        Ci.nsISupportsString).data;
-      var newGotoTree = Cc["@mozilla.org/supports-string;1"].createInstance(Ci.nsISupportsString);
-      newGotoTree.data =
-        oldGotoTree.split(",").
-                    map(function(v) v == "Firefox3.1" ? "Firefox3.5" : v).
-                    sort().
-                    filter(function(v, i, a) i == 0 || v != a[i-1]).
-                    join(",");
-      Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefService).
-	               getBranch("extensions.tinderstatus.").
-	               setComplexValue(gotoTree, Ci.nsISupportsString, newGotoTree);
-	}
-    gotoTree = "gotoTree" + ++i;
-  }
\ No newline at end of file
diff -u8pdNr exten-032/chrome/content/overlay.xul exten-042/chrome/content/overlay.xul
--- exten-032/chrome/content/overlay.xul	2009-04-08 23:35:04.000000000 +0200
+++ exten-042/chrome/content/overlay.xul	2011-06-12 14:36:39.161271500 +0200
@@ -39,40 +39,44 @@
 
 <!DOCTYPE overlay SYSTEM "chrome://tinderstatus/locale/overlay.dtd">
 
 <overlay id="tinderstatusOverlay" 
          xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 
   <script type="application/x-javascript" src="chrome://global/content/strres.js"/>
   <script type="application/x-javascript" src="chrome://tinderstatus/content/tinderstatus.js" />
-  <script type="application/x-javascript" src="chrome://tinderstatus/content/convert.js" />
 
   <statusbar id="status-bar">
     <!-- We use a box within the statusbarpanel instead of just treating 
        - the panel like a button so we can obtain native appearance on the panel
        - with "-moz-appearance: statusbarpanel" while still being able to style 
        - the background color of the box to reflect build status. -->
 
     <statusbarpanel id="tinderstatus-panel" insertbefore="security-button">
 
       <box id="tinderstatus-box" class="tinderstatus-box"
            onclick="loadTinderboxURI(event);" buildstatus="none"
            context="tinderstatus-context" tooltip="tinderstatus-tooltip">
          <image class="tinderstatus-icon" treestatus="none"/>
       </box>
 
       <popupset>
-        <menupopup id="tinderstatus-context">
+        <menupopup id="tinderstatus-context"
+                   onpopupshowing="Tinderstatus.onContextShowing();">
           <menuitem id="tinderstatus-open-tree" label="&tinderstatus.context.opentree;"
                     disabled="true"/>
           <menuseparator id="tinderstatus-separator"/>
           <menuitem id="tinderstatus-prefs" label="&tinderstatus.context.preferences;"
                     accesskey="&tinderstatus.context.preferences.accesskey;"
                     oncommand="openTinderstatusPreferences();"/>
+          <menuitem id="tinderstatus-notifications" label="&tinderstatus.context.notifications;"
+                    accesskey="&tinderstatus.context.notifications.accesskey;"
+                    type="checkbox"
+                    oncommand="Tinderstatus.onNotificationToggled();"/>
           <menuitem id="tinderstatus-refresh" label="&tinderstatus.context.refresh.now;"
                     accesskey="&tinderstatus.context.refresh.now.accesskey;"
                     oncommand="refreshTinderboxenStatus();"/>
         </menupopup>
 
         <tooltip id="tinderstatus-tooltip">
           <description value="&tinderstatus.tooltip;"/>
           <description/>
diff -u8pdNr exten-032/chrome/content/prefs.js exten-042/chrome/content/prefs.js
--- exten-032/chrome/content/prefs.js	2009-04-08 22:16:40.000000000 +0200
+++ exten-042/chrome/content/prefs.js	2011-06-12 16:53:02.322553300 +0200
@@ -73,21 +73,28 @@ function onLoadTinderstatusPrefsPane()
       item.pref = prefString.split(",");
     }
     catch (ex) {
       item.pref = [];
     }
     watchList.push(item);
   }
 
+  watchList.push({ element: document.getElementById("notifyTrees"),
+                   pref: gPrefBranch.getComplexValue("notifyTrees",
+                                                     Ci.nsISupportsString).data.split(",") });
+  watchList.push({ element: document.getElementById("notifyTinderboxes"),
+                   pref: gPrefBranch.getComplexValue("notifyTinderboxes",
+                                                     Ci.nsISupportsString).data.split(",") });
+
   var item;
 
   for (i = 0; i < fullList.length; ++i) {
     // Add the item to the watch lists
-    for (var j = 0; j < kNumWatchLists; ++j) {
+    for (var j = 0; j < watchList.length; ++j) {
       item = document.createElement("listitem");
       item.setAttribute("id", fullList[i]);
       item.setAttribute("label", fullList[i]);
       item.setAttribute("type", "checkbox");
       item.setAttribute("checked", watchList[j].pref.indexOf(fullList[i]) != -1);
       watchList[j].element.appendChild(item);
     }
 
@@ -99,17 +106,17 @@ function onLoadTinderstatusPrefsPane()
 
     if (fullList[i] == gotoTreePref) {
       gotoTreePopup.parentNode.value = fullList[i];
       gotoTreePopup.selectedItem = item;
     }
   }
 }
 
-function syncToWatchList(aElement)
+function syncToList(aElement)
 {
   var wlArray = [];
   for (var i = 0; i < aElement.getRowCount(); ++i) {
     var wlNode = aElement.getItemAtIndex(i);
     if (wlNode.checked)
       wlArray.push(wlNode.id);
   }
   return wlArray.join(",");
@@ -170,16 +177,42 @@ function tinderstatus_resetFullList() {
 
 function tinderstatus_clearGotoTreePopup() {
   var oldList = document.getElementById("gotoTreePopup");
   while(oldList.hasChildNodes()){
     oldList.removeChild(oldList.firstChild);
   }
  }
 
+function tinderstatus_clearNotifyTrees() {
+  var oldList = document.getElementById("notifyTrees");
+  while(oldList.hasChildNodes()){
+    oldList.removeChild(oldList.firstChild);
+  }
+ }
+ 
+function tinderstatus_clearNotifyTinderboxes() {
+  var oldList = document.getElementById("notifyTinderboxes");
+  while(oldList.hasChildNodes()){
+    oldList.removeChild(oldList.firstChild);
+  }
+ }
+ 
+function tinderstatus_resetNotifyTrees() {
+  var defaultList = gPrefDefaultBranch.getComplexValue("notifyTrees",
+                                           Ci.nsISupportsString).data;
+  void gPrefBranch.setCharPref("notifyTrees",defaultList);
+ }
+ 
+function tinderstatus_resetNotifyTinderboxes() {
+  var defaultList = gPrefDefaultBranch.getComplexValue("notifyTinderboxes",
+                                           Ci.nsISupportsString).data;
+  void gPrefBranch.setCharPref("notifyTinderboxes",defaultList);
+ }
+
 function tinderstatus_resetWatchList() {
   var defaultList = gPrefDefaultBranch.getComplexValue("watchList",
                                            Ci.nsISupportsString).data;
   void gPrefBranch.setCharPref("watchList",defaultList);
 }
 
 function tinderstatus_resetGoToTreePopup() {
   var defaultList = gPrefDefaultBranch.getComplexValue("gotoTree",
@@ -192,12 +225,16 @@ function tinderstatus_resetRefreshTime()
   void gPrefBranch.setIntPref("refreshTime",defaultTime);
 }
 
 function tinderstatus_reset() {
   tinderstatus_resetRefreshTime()
   tinderstatus_resetFullList();
   tinderstatus_clearWatchList();
   tinderstatus_clearGotoTreePopup();
+  tinderstatus_clearNotifyTrees();
+  tinderstatus_clearNotifyTinderboxes();
+  tinderstatus_resetNotifyTrees();
+  tinderstatus_resetNotifyTinderboxes();
   tinderstatus_resetWatchList();
   tinderstatus_resetGoToTreePopup();
   onLoadTinderstatusPrefsPane();
 }
diff -u8pdNr exten-032/chrome/content/prefs.xul exten-042/chrome/content/prefs.xul
--- exten-032/chrome/content/prefs.xul	2009-02-28 14:52:10.000000000 +0100
+++ exten-042/chrome/content/prefs.xul	2011-06-12 17:02:25.052739600 +0200
@@ -66,51 +66,91 @@
     <preference id="extensions.tinderstatus.watchList6"
                 name="extensions.tinderstatus.watchList6" type="string"/>
     <preference id="extensions.tinderstatus.watchList7"
                 name="extensions.tinderstatus.watchList7" type="string"/>
     <preference id="extensions.tinderstatus.watchList8"
                 name="extensions.tinderstatus.watchList8" type="string"/>
     <preference id="extensions.tinderstatus.watchList9"
                 name="extensions.tinderstatus.watchList9" type="string"/>
+    <preference id="extensions.tinderstatus.notifications"
+                name="extensions.tinderstatus.notifications" type="bool"/>
+    <preference id="extensions.tinderstatus.notifyTrees"
+                name="extensions.tinderstatus.notifyTrees" type="string"/>
+    <preference id="extensions.tinderstatus.notifyTinderboxes"
+                name="extensions.tinderstatus.notifyTinderboxes" type="string"/>
     <preference id="extensions.tinderstatus.gotoTree"
                 name="extensions.tinderstatus.gotoTree" type="string"/>
     <preference id="extensions.tinderstatus.refreshTime"
                 name="extensions.tinderstatus.refreshTime" type="int"/>
     <preference id="extensions.tinderstatus.numTrees"
                 name="extensions.tinderstatus.numTrees" type="int"/>
   </preferences>
 
   <vbox>
-    <hbox>
-      <label control="refreshTime" accesskey="&tinderstatus.preferences.refreshtime.accesskey;"
-             value="&tinderstatus.preferences.refreshtime;"/>
-      <textbox id="refreshTime" type="number" size="2" min="1" max="60"
-               preference="extensions.tinderstatus.refreshTime"/>
-    </hbox>
-
-    <hbox>
-      <label control="gotoTree" accesskey="&tinderstatus.preferences.gototree.accesskey;"
-             value="&tinderstatus.preferences.gototree;"/>
-    </hbox>
-    <hbox align="right">
-      <menulist id="gotoTree" preference="extensions.tinderstatus.gotoTree"
-                flex="0">
-        <menupopup id="gotoTreePopup"/>
-      </menulist>
-    </hbox>
+    <grid>
+      <columns>
+        <column/>
+        <column/>
+      </columns>
+      <rows>
+        <row>
+          <label control="refreshTime" accesskey="&tinderstatus.preferences.refreshtime.accesskey;"
+                 value="&tinderstatus.preferences.refreshtime;"/>
+          <textbox id="refreshTime" type="number" size="2" min="1" max="60"
+                   preference="extensions.tinderstatus.refreshTime"/>
+        </row>
 
-    <hbox>
-      <label control="numTrees" accesskey="&tinderstatus.preferences.numberstatusicons.accesskey;"
-             value="&tinderstatus.preferences.numberstatusicons;"/>
-      <textbox id="numTrees" type="number" size="2" min="1" max="10"
-               preference="extensions.tinderstatus.numTrees"/>
-    </hbox>
+        <row>
+          <label control="gotoTree" accesskey="&tinderstatus.preferences.gototree.accesskey;"
+                 value="&tinderstatus.preferences.gototree;"/>
+          <menulist id="gotoTree" preference="extensions.tinderstatus.gotoTree"
+                    flex="0">
+            <menupopup id="gotoTreePopup"/>
+          </menulist>
+        </row>
+        <row>
+          <label control="numTrees" accesskey="&tinderstatus.preferences.numberstatusicons.accesskey;"
+                 value="&tinderstatus.preferences.numberstatusicons;"/>
+          <textbox id="numTrees" type="number" size="2" min="1" max="10"
+                   preference="extensions.tinderstatus.numTrees"/>
+        </row>
+      </rows>
+    </grid>
 
-    <spacer flex="1"/>
+    <tabbox id="mainTabs">
+      <tabs>
+        <tab label="&tinderstatus.preferences.notifyTreesTab.label;" id="notifyTreesTab"/>
+        <tab label="&tinderstatus.preferences.treeWatchTab.label;" id="treeWatchTab"/>
+      </tabs>
+    <tabpanels>
+      <vbox>
+        <checkbox label="&tinderstatus.preferences.notificationsOn.label;"
+                  preference="extensions.tinderstatus.notifications"/>
+        <hbox>
+          <vbox>
+            <label control="notifyTrees"
+                   value="&tinderstatus.preferences.notifyTrees.label;"/>
+            <listbox id="notifyTrees"
+                     preference="extensions.tinderstatus.notifyTrees"
+                     onsynctopreference="return syncToList(this);"
+                     onclick="userChangedValue(event.target);"
+                     onkeyup="userChangedValue(event.target);"/>
+          </vbox>
+          <vbox>
+            <label control="notifyTinderboxes"
+                   value="&tinderstatus.preferences.notifyTinderboxes.label;"/>
+            <listbox id="notifyTinderboxes"
+                     preference="extensions.tinderstatus.notifyTinderboxes"
+                     onsynctopreference="return syncToList(this);"
+                     onclick="userChangedValue(event.target);"
+                     onkeyup="userChangedValue(event.target);"/>
+          </vbox>
+        </hbox>
+      </vbox>
 
     <!-- The preferences system doesn't seem to want to be dynamic in swapping
          which elements preferences belong to. Therefore we have to do this
          the long way :-( -->
     <tabbox id="treeTabs">
       <tabs>
         <tab label="1" id="tab0"/>
         <tab label="2" id="tab1"/>
@@ -127,94 +167,96 @@
       <tabpanels>
         <vbox>
           <label control="watchList" value="&tinderstatus.preferences.watchlist;"
                  accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
 
           <!-- onclick/onkeyup used due to the listitems not reporting up that
                they have been changed -->
           <listbox preference="extensions.tinderstatus.watchList" id="watchList"
-                   onsynctopreference="return syncToWatchList(this);"
+                   onsynctopreference="return syncToList(this);"
                    onclick="userChangedValue(event.target);"
                    onkeyup="userChangedValue(event.target);"/>
 	</vbox>
         <vbox>
           <label control="watchList1" value="&tinderstatus.preferences.watchlist;"
                  accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
           <listbox preference="extensions.tinderstatus.watchList1" id="watchList1"
-                   onsynctopreference="return syncToWatchList(this);"
+                   onsynctopreference="return syncToList(this);"
                    onclick="userChangedValue(event.target);"
                    onkeyup="userChangedValue(event.target);"/>
 	</vbox>
         <vbox>
           <label control="watchList2" value="&tinderstatus.preferences.watchlist;"
                  accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
           <listbox preference="extensions.tinderstatus.watchList2" id="watchList2"
-                   onsynctopreference="return syncToWatchList(this);"
+                   onsynctopreference="return syncToList(this);"
                    onclick="userChangedValue(event.target);"
                    onkeyup="userChangedValue(event.target);"/>
 	</vbox>
         <vbox>
           <label control="watchList3" value="&tinderstatus.preferences.watchlist;"
                  accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
           <listbox preference="extensions.tinderstatus.watchList3" id="watchList3"
-                   onsynctopreference="return syncToWatchList(this);"
+                   onsynctopreference="return syncToList(this);"
                    onclick="userChangedValue(event.target);"
                    onkeyup="userChangedValue(event.target);"/>
 	</vbox>
         <vbox>
           <label control="watchList4" value="&tinderstatus.preferences.watchlist;"
                  accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
           <listbox preference="extensions.tinderstatus.watchList4" id="watchList4"
-                   onsynctopreference="return syncToWatchList(this);"
+                   onsynctopreference="return syncToList(this);"
                    onclick="userChangedValue(event.target);"
                    onkeyup="userChangedValue(event.target);"/>
 	</vbox>
         <vbox>
           <label control="watchList5" value="&tinderstatus.preferences.watchlist;"
                  accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
           <listbox preference="extensions.tinderstatus.watchList5" id="watchList5"
-                   onsynctopreference="return syncToWatchList(this);"
+                   onsynctopreference="return syncToList(this);"
                    onclick="userChangedValue(event.target);"
                    onkeyup="userChangedValue(event.target);"/>
 	</vbox>
         <vbox>
           <label control="watchList6" value="&tinderstatus.preferences.watchlist;"
                  accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
           <listbox preference="extensions.tinderstatus.watchList6" id="watchList6"
-                   onsynctopreference="return syncToWatchList(this);"
+                   onsynctopreference="return syncToList(this);"
                    onclick="userChangedValue(event.target);"
                    onkeyup="userChangedValue(event.target);"/>
 	</vbox>
         <vbox>
           <label control="watchList7" value="&tinderstatus.preferences.watchlist;"
                  accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
           <listbox preference="extensions.tinderstatus.watchList7" id="watchList7"
-                   onsynctopreference="return syncToWatchList(this);"
+                   onsynctopreference="return syncToList(this);"
                    onclick="userChangedValue(event.target);"
                    onkeyup="userChangedValue(event.target);"/>
 	</vbox>
         <vbox>
           <label control="watchList8" value="&tinderstatus.preferences.watchlist;"
                  accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
           <listbox preference="extensions.tinderstatus.watchList8" id="watchList8"
-                   onsynctopreference="return syncToWatchList(this);"
+                   onsynctopreference="return syncToList(this);"
                    onclick="userChangedValue(event.target);"
                    onkeyup="userChangedValue(event.target);"/>
 	</vbox>
         <vbox>
           <label control="watchList9" value="&tinderstatus.preferences.watchlist;"
                  accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
           <listbox preference="extensions.tinderstatus.watchList9" id="watchList9"
-                   onsynctopreference="return syncToWatchList(this);"
+                   onsynctopreference="return syncToList(this);"
                    onclick="userChangedValue(event.target);"
                    onkeyup="userChangedValue(event.target);"/>
 	</vbox>
       </tabpanels>
     </tabbox>
+    </tabpanels>
+    </tabbox>
     <hbox>
       <button id="ts-addTinderbox-button" label="&tinderstatus.preferences.showhide.tinderboxes.button;"
               accesskey="&tinderstatus.preferences.showhide.tinderboxes.accesskey;"
               oncommand="tinderstatus_showhideTinderboxesDialog();"/>
       <button id="ts-resetWatchList-button" label="&tinderstatus.preferences.resettodefault;"
               accesskey="&tinderstatus.preferences.resettodefault.accesskey;"
               oncommand="tinderstatus_reset();"/>
     </hbox>
diff -u8pdNr exten-032/chrome/content/showhideTinderboxes.js exten-042/chrome/content/showhideTinderboxes.js
--- exten-032/chrome/content/showhideTinderboxes.js	2009-02-28 14:35:16.000000000 +0100
+++ exten-042/chrome/content/showhideTinderboxes.js	2011-06-12 17:39:47.876021800 +0200
@@ -102,10 +102,12 @@ function mergeAndSync()
   void gPrefBranch.setCharPref("fullList",syncArray);
   return syncArray;
 }
 
 function refreshParent()
 {
   opener.tinderstatus_clearWatchList();
   opener.tinderstatus_clearGotoTreePopup();
+  opener.tinderstatus_clearNotifyTrees();
+  opener.tinderstatus_clearNotifyTinderboxes();
   opener.onLoadTinderstatusPrefsPane();
 }
diff -u8pdNr exten-032/chrome/content/tinderstatus.css exten-042/chrome/content/tinderstatus.css
--- exten-032/chrome/content/tinderstatus.css	2009-02-28 12:27:14.000000000 +0100
+++ exten-042/chrome/content/tinderstatus.css	2011-06-12 13:20:18.168072700 +0200
@@ -61,16 +61,20 @@ statusbarpanel#tinderstatus-panel {
 .tinderstatus-box[buildstatus="testfailed"] {
   background-color: #FFAA00;
 }
 
 .tinderstatus-box[buildstatus="busted"] {
   background-color: #EE0000;
 }
 
+.tinderstatus-box[buildstatus="exception"] {
+  background-color: #770088;
+}
+
 /* Superimpose an icon on the box to reflect tree status. */
 .tinderstatus-icon[treestatus="open"] {
   list-style-image: url("chrome://tinderstatus/content/tree-open.png");
   padding-top: 1px;
 }
 
 .tinderstatus-icon[treestatus="closed"] {
   list-style-image: url("chrome://tinderstatus/content/tree-closed.png");
diff -u8pdNr exten-032/chrome/content/tinderstatus.js exten-042/chrome/content/tinderstatus.js
--- exten-032/chrome/content/tinderstatus.js	2009-12-13 21:54:20.000000000 +0100
+++ exten-042/chrome/content/tinderstatus.js	2011-06-12 17:57:48.818848200 +0200
@@ -32,17 +32,17 @@
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
 // This file was completely rewritten in June, 2005 by Alexander J. Vincent.
 
-const tsOptionsURL = "chrome://tinderstatus/content/prefs.xul"
+const tsOptionsURL = "chrome://tinderstatus/content/prefs.xul";
 
 if (!Cc)
   var Cc = Components.classes;
 if (!Ci)
   var Ci = Components.interfaces;
 
 // FIXME: don't set a bunch of non-namespaced global variables.
 
@@ -57,41 +57,42 @@ var appInfo = Cc['@mozilla.org/xre/app-i
 
 var bundle = srGetStrBundle("chrome://tinderstatus/locale/tinderstatus.properties");
 var preferencesLabel = bundle.GetStringFromName( "preferencesLabel" );
 var noTinderboxSelected = bundle.GetStringFromName( "noTinderboxSelected" );
 var lastUpdate = bundle.GetStringFromName( "lastUpdate" );
 var tinderboxesAllGreen = bundle.GetStringFromName( "tinderboxesAllGreen" );
 var tinderboxesUnknownStatus = bundle.GetStringFromName( "tinderboxesUnknownStatus" );
 var tooltipWatching = bundle.GetStringFromName( "tooltipWatching" );
+var updatedTreeStatusLabel = bundle.GetStringFromName( "updatedTreeStatusLabel" );
+var stillNoSuccessLabel = bundle.GetStringFromName( "stillNoSuccessLabel" );
 
 // The order in this list somewhat matters, as the first item is the one
 // that gets loaded when you click on the statusbar icon.
 var gTinderboxIndex = -1;
 var gTinderboxText  = "";
 var gTinderboxURIIndex = 0;
 var gTinderboxIntervalID = 0;
 var gTinderboxLastUpdate = null;
 
 // FIXME: move all the top-level variables into this object so they don't
 // pollute the global namespace and potentially conflict with other extensions
 // and core code.
 var Tinderstatus = {
   _numTrees: 1,
   _treeBoxes: null,
-  _tinderboxResults: {},
   _internalTinderboxQueryList: [],
 
-  // This flag is used so that we don't update the tinderboxQueryList whilst
+  // An array of the current tinderbox list and the specific results for the
+  tinderboxDetails: [],
+
+  // This flag is used so that we don't update the tinderboxDetails whilst
   // we're in the middle of a set of queries
   _tinderboxListUpdateRequired: true,
 
-  // The set of tinderboxes we need to check to cover all icons.
-  tinderboxQueryList: [],
-
   init: function() {
     // If we haven't yet converted references to the Firefox3.1 tree into
     // references to the Firefox3.5 tree (to which it was renamed), do so now.
     // FIXME: remove this code after everyone has updated to Tinderstatus 0.3.1
     // or a newer version.
     if (!this._prefs.getBoolPref("renamed_Firefox3.1_to_Firefox3.5")) {
       var i = 0, watchList = "watchList";
       // Go through watchlist prefs and update the ones with user set values.
@@ -104,50 +105,57 @@ var Tinderstatus = {
                          map(function(v) v == "Firefox3.1" ? "Firefox3.5" : v).   // Firefox3.1 -> Firefox3.5
                          sort().                                                  // sort to enable duplicate filtration
                          filter(function(v, i, a) i == 0 || v != a[i-1]).         // remove duplicates (i.e. Firefox3.5 twice)
                          join(",");                                               // join into string of trees
           this._prefs.setComplexValue(watchList, Ci.nsISupportsString, newWatchList);
         }
         watchList = "watchList" + ++i;
       }
-	  
-	  convertFullList();
-	  
-	  convertFullListApplications();
-	  
-	  convertGotoTree();
-	  
       this._prefs.setBoolPref("renamed_Firefox3.1_to_Firefox3.5", true);
     }
 
     this._numTrees = this._prefs.getIntPref("numTrees");
     // Must have at least one tree.
     if (this._numTrees <= 0)
       this._numTrees = 1;
 
-    let prefValue = ""
+    let prefValue = "";
     try {
       prefValue = Tinderstatus._prefs.getComplexValue("watchList", Ci.nsISupportsString).data;
     }
     catch (e) { }
 
     let toolTip = document.getElementById("tinderstatus-tooltip");
 
     this._treeBoxes = [ { box: document.getElementById("tinderstatus-box"),
                           tooltip: toolTip,
                           trees: prefValue } ];
   },
 
   updateCurrentTinderboxList: function () {
-    this.tinderboxQueryList = this._internalTinderboxQueryList;
+    let oldTinderboxDetails = this.tinderboxDetails;
+    this.tinderboxDetails = [];
+    function addDetails(element) {
+      let oldDetails = null;
+      for (let i = 0; i < oldTinderboxDetails.length; ++i) {
+        if (oldTinderboxDetails[i].tree == element)
+          oldDetails = oldTinderboxDetails[i];
+      }
+      Tinderstatus.tinderboxDetails.push(oldDetails ? oldDetails :
+                                         {tree: element,
+                                          result: "",
+                                          lastStatus: "Unknown" });
+    }
+
+    this._internalTinderboxQueryList.forEach(addDetails);
     this._tinderboxListUpdateRequired = false;
   },
 
-  // This function just goes through everything (number of tress/what to watch)
+  // This function just goes through everything (number of trees/what to watch)
   // and refreshes everything.
   updateTreeIconsAndPrefs: function() {
     var i;
 
     this._numTrees = this._prefs.getIntPref("numTrees");
     // Must have at least one tree.
     if (this._numTrees <= 0)
       this._numTrees = 1;
@@ -198,42 +206,147 @@ var Tinderstatus = {
       catch (e) { }
 
       this._treeBoxes[i].trees = prefValue;
       this._treeBoxes[i].tooltip
           .childNodes[1].setAttribute("value", tooltipWatching + prefValue);
       newList = newList.concat(prefValue.split(","));
     }
 
+    // Also add any we're getting notifications for, but not actually watching
+    var notifyTrees = this._prefs.getCharPref("notifyTinderboxes") + "," +
+                      this._prefs.getCharPref("notifyTrees");
+
+    newList = newList.concat(notifyTrees.split(","));
+
     // Now strip out any duplicates
     this._internalTinderboxQueryList = [];
     for (i = 0; i < newList.length; ++i) {
-      if (this._internalTinderboxQueryList.indexOf(newList[i], 0) < 0)
+      if (newList[i] &&
+          this._internalTinderboxQueryList.indexOf(newList[i], 0) < 0)
 	this._internalTinderboxQueryList.push(newList[i]);
     }
     this._tinderboxListUpdateRequired = true;
   },
 
+  translateStatus: function (text) {
+    if (!text)
+      return "Unknown";
+
+    let status = "Unknown";
+
+    if (text.indexOf("busted") != -1) {
+      status = "Busted";
+    }
+    else if (text.indexOf("testfailed") != -1) {
+      status = "Test Failed";
+    }
+    else if (text.indexOf("exception") != -1) {
+      status = "Non-build failure";
+    }
+    else if (text.indexOf("success") != -1) {
+      status = "Success";
+    }
+
+    return status;
+  },
+
+  checkUpdatedTree: function (index) {
+    let currentStatus = this.translateStatus(this.tinderboxDetails[index].result);
+    let notifyTrees = this._prefs.getCharPref("notifyTrees").split(",");
+    let treeName = this.tinderboxDetails[index].tree;
+    let lastStatus = this.tinderboxDetails[index].lastStatus;
+
+    if (notifyTrees.indexOf(treeName) != -1 &&
+        lastStatus != currentStatus &&
+        currentStatus != "Unknown" && lastStatus != "Unknown") {
+      this.showAlert(treeName, updatedTreeStatusLabel + currentStatus);
+    }
+    this.tinderboxDetails[index].lastStatus = currentStatus;
+  },
+
+  checkUpdatedTinderboxes: function (index) {
+    let currentText = this.tinderboxDetails[index].result;
+    let boxes = currentText.split("\n");
+
+    let notifyTinderboxes = this._prefs.getCharPref("notifyTinderboxes").split(",");
+
+    let treeName = this.tinderboxDetails[index].tree;
+
+    if (notifyTinderboxes.indexOf(treeName) == -1)
+      return;
+
+    for (let i = 0; i < boxes.length; ++i) {
+      let details = boxes[i].split("|");
+      let boxName = details[2];
+      let boxStatus = this.translateStatus(details[3]);
+
+      if (!(boxName in this.tinderboxDetails[index])) {
+        this.tinderboxDetails[index][boxName] = {
+          status: boxStatus,
+          time: details[4]
+        };
+        // New box, no point in progressing here.
+        continue;
+      }
+
+      if (boxStatus != "Unknown") {
+        let lastBoxStatus = this.tinderboxDetails[index][boxName].status;
+        let lastBoxTime = this.tinderboxDetails[index][boxName].time;
+
+        // Show an alert if the status has changed
+        if (lastBoxStatus != boxStatus && lastBoxStatus != "Unknown")
+          this.showAlert(treeName, "Builder: " + boxName + " Status: " + boxStatus);
+        // Show an alert if the status isn't success and a new build has
+        // completed but not changed state.
+        else if (lastBoxStatus == boxStatus && boxStatus != "Success" &&
+            lastBoxTime != details[4])
+          this.showAlert(treeName, "Builder: " + boxName + stillNoSuccessLabel + boxStatus);
+      }
+
+      this.tinderboxDetails[index][boxName].status = boxStatus;
+      this.tinderboxDetails[index][boxName].time = details[4];
+    }
+  },
+
   get _prefSvc() {
     delete this._prefSvc;
     return this._prefSvc = Cc["@mozilla.org/preferences-service;1"].
                            getService(Ci.nsIPrefService);
   },
 
   // FIXME: use the Preferences module to make this easier.
   // https://wiki.mozilla.org/Labs/JS_Modules#Preferences
   get _prefs() {
     delete this._prefs;
     return this._prefs = this._prefSvc.
                          getBranch("extensions.tinderstatus.").
                          QueryInterface(Ci.nsIPrefBranch2);
+  },
+
+  onContextShowing: function () {
+    document.getElementById("tinderstatus-notifications").
+      setAttribute("checked", this._prefs.getBoolPref("notifications"));
+  },
+
+  onNotificationToggled: function () {
+    this._prefSvc.QueryInterface(Ci.nsIPrefBranch).setBoolPref("extensions.tinderstatus.notifications", !!document.getElementById("tinderstatus-notifications").getAttribute("checked"));
+  },
+
+  showAlert: function (title, text) {
+    if (this._prefs.getBoolPref("notifications")) {
+      let alertsService = Components.classes["@mozilla.org/alerts-service;1"]
+        .getService(Components.interfaces.nsIAlertsService);
+
+      alertsService.showAlertNotification("Tree State", title, text);
+    }
   }
 };
 
-var tinderstatusPrefObserver = 
+var tinderstatusPrefObserver =
 {
   register: function()
   {
     Tinderstatus._prefs.addObserver("", this, false);
   },
 
   unregister: function()
   {
@@ -310,17 +423,17 @@ function setUpTinderboxMenuPopup() {
 
   // Get the full list of tinderboxes that we know about.
   var fullList;
 
   try {
     fullList = Tinderstatus._prefs.getComplexValue("fullList", Ci.nsISupportsString).data;
   }
   catch (ex) {
-    fullList = "Bugzilla,Camino,Firefox,Firefox-Ports,Firefox3.5,Firefox3.6,Mobile,SeaMonkey,SeaMonkey-Ports,Sunbird,Thunderbird,Thunderbird3.1,XULRunner";
+    fullList = "Birch,Bugzilla,Build-System,Camino,Cedar,Firefox,Firefox3.6,Firefox3.5,Mapel,Miramar,Mobile,Places,SeaMonkey,CalendarTrunk,Calendar1.0,ThunderbirdTrunk,Thunderbird3.1,TraceMonkey,XULRunner";
   }
 
   fullList = fullList.split(",");
 
   // Now add the tinderboxes onto the menu
   var item;
   for (var i = 0; i < fullList.length; ++i) {
     item = document.createElement("menuitem");
@@ -367,17 +480,17 @@ function getRefreshTime() {
     if (refreshTime < 60000)
       refreshTime = 60000;
   }
   catch(ex) {
     // set to default of one minute.
     refreshTime = 60000;
   }
 
-  return refreshTime;                                           
+  return refreshTime;
 }
 
 /**
  * Load into the browser a current tinderbox page.
  */
 function loadTinderboxURI(evt) {
   // Only load for left or middle click events.
   if (evt.button > 1)
@@ -389,17 +502,17 @@ function loadTinderboxURI(evt) {
   }
   catch (ex) {
     // If we can't get the pref, set to the default
     tinderboxToLoad = "Firefox";
   }
 
   if (tinderboxToLoad != "") {
     var url = "http://tinderbox.mozilla.org/" + tinderboxToLoad + "/";
-      if(appInfo.name == 'Sunbird') {
+    if(appInfo.name == 'Sunbird') {
         var uriTinderbox = ioservice.newURI(url, null, null);
         extps.loadURI(uriTinderbox, null);
         }
       else {
         if (!handleLinkClick(evt, url, null)) {
           loadURI(url);
         }
     }
@@ -428,62 +541,63 @@ function refreshTinderboxenStatus() {
   getTinderboxStatus();
 }
 
 /**
  * Request a tinderbox summary from one tree.
  */
 function getTinderboxStatus() {
   // If no items selected, just show nothing.
-  if (Tinderstatus.tinderboxQueryList.length == 0) {
+  if (Tinderstatus.tinderboxDetails.length == 0) {
     document.getElementById('tinderstatus-box')
             .setAttribute("buildstatus", "none");
 
     //    setTinderboxStatus(noTinderboxSelected);
     gTinderboxURIIndex = 0;
     return;
   }
 
   gTinderboxIndex++;
-  if (gTinderboxIndex == Tinderstatus.tinderboxQueryList.length) {
+  if (gTinderboxIndex == Tinderstatus.tinderboxDetails.length) {
     return;
   }
   var url = "http://tinderbox.mozilla.org/";
-  url += Tinderstatus.tinderboxQueryList[gTinderboxIndex];
+  url += Tinderstatus.tinderboxDetails[gTinderboxIndex].tree;
   url += "/quickparse.txt";
 
   // Oh, how I wish we didn't have to reinitialize every time.
   gXMLHttpRequest = new XMLHttpRequest();
   gXMLHttpRequest.onload = displayTinderboxStatus;
   gXMLHttpRequest.onerror = handleRequestError;
   gXMLHttpRequest.open("GET", url);
   gXMLHttpRequest.send(null);
 }
 
 function handleRequestError() {
+  // Empty out the result for the current request.
+  Tinderstatus.tinderboxDetails[gTinderboxIndex].result = "";
   // Abort current attempt, wait for next refresh
   gTinderboxIndex = -1;
   gTinderboxText = "";
-  Tinderstatus._tinderboxResults = {};
 }
 
 function getSetLastUpdated() {
   gTinderboxLastUpdate = new Date();
 
   var result = lastUpdate;
 
   if (gTinderboxLastUpdate.getHours() < 10)
     result += "0";
-  
+
   result += gTinderboxLastUpdate.getHours();
 
   result += gTinderboxLastUpdate.getMinutes() < 10 ? ":0" : ":";
 
   result += gTinderboxLastUpdate.getMinutes();
-  
+
   result += gTinderboxLastUpdate.getSeconds() < 10 ? ":0" : ":";
 
   return result + gTinderboxLastUpdate.getSeconds();
 }
 
 /**
  * Indicate via tooltip tinderboxes which show failures.
  */
@@ -526,52 +640,62 @@ function setTinderboxStatus(aTooltip, aM
 
 /**
  * Handle response from tinderbox server, and update status bar.
  */
 function displayTinderboxStatus()
 {
   var text = gXMLHttpRequest.responseText + "\n";
   gTinderboxText += text;
-  Tinderstatus._tinderboxResults[Tinderstatus.tinderboxQueryList[gTinderboxIndex]] = text;
+  Tinderstatus.tinderboxDetails[gTinderboxIndex].result = text;
+
+  Tinderstatus.checkUpdatedTree(gTinderboxIndex);
+  Tinderstatus.checkUpdatedTinderboxes(gTinderboxIndex);
 
   // Note which tinderbox fails.
   if ((gTinderboxURIIndex == 0) &&
-      ((text.indexOf("busted") != -1) || (text.indexOf("testfailed") != -1))) {
+      ((text.indexOf("busted") != -1) || (text.indexOf("testfailed") != -1) ||
+       (text.indexOf("exception") != -1))) {
     gTinderboxURIIndex = gTinderboxIndex;
   }
 
   // Do we need to loop around again?
-  if (gTinderboxIndex < (Tinderstatus.tinderboxQueryList.length - 1)) {
+  if (gTinderboxIndex < (Tinderstatus.tinderboxDetails.length - 1)) {
     getTinderboxStatus();
     return;
   }
 
   // Change the background color of the box depending to reflect build status.
   for (let i = 0; i < Tinderstatus._treeBoxes.length; ++i) {
     let box = Tinderstatus._treeBoxes[i].box;
     let tooltip = Tinderstatus._treeBoxes[i].tooltip;
     let prefs = Tinderstatus._treeBoxes[i].trees.split(",");
     let reducedText = "";
     for (let j = 0; j < prefs.length; ++j) {
-      if (prefs[j] in Tinderstatus._tinderboxResults)
-	reducedText += Tinderstatus._tinderboxResults[prefs[j]] + "\n";
+      for (let k = 0; k < Tinderstatus.tinderboxDetails.length; ++k)
+        if (Tinderstatus.tinderboxDetails[k].tree == prefs[j])
+          reducedText += Tinderstatus.tinderboxDetails[k].result + "\n";
     }
 
-    var re;
+    let re;
     if (reducedText.indexOf("busted") != -1) {
-      re = /.*(busted|testfailed)/g;
+      re = /.*(busted|testfailed|exception)/g;
       fillTinderboxStatus(tooltip, reducedText, re);
       box.setAttribute("buildstatus", "busted");
     }
     else if (reducedText.indexOf("testfailed") != -1) {
-      re = /.*testfailed/g;
+      re = /.*(testfailed|exception)/g;
       fillTinderboxStatus(tooltip, reducedText, re);
       box.setAttribute("buildstatus", "testfailed");
     }
+    else if (reducedText.indexOf("exception") != -1) {
+      re = /.*exception/g;
+      fillTinderboxStatus(tooltip, reducedText, re);
+      box.setAttribute("buildstatus", "exception");
+    }
     else if (reducedText.indexOf("success") != -1) {
       setTinderboxStatus(tooltip, tinderboxesAllGreen);
       box.setAttribute("buildstatus", "success");
       gTinderboxURIIndex = 0;
     }
     else {
       setTinderboxStatus(tooltip, tinderboxesUnknownStatus);
       box.setAttribute("buildstatus", "none");
diff -u8pdNr exten-032/chrome/locale/de/overlay.dtd exten-042/chrome/locale/de/overlay.dtd
--- exten-032/chrome/locale/de/overlay.dtd	2008-01-13 01:56:00.000000000 +0100
+++ exten-042/chrome/locale/de/overlay.dtd	2011-06-12 14:21:18.312601900 +0200
@@ -1,6 +1,8 @@
 <!ENTITY tinderstatus.context.opentree "Offener Verzeichnisbaum:">
 <!ENTITY tinderstatus.context.preferences "Einstellungen…">
 <!ENTITY tinderstatus.context.preferences.accesskey "E">
+<!ENTITY tinderstatus.context.notifications "Benachrichtigungen">
+<!ENTITY tinderstatus.context.notifications.accesskey "B">
 <!ENTITY tinderstatus.context.refresh.now "Jetzt aktualisieren">
 <!ENTITY tinderstatus.context.refresh.now.accesskey "a">
 <!ENTITY tinderstatus.tooltip "Bislang keine Statusinformationen erhalten.">
diff -u8pdNr exten-032/chrome/locale/de/prefs.dtd exten-042/chrome/locale/de/prefs.dtd
--- exten-032/chrome/locale/de/prefs.dtd	2009-02-28 14:48:50.000000000 +0100
+++ exten-042/chrome/locale/de/prefs.dtd	2011-06-12 17:31:01.584919700 +0200
@@ -7,8 +7,13 @@
 <!ENTITY tinderstatus.preferences.watchlist "Zu beobachtende Quellen-Verzeichnisbäume auswählen: ">
 <!ENTITY tinderstatus.preferences.watchlist.accesskey "T">
 <!ENTITY tinderstatus.preferences.showhide.tinderboxes.button "Liste anpassen…">
 <!ENTITY tinderstatus.preferences.showhide.tinderboxes.accesskey "L">
 <!ENTITY tinderstatus.preferences.resettodefault "Einstellungen zurücksetzen">
 <!ENTITY tinderstatus.preferences.resettodefault.accesskey "z">
 <!ENTITY tinderstatus.preferences.numberstatusicons "Anzahl Statusleisten-Symbole:">
 <!ENTITY tinderstatus.preferences.numberstatusicons.accesskey "N">
+<!ENTITY tinderstatus.preferences.notifyTreesTab.label "Benachrichtigungen">
+<!ENTITY tinderstatus.preferences.treeWatchTab.label "Quellen-Beobachtung">
+<!ENTITY tinderstatus.preferences.notificationsOn.label "Benachrichtigungen anzeigen">
+<!ENTITY tinderstatus.preferences.notifyTrees.label "Benachrichtigung bei Statusänderung:">
+<!ENTITY tinderstatus.preferences.notifyTinderboxes.label "Benachrichtigung für einzelne Builds:">
diff -u8pdNr exten-032/chrome/locale/de/tinderstatus.properties exten-042/chrome/locale/de/tinderstatus.properties
--- exten-032/chrome/locale/de/tinderstatus.properties	2009-02-28 14:44:48.000000000 +0100
+++ exten-042/chrome/locale/de/tinderstatus.properties	2011-06-12 17:57:11.479712500 +0200
@@ -1,7 +1,9 @@
 extensions.{CE49928A-7804-4688-8C9E-ABCBC7FB9BCF}.description=Statusleisten-Symbol, das über den Status von Mozilla-Tinderboxen informiert.
 preferencesLabel=Einstellungen…
 noTinderboxSelected=Keine Tinderbox ausgewählt.
 lastUpdate=Letzte Aktualisierung:
 tinderboxesAllGreen=Alle Tinderboxen sind grün.
 tinderboxesUnknownStatus=Unbekannter Tinderbox-Status.
 tooltipWatching=Beobachte: 
+updatedTreeStatusLabel=Status ist jetzt: 
+stillNoSuccessLabel= ist weiterhin 
diff -u8pdNr exten-032/chrome/locale/en-US/overlay.dtd exten-042/chrome/locale/en-US/overlay.dtd
--- exten-032/chrome/locale/en-US/overlay.dtd	2008-01-13 01:59:00.000000000 +0100
+++ exten-042/chrome/locale/en-US/overlay.dtd	2011-06-12 14:19:45.314282700 +0200
@@ -1,6 +1,8 @@
 <!ENTITY tinderstatus.context.opentree "Open Tree:">
 <!ENTITY tinderstatus.context.preferences "Options">
 <!ENTITY tinderstatus.context.preferences.accesskey "O">
+<!ENTITY tinderstatus.context.notifications "Notifications">
+<!ENTITY tinderstatus.context.notifications.accesskey "N">
 <!ENTITY tinderstatus.context.refresh.now "Refresh now">
 <!ENTITY tinderstatus.context.refresh.now.accesskey "R">
 <!ENTITY tinderstatus.tooltip "No status retrieved yet.">
diff -u8pdNr exten-032/chrome/locale/en-US/prefs.dtd exten-042/chrome/locale/en-US/prefs.dtd
--- exten-032/chrome/locale/en-US/prefs.dtd	2009-02-28 14:47:00.000000000 +0100
+++ exten-042/chrome/locale/en-US/prefs.dtd	2011-06-12 17:02:04.225548400 +0200
@@ -7,8 +7,13 @@
 <!ENTITY tinderstatus.preferences.watchlist "Choose trees to watch: ">
 <!ENTITY tinderstatus.preferences.watchlist.accesskey "T">
 <!ENTITY tinderstatus.preferences.showhide.tinderboxes.button "Customize list…">
 <!ENTITY tinderstatus.preferences.showhide.tinderboxes.accesskey "L">
 <!ENTITY tinderstatus.preferences.resettodefault "Reset settings to default">
 <!ENTITY tinderstatus.preferences.resettodefault.accesskey "d">
 <!ENTITY tinderstatus.preferences.numberstatusicons "Number of Status Icons">
 <!ENTITY tinderstatus.preferences.numberstatusicons.accesskey "N">
+<!ENTITY tinderstatus.preferences.notifyTreesTab.label "Notifications">
+<!ENTITY tinderstatus.preferences.treeWatchTab.label "Tree Watching">
+<!ENTITY tinderstatus.preferences.notificationsOn.label "Notifications On">
+<!ENTITY tinderstatus.preferences.notifyTrees.label "Notify me when these trees change status:">
+<!ENTITY tinderstatus.preferences.notifyTinderboxes.label "Notify me about individual builds on these trees:">
diff -u8pdNr exten-032/chrome/locale/en-US/tinderstatus.properties exten-042/chrome/locale/en-US/tinderstatus.properties
--- exten-032/chrome/locale/en-US/tinderstatus.properties	2009-02-28 14:43:14.000000000 +0100
+++ exten-042/chrome/locale/en-US/tinderstatus.properties	2011-06-12 17:53:20.895523800 +0200
@@ -1,7 +1,9 @@
 extensions.{CE49928A-7804-4688-8C9E-ABCBC7FB9BCF}.description=Satusbar icon showing the status of Mozilla tinderboxes.
 preferencesLabel=Options…
 noTinderboxSelected=No tinderbox selected.
 lastUpdate=Last Updated: 
 tooltipWatching=Watching: 
 tinderboxesAllGreen=All tinderboxes are green.
 tinderboxesUnknownStatus=Unknown tinderbox status.
+updatedTreeStatusLabel=Tree state is now: 
+stillNoSuccessLabel= is still 
diff -u8pdNr exten-032/defaults/preferences/tinderstatus.js exten-042/defaults/preferences/tinderstatus.js
--- exten-032/defaults/preferences/tinderstatus.js	2009-12-13 21:52:00.000000000 +0100
+++ exten-042/defaults/preferences/tinderstatus.js	2011-06-12 16:46:59.418796400 +0200
@@ -1,8 +1,12 @@
 pref("extensions.{CE49928A-7804-4688-8C9E-ABCBC7FB9BCF}.description", "chrome://tinderstatus/locale/tinderstatus.properties");
-pref("extensions.tinderstatus.fullList", "Bugzilla,Camino,Firefox,Firefox-Ports,Firefox3.5,Firefox3.6,Mobile,SeaMonkey,SeaMonkey-Ports,Sunbird,Thunderbird,Thunderbird3.1,XULRunner");
-pref("extensions.tinderstatus.fullList.applications", "Bugzilla,Bugzilla3.0,Bugzilla3.2,Bugzilla3.4,Calendar1.0,Camino,Electrolysis,Electrolysis-Unittest,Firefox,Firefox-Ports,Firefox-Staging,Firefox-Unittest,Firefox3.0,Firefox3.5,Firefox3.5-Unittest,Firefox3.6,Firefox3.6-Release,Firefox3.6-Unittest,Geriatric-Machines,LeakTest,Mobile,Mozilla1.8,Mozilla1.8-SeaMonkey,Mozilla1.8-Staging,MozillaExperimental,MozillaRelease,MozillaStaging,MozillaTest,MozillaTest-BACKUP,MozillaTest-Release,MozillaTestBroken,MozillaTestBroken2,MozillaTry,Nanojit,NSS,NSS-Stable-Branch,SeaMonkey,SeaMonkey-Ports,SeaMonkey2.0,Sunbird,Sunbird-Mozilla1.8,Testing,Thunderbird,Thunderbird-Ports,Thunderbird3.0,Thunderbird3.1,ThunderbirdTest,ThunderbirdTry,TraceMonkey,TraceMonkeyUnitTest,UnitTest,XULRunner");
-pref("extensions.tinderstatus.fullList.localizations", "Mozilla-l10n,Mozilla-l10n-af,Mozilla-l10n-ar,Mozilla-l10n-as,Mozilla-l10n-be,Mozilla-l10n-bg,Mozilla-l10n-bn-BD,Mozilla-l10n-bn-IN,Mozilla-l10n-ca,Mozilla-l10n-cs,Mozilla-l10n-cy,Mozilla-l10n-da,Mozilla-l10n-de,Mozilla-l10n-el,Mozilla-l10n-en-GB,Mozilla-l10n-en-ZA,Mozilla-l10n-eo,Mozilla-l10n-es-AR,Mozilla-l10n-es-CL,Mozilla-l10n-es-ES,Mozilla-l10n-es-MX,Mozilla-l10n-et,Mozilla-l10n-eu,Mozilla-l10n-fa,Mozilla-l10n-fi,Mozilla-l10n-fr,Mozilla-l10n-fy-NL,Mozilla-l10n-ga-IE,Mozilla-l10n-gl,Mozilla-l10n-gu-IN,Mozilla-l10n-he,Mozilla-l10n-hi-IN,Mozilla-l10n-hr,Mozilla-l10n-hu,Mozilla-l10n-hy-AM,Mozilla-l10n-id,Mozilla-l10n-is,Mozilla-l10n-it,Mozilla-l10n-ja,Mozilla-l10n-ja-JP-mac,Mozilla-l10n-ka,Mozilla-l10n-kk,Mozilla-l10n-kn,Mozilla-l10n-ko,Mozilla-l10n-ku,Mozilla-l10n-lt,Mozilla-l10n-lv,Mozilla-l10n-mk,Mozilla-l10n-ml,Mozilla-l10n-mn,Mozilla-l10n-mr,Mozilla-l10n-ms,Mozilla-l10n-nb-NO,Mozilla-l10n-ne-NP,Mozilla-l10n-nl,Mozilla-l10n-nn-NO,Mozilla-l10n-oc,Mozilla-l10n-or,Mozilla-l10n-pa-IN,Mozilla-l10n-pl,Mozilla-l10n-pt-BR,Mozilla-l10n-pt-PT,Mozilla-l10n-rm,Mozilla-l10n-ro,Mozilla-l10n-ru,Mozilla-l10n-rw,Mozilla-l10n-si,Mozilla-l10n-sk,Mozilla-l10n-sl,Mozilla-l10n-sq,Mozilla-l10n-sr,Mozilla-l10n-sv-SE,Mozilla-l10n-ta,Mozilla-l10n-ta-LK,Mozilla-l10n-te,Mozilla-l10n-th,Mozilla-l10n-tr,Mozilla-l10n-uk,Mozilla-l10n-vi,Mozilla-l10n-zh-CN,Mozilla-l10n-zh-TW,Mozilla1.8-l10n,Mozilla1.8-l10n-af,Mozilla1.8-l10n-ar,Mozilla1.8-l10n-be,Mozilla1.8-l10n-bg,Mozilla1.8-l10n-ca,Mozilla1.8-l10n-cs,Mozilla1.8-l10n-da,Mozilla1.8-l10n-de,Mozilla1.8-l10n-el,Mozilla1.8-l10n-en-GB,Mozilla1.8-l10n-en-ZA,Mozilla1.8-l10n-es-AR,Mozilla1.8-l10n-es-ES,Mozilla1.8-l10n-eu,Mozilla1.8-l10n-fi,Mozilla1.8-l10n-fr,Mozilla1.8-l10n-fy-NL,Mozilla1.8-l10n-ga-IE,Mozilla1.8-l10n-gu-IN,Mozilla1.8-l10n-he,Mozilla1.8-l10n-hu,Mozilla1.8-l10n-hy-AM,Mozilla1.8-l10n-is,Mozilla1.8-l10n-it,Mozilla1.8-l10n-ja,Mozilla1.8-l10n-ja-JP-mac,Mozilla1.8-l10n-ka,Mozilla1.8-l10n-ko,Mozilla1.8-l10n-ku,Mozilla1.8-l10n-lt,Mozilla1.8-l10n-mk,Mozilla1.8-l10n-mn,Mozilla1.8-l10n-nb-NO,Mozilla1.8-l10n-nl,Mozilla1.8-l10n-nn-NO,Mozilla1.8-l10n-nr,Mozilla1.8-l10n-nso,Mozilla1.8-l10n-pa-IN,Mozilla1.8-l10n-pl,Mozilla1.8-l10n-pt-BR,Mozilla1.8-l10n-pt-PT,Mozilla1.8-l10n-ro,Mozilla1.8-l10n-ru,Mozilla1.8-l10n-sk,Mozilla1.8-l10n-sl,Mozilla1.8-l10n-sq,Mozilla1.8-l10n-ss,Mozilla1.8-l10n-st,Mozilla1.8-l10n-sv-SE,Mozilla1.8-l10n-tn,Mozilla1.8-l10n-tr,Mozilla1.8-l10n-ts,Mozilla1.8-l10n-uk,Mozilla1.8-l10n-ve,Mozilla1.8-l10n-xh,Mozilla1.8-l10n-zh-CN,Mozilla1.8-l10n-zh-TW,Mozilla1.8-l10n-zu");
-pref("extensions.tinderstatus.watchList", "Camino,Firefox,Firefox3.5,Firefox3.6,Mobile,SeaMonkey,Thunderbird,Thunderbird3.1,XULRunner");
+pref("extensions.tinderstatus.fullList", "Birch,Bugzilla,Build-System,Camino,Cedar,Firefox,Firefox3.6,Firefox3.5,Mapel,Miramar,Mobile,Places,SeaMonkey,CalendarTrunk,Calendar1.0,ThunderbirdTrunk,Thunderbird3.1,TraceMonkey,XULRunner");
+pref("extensions.tinderstatus.fullList.applications", "Accessibility,Addons,AddonsMgr,AddonTester,Bugzilla,Bugzilla3.0,Bugzilla3.2,Bugzilla3.4,Bugzilla3.6,Bugzilla4.0,Build-System,Calendar1.0,CalendarTrunk,Camino,Cedar,Devtools,Electrolysis,Electrolysis-Unittest,Firefox,Firefox-Ports,Firefox-Release,Firefox-Staging,Firefox-Unittest,Firefox3.5,Firefox3.5-Unittest,Firefox3.6,Firefox3.6-Release,Firefox3.6-Unittest,Firefox4.0,Firefox4.0-Release,Firefox4.0-Unittest,Fx-Team,Geriatric-Machines,Graphics,Jaegermonkey,Jetpack,LeakTest,Maple,Miramar,Miramar-Release,Mobile,Mobile1.1,Mobile2.0,Mobile5.0,MobileTest,Mozilla-Aurora,Mozilla-Beta,Mozilla-Beta-Release,Mozilla-Inbound,MozillaExperimental,MozillaRelease,MozillaStaging,MozillaTest,MozillaTest-BACKUP,MozillaTest-Release,MozillaTestBroken,MozillaTestBroken2,MozillaTry,Nanojit,NSS,NSS-Stable-Branch,Places,Places-Unittest,Private-Browsing,Releng-Preproduction,Rust,SeaMonkey,SeaMonkey-Aurora,SeaMonkey-Beta,SeaMonkey-Ports,SeaMonkey2.0,SeaMonkey2.1,Services-Central,Shadow-Central,Sunbird,Sunbird-Mozilla1.8,Testing,Thunderbird,Thunderbird-Aurora,Thunderbird-Beta,Thunderbird-Ports,Thunderbird-Release,Thunderbird3.0,Thunderbird3.0-Release,Thunderbird3.1,Thunderbird3.1-Release,ThunderbirdTest,ThunderbirdTrunk,ThunderbirdTry,TraceMonkey,TraceMonkeyUnitTest,Try,UnitTest,UX,Ux,XULRunner");
+pref("extensions.tinderstatus.fullList.localizations", "Mozilla-l10n,Mozilla-l10n-af,Mozilla-l10n-ak,Mozilla-l10n-ar,Mozilla-l10n-as,Mozilla-l10n-ast,Mozilla-l10n-be,Mozilla-l10n-bg,Mozilla-l10n-bn-BD,Mozilla-l10n-bn-IN,Mozilla-l10n-br,Mozilla-l10n-bs,Mozilla-l10n-ca,Mozilla-l10n-cs,Mozilla-l10n-cy,Mozilla-l10n-da,Mozilla-l10n-de,Mozilla-l10n-el,Mozilla-l10n-en-GB,Mozilla-l10n-en-ZA,Mozilla-l10n-eo,Mozilla-l10n-es-AR,Mozilla-l10n-es-CL,Mozilla-l10n-es-ES,Mozilla-l10n-es-MX,Mozilla-l10n-et,Mozilla-l10n-eu,Mozilla-l10n-fa,Mozilla-l10n-fi,Mozilla-l10n-fr,Mozilla-l10n-fy-NL,Mozilla-l10n-ga-IE,Mozilla-l10n-gd,Mozilla-l10n-gl,Mozilla-l10n-gu-IN,Mozilla-l10n-he,Mozilla-l10n-hi-IN,Mozilla-l10n-hr,Mozilla-l10n-hu,Mozilla-l10n-hy-AM,Mozilla-l10n-id,Mozilla-l10n-ilo,Mozilla-l10n-is,Mozilla-l10n-it,Mozilla-l10n-ja,Mozilla-l10n-ja-JP-mac,Mozilla-l10n-ka,Mozilla-l10n-kk,Mozilla-l10n-km,Mozilla-l10n-kn,Mozilla-l10n-ko,Mozilla-l10n-ku,Mozilla-l10n-lg,Mozilla-l10n-lt,Mozilla-l10n-lv,Mozilla-l10n-mai,Mozilla-l10n-mk,Mozilla-l10n-ml,Mozilla-l10n-mn,Mozilla-l10n-mr,Mozilla-l10n-ms,Mozilla-l10n-nb-NO,Mozilla-l10n-ne-NP,Mozilla-l10n-nl,Mozilla-l10n-nn-NO,Mozilla-l10n-nso,Mozilla-l10n-oc,Mozilla-l10n-or,Mozilla-l10n-pa-IN,Mozilla-l10n-pl,Mozilla-l10n-pt-BR,Mozilla-l10n-pt-PT,Mozilla-l10n-rm,Mozilla-l10n-ro,Mozilla-l10n-ru,Mozilla-l10n-rw,Mozilla-l10n-si,Mozilla-l10n-sk,Mozilla-l10n-sl,Mozilla-l10n-son,Mozilla-l10n-sq,Mozilla-l10n-sr,Mozilla-l10n-sv-SE,Mozilla-l10n-ta,Mozilla-l10n-ta-LK,Mozilla-l10n-te,Mozilla-l10n-th,Mozilla-l10n-tr,Mozilla-l10n-uk,Mozilla-l10n-vi,Mozilla-l10n-zh-CN,Mozilla-l10n-zh-TW,Mozilla-l10n-zu");
+pref("extensions.tinderstatus.watchList", "Firefox,Firefox3.5,Firefox3.6,Mobile,SeaMonkey,ThunderbirdTrunk");
 pref("extensions.tinderstatus.gotoTree", "Firefox");
 pref("extensions.tinderstatus.refreshTime", 1);
+pref("extensions.tinderstatus.numTrees", 1);
 pref("extensions.tinderstatus.renamed_Firefox3.1_to_Firefox3.5", false);
+pref("extensions.tinderstatus.notifications", true);
+pref("extensions.tinderstatus.notifyTrees", "");
+pref("extensions.tinderstatus.notifyTinderboxes", "");
diff -u8pdNr exten-032/install.js exten-042/install.js
--- exten-032/install.js	2009-12-13 21:25:38.000000000 +0100
+++ exten-042/install.js	2011-06-12 14:10:17.764543200 +0200
@@ -1,9 +1,9 @@
-initInstall("Tinderstatus Extended", "/mozdev/tinderstatus", "0.3.2");
+initInstall("Tinderstatus Extended", "/mozdev/tinderstatus", "0.4.2");
 
 var chromeDir = getFolder("Profile", "chrome");
 
 // Specify the directory into which we're going to install the extension.
 var installDir = getFolder(chromeDir, "tinderstatus");
 setPackageFolder(installDir);
 
 // Specify the directory into which we're going to install the content files,
diff -u8pdNr exten-032/install.rdf exten-042/install.rdf
--- exten-032/install.rdf	2009-12-22 12:15:18.000000000 +0100
+++ exten-042/install.rdf	2011-06-12 18:08:37.109928300 +0200
@@ -1,48 +1,50 @@
 <?xml version="1.0"?>
 
 <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
      xmlns:em="http://www.mozilla.org/2004/em-rdf#">
 
   <Description about="urn:mozilla:install-manifest">
     <em:name>Tinderstatus Extended</em:name>
     <em:id>{CE49928A-7804-4688-8C9E-ABCBC7FB9BCF}</em:id>
-    <em:version>0.3.2</em:version>
+    <em:version>0.4.2</em:version>
 
     <em:description>icon showing the status of Mozilla tinderboxen</em:description>
     <em:creator>Myk Melez</em:creator>
     <em:contributor>Alex Vincent</em:contributor>
     <em:contributor>Mark Banner</em:contributor>
     <em:contributor>Frédéric Buclin</em:contributor>
     <em:homepageURL>http://tinderstatus.mozdev.org/</em:homepageURL>
     <em:optionsURL>chrome://tinderstatus/content/prefs.xul</em:optionsURL>
+    <em:updateURL>http://www.nadelundhirn.de/krams/exten/tinderstatus/update.rdf</em:updateURL>
+    <em:updateKey>MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDJ9vts188WYuHxbA5Dmj8H1F7b4JoGolHIQKWVixZfnyQg9Qq2FDjXGwEFAtowO6bXHnB+PuLBD/LpbqcJEcTSjQkziYsjmduiQVQcLcmv6Jc1dN6H0XuOTRDIAmfxVQewjJm8yYQIf6F93MZdPeSZ5gWBl7s29h8WcjMHglLfmwIDAQAB</em:updateKey>
 
     <!-- Firefox -->
     <em:targetApplication>
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-        <em:minVersion>3.0pre</em:minVersion>
-        <em:maxVersion>3.7a1pre</em:maxVersion>
+        <em:minVersion>1.5</em:minVersion>
+        <em:maxVersion>7.0a1</em:maxVersion>
       </Description>
     </em:targetApplication>
 
     <!-- SeaMonkey -->
     <em:targetApplication>
       <Description>
         <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
         <em:minVersion>2.0a1</em:minVersion>
-        <em:maxVersion>2.0.2pre</em:maxVersion>
+        <em:maxVersion>2.4a1</em:maxVersion>
       </Description>
     </em:targetApplication>
 
     <!-- Sunbird -->
     <em:targetApplication>
       <Description>
         <em:id>{718e30fb-e89b-41dd-9da7-e25a45638b28}</em:id>
         <em:minVersion>1.0b1pre</em:minVersion>
         <em:maxVersion>1.0pre</em:maxVersion>
-      </Description>
+        </Description>
     </em:targetApplication>
 
   </Description>
 
 </RDF>
