diff -u8pdNr exten-026/chrome/content/contents.rdf exten-030/chrome/content/contents.rdf
--- exten-026/chrome/content/contents.rdf	2008-12-18 22:40:30.000000000 +0100
+++ exten-030/chrome/content/contents.rdf	2009-02-28 12:02:18.000000000 +0100
@@ -48,22 +48,23 @@
         chrome:name="tinderstatus"
         chrome:extension="true"
         chrome:description="icon displaying the status of Mozilla tinderboxen"> 
   </RDF:Description>
 
   <RDF:Seq about="urn:mozilla:overlays">
     <RDF:li resource="chrome://navigator/content/navigator.xul"/>
     <RDF:li resource="chrome://calendar/content/calendar.xul"/>
+    <RDF:li resource="chrome://sunbird/content/calendar.xul"/>
   </RDF:Seq>
 
   <RDF:Seq about="chrome://navigator/content/navigator.xul">
     <RDF:li>chrome://tinderstatus/content/overlay.xul</RDF:li>
   </RDF:Seq>
 
   <RDF:Seq about="chrome://calendar/content/calendar.xul">
     <RDF:li>chrome://tinderstatus/content/overlay.xul</RDF:li>
   </RDF:Seq>
-    <RDF:Seq about="chrome://sunbird/content/calendar.xul">
+  <RDF:Seq about="chrome://sunbird/content/calendar.xul">
     <RDF:li>chrome://tinderstatus/content/overlay.xul</RDF:li>
   </RDF:Seq>
 
 </RDF:RDF>
diff -u8pdNr exten-026/chrome/content/overlay.xul exten-030/chrome/content/overlay.xul
--- exten-026/chrome/content/overlay.xul	2008-04-02 18:41:24.000000000 +0200
+++ exten-030/chrome/content/overlay.xul	2009-02-28 12:05:38.000000000 +0100
@@ -45,43 +45,41 @@
   <script type="application/x-javascript" src="chrome://global/content/strres.js"/>
   <script type="application/x-javascript" src="chrome://tinderstatus/content/tinderstatus.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"
-                    class="statusbarpanel-iconic"
-                    tooltip="tinderstatus-tooltip"
-                    insertbefore="security-button"
-                    onclick="loadTinderboxURI(event);"
-                    context="tinderstatus-context">
 
-      <menupopup id="tinderstatus-context">
-        <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-refresh" label="&tinderstatus.context.refresh.now;"
-                  accesskey="&tinderstatus.context.refresh.now.accesskey;"
-                  oncommand="refreshTinderboxenStatus();"/>
-      </menupopup>
+    <statusbarpanel id="tinderstatus-panel" insertbefore="security-button">
 
-      <box id="tinderstatus-box" buildstatus="none" tooltip="tinderstatus-tooltip">
-        <image id="tinderstatus-icon" treestatus="none"/>
+      <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">
+          <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-refresh" label="&tinderstatus.context.refresh.now;"
+                    accesskey="&tinderstatus.context.refresh.now.accesskey;"
+                    oncommand="refreshTinderboxenStatus();"/>
+        </menupopup>
+
+        <tooltip id="tinderstatus-tooltip">
+          <description value="&tinderstatus.tooltip;"/>
+          <description/>
+        </tooltip>
+      </popupset>
+
     </statusbarpanel>
 
-    <hbox>
-      <tooltip id="tinderstatus-tooltip">
-        <vbox>
-          <description id="tinderstatus-description" value="&tinderstatus.tooltip;"/>
-        </vbox>
-      </tooltip>
-    </hbox>
   </statusbar>
 
 </overlay>
diff -u8pdNr exten-026/chrome/content/prefs.js exten-030/chrome/content/prefs.js
--- exten-026/chrome/content/prefs.js	2008-04-02 19:05:16.000000000 +0200
+++ exten-030/chrome/content/prefs.js	2009-02-28 14:40:12.000000000 +0100
@@ -43,74 +43,128 @@ var gPrefService = Cc["@mozilla.org/pref
                    .getService(Ci.nsIPrefService);
 var gPrefBranch = gPrefService.getBranch("extensions.tinderstatus.");
 var gPrefDefaultBranch = gPrefService.getDefaultBranch("extensions.tinderstatus.");
 var prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"]
               .getService(Components.interfaces.nsIPromptService);
 
 var bundle = srGetStrBundle("chrome://tinderstatus/locale/tinderstatus.properties");
 
+const kNumWatchLists = 10;
+
 function onLoadTinderstatusPrefsPane()
 {
-  var watchList = document.getElementById("watchList");
   var gotoTreePopup = document.getElementById("gotoTreePopup");
-  var selectedList = gPrefBranch.getComplexValue("watchList",
-                                                 Ci.nsISupportsString).data;
   var fullList = gPrefBranch.getComplexValue("fullList",
                                              Ci.nsISupportsString).data;
   var gotoTreePref = gPrefBranch.getComplexValue("gotoTree",
                                                  Ci.nsISupportsString).data;
-  selectedList = selectedList.split(",");
   fullList = fullList.split(",");
 
+  var i;
+  var watchList = [ { element: document.getElementById("watchList"),
+		      pref: gPrefBranch.getComplexValue("watchList",
+							Ci.nsISupportsString).data
+                      } ];
+
+  for (i = 1; i < kNumWatchLists; ++i) {
+    var item = { element: document.getElementById("watchList" + i) };
+    try {
+      var prefString = gPrefBranch.getComplexValue("watchList" + i,
+						   Ci.nsISupportsString).data;
+      item.pref = prefString.split(",");
+    }
+    catch (ex) {
+      item.pref = [];
+    }
+    watchList.push(item);
+  }
+
   var item;
 
-  for (var i = 0; i < fullList.length; ++i) {
-    // Add the item to the watch list
-    item = document.createElement("listitem");
-    item.setAttribute("id", fullList[i]);
-    item.setAttribute("label", fullList[i]);
-    item.setAttribute("type", "checkbox");
-    item.setAttribute("checked", selectedList.indexOf(fullList[i]) != -1);
-    watchList.appendChild(item);
+  for (i = 0; i < fullList.length; ++i) {
+    // Add the item to the watch lists
+    for (var j = 0; j < kNumWatchLists; ++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);
+    }
 
     // Add the item to the goto tree
     item = document.createElement("menuitem");
     item.setAttribute("label", fullList[i]);
     item.setAttribute("value", fullList[i]);
     gotoTreePopup.appendChild(item);
 
     if (fullList[i] == gotoTreePref) {
       gotoTreePopup.parentNode.value = fullList[i];
       gotoTreePopup.selectedItem = item;
     }
   }
 }
 
-function syncToWatchList()
+function syncToWatchList(aElement)
 {
-  var watchList = document.getElementById("watchList");
   var wlArray = [];
-  for (var i = 0; i < watchList.getRowCount(); ++i) {
-    var wlNode = watchList.getItemAtIndex(i);
+  for (var i = 0; i < aElement.getRowCount(); ++i) {
+    var wlNode = aElement.getItemAtIndex(i);
     if (wlNode.checked)
       wlArray.push(wlNode.id);
   }
   return wlArray.join(",");
 }
 
 function tinderstatus_showhideTinderboxesDialog() {
     document.documentElement.openSubDialog("chrome://tinderstatus/content/showhideTinderboxes.xul", "chrome", "add");
 }
 
 function tinderstatus_clearWatchList() {
   var oldList = document.getElementById("watchList");
+  var oldList1 = document.getElementById("watchList1");
+  var oldList2 = document.getElementById("watchList2");
+  var oldList3 = document.getElementById("watchList3");
+  var oldList4 = document.getElementById("watchList4");
+  var oldList5 = document.getElementById("watchList5");
+  var oldList6 = document.getElementById("watchList6");
+  var oldList7 = document.getElementById("watchList7");
+  var oldList8 = document.getElementById("watchList8");
+  var oldList9 = document.getElementById("watchList9");
   while(oldList.hasChildNodes()){
     oldList.removeChild(oldList.firstChild);
   }
+  while(oldList1.hasChildNodes()){
+    oldList1.removeChild(oldList1.firstChild);
+  }
+  while(oldList2.hasChildNodes()){
+    oldList2.removeChild(oldList2.firstChild);
+  }
+  while(oldList3.hasChildNodes()){
+    oldList3.removeChild(oldList3.firstChild);
+  }
+  while(oldList4.hasChildNodes()){
+    oldList4.removeChild(oldList4.firstChild);
+  }
+  while(oldList5.hasChildNodes()){
+    oldList5.removeChild(oldList5.firstChild);
+  }
+  while(oldList6.hasChildNodes()){
+    oldList6.removeChild(oldList6.firstChild);
+  }
+  while(oldList7.hasChildNodes()){
+    oldList7.removeChild(oldList7.firstChild);
+  }
+  while(oldList8.hasChildNodes()){
+    oldList8.removeChild(oldList8.firstChild);
+  }
+  while(oldList9.hasChildNodes()){
+    oldList9.removeChild(oldList9.firstChild);
+  }
 }
 
 function tinderstatus_resetFullList() {
   var defaultList = gPrefDefaultBranch.getComplexValue("fullList",
                                            Ci.nsISupportsString).data;
   void gPrefBranch.setCharPref("fullList",defaultList);
 }
 
diff -u8pdNr exten-026/chrome/content/prefs.xul exten-030/chrome/content/prefs.xul
--- exten-026/chrome/content/prefs.xul	2008-04-02 18:42:42.000000000 +0200
+++ exten-030/chrome/content/prefs.xul	2009-02-28 14:52:10.000000000 +0100
@@ -48,57 +48,177 @@
   <script type="application/x-javascript"
           src="chrome://global/content/strres.js"/>
   <script type="application/x-javascript"
           src="chrome://tinderstatus/content/prefs.js" />
 
   <preferences>
     <preference id="extensions.tinderstatus.watchList"
                 name="extensions.tinderstatus.watchList" type="string"/>
+    <preference id="extensions.tinderstatus.watchList1"
+                name="extensions.tinderstatus.watchList1" type="string"/>
+    <preference id="extensions.tinderstatus.watchList2"
+                name="extensions.tinderstatus.watchList2" type="string"/>
+    <preference id="extensions.tinderstatus.watchList3"
+                name="extensions.tinderstatus.watchList3" type="string"/>
+    <preference id="extensions.tinderstatus.watchList4"
+                name="extensions.tinderstatus.watchList4" type="string"/>
+    <preference id="extensions.tinderstatus.watchList5"
+                name="extensions.tinderstatus.watchList5" type="string"/>
+    <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.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">
+    <hbox align="right">
       <menulist id="gotoTree" preference="extensions.tinderstatus.gotoTree"
                 flex="0">
         <menupopup id="gotoTreePopup"/>
       </menulist>
     </hbox>
 
+    <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>
+
     <spacer flex="1"/>
 
-    <label control="watchList" value="&tinderstatus.preferences.watchlist;"
-           accesskey="&tinderstatus.preferences.watchlist.accesskey;"/>
+    <!-- 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"/>
+        <tab label="3" id="tab2"/>
+        <tab label="4" id="tab3"/>
+        <tab label="5" id="tab4"/>
+        <tab label="6" id="tab5"/>
+        <tab label="7" id="tab6"/>
+        <tab label="8" id="tab7"/>
+        <tab label="9" id="tab8"/>
+        <tab label="10" id="tab9"/>
+      </tabs>
 
-    <!-- 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();"
-             onclick="userChangedValue(event.target);"
-             onkeyup="userChangedValue(event.target);"/>
+      <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);"
+                   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);"
+                   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);"
+                   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);"
+                   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);"
+                   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);"
+                   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);"
+                   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);"
+                   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);"
+                   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);"
+                   onclick="userChangedValue(event.target);"
+                   onkeyup="userChangedValue(event.target);"/>
+	</vbox>
+      </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>
   </vbox>
-
 </prefpane>
 
 </prefwindow>
diff -u8pdNr exten-026/chrome/content/tinderstatus.css exten-030/chrome/content/tinderstatus.css
--- exten-026/chrome/content/tinderstatus.css	2008-12-18 23:52:28.000000000 +0100
+++ exten-030/chrome/content/tinderstatus.css	2009-02-28 12:27:14.000000000 +0100
@@ -36,47 +36,46 @@
  * ***** END LICENSE BLOCK ***** */
 
 statusbarpanel#tinderstatus-panel {
   /* Make the contents of the status panel stretch to fill it so the entire 
    * panel is colored by the background color of the enclosed box. */
   -moz-box-align: stretch;
 }
 
-box#tinderstatus-box {
+.tinderstatus-box {
   background-color: grey;
   
   /* Center-align the enclosed icon so it doesn't stretch to fill the box. */
   -moz-box-align: center;
   min-width: 14px;
 
   padding: 0px 2px 0px 2px;
+/*
+  max-width: 7px;*/
 }
 
 /* Style the background color of the box to reflect build status. */
-box#tinderstatus-box[buildstatus="success"] {
+.tinderstatus-box[buildstatus="success"] {
   background-color: #11DD11;
 }
 
-box#tinderstatus-box[buildstatus="testfailed"] {
+.tinderstatus-box[buildstatus="testfailed"] {
   background-color: #FFAA00;
 }
 
-box#tinderstatus-box[buildstatus="busted"] {
+.tinderstatus-box[buildstatus="busted"] {
   background-color: #EE0000;
 }
 
 /* Superimpose an icon on the box to reflect tree status. */
-image#tinderstatus-icon[treestatus="open"] {
+.tinderstatus-icon[treestatus="open"] {
   list-style-image: url("chrome://tinderstatus/content/tree-open.png");
   padding-top: 1px;
 }
 
-image#tinderstatus-icon[treestatus="closed"] {
+.tinderstatus-icon[treestatus="closed"] {
   list-style-image: url("chrome://tinderstatus/content/tree-closed.png");
 }
 
-
-image#tinderstatus-icon {
+.tinderstatus-icon {
   list-style-image: url("chrome://tinderstatus/content/tree-unknown.png");
 }
-
-
diff -u8pdNr exten-026/chrome/content/tinderstatus.js exten-030/chrome/content/tinderstatus.js
--- exten-026/chrome/content/tinderstatus.js	2009-02-28 10:28:06.000000000 +0100
+++ exten-030/chrome/content/tinderstatus.js	2009-02-28 17:17:10.000000000 +0100
@@ -39,103 +39,230 @@
 
 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.
+
 var gXMLHttpRequest;
 
 var ioservice = Cc["@mozilla.org/network/io-service;1"]
   .getService(Ci.nsIIOService);
 var extps = Cc["@mozilla.org/uriloader/external-protocol-service;1"]
   .getService(Components.interfaces.nsIExternalProtocolService);
 var appInfo = Cc['@mozilla.org/xre/app-info;1']
   .getService(Components.interfaces.nsIXULAppInfo);
 
 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" );
 
 // 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 gTinderboxList  = [];
-var gTinderboxListUpdateRequired = true;
 var gTinderboxIndex = -1;
 var gTinderboxText  = "";
 var gTinderboxURIIndex = 0;
-var gTinderboxStatus = null;
 var gTinderboxIntervalID = 0;
 var gTinderboxLastUpdate = null;
 
-var gPrefService = Cc["@mozilla.org/preferences-service;1"]
-  .getService(Ci.nsIPrefService);
-var gPrefBranch = gPrefService.getBranch("extensions.tinderstatus.");
+// 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
+  // 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() {
+    this._numTrees = this._prefs.getIntPref("numTrees");
+    // Must have at least one tree.
+    if (this._numTrees <= 0)
+      this._numTrees = 1;
+
+    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;
+    this._tinderboxListUpdateRequired = false;
+  },
+
+  // This function just goes through everything (number of tress/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;
+
+    let firstBox = Tinderstatus._treeBoxes[0].box;
+    let firstTip = Tinderstatus._treeBoxes[0].tooltip;
+    let parentBox = firstBox.parentNode;
+    let parentTip = firstTip.parentNode;
+
+    // If the user has reduced the number of boxes
+    for (i = this._treeBoxes.length - 1; i >= this._numTrees; --i) {
+      parentBox.removeChild(this._treeBoxes[i].box);
+      parentTip.removeChild(this._treeBoxes[i].tooltip);
+      this._treeBoxes.pop();
+    }
+
+    // If the user has increased the number of boxes
+    for (i = this._treeBoxes.length; i < this._numTrees; ++i) {
+      let newBox = firstBox.cloneNode(true);
+      newBox.id = "tinderstatus-box-" + i;
+      newBox.setAttribute("buildstatus", "none");
+      newBox.firstChild.setAttribute("treestatus", "none");
+
+      let newTip = firstTip.cloneNode(true);
+      newTip.id = "tinderstatus-tooltip-" + i;
+      newTip.firstChild.setAttribute("value", "No status retrieved yet.");
+
+      newBox.setAttribute("tooltip", newTip.id);
+
+      // trees gets filled in below.
+      this._treeBoxes[i] = { box: newBox, tooltip: newTip, trees: "" };
+
+      parentBox.insertBefore(newBox, Tinderstatus._treeBoxes[i - 1].box.nextSibling);
+      parentTip.insertBefore(newTip, Tinderstatus._treeBoxes[i - 1].tooltip.nextSibling);
+    }
+
+    // Clear out the list of tinderboxes to query.
+    var newList = [];
+
+    // Now update the prefs for all the tree boxes
+    for (i = 0; i < this._treeBoxes.length; ++i) {
+      var prefValue = "";
+      try {
+	prefValue =
+          this._prefs.getComplexValue(i > 0 ? "watchList" + i : "watchList",
+                                      Ci.nsISupportsString).data;
+      }
+      catch (e) { }
+
+      this._treeBoxes[i].trees = prefValue;
+      this._treeBoxes[i].tooltip
+          .childNodes[1].setAttribute("value", tooltipWatching + prefValue);
+      newList = newList.concat(prefValue.split(","));
+    }
+
+    // Now strip out any duplicates
+    this._internalTinderboxQueryList = [];
+    for (i = 0; i < newList.length; ++i) {
+      if (this._internalTinderboxQueryList.indexOf(newList[i], 0) < 0)
+	this._internalTinderboxQueryList.push(newList[i]);
+    }
+    this._tinderboxListUpdateRequired = true;
+  },
+
+  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);
+  }
+};
 
 var tinderstatusPrefObserver = 
 {
   register: function()
   {
-    if (gPrefBranch instanceof Ci.nsIPrefBranch2) {
-      gPrefBranch.addObserver("", this, false);
-    }
+    Tinderstatus._prefs.addObserver("", this, false);
   },
 
   unregister: function()
   {
-    if (gPrefBranch instanceof Ci.nsIPrefBranch2) {
-      gPrefBranch.removeObserver("", this);
-    }
+    Tinderstatus._prefs.removeObserver("", this);
   },
 
   observe: function(aSubject, aTopic, aData)
   {
     if (aTopic != "nsPref:changed")
       return;
 
+    if (aData.lastIndexOf("watchList", 0) != -1 ||
+	aData == "numTrees") {
+
+      Tinderstatus.updateTreeIconsAndPrefs();
+
+      refreshTinderboxenStatus();
+      return;
+    }
+
     switch (aData) {
-      case "watchList":
-        gTinderboxListUpdateRequired = true;
-        refreshTinderboxenStatus();
-        break;
       case "refreshTime":
         if (gTinderboxIntervalID)
           window.clearInterval(gTinderboxIntervalID);
 
         gTinderboxIntervalID = window.setInterval(refreshTinderboxenStatus,
                                                   getRefreshTime());
         break;
       case "fullList":
         setUpTinderboxMenuPopup();
         break;
     }
   }
 };
 
 function initializeTinderstatus() {
+  Tinderstatus.init();
 
   // If we're running in SeaMonkey and the version is less than 2.*, then the
   // options dialog won't work, so disable the menu option.
   if (appInfo.ID == "{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}") {
     var versionChecker = Cc["@mozilla.org/xpcom/version-comparator;1"]
       .getService(Ci.nsIVersionComparator);
 
     if (versionChecker.compare(appInfo.version, "2.0a1pre") < 0)
       document.getElementById("tinderstatus-prefs").hidden = true;
   }
 
   // If we're not on windows, use preferences for the menu instead of Options.
   if (navigator.platform.toLowerCase().indexOf('win') == -1)
     document.getElementById("tinderstatus-prefs").label = preferencesLabel;
 
+  // Set up the tree icons and prefs
+  Tinderstatus.updateTreeIconsAndPrefs();
+
   // Kick off the first update.
   refreshTinderboxenStatus();
 
   // Setup the menu
   setUpTinderboxMenuPopup();
 }
 
 function setUpTinderboxMenuPopup() {
@@ -149,18 +276,17 @@ function setUpTinderboxMenuPopup() {
     popup.removeChild(nextitem);
     nextitem = separatorItem.previousSibling;
   }
 
   // Get the full list of tinderboxes that we know about.
   var fullList;
 
   try {
-    fullList = gPrefBranch.getComplexValue("fullList",
-                                           Ci.nsISupportsString).data;
+    fullList = Tinderstatus._prefs.getComplexValue("fullList", Ci.nsISupportsString).data;
   }
   catch (ex) {
     fullList = "Bugzilla,Camino,Firefox,Firefox-Ports,Firefox3.0,Firefox3.1,Mobile,SeaMonkey,SeaMonkey-Ports,Sunbird,Thunderbird,Thunderbird3.0,XULRunner";
   }
 
   fullList = fullList.split(",");
 
   // Now add the tinderboxes onto the menu
@@ -183,82 +309,57 @@ function openTinderstatusPreferences() {
     if (win.document.documentURI == tsOptionsURL) {
       win.focus();
       return;
     }
   }
 
   var features;
   try {
-    var instantApply = gPrefService.getBranch(null)
-      .getBoolPref("browser.preferences.instantApply");
+    var instantApply = Tinderstatus._prefSvc.getBranch(null).
+                       getBoolPref("browser.preferences.instantApply");
     features = "chrome,titlebar,toolbar,centerscreen" + (instantApply ? ",dialog=no" : ",modal");
   }
   catch (e) {
     features = "chrome,titlebar,toolbar,centerscreen,modal";
   }
   openDialog(tsOptionsURL, "", features);
 }
 
 function getRefreshTime() {
   var refreshTime;
 
   try {
     // refreshTime is stored in minutes
-    refreshTime = gPrefBranch.getIntPref("refreshTime") * 60000;
+    refreshTime = Tinderstatus._prefs.getIntPref("refreshTime") * 60000;
 
     // Always ensure refresh time is at least one minute so we don't hit
     // the servers hard
     if (refreshTime < 60000)
       refreshTime = 60000;
   }
   catch(ex) {
     // set to default of one minute.
     refreshTime = 60000;
   }
 
   return refreshTime;                                           
 }
 
-function updateCurrentTinderboxList() {
-  try {
-    gTinderboxList = gPrefBranch.getComplexValue("watchList",
-                                                 Ci.nsISupportsString).data;
-    gTinderboxList = gTinderboxList.split(",");
-
-    if (gTinderboxList.length == 1 && gTinderboxList[0] == "")
-      gTinderboxList = [];
-  }
-  catch (ex) {
-    // Set to the default list
-    gTinderboxList  = ["Camino",
-                       "Firefox",
-                       "Firefox3.0",
-                       "Firefox3.1",
-                       "Mobile",
-                       "SeaMonkey",
-                       "Thunderbird",
-                       "Thunderbird3.0",
-                       "XULRunner"];
-  }
-  gTinderboxListUpdateRequired = false;
-}
-
 /**
  * Load into the browser a current tinderbox page.
  */
 function loadTinderboxURI(evt) {
   // Only load for left or middle click events.
-  if (evt.button > 1 || evt.originalTarget.localName != "statusbarpanel")
+  if (evt.button > 1)
     return;
 
   var tinderboxToLoad;
   try {
-    tinderboxToLoad = gPrefBranch.getComplexValue("gotoTree",
-                                                  Ci.nsISupportsString).data;
+    tinderboxToLoad = Tinderstatus._prefs.getComplexValue("gotoTree", Ci.nsISupportsString).data;
   }
   catch (ex) {
     // If we can't get the pref, set to the default
     tinderboxToLoad = "Firefox";
   }
 
   if (tinderboxToLoad != "") {
     var url = "http://tinderbox.mozilla.org/" + tinderboxToLoad + "/";
@@ -285,57 +386,57 @@ function loadTinderboxPage(pageName) {
   }
 }
 
 function refreshTinderboxenStatus() {
   // Check we aren't currently doing an update
   if (gTinderboxIndex != -1)
     return;
 
-  if (gTinderboxListUpdateRequired)
-    updateCurrentTinderboxList();
+  Tinderstatus.updateCurrentTinderboxList();
 
   gTinderboxURIIndex = 0;
   getTinderboxStatus();
 }
 
 /**
  * Request a tinderbox summary from one tree.
  */
 function getTinderboxStatus() {
   // If no items selected, just show nothing.
-  if (gTinderboxList.length == 0) {
+  if (Tinderstatus.tinderboxQueryList.length == 0) {
     document.getElementById('tinderstatus-box')
             .setAttribute("buildstatus", "none");
 
-    setTinderboxStatus(noTinderboxSelected);
+    //    setTinderboxStatus(noTinderboxSelected);
     gTinderboxURIIndex = 0;
     return;
   }
 
   gTinderboxIndex++;
-  if (gTinderboxIndex == gTinderboxList.length) {
+  if (gTinderboxIndex == Tinderstatus.tinderboxQueryList.length) {
     return;
   }
   var url = "http://tinderbox.mozilla.org/";
-  url += gTinderboxList[gTinderboxIndex];
+  url += Tinderstatus.tinderboxQueryList[gTinderboxIndex];
   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() {
   // Abort current attempt, wait for next refresh
   gTinderboxIndex = -1;
   gTinderboxText = "";
+  Tinderstatus._tinderboxResults = {};
 }
 
 function getSetLastUpdated() {
   gTinderboxLastUpdate = new Date();
 
   var result = lastUpdate;
 
   if (gTinderboxLastUpdate.getHours() < 10)
@@ -350,112 +451,128 @@ function getSetLastUpdated() {
   result += gTinderboxLastUpdate.getSeconds() < 10 ? ":0" : ":";
 
   return result + gTinderboxLastUpdate.getSeconds();
 }
 
 /**
  * Indicate via tooltip tinderboxes which show failures.
  */
-function fillTinderboxStatus(aRegExp) {
-  var results = gTinderboxText.match(aRegExp);
+function fillTinderboxStatus(aTooltip, aTinderboxText, aRegExp) {
+  var results = aTinderboxText.match(aRegExp);
 
-  while (gTinderboxStatus.firstChild != gTinderboxStatus.lastChild) {
-    gTinderboxStatus.removeChild(gTinderboxStatus.firstChild);
+  if (aTooltip.firstChild == aTooltip.lastChild)
+    throw "Error, should be two elements in tooltip not one.";
+
+  while (aTooltip.childNodes[1] != aTooltip.lastChild) {
+    aTooltip.removeChild(aTooltip.lastChild);
   }
 
-  gTinderboxStatus.firstChild.setAttribute("value", getSetLastUpdated());
+  aTooltip.firstChild.setAttribute("value", getSetLastUpdated());
 
   for (var i = 0; i < results.length; i++) {
     var node = document.createElement("description");
     node.setAttribute("value", results[i]);
-    gTinderboxStatus.appendChild(node);
+    aTooltip.appendChild(node);
   }
 }
 
 /**
  * Indicate via tooltip a status message (usually success).
  */
-function setTinderboxStatus(aMessage) {
-  while (gTinderboxStatus.firstChild != gTinderboxStatus.lastChild) {
-    gTinderboxStatus.removeChild(gTinderboxStatus.firstChild);
+function setTinderboxStatus(aTooltip, aMessage) {
+  if (aTooltip.firstChild == aTooltip.lastChild)
+    throw "Error, should be two elements in tooltip not one.";
+
+  while (aTooltip.childNodes[1] != aTooltip.lastChild) {
+    aTooltip.removeChild(aTooltip.lastChild);
   }
 
-  gTinderboxStatus.firstChild.setAttribute("value", getSetLastUpdated());
+  aTooltip.firstChild.setAttribute("value", getSetLastUpdated());
 
   var node = document.createElement("description");
   node.setAttribute("value", aMessage);
-  gTinderboxStatus.appendChild(node);
+  aTooltip.appendChild(node);
 }
 
 /**
  * Handle response from tinderbox server, and update status bar.
  */
 function displayTinderboxStatus()
 {
   var text = gXMLHttpRequest.responseText + "\n";
   gTinderboxText += text;
+  Tinderstatus._tinderboxResults[Tinderstatus.tinderboxQueryList[gTinderboxIndex]] = text;
 
   // Note which tinderbox fails.
   if ((gTinderboxURIIndex == 0) &&
       ((text.indexOf("busted") != -1) || (text.indexOf("testfailed") != -1))) {
     gTinderboxURIIndex = gTinderboxIndex;
   }
 
   // Do we need to loop around again?
-  if (gTinderboxIndex < (gTinderboxList.length - 1)) {
+  if (gTinderboxIndex < (Tinderstatus.tinderboxQueryList.length - 1)) {
     getTinderboxStatus();
     return;
   }
 
   // Change the background color of the box depending to reflect build status.
-  var box = document.getElementById('tinderstatus-box');
-  var re;
-  if (gTinderboxText.indexOf("busted") != -1) {
-    re = /.*(busted|testfailed)/g;
-    fillTinderboxStatus(re);
-    box.setAttribute("buildstatus", "busted");
-  }
-  else if (gTinderboxText.indexOf("testfailed") != -1) {
-    re = /.*testfailed/g;
-    fillTinderboxStatus(re);
-    box.setAttribute("buildstatus", "testfailed");
-  }
-  else if (gTinderboxText.indexOf("success") != -1) {
-    setTinderboxStatus(tinderboxesAllGreen);
-    box.setAttribute("buildstatus", "success");
-    gTinderboxURIIndex = 0;
-  }
-  else {
-    setTinderboxStatus(tinderboxesUnknownStatus);
-    box.setAttribute("buildstatus", "none");
-    gTinderboxURIIndex = 0;
-  }
+  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";
+    }
 
-  // Change the icon superimposed on the box to reflect tree status.
-  var icon = document.getElementById('tinderstatus-icon');
-  if (gTinderboxText.indexOf("closed") != -1)
-    icon.setAttribute("treestatus", "closed");
-  else if (gTinderboxText.indexOf("open") != -1)
-    icon.setAttribute("treestatus", "open");
-  else
-    icon.setAttribute("treestatus", "none");
+    var re;
+    if (reducedText.indexOf("busted") != -1) {
+      re = /.*(busted|testfailed)/g;
+      fillTinderboxStatus(tooltip, reducedText, re);
+      box.setAttribute("buildstatus", "busted");
+    }
+    else if (reducedText.indexOf("testfailed") != -1) {
+      re = /.*testfailed/g;
+      fillTinderboxStatus(tooltip, reducedText, re);
+      box.setAttribute("buildstatus", "testfailed");
+    }
+    else if (reducedText.indexOf("success") != -1) {
+      setTinderboxStatus(tooltip, tinderboxesAllGreen);
+      box.setAttribute("buildstatus", "success");
+      gTinderboxURIIndex = 0;
+    }
+    else {
+      setTinderboxStatus(tooltip, tinderboxesUnknownStatus);
+      box.setAttribute("buildstatus", "none");
+      gTinderboxURIIndex = 0;
+    }
+
+    // Change the icon superimposed on the box to reflect tree status.
+    var icon = box.firstChild;
+    if (reducedText.indexOf("closed") != -1)
+      icon.setAttribute("treestatus", "closed");
+    else if (reducedText.indexOf("open") != -1)
+      icon.setAttribute("treestatus", "open");
+    else
+      icon.setAttribute("treestatus", "none");
+  }
 
   gTinderboxIndex = -1;
   gTinderboxText = "";
 
   // If we have just done an update, and the an update request is signalled
   // due to change of pref, run the update again
-  if (gTinderboxListUpdateRequired)
+  if (Tinderstatus._tinderboxListUpdateRequired)
     refreshTinderboxenStatus();
 }
 
 tinderstatusPrefObserver.register();
 
 // Check the status a second after the browser loads.
 window.addEventListener("load", function initTinderboxStatus(evt) {
-  gTinderboxStatus = document.getElementById("tinderstatus-tooltip").firstChild;
   window.setTimeout(initializeTinderstatus, 1000);
 
   // Wait one minute before trying again.
   gTinderboxIntervalID = window.setInterval(refreshTinderboxenStatus,
                                             getRefreshTime());
 }, false);
diff -u8pdNr exten-026/chrome/locale/de/prefs.dtd exten-030/chrome/locale/de/prefs.dtd
--- exten-026/chrome/locale/de/prefs.dtd	2008-03-31 18:20:54.000000000 +0200
+++ exten-030/chrome/locale/de/prefs.dtd	2009-02-28 14:48:50.000000000 +0100
@@ -5,8 +5,10 @@
 <!ENTITY tinderstatus.preferences.gototree "Mit Klick auf das Tinderstatus-Symbol diesen Quellen-Verzeichnisbaum laden:">
 <!ENTITY tinderstatus.preferences.gototree.accesskey "K">
 <!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">
diff -u8pdNr exten-026/chrome/locale/de/tinderstatus.properties exten-030/chrome/locale/de/tinderstatus.properties
--- exten-026/chrome/locale/de/tinderstatus.properties	2008-04-02 13:32:10.000000000 +0200
+++ exten-030/chrome/locale/de/tinderstatus.properties	2009-02-28 14:44:48.000000000 +0100
@@ -1,6 +1,7 @@
 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: 
diff -u8pdNr exten-026/chrome/locale/en-US/prefs.dtd exten-030/chrome/locale/en-US/prefs.dtd
--- exten-026/chrome/locale/en-US/prefs.dtd	2008-03-31 18:21:16.000000000 +0200
+++ exten-030/chrome/locale/en-US/prefs.dtd	2009-02-28 14:47:00.000000000 +0100
@@ -5,8 +5,10 @@
 <!ENTITY tinderstatus.preferences.gototree "Clicking tinderstatus icon loads the tree:">
 <!ENTITY tinderstatus.preferences.gototree.accesskey "C">
 <!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">
diff -u8pdNr exten-026/chrome/locale/en-US/tinderstatus.properties exten-030/chrome/locale/en-US/tinderstatus.properties
--- exten-026/chrome/locale/en-US/tinderstatus.properties	2008-04-02 14:27:08.000000000 +0200
+++ exten-030/chrome/locale/en-US/tinderstatus.properties	2009-02-28 14:43:14.000000000 +0100
@@ -1,6 +1,7 @@
 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.
diff -u8pdNr exten-026/chrome.manifest exten-030/chrome.manifest
--- exten-026/chrome.manifest	2008-12-18 22:41:00.000000000 +0100
+++ exten-030/chrome.manifest	2009-02-28 12:29:48.000000000 +0100
@@ -1,11 +1,12 @@
 content tinderstatus chrome/content/
 locale tinderstatus en-US chrome/locale/en-US/
 locale tinderstatus de chrome/locale/de/
+
 # For Firefox
 overlay chrome://browser/content/browser.xul chrome://tinderstatus/content/overlay.xul
 
 # For SeaMonkey
 overlay chrome://navigator/content/navigator.xul chrome://tinderstatus/content/overlay.xul
 
 # For Sunbird
 overlay chrome://calendar/content/calendar.xul chrome://tinderstatus/content/overlay.xul
diff -u8pdNr exten-026/install.js exten-030/install.js
--- exten-026/install.js	2008-12-18 23:43:22.000000000 +0100
+++ exten-030/install.js	2009-02-28 12:30:46.000000000 +0100
@@ -1,9 +1,9 @@
-initInstall("Tinderstatus Extended", "/mozdev/tinderstatus", "0.2.6");
+initInstall("Tinderstatus Extended", "/mozdev/tinderstatus", "0.3");
 
 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-026/install.rdf exten-030/install.rdf
--- exten-026/install.rdf	2009-02-28 11:14:38.000000000 +0100
+++ exten-030/install.rdf	2009-04-04 12:50:16.000000000 +0200
@@ -1,49 +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.2.6</em:version>
+    <em:version>0.3</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>1.5</em:minVersion>
-        <em:maxVersion>3.0.*</em:maxVersion>
+        <em:minVersion>3.0pre</em:minVersion>
+        <em:maxVersion>3.1b3pre</em:maxVersion>
       </Description>
     </em:targetApplication>
 
     <!-- SeaMonkey -->
     <em:targetApplication>
       <Description>
         <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
-        <em:minVersion>2.0a1pre</em:minVersion>
-        <em:maxVersion>2.0a3pre</em:maxVersion>
+        <em:minVersion>2.0a1</em:minVersion>
+        <em:maxVersion>2.0a3</em:maxVersion>
       </Description>
     </em:targetApplication>
 
     <!-- Sunbird -->
     <em:targetApplication>
       <Description>
         <em:id>{718e30fb-e89b-41dd-9da7-e25a45638b28}</em:id>
-        <em:minVersion>0.7</em:minVersion>
+        <em:minVersion>1.0pre</em:minVersion>
         <em:maxVersion>1.0pre</em:maxVersion>
       </Description>
     </em:targetApplication>
 
   </Description>
 
 </RDF>
