[Pkg-mozext-commits] [nosquint] 26/47: Import of 2.1b1 release into git

David Prévot taffit at moszumanska.debian.org
Tue Apr 28 01:41:18 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to annotated tag 2.1.6
in repository nosquint.

commit d5eef87cacb9d80625ebd68056bb8270732cd060
Author: Jason Tackaberry <tack at urandom.ca>
Date:   Fri Jan 13 19:41:14 2012 -0500

    Import of 2.1b1 release into git
---
 src/chrome.manifest                  |    3 +
 src/chrome.manifest.in               |    3 +
 src/components/about-handler.js      |   28 +
 src/content/about.html               |  207 ++++
 src/content/browser.js               |  224 +++-
 src/content/cmd.js                   |   35 +-
 src/content/dlg-site.js              |    8 +-
 src/content/init.js                  |   15 +
 src/content/interfaces.js            |  126 ++-
 src/content/lib.js                   |   34 +-
 src/content/overlay.xul              |   25 +-
 src/content/prefs.js                 |  113 +-
 src/content/two-level-tlds           | 2008 +++++++++++++++++++++++++++++++++-
 src/content/zoommanager.js           |    2 +
 src/defaults/preferences/nosquint.js |    3 +-
 src/icon.png                         |  Bin 0 -> 4967 bytes
 src/icon64.png                       |  Bin 0 -> 6786 bytes
 src/install.rdf                      |    7 +-
 src/skin/box-grunge.png              |  Bin 0 -> 3290 bytes
 src/skin/icon96.png                  |  Bin 0 -> 13452 bytes
 src/skin/statusbar-shot.jpg          |  Bin 0 -> 2003 bytes
 src/skin/toolbar-shot.jpg            |  Bin 0 -> 4975 bytes
 22 files changed, 2726 insertions(+), 115 deletions(-)

diff --git a/src/chrome.manifest b/src/chrome.manifest
index 8fe1d1e..0f4da6f 100644
--- a/src/chrome.manifest
+++ b/src/chrome.manifest
@@ -7,3 +7,6 @@ locale nosquint en-US locale/en-US/
 
 skin nosquint classic/1.0 skin/
 style chrome://global/content/customizeToolbar.xul chrome://nosquint/skin/toolbar.css
+
+component {d0d9afd9-ef86-46fe-8a39-87c44dbce919} components/about-handler.js
+contract @mozilla.org/network/protocol/about;1?what=nosquint {d0d9afd9-ef86-46fe-8a39-87c44dbce919}
diff --git a/src/chrome.manifest.in b/src/chrome.manifest.in
index bc2ae92..1235729 100644
--- a/src/chrome.manifest.in
+++ b/src/chrome.manifest.in
@@ -7,3 +7,6 @@ locale nosquint en-US ${JAR}locale/en-US/
 
 skin nosquint classic/1.0 ${JAR}skin/
 style chrome://global/content/customizeToolbar.xul chrome://nosquint/skin/toolbar.css
+
+component {d0d9afd9-ef86-46fe-8a39-87c44dbce919} components/about-handler.js
+contract @mozilla.org/network/protocol/about;1?what=nosquint {d0d9afd9-ef86-46fe-8a39-87c44dbce919}
diff --git a/src/components/about-handler.js b/src/components/about-handler.js
new file mode 100644
index 0000000..ac77401
--- /dev/null
+++ b/src/components/about-handler.js
@@ -0,0 +1,28 @@
+const Cc = Components.classes;
+const Ci = Components.interfaces;
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
+function Aboutnosquint() {}
+
+Aboutnosquint.prototype = {
+  classDescription: "about:nosquint",
+  contractID: "@mozilla.org/network/protocol/about;1?what=nosquint",
+  classID: Components.ID("{d0d9afd9-ef86-46fe-8a39-87c44dbce919}"),
+  QueryInterface: XPCOMUtils.generateQI([Ci.nsIAboutModule]),
+  
+  getURIFlags: function(aURI) {
+    return Ci.nsIAboutModule.ALLOW_SCRIPT;
+  },
+  
+  newChannel: function(aURI) {
+    let ios = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
+    let channel = ios.newChannel("chrome://nosquint/content/about.html", null, null);
+    channel.originalURI = aURI;
+    return channel;
+  }
+};
+
+if (XPCOMUtils.generateNSGetFactory)
+    var NSGetFactory = XPCOMUtils.generateNSGetFactory([Aboutnosquint]);
+else
+    var NSGetModule = XPCOMUtils.generateNSGetModule([Aboutnosquint]);
diff --git a/src/content/about.html b/src/content/about.html
new file mode 100644
index 0000000..009d856
--- /dev/null
+++ b/src/content/about.html
@@ -0,0 +1,207 @@
+<html>
+<head>
+    <title>About NoSquint</title>
+    <style>
+        h1 {
+            font-family: tahoma, sans-serif;
+            font-size: 50px;
+            padding: 0;
+            margin-left: -40px;
+        }
+
+        a:link, a:visited {
+            text-decoration: none;
+            color: #0489b7;
+        }
+
+        a:hover, a:active {
+            text-decoration: underline;
+        }
+
+
+        #outer {
+            width: 80%;
+            margin: 0 auto;
+        }
+
+        div.box {
+            padding: 20px 0;
+            width: 100%;
+            margin: 40px 0 0;
+            background: #f9f9f9 url(chrome://nosquint/skin/box-grunge.png) 0 0 repeat-x;
+            border: 1px solid #dbe5ea;
+            -moz-border-radius: 10px;
+            border-radius: 10px;
+            -moz-box-shadow: 0 2px 3px rgba(0,0,0,0.05);
+        }
+
+        div.box:nth-child(2) {
+            margin: -65px 0 0;
+            padding: 30px 0;
+        }
+
+        div.box h2 {
+            color: #303030;
+            font-size: 150%;
+            margin: 0 0 10px;
+            font-family: georgia,serif;
+            font-weight: normal;
+            font-style: italic;
+        }
+
+        div.col > img {
+            display: block;
+            margin: 0 auto;
+            max-width: 100%;
+        }
+
+        div.box div.col {
+            float: left;
+            padding: 1px 0;
+            margin-left: 3%;
+            width: 29%;
+            font-size: 100%;
+            color: #6D7581;
+        }
+
+    </style>
+</head>
+<body>
+
+<div id='outer'>
+    <h1>
+        <img src="chrome://nosquint/skin/icon96.png" align='absmiddle' />
+        <span style='color: #b73636'>NoSquint</span> <span style='color: #666' id='version1'></1span>
+    </h1>
+    <div class='box'>
+        <div class='col'>
+            <h2>Welcome!</h2>
+            <p>Thanks for installing NoSquint <span id='version2'></span>!</p>
+            <p> NoSquint improves your browsing experience by giving you the tools you need to combat
+            small fonts and unreadable colors on the web.  </p>
+            <p>You can always find the <a href='https://urandom.ca/nosquint/'>latest version</a> online.</p>
+        </div>
+        <div class='col'>
+            <h2>Toolbar Buttons</h2>
+            <img src='chrome://nosquint/skin/toolbar-shot.jpg' />
+            <p id='toolbar-add-upgrade'>Did you know there are zoom buttons for the toolbar?</p>
+            <p id='toolbar-remove-upgrade'>The toolbar zoom buttons can be added and removed at any time.</p>
+            <p id='toolbar-remove-firstrun'>Because you're running NoSquint for the first time, zoom buttons have been added to your toolbar.</p>
+            <p id='toolbar-remove'>
+            <button id="toolbar-buttons-toggle">Add Toolbar Buttons</button>
+        </div>
+        <div class='col'>
+            <h2>Customize Your Toolbar</h2>
+            <p>Not happy with the default placement of the toolbar buttons?</p>
+            <p>Firefox lets you customize your toolbars.  You can drag the buttons to a different position,
+              or even to another toolbar.</p>
+            <button id="toolbar-buttons-customize">Customize Toolbar</button>
+        </div>
+        <div style='clear: both; margin-bottom: 40px'></div>
+
+
+        <div class='col'>
+            <h2>Getting Started</h2>
+            <p>If your status bar is visible, you should see the NoSquint icon in the bottom corner.</p>
+            <img src='chrome://nosquint/skin/statusbar-shot.jpg' />
+            <p>Clicking this icon with the left, middle, or right mouse buttons will provide different
+               options.  Go ahead and try!
+            <p>Try starting with NoSquint's global settings.<p>
+            <button id="global-settings">NoSquint Global Settings</button>
+        </div>
+        <div class='col'>
+            <h2>How do I zoom?</h2>
+            <p style='margin-bottom: 0'>All the standard zoom shortcuts are supported:</p>
+                <ul style='margin-top: 5px'>
+                    <li>Zoom in/out toolbar buttons</li>
+                    <li>Ctrl-mousewheel</li>
+                    <li>Ctrl-plus and ctrl-minus</li>
+                </ul>
+            </p>
+            <p>Here's a tip: middle clicking on the toolbar buttons will reset the zoom level.</p>
+            <p>And another tip: pressing the shift key with any zoom shortcut will use a different zoom method (text-only by default).</p>
+        </div>
+        <div class='col'>
+            <h2>Firefox 4</h2>
+            <p>As of version 4, Firefox natively includes zoom buttons for the toolbar.  If you're using Firefox 4, you may have noticed that NoSquint automatically replaced its old buttons with the native ones.  Don't worry, they still work like before!</p>
+            <p>In order to best interact with NoSquint, Firefox's new Addon Bar (which replaces the old status bar) should be enabled.  NoSquint will enable it for you when you upgrade.</p>
+
+        </div>
+        <div style='clear: both'></div>
+    </div>
+
+</div>
+
+
+<script type="application/x-javascript">
+var storage = Application.storage.get('nosquint-global', null);
+var NSQ = storage.NoSquint;
+var initialized = false;
+
+function $(id) {
+    return document.getElementById(id);
+}
+
+function update_toolbar_blurb(current) {
+    $('toolbar-remove-firstrun').style.display =
+    $('toolbar-remove-upgrade').style.display =
+    $('toolbar-add-upgrade').style.display = 'none';
+    $(current).style.display = '';
+
+    if (current == 'toolbar-add-upgrade')
+        $('toolbar-buttons-toggle').innerHTML= 'Add Toolbar Buttons';
+    else
+        $('toolbar-buttons-toggle').innerHTML = 'Remove Toolbar Buttons';
+}
+
+window.onload = function() {
+    if (initialized || !NSQ.prefs.currentVersion)
+        return;
+
+    var upgrading = NSQ.prefs.currentVersion != NSQ.prefs.lastVersion;
+    var [tbver, where] = NSQ.browser.checkToolbar();
+
+    if (upgrading && tbver == 3 && !NSQ.is3x()) {
+        // Version 3 buttons, running ff 4 or later, so replace.
+        NSQ.browser.modifyToolbar(3, where);
+        update_toolbar_blurb('toolbar-remove-upgrade');
+    } else if (NSQ.prefs.lastVersion == '0' && tbver == 0) {
+        // First install, add buttons.
+        NSQ.browser.modifyToolbar(1);
+        NSQ.cmd.showToolbarPanel();
+        update_toolbar_blurb('toolbar-remove-firstrun');
+    } else if (tbver)
+        update_toolbar_blurb('toolbar-remove-upgrade');
+    else
+        update_toolbar_blurb('toolbar-add-upgrade');
+
+    $('version1').innerHTML = $('version2').innerHTML = NSQ.prefs.currentVersion;
+
+    if (!NSQ.is3x() && upgrading)
+        NSQ.browser.enableAddonBar();
+
+    NSQ.prefs.lastVersion = NSQ.prefs.currentVersion;
+    initialized = true;
+}
+
+$('toolbar-buttons-toggle').onclick = function() {
+    var [hasButtons, where] = NSQ.browser.checkToolbar();
+    NSQ.browser.modifyToolbar(hasButtons ? 2 : 1);
+    if (!hasButtons) {
+        NSQ.cmd.showToolbarPanel();
+        update_toolbar_blurb('toolbar-remove-upgrade');
+    } else
+        update_toolbar_blurb('toolbar-add-upgrade');
+}
+
+$('toolbar-buttons-customize').onclick = function() {
+    NSQ.browser.customizeToolbar();
+}
+
+$('global-settings').onclick = function() {
+    NSQ.cmd.openGlobalSettings();
+}
+
+</script>
+</body>
+</html>
diff --git a/src/content/browser.js b/src/content/browser.js
index 5574395..cfd01ea 100644
--- a/src/content/browser.js
+++ b/src/content/browser.js
@@ -10,6 +10,7 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
     var zoomAllTimer = null;             // Timer for queueZoomAll()
     var styleAllTimer = null;            // Timer for queueStyleAll()
     var updateStatusTimer = null;        // Timer for queueUpdateStatus()
+    var tooltipDirty = false;            // True if tooltip needs updating on hover
 
     this.init = function() {
         this.gBrowser = gBrowser;
@@ -51,14 +52,121 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
         gBrowser.tabContainer.addEventListener('TabOpen', this.handleTabOpen, false);
         gBrowser.tabContainer.addEventListener('TabSelect', this.handleTabSelect, false);
         gBrowser.tabContainer.addEventListener('TabClose', this.handleTabClose, false);
-
+        
         this.zoomAll(null, true);
+        this.styleAll(null);
+
+        this.hookZoomButtonsForReset();
+        NoSquint.prefs.checkVersionChange();
     };
 
     this.destroy = function() {
+        if (NSQ.storage.dialogs.site)
+            NSQ.storage.dialogs.site.die();
+
+        gBrowser.tabContainer.removeEventListener('TabOpen', this.handleTabOpen, false);
+        gBrowser.tabContainer.removeEventListener('TabSelect', this.handleTabSelect, false);
+        gBrowser.tabContainer.removeEventListener('TabClose', this.handleTabClose, false);
+        window.removeEventListener('DOMMouseScroll', this.handleMouseScroll, false); 
+    };
+
+    this.hookZoomButtonsForReset = function() {
+        if ($('zoom-out-button')) {
+            $('zoom-out-button').onclick = $('zoom-in-button').onclick = 
+                function(event) {
+                    if (event.button == 1)
+                        NoSquint.cmd.buttonReset(event);
+                };
+
+            /* TODO
+            $('zoom-out-button').addEventListener('DOMMouseScroll', function(event) {
+                // Implement wheel zooming over button here.
+            }, false); 
+            */
+        }
+    };
+
+    /* Turns on the Addon Bar (Firefox 4)
+     */
+    this.enableAddonBar = function() {
+        var bar = $('addon-bar');
+        setToolbarVisibility(bar, true);
+    };
+
+    /* Checks whether the zoom buttons are added to any toolbar.  Returns a
+     * 2-tuple [ver, where], where 'ver' is version (3 being NoSquint's, 4
+     * being Firefox 4's native buttons) and where is the index within the
+     * toolbar here the first button was found.
+     */
+    this.checkToolbar = function() {
+        var [ver, button] = [4, $('zoom-controls')];
+        if (!button)
+            var [ver, button] = [3, $('nosquint-button-reduce')];
+        if (!button)
+            var [ver, button] = [3, $('nosquint-button-enlarge')];
+        if (!button)
+            return [0, null];
+        else {
+            var toolbar = button.parentNode;
+            var set = toolbar.currentSet.split(',');
+            return [ver, set.indexOf(button.id)];
+        }
+    };
+
+    /* Adds or removes zoom buttons to the toolbar.  Action is a bitmask with
+     * 1 being add, 2 being remove, and where is the position on the navbar to
+     * add the buttons.  If where is not passed, a good default will be chosen.
+     */
+    this.modifyToolbar = function(action, where) {
+        function remove(button) {
+            if (!button)
+                return;
+            var toolbar = button.parentNode;
+            var set = toolbar.currentSet.split(',');
+            set.splice(set.indexOf(button.id), 1);
+            toolbar.currentSet = set.join(',');
+            toolbar.setAttribute('currentset', set.join(','));
+            document.persist(toolbar.id, 'currentset');
+        }
+
+        if (action & 2) {
+            remove($('nosquint-button-reduce'));
+            remove($('nosquint-button-enlarge'));
+            remove($('nosquint-button-reset'));
+            remove($('zoom-controls'));
+        }
+
+        if (action & 1) {
+            var navbar = $('nav-bar');
+            var set = navbar.currentSet.split(',');
+            if (where === undefined || where === null) {
+                where = set.indexOf('search-container') + 1;
+                if (where == 0)
+                    where = set.length;
+            }
+            var ids = is3x() ? 'nosquint-button-reduce,nosquint-button-enlarge' : 'zoom-controls';
+            set = set.slice(0, where).concat(ids).concat(set.slice(where));
+            navbar.currentSet = set.join(',');
+            navbar.setAttribute('currentset', set.join(','));
+            document.persist(navbar.id, 'currentset');
+            this.hookZoomButtonsForReset();
+        }
+
+        try {
+            BrowserToolboxCustomizeDone(true);
+        }
+        catch (e) {}
+    };
+
+
+    /* Pops up the customize toolbar window.
+     */
+    this.customizeToolbar = function() {
+        return BrowserCustomizeToolbar();
     };
 
 
+
     /* Event handlers.  Reminder: 'this' will not be NSQ.browser
      */
 
@@ -69,8 +177,7 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
             var browser = gBrowser.selectedBrowser;
             var text = full = false;
             var increment = NSQ.prefs.zoomIncrement * (event.detail < 0 ? 1 : -1);
-            //var img = isImage(browser);
-            var img = false;
+            var img = isImage(browser);
                 
             if (NSQ.prefs.wheelZoomInvert)
                 increment *= -1;
@@ -80,11 +187,8 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
             else
                 text = Math.round((browser.markupDocumentViewer.textZoom * 100) + increment);
 
-            //if (!img || !browser.getUserData('nosquint').site) {
-            if (!img) {
-                NSQ.browser.zoom(browser, text, full);
-                NSQ.browser.saveCurrentZoom();
-            }
+            NSQ.browser.zoom(browser, text, full);
+            NSQ.browser.saveCurrentZoom();
         }
         event.stopPropagation();
         event.preventDefault();
@@ -162,10 +266,53 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
     };
 
 
+    this.updateStatusTooltip = function() {
+        if (!tooltipDirty)
+            return;
+        tooltipDirty = false;
+
+        // Get cached sitename for current browser.
+        var browser = gBrowser.selectedBrowser;
+        var site = browser.getUserData('nosquint').site;
+        var text = Math.round(browser.markupDocumentViewer.textZoom * 100);
+        var full = Math.round(browser.markupDocumentViewer.fullZoom * 100);
+
+        var e = $('nosquint-status');
+        // updateStatusTooltip() won't be called unless site is not null.
+        $('nosquint-status-tooltip-site').value = site.replace(/%20/g, ' ');
+        $('nosquint-status-tooltip-full').value = full + '%';
+        $('nosquint-status-tooltip-text').value = text + '%';
+
+        var style = this.getStyleForBrowser(browser);
+        var label = $('nosquint-status-tooltip-textcolor');
+        label.style.color = style.colorText || 'inherit';
+        label.style.backgroundColor = style.colorBackground || 'inherit';
+        label.value = (style.colorText || style.colorBackground) ? 'Sample' : 'Site Controlled';
+
+        var vis = $('nosquint-status-tooltip-vis-link');
+        var unvis = $('nosquint-status-tooltip-unvis-link');
+        unvis.value = vis.value = '';
+        vis.style.color = vis.style.textDecoration = 'inherit';
+        unvis.style.color = unvis.style.textDecoration = 'inherit';
+
+        if (!style.linksUnvisited && !style.linksVisited)
+            unvis.value = 'Site Controlled';
+        else {
+            for (let [attr, elem] in items({'linksUnvisited': unvis, 'linksVisited': vis})) {
+                if (style[attr]) {
+                    elem.value = attr.replace('links', '');
+                    elem.style.color = style[attr];
+                    elem.style.textDecoration = style.linksUnderline ? 'underline' : 'inherit';
+                }
+            }
+        }
+    };
+
     /* Updates the status panel and tooltip to reflect current site name
      * and zoom levels.
      */
     this.updateStatus = function() {
+        // Get cached sitename for current browser.
         var browser = gBrowser.selectedBrowser;
         var site = browser.getUserData('nosquint').site;
         // Disable/enable context menu item.
@@ -180,45 +327,20 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
             // Pref indicates we're hiding status panel, no sense in updating.
             return;
 
-        var text = Math.round(browser.markupDocumentViewer.textZoom * 100);
-        var full = Math.round(browser.markupDocumentViewer.fullZoom * 100);
-        var [text_default, full_default] = NSQ.prefs.getZoomDefaults();
-
         var e = $('nosquint-status');
         if (site) {
+            var text = Math.round(browser.markupDocumentViewer.textZoom * 100);
+            var full = Math.round(browser.markupDocumentViewer.fullZoom * 100);
+            var [text_default, full_default] = NSQ.prefs.getZoomDefaults(site);
+
             if (NSQ.prefs.fullZoomPrimary)
-                e.label = full + '%' + (text == 100 ? '' : (' / ' + text + '%'));
+                e.label = full + '%' + (text == text_default ? '' : (' / ' + text + '%'));
             else
-                e.label = text + '%' + (full == 100 ? '' : (' / ' + full + '%'));
-            $('nosquint-status-tooltip-site').value = site.replace(/%20/g, ' ');
-            $('nosquint-status-tooltip-full').value = full + '%';
-            $('nosquint-status-tooltip-text').value = text + '%';
-
-            var style = this.getStyleForBrowser(browser);
-            var label = $('nosquint-status-tooltip-textcolor');
-            label.style.color = style.colorText || 'inherit';
-            label.style.backgroundColor = style.colorBackground || 'inherit';
-            label.value = (style.colorText || style.colorBackground) ? 'Sample' : 'Site Controlled';
-
-            var vis = $('nosquint-status-tooltip-vis-link');
-            var unvis = $('nosquint-status-tooltip-unvis-link');
-            unvis.value = vis.value = '';
-            vis.style.color = vis.style.textDecoration = 'inherit';
-            unvis.style.color = unvis.style.textDecoration = 'inherit';
-
-            if (!style.linksUnvisited && !style.linksVisited)
-                unvis.value = 'Site Controlled';
-            else {
-                for (let [attr, elem] in items({'linksUnvisited': unvis, 'linksVisited': vis})) {
-                    if (style[attr]) {
-                        elem.value = attr.replace('links', '');
-                        elem.style.color = style[attr];
-                        elem.style.textDecoration = style.linksUnderline ? 'underline' : 'inherit';
-                    }
-                }
-            }
+                e.label = text + '%' + (full == full_default ? '' : (' / ' + full + '%'));
+
             $('nosquint-status-tooltip').style.display = '';
             e.style.fontStyle = e.style.opacity = 'inherit';
+            tooltipDirty = true;
         } else {
             $('nosquint-status-tooltip').style.display = 'none';
             e.label = 'N/A';
@@ -228,6 +350,7 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
              */
             e.style.opacity = 0.5;
             e.style.fontStyle = 'italic';
+            tooltipDirty = false;
         }
     };
 
@@ -252,13 +375,15 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
      */
     this.getZoomForBrowser = function(browser) {
         var site = browser.getUserData('nosquint').site;
-        if (site === null) {
+        debug('getZoomForBrowser(): site=' + site);
+        if (site === undefined) {
             site = this.getSiteFromBrowser(browser);
             browser.getUserData('nosquint').site = site;
+            debug('getZoomForBrowser(): after getSiteFromBrowser(), site=' + site);
         }
 
         var [text, full] = NSQ.prefs.getZoomForSite(site);
-        var [text_default, full_default] = NSQ.prefs.getZoomDefaults();
+        var [text_default, full_default] = NSQ.prefs.getZoomDefaults(site);
         return [text || text_default, full || full_default];
     };
 
@@ -281,6 +406,8 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
     this.attach = function(browser) {
         var listener = new NSQ.interfaces.ProgressListener(browser);
         browser.addProgressListener(listener, CI.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
+        debug('attach(): attached browser URI=' + browser.docShell.document.URL);
+
         var userData = {
             listener: listener,
             stylers: []
@@ -288,6 +415,8 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
         browser.setUserData('nosquint', userData, null);
 
         browser.addEventListener('DOMFrameContentLoaded', function(event) {
+            if (!event.target.contentWindow)
+                return;
             var styler = NSQ.browser.getDocumentStyler(browser, event.target.contentWindow.document);
             styler();
             browser.getUserData('nosquint').stylers.push(styler);
@@ -302,7 +431,7 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
      */
     this.zoom = function(browser, text, full) {
         if (!browser || (text == false && full == false))
-            return;
+            return false;
 
         var t0 = new Date().getTime();
         if (text == null || full == null) {
@@ -312,8 +441,8 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
             if (full == null)
                 full = full || site_full;
             // Only zoom web content, not chrome or plugins (e.g. PDF)
-            if (!browser.getUserData('nosquint').site)
-                [text, full] = [100, 100];
+            //if (!browser.getUserData('nosquint').site)
+            //    [text, full] = [100, 100];
         }
 
         debug("zoom(): text=" + text + ", full=" + full);
@@ -325,6 +454,7 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
             this.queueUpdateStatus();
         var t1 = new Date().getTime();
         debug('zoom(): took ' + (t1-t0));
+        return true;
     };
 
     /* Updates the zoom levels for all tabs; each tab is set to the levels
@@ -371,7 +501,7 @@ NoSquint.browser = NoSquint.ns(function() { with (NoSquint) {
     this.getCSSFromStyle = function(style) {
         var css = '';
         if (style.colorText || style.colorBackground || style.colorBackgroundImages) {
-            css += 'body,p,div,span,center,blockquote,h1,h2,h3,h4,h5,table,tr,th,td,iframe,a,b,i {';
+            css += 'body,p,div,span,font,ul,li,center,blockquote,h1,h2,h3,h4,h5,table,tr,th,td,iframe,a,b,i {';
             if (style.colorText)
                 css += 'color: ' + style.colorText + ' !important;';
             if (style.colorBackground)
diff --git a/src/content/cmd.js b/src/content/cmd.js
index eba119a..d33ea56 100644
--- a/src/content/cmd.js
+++ b/src/content/cmd.js
@@ -16,6 +16,8 @@ NoSquint.cmd = NoSquint.ns(function() { with (NoSquint) {
     };
 
     this.buttonReset = function(event) {
+        //event.stopPropagation();
+        //event.preventDefault();
         NSQ.cmd.reset();
     };
 
@@ -37,8 +39,9 @@ NoSquint.cmd = NoSquint.ns(function() { with (NoSquint) {
     };
 
     this.reset = function() {
-        var [text, full] = NSQ.prefs.getZoomDefaults();
-        var viewer = getBrowser().mCurrentBrowser.markupDocumentViewer;
+        var browser = getBrowser().mCurrentBrowser;
+        var [text, full] = NSQ.prefs.getZoomDefaults(NSQ.browser.getSiteFromBrowser(browser));
+        var viewer = browser.markupDocumentViewer;
         var updated = false;
 
         if (Math.round(viewer.textZoom * 100.0) != text)
@@ -119,10 +122,15 @@ NoSquint.cmd = NoSquint.ns(function() { with (NoSquint) {
         else if (event.button == 1)
             // Middle click, open global prefs.
             return NSQ.cmd.openGlobalSettings();
+    }
+
+    this.statusPanelPrepareMenu = function(event) {
+        if (event.button != 2)
+            // Not a right click.
+            return;
 
-        /* Right click.  Setup the context menu according to the current
-         * browser tab: the site name is set, and the appropriate radio 
-         * menuitems get selected.
+        /* Setup the context menu according to the current browser tab: the
+         * site name is set, and the appropriate radio menuitems get selected.
          */
         var popup = $('nosquint-status-popup');
         var browser = gBrowser.selectedBrowser;
@@ -145,7 +153,7 @@ NoSquint.cmd = NoSquint.ns(function() { with (NoSquint) {
         for (let child in iter(popup_full.childNodes))
             child.setAttribute('checked', child.label.replace(/%/, '') == current_full);
 
-        popup.openPopupAtScreen(event.screenX, event.screenY, true);
+        //popup.openPopupAtScreen(event.screenX, event.screenY, true);
     };
 
 
@@ -161,7 +169,7 @@ NoSquint.cmd = NoSquint.ns(function() { with (NoSquint) {
         var dlg = NSQ.storage.dialogs.site;
         if (dlg)
             return dlg.setBrowser(NSQ.browser, browser);
-        window.openDialog('chrome://nosquint/content/dlg-site.xul', null, 'chrome', NSQ.browser, browser);
+        window.openDialog('chrome://nosquint/content/dlg-site.xul', 'nsqSite', 'chrome', NSQ.browser, browser);
     };
 
 
@@ -178,7 +186,18 @@ NoSquint.cmd = NoSquint.ns(function() { with (NoSquint) {
                 host += ':' + browser.currentURI.port;
         } catch (err) {};
         var url = host + browser.currentURI.path;
-        window.openDialog('chrome://nosquint/content/dlg-global.xul', null, 'chrome', url);
+        window.openDialog('chrome://nosquint/content/dlg-global.xul', 'nsqGlobal', 'chrome', url);
+    };
+
+    this.showToolbarPanel = function() {
+        var panel = $('nosquint-toolbar-buttons-notify');
+        var anchor = $('zoom-out-button');
+        if (!anchor)
+            anchor = $('nosquint-button-reduce');
+        panel.openPopup(anchor, 'after_start', 0, 0, false, false, null);
+        defer(5000, function() {
+            panel.hidePopup();
+        });
     };
 
 }});
diff --git a/src/content/dlg-site.js b/src/content/dlg-site.js
index b314cc1..039e373 100644
--- a/src/content/dlg-site.js
+++ b/src/content/dlg-site.js
@@ -69,9 +69,11 @@ NoSquint.dialogs.site = NoSquint.ns(function() { with (NoSquint) {
 
         for (let [id, defcolor] in items(NSQ.prefs.defaultColors)) {
             $(id).parentNode.childNodes[1].color = (!style || style[id] == '0' ? defcolor : style[id]);
-            $(id).checked = (!style || style[id] == '0' ? false : true);
+            $(id).checked = Boolean(style && style[id] && style[id] != '0');
             this.colorChecked.apply($(id));
         }
+        for (let attr in iter(['colorBackgroundImages', 'linksUnderline']))
+            $(attr).checked = Boolean(style && style[attr] && style[attr] != '0');
         window.focus();
         window.sizeToContent();
     };
@@ -115,7 +117,7 @@ NoSquint.dialogs.site = NoSquint.ns(function() { with (NoSquint) {
     };
 
     this.buttonUseDefault = function(target) {
-        var [text, full] = NSQ.prefs.getZoomDefaults();
+        var [text, full] = NSQ.prefs.getZoomDefaults(this.site);
         var input = $(target.id.replace('button', 'level'));
         input.value = (input.id == 'text-zoom-level' ? text : full);
         input.onchange();
@@ -160,7 +162,7 @@ NoSquint.dialogs.site = NoSquint.ns(function() { with (NoSquint) {
                 style.enabled = style.enabled || Boolean(style[attr]);
             }
             for (let attr in iter(['colorBackgroundImages', 'linksUnderline'])) {
-                style[attr] = $(attr).checked;
+                style[attr] = Boolean($(attr).checked);
                 style.enabled = style.enabled || Boolean(style[attr]);
             }
         }
diff --git a/src/content/init.js b/src/content/init.js
index c571967..c379173 100644
--- a/src/content/init.js
+++ b/src/content/init.js
@@ -18,16 +18,31 @@ NoSquint = {
         return scope;
     },
 
+    /* This function is the load handler.  It calls init() on all namespaces
+     * previously registered with ns(), which happens for most .js files that
+     * are loaded via the overlay.
+     *
+     * Consequently, init() for each namespace should be kept light so as not
+     * to adversely affect load times.
+     *
+     * Currently initialization takes about 5-10ms with ff4 on my fairly peppy
+     * Thinkpad (i7 M 620 2.67GHz), which isn't horrible, but there's room for
+     * improvement.
+     */
     init: function() {
         if (NoSquint._initialized)
             return;
         NoSquint._initialized = true;
 
+        //var t0 = new Date().getTime();
         for (let i = 0; i < NoSquint.namespaces.length; i++) {
+            //var t1 = new Date().getTime();
             var scope = NoSquint.namespaces[i];
             if (scope.init !== undefined)
                 scope.init();
+            //dump(scope.id + " init took " + (new Date().getTime() - t1) + "\n");
         }
+        //dump("Total init took: " + (new Date().getTime() - t0) + "\n");
     },
 
     destroy: function() {
diff --git a/src/content/interfaces.js b/src/content/interfaces.js
index 5a9fdbe..dfb4867 100644
--- a/src/content/interfaces.js
+++ b/src/content/interfaces.js
@@ -6,11 +6,16 @@ NoSquint.interfaces = NoSquint.ns(function() { with (NoSquint) {
     /* Specifies at which state we will try to zoom and style the page.  With
      * 3.5+, we can style early with STATE_TRANSFERRING.  With 3.0, we seem to
      * have style later at STATE_STOP in order to get reliable results. (In 3.0
-     * using STATE_TRANSFERRING, on e.g. youtube.com the search bar is improperly
-     * rendered.
+     * using STATE_TRANSFERRING, on e.g. youtube.com the search bar is
+     * improperly rendered.  [And this, quite perplexingly, is caused by
+     * accessing doc.documentElement in NSQ.browser.style()])
      */
     var stateFlag = is30() ? Components.interfaces.nsIWebProgressListener.STATE_STOP
                            : Components.interfaces.nsIWebProgressListener.STATE_TRANSFERRING;
+    /* XXX: if we use STATE_STOP, the move-tab-between-windows kludge below stops
+     * working.
+     */
+    //var stateFlag = Components.interfaces.nsIWebProgressListener.STATE_STOP;
 
     /* Listener used to receive notifications when a new URI is about to be loaded.
      * TODO: when support for Firefox 3.0 is dropped, use:
@@ -49,7 +54,7 @@ NoSquint.interfaces = NoSquint.ns(function() { with (NoSquint) {
                 // New document on the same site.
                 return;
 
-            debug("onLocationChange(): old=" + userData.site + "new=" + site + ", uri=" + uri.spec);
+            debug("onLocationChange(): old=" + userData.site + ", new=" + site + ", uri=" + uri.spec);
             /* Update timestamp for site.  This isn't _quite_ perfect because
              * the timestamp is only updated for the first page load on that site
              * rather than the last.  But it should be good enough in practice, and
@@ -66,6 +71,8 @@ NoSquint.interfaces = NoSquint.ns(function() { with (NoSquint) {
              * onStateChange the way styling is currently hooked.
              * XXX: 3.6 private browsing mode exhibits some problems, so zooming
              * is back in onStateChange.
+             * https://support.mozilla.com/en-US/forum/1/563849
+             * https://bugzilla.mozilla.org/show_bug.cgi?id=526828
              */
             NSQ.browser.zoom(this.browser);
 
@@ -86,14 +93,33 @@ NoSquint.interfaces = NoSquint.ns(function() { with (NoSquint) {
             var contentType = this.browser.docShell.document.contentType;
             if (this.contentType != contentType) {
                 this.contentType = contentType;
+                var userData = this.browser.getUserData('nosquint');
                 if (isChrome(this.browser)) {
-                    this.browser.getUserData('nosquint').site = null;
+                    // Content type is changed and it's now chrome.  Unzoom (or
+                    // zoom to 100%)
+                    userData.site = null;
                     NSQ.browser.zoom(this.browser, 100, 100);
+                } else if (userData.site === null) {
+                    // Was considered chrome, but now isn't.  Rezoom/style.
+                    delete userData.site;
+                    NSQ.browser.zoom(this.browser);
+                    this.styleApplied = NSQ.browser.style(this.browser);
                 }
             } else if (state & stateFlag) {
                 if (!this.zoomApplied) {
                     this.zoomApplied = true;
-                    NSQ.browser.zoom(this.browser);
+                    if (NSQ.browser.observer.inPrivateBrowsing) {
+                        /* In private browsing mode, Firefox does not honor
+                         * siteSpecific=false and resets the zoom level back to
+                         * 100% after every page load (bug #526828).  So we
+                         * must resort to this retarded hack, queuing a zoom in
+                         * 100ms.  This seems to work ok empirically, but a race
+                         * is theoretically possible. *grmbl*
+                         */
+                        var b = this.browser;
+                        setTimeout(function() NSQ.browser.zoom(b), 100);
+                    } else
+                        NSQ.browser.zoom(this.browser);
                 }
                 if (!this.styleApplied) {
                     if (!isChrome(this.browser) || isImage(this.browser))
@@ -101,7 +127,46 @@ NoSquint.interfaces = NoSquint.ns(function() { with (NoSquint) {
                     else
                         this.styleApplied = true;
                 }
+            } else if (state & Components.interfaces.nsIWebProgressListener.STATE_IS_DOCUMENT &&
+                       this.browser.getUserData('nosquint').site == null && !is30()) {
+                /* Kludge: when moving a tab from one window to another, the
+                 * listener previously created and attached in
+                 * NSQ.browser.attach() seems to either stop working or gets
+                 * implicitly detached somewhere afterward.  The tab gets
+                 * created initially as about:blank, so NoSquint thinks it's
+                 * chrome.  The tab gets updated for the proper site, but since
+                 * the listener isn't working, NoSquint doesn't hear about it.
+                 *
+                 * The specific magical incantation to deal with this seems to
+                 * be handling STATE_IS_DOCUMENT when site=null.  After a 0ms
+                 * timer, we try to re-add this listener ('this').  If it
+                 * fails, we assume the listener from attach() is still there
+                 * and everything is cool after all.  Otherwise, regenerate the
+                 * site name and rezooms/style.
+                 *
+                 * This seems to solve the problem, but feels like a nasty volatile
+                 * hack to work around what is probably a firefox bug, and will
+                 * likely break in the future.  It doesn't seem to be necessary
+                 * with 3.0, but is with 3.5+.
+                 */
+                var browser = this.browser;
+                var listener = this;
+                setTimeout(function() {
+                    try {
+                        browser.addProgressListener(listener, CI.nsIWebProgress.NOTIFY_STATE_DOCUMENT);
+                    } catch (err) {
+                        // Assume ProgressListener was already attached after all, so
+                        // we don't need to do anything.
+                        return;
+                    }
+                    browser.getUserData('nosquint').listener = listener;
+                    // Forces getZoomForBrowser() (via zoom()) to redetermine site name.
+                    delete browser.getUserData('nosquint').site;
+                    NSQ.browser.zoom(browser);
+                    NSQ.browser.style(browser);
+                }, 0);
             }
+
         },
 
         onProgressChange: function() 0,
@@ -137,7 +202,13 @@ NoSquint.interfaces = NoSquint.ns(function() { with (NoSquint) {
         _hook: function() {
             this._os.addObserver(this, "private-browsing", false);  
             this._os.addObserver(this, "quit-application-granted", false);  
-            this._os.addObserver(this, "em-action-requested", false);  
+            if (is3x())
+                this._os.addObserver(this, "em-action-requested", false);  
+            else {
+                Components.utils.import("resource://gre/modules/AddonManager.jsm");
+                AddonManager.addAddonListener(this);
+            }
+
             try {  
                 var pbs = Components.classes["@mozilla.org/privatebrowsing;1"]  
                                   .getService(Components.interfaces.nsIPrivateBrowsingService);  
@@ -145,6 +216,7 @@ NoSquint.interfaces = NoSquint.ns(function() { with (NoSquint) {
             } catch(ex) {  
                 // ignore exceptions in older versions of Firefox  
             }
+
             this._hooked = true;
         },
 
@@ -154,6 +226,28 @@ NoSquint.interfaces = NoSquint.ns(function() { with (NoSquint) {
             this._hooked = false;
         },
 
+        onDisabling: function(addon, needsRestart) {
+            if (addon.id != 'nosquint at urandom.ca' || NSQ.storage.disabled)
+                return;
+
+            NSQ.storage.disabled = true;
+            if (popup('confirm', NSQ.strings.disableTitle, NSQ.strings.disablePrompt) == 1) {
+                // Clicked no
+            } else
+                NSQ.prefs.setSiteSpecific(true);
+        },
+
+        onUninstalling: function(addon, needsRestart) {
+            return this.onDisabling(addon, needsRestart);
+        },
+
+        onOperationCancelled: function(addon) {
+            if (addon.id != 'nosquint at urandom.ca' || NSQ.storage.disabled != true)
+                return;
+            NSQ.prefs.setSiteSpecific(false);
+            NSQ.storage.disabled = false;
+        },
+
         observe: function (subject, topic, data) {  
             switch (topic) {
                 case "private-browsing":
@@ -177,27 +271,19 @@ NoSquint.interfaces = NoSquint.ns(function() { with (NoSquint) {
                     this._unhook();
                     break;
 
+                // This is for ff 3.x; just dispatch to the 4.x handlers.
                 case "em-action-requested":
                     switch (data) {
                         case "item-disabled":
                         case "item-uninstalled":
-                            var item = subject.QueryInterface(Components.interfaces.nsIUpdateItem);
-                            if (item.id != 'nosquint at urandom.ca' || NSQ.storage.disabled)
-                                break;
-
-                            NSQ.storage.disabled = true;
-                            if (popup('confirm', NSQ.strings.disableTitle, NSQ.strings.disablePrompt) == 1) {
-                                // Clicked no
-                            } else
-                                NSQ.prefs.setSiteSpecific(true);
+                            var addon = subject.QueryInterface(Components.interfaces.nsIUpdateItem);
+                            this.onDisabling(addon, true);
                             break;
                         
                         case "item-cancel-action":
-                            var item = subject.QueryInterface(Components.interfaces.nsIUpdateItem);
-                            if (item.id != 'nosquint at urandom.ca' || NSQ.storage.disabled != true)
-                                break;
-                            NSQ.prefs.setSiteSpecific(false);
-                            NSQ.storage.disabled = false;
+                            var addon = subject.QueryInterface(Components.interfaces.nsIUpdateItem);
+                            this.onOperationCancelled(addon);
+                            break;
                     }
                     break;
             }
diff --git a/src/content/lib.js b/src/content/lib.js
index 1163140..dd9308f 100644
--- a/src/content/lib.js
+++ b/src/content/lib.js
@@ -6,26 +6,33 @@
      * exists once, and is referenced for each window.  (In contrast, doing
      * Application.storage.set('foo', [1,2]) will store a copy of the list.)
      */
-    var extstorage = Application.extensions.get('nosquint at urandom.ca').storage;
-    this.storage = extstorage.get('global', null);
+    this.storage = Application.storage.get('nosquint-global', null);
     if (this.storage === null) {
         // Initialize global defaults.
         this.storage = {
             disabled: false,
             quitting: false,
             origSiteSpecific: null,
-            dialogs: {}
+            dialogs: {},
+            NoSquint: NoSquint
         };
-        extstorage.set('global', this.storage);
+        Application.storage.set('nosquint-global', this.storage);
     }
 
-
     this.is30 = function() {
         return Application.version.substr(0, 4) == '3.0.';
     };
 
     this.is36 = function() {
-        return Application.version.substr(0, 4) >=  '3.6.';
+        return Application.version.substr(0, 4) == '3.6.';
+    };
+
+    this.is3x = function() {
+        return Application.version.substr(0, 4) < '4.0';
+    };
+
+    this.is40 = function() {
+        return Application.version.substr(0, 4) >= '4.0.';
     };
 
     this.$ = function(id, doc) {
@@ -75,7 +82,7 @@
     this.getBaseDomainFromHost = function(host) {
         if (this.storage.TLDs === undefined) {
             // First window opened, so parse from stored list, which is
-            // borrowed from http://www.surbl.org/two-level-tlds
+            // borrowed from http://george.surbl.org/two-level-tlds
             this.storage.TLDs = {};
             for each (let line in this.readLines('chrome://nosquint/content/two-level-tlds'))
                 this.storage.TLDs[line] = true;
@@ -106,6 +113,7 @@
     this.isChrome = function(browser) {
         var document = browser.docShell.document;
         
+        //this.debug('isChrome(): URL=' + document.URL + ', spec=' + browser.currentURI.spec + ', contentType=' + document.contentType);
         if (document.URL == undefined)
             return true;
 
@@ -122,13 +130,14 @@
             return true;
 
         // A couple other common cases.
-        if (document.URL == undefined || document.URL.substr(0, 6) == 'about:')
-            return true;
         if (document.contentType == 'text/html' || document.contentType == 'application/xhtml+xml')
             return false;
+        if (document.URL == undefined || document.URL.substr(0, 6) == 'about:')
+            return true;
 
         // Less common cases that we'll cover with the more expensive regexp.
         return document.contentType.search(/^text\/(plain|css|xml|javascript)/) != 0;
+        //return document.contentType.search(/^text\/(plain|css|xml|javascript)|image\//) != 0;
     };
 
     this.isImage = function(browser) {
@@ -217,4 +226,11 @@
         }
     };
 
+    this.defer = function(delay, callback) {
+        var timer = setTimeout(function() {
+            callback();
+            clearTimeout(timer);
+        }, delay);
+    };
+
 }).apply(NoSquint);
diff --git a/src/content/overlay.xul b/src/content/overlay.xul
index cc12c52..b1bf066 100644
--- a/src/content/overlay.xul
+++ b/src/content/overlay.xul
@@ -19,9 +19,11 @@
     <toolbarpalette id="BrowserToolbarPalette">
         <toolbarbutton id="nosquint-button-reduce" class="toolbarbutton-1"
                        label="Zoom Out" tooltiptext="Zoom out"
+                       onclick="if (event.button == 1) NoSquint.cmd.buttonReset(event)"
                        oncommand="NoSquint.cmd.buttonReduce(event);" />
         <toolbarbutton id="nosquint-button-enlarge" class="toolbarbutton-1"
                        label="Zoom In" tooltiptext="Zoom in"
+                       onclick="if (event.button == 1) NoSquint.cmd.buttonReset(event)"
                        oncommand="NoSquint.cmd.buttonEnlarge(event);" />
         <toolbarbutton id="nosquint-button-reset" class="toolbarbutton-1"
                        label="Reset Zoom" tooltiptext="Reset Zoom"
@@ -37,9 +39,9 @@
 
     <commandset id="mainCommandSet">
         <command id="cmd_noSquintPrefs" oncommand="NoSquint.cmd.openGlobalSettings()" />
-        <command id="cmd_fullZoomEnlarge" oncommand="NoSquint.cmd.enlargePrimary()" />
-        <command id="cmd_fullZoomReduce" oncommand="NoSquint.cmd.reducePrimary()" />
-        <command id="cmd_fullZoomReset" oncommand="NoSquint.cmd.reset()" />
+        <command id="cmd_fullZoomEnlarge" oncommand="NoSquint.cmd.buttonEnlarge(event)" />
+        <command id="cmd_fullZoomReduce" oncommand="NoSquint.cmd.buttonReduce(event)" />
+        <command id="cmd_fullZoomReset" oncommand="NoSquint.cmd.buttonReset(event)" />
         <command id="cmd_noSquintEnlargeSecondary" oncommand="NoSquint.cmd.enlargeSecondary()" />
         <command id="cmd_noSquintReduceSecondary" oncommand="NoSquint.cmd.reduceSecondary()" />
     </commandset>
@@ -50,7 +52,7 @@
     </popup>
 
     <statusbar id="status-bar">
-        <tooltip id="nosquint-status-tooltip" orient="vertical">
+        <tooltip id="nosquint-status-tooltip" orient="vertical" onpopupshowing="NoSquint.browser.updateStatusTooltip()">
             <grid>
                 <columns>
                     <column />
@@ -131,14 +133,21 @@
                     <menuitem type="radio" name="text" label="150%" />
                 </menupopup>
             </menu>
-            <menuitem id="nosquint-status-reset" label="&ns.menu.reset.label;" onclick="NoSquint.cmd.reset()" />
-            <menuitem label="&ns.menu.siteSettings.label;" onclick="NoSquint.cmd.openSiteSettings()" />
+            <menuitem id="nosquint-status-reset" label="&ns.menu.reset.label;" oncommand="NoSquint.cmd.reset()" />
+            <menuitem label="&ns.menu.siteSettings.label;" oncommand="NoSquint.cmd.openSiteSettings()" />
             <menuseparator />
-            <menuitem label="&ns.menu.globalSettings.label;" onclick="NoSquint.cmd.openGlobalSettings()" />
+            <menuitem label="&ns.menu.globalSettings.label;" oncommand="NoSquint.cmd.openGlobalSettings()" />
         </menupopup>
 
+    <panel id="nosquint-toolbar-buttons-notify" type="arrow" fade="slow" style="padding:0.5em">
+        <description value="Zoom buttons have been added to your toolbar." />
+    </panel>
+
+
         <statusbarpanel class="statusbarpanel-iconic-text" id="nosquint-status" label="100%" 
-                        onclick="NoSquint.cmd.statusPanelClick(event)" 
+                        onclick="return NoSquint.cmd.statusPanelClick(event)" 
+                        onmousedown="return NoSquint.cmd.statusPanelPrepareMenu(event)" 
+                        context="nosquint-status-popup"
                         src="chrome://nosquint/skin/icon-statusbar-16.png" 
                         tooltip="nosquint-status-tooltip" />
     </statusbar>
diff --git a/src/content/prefs.js b/src/content/prefs.js
index 5f6c003..fda15b1 100644
--- a/src/content/prefs.js
+++ b/src/content/prefs.js
@@ -22,6 +22,15 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
         linksVisited: '#551a8b'
     };
 
+    /* Active window we can use for window methods (e.g. setTimeout).  Because
+     * NSQ.prefs is a singleton, it could be that the window we initialized
+     * with has been closed.  In that case, setTimeout will fail with 
+     * NS_ERROR_NOT_INITIALIZED.  So we keep a reference to an available
+     * window here we can call window.* methods with, and if the window
+     * goes away, we find a new one using foreachNSQ().
+     */
+    this.window = window;
+
     // Pref service.
     var svc = Components.classes["@mozilla.org/preferences-service;1"].getService(
                           Components.interfaces.nsIPrefService);
@@ -94,6 +103,11 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
     };
 
     this.destroy = function() {
+        if (this.rememberSites)
+            // In case the window shutting down is the one whose saveTimer is
+            // associated with, we should finish any pending save now.
+            this.finishPendingSaveSiteList();
+
         if (!NSQ.storage.quitting)
             // NSQ.prefs is a singleton so we only ever truly destroy on app
             // shutdown.
@@ -102,18 +116,32 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
         branchNS.removeObserver('', this);
         branchBZ.removeObserver('', this);
 
-        if (this.rememberSites)
-            this.finishPendingSaveSiteList();
-        else
+        if (!this.rememberSites)
             // Per-site setting storage disabled.
             branchNS.setCharPref('sites', '');
 
         this.setSiteSpecific(origSiteSpecific);
+        this.save();
+    };
+
+
+    /* Invoke a window method, such as setTimeout.  We need to do this indirectly
+     * because NSQ.prefs is a singleton, and the window NSQ.prefs initialized with
+     * may not actually still be alive.
+     */
+    this.winFunc = function(func) {
+        var args = Array.prototype.slice.call(arguments, 1); 
+        try {
+            return this.window[func].apply(this.window, args);
+        } catch (e) {
+            // Presumably NS_ERROR_NOT_INITIALIZED.  TODO: verify.
+            this.window = foreachNSQ(function() false);
+            return this.window[func].apply(this.window, args);
+        }
     };
 
     this.setSiteSpecific = function(value) {
         branchBZ.setBoolPref('siteSpecific', value);
-        this.save();
     };
 
     this.preload = function() {
@@ -136,6 +164,7 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
             // Not a pref change.
             return;
 
+        debug('observe(): data=' + data);
         switch (data) {
             case 'siteSpecific':
                 if (branchBZ.getBoolPref('siteSpecific') == false || NSQ.storage.disabled || NSQ.storage.quitting)
@@ -424,7 +453,6 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
         var remove = [];
         var now = new Date();
         for (let [site, settings] in items(this.sites)) {
-        //for (let [site, settings] in Iterator(this.sites)) {
             if (!settings)
                 continue
             var [text, timestamp, counter, full] = settings;
@@ -442,7 +470,7 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
 
         // Fire timer once a day.
         if (pruneTimer == null)
-            pruneTimer = setTimeout(function() { pruneTimer = null; NSQ.prefs.pruneSites(); }, 24*60*60*1000);
+            pruneTimer = this.winFunc('setTimeout', function() { pruneTimer = null; NSQ.prefs.pruneSites(); }, 24*60*60*1000);
     };
 
 
@@ -460,7 +488,7 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
 
         if (levels) {
             // Update record with specified levels.
-            var [text_default, full_default] = this.getZoomDefaults();
+            var [text_default, full_default] = this.getZoomDefaults(site);
             var [text, full] = levels;
             // Default zooms are stored as 0.
             record[0] = text == text_default ? 0 : text;
@@ -523,7 +551,7 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
          * needlessly iterating over the sites array.
          */
         debug("queueSaveSiteList(): delay=" + this.saveDelay);
-        saveTimer = setTimeout(function() NSQ.prefs.saveSiteList(), this.saveDelay);
+        saveTimer = this.winFunc('setTimeout', function() NSQ.prefs.saveSiteList(), this.saveDelay);
     };
 
 
@@ -551,7 +579,7 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
         branchNS.setCharPref('sites', sites.join(' '));
         this.save();
         debug("saveSiteList(): took: " + (new Date().getTime() - t0) + "ms");
-        clearTimeout(saveTimer);
+        this.winFunc('clearTimeout', saveTimer);
         saveTimer = null;
     };
 
@@ -563,7 +591,7 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
         if (saveTimer === null)
             return false;
 
-        clearTimeout(saveTimer);
+        this.winFunc('clearTimeout', saveTimer);
         saveTimer = null;
         return true;
     };
@@ -585,7 +613,9 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
     /* Returns a 2-tuple [text_default, full_default] representing the default
      * zoom levels.
      */
-    this.getZoomDefaults = function() {
+    this.getZoomDefaults = function(site) {
+        if (!site || site.substr(0, 6) == 'about:')
+            return [100, 100];
         return [this.textZoomLevel, this.fullZoomLevel];
     };
 
@@ -599,6 +629,14 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
         if (!URI)
             return null;
 
+        /* It's a bit ugly to hard-code the 'about' case here.  But make it
+         * not-ugly would require some significant reworking of the site
+         * name logic.
+         */
+        if (URI.scheme == 'about')
+            // Truncate path after non-word character (e.g. ?foo=bar is stripped)
+            return URI.scheme + ':' + URI.path.replace(/\W.*$/, '');
+
         var uri_host = URI.asciiHost;
         var uri_path = URI.path;
 
@@ -765,4 +803,57 @@ NoSquint.prefs = NoSquint.ns(function() { with(NoSquint) {
             }
         });
     };
+
+
+    this.checkVersionChange = function() {
+        this.lastVersion = branchNS.getCharPref('version');
+        function callback(addon) {
+            NSQ.prefs.currentVersion = addon.version;
+            var found = false;
+            foreachNSQ(function(NSQ) {
+                for (let browser in iter(NSQ.browser.gBrowser.browsers)) {
+                    if (browser.currentURI.spec == 'about:nosquint') {
+                        /* With ff4, fetching the addon object is asynchronous, and with ff3, we
+                         * defer this callback also (so as not to take the startup hit), so any
+                         * previously opened about:nosquint tabs (which may be reopened on startup)
+                         * may be loaded before NSQ.prefs.currentVersion is set.  This quasi-hack
+                         * (re)triggers the 'load' event on the window so that the necessary
+                         * elements get updated.
+                         */
+                        var evt = document.createEvent('HTMLEvents');
+                        evt.initEvent('load', true, false);
+                        browser.contentWindow.dispatchEvent(evt);
+                        // XXX: see note below about version comparison.
+                        if (addon.version != NSQ.prefs.lastVersion && !found) {
+                            NSQ.browser.gBrowser.selectedTab = browser;
+                            found = true;
+                        }
+                    }
+                }
+            });
+
+            /* XXX: if we change this to > rather than !=, we need to be smarter than
+             * a simple lexographic comparison, because '2.1b1' > '2.1' which isn't
+             * expected behaviour.
+             */
+            if (addon.version != NSQ.prefs.lastVersion) {
+                if (!found)
+                    NSQ.browser.gBrowser.selectedTab = gBrowser.addTab('about:nosquint');
+                branchNS.setCharPref('version', addon.version);
+                NoSquint.prefs.save();
+            }
+        };
+
+        if (is3x()) {
+            /* Because this.checkVersionChange() is called during init of NSQ.browser,
+             * and Application.extensions.get() is synchronous, defer this call.
+             */
+            defer(0, function() callback(Application.extensions.get('nosquint at urandom.ca')));
+        } else {
+            Components.utils.import("resource://gre/modules/AddonManager.jsm");
+            AddonManager.getAddonByID('nosquint at urandom.ca', callback);
+        }
+    };
+
+
 }});
diff --git a/src/content/two-level-tlds b/src/content/two-level-tlds
index 379f194..814ba59 100644
--- a/src/content/two-level-tlds
+++ b/src/content/two-level-tlds
@@ -1,4 +1,25 @@
+0.bg
+1.bg
+110mb.com
+150m.com
+163.to
+1blu.de
+2.bg
 2000.hu
+3.bg
+4.bg
+5.bg
+6.bg
+6a.org
+6bone.pl
+7.bg
+8.bg
+9.bg
+9k.com
+a.bg
+a.se
+aa.no
+aarborte.no
 ab.ca
 ab.se
 abo.pa
@@ -7,6 +28,7 @@ ac.am
 ac.at
 ac.bd
 ac.be
+ac.ci
 ac.cn
 ac.com
 ac.cr
@@ -27,16 +49,20 @@ ac.ke
 ac.kr
 ac.lk
 ac.ma
+ac.me
+ac.mu
 ac.mw
 ac.ng
 ac.nz
 ac.om
 ac.pa
 ac.pg
+ac.pr
 ac.rs
 ac.ru
 ac.rw
 ac.se
+ac.sz
 ac.th
 ac.tj
 ac.tz
@@ -47,140 +73,483 @@ ac.yu
 ac.za
 ac.zm
 ac.zw
+aca.pro
+academy.museum
+accident-investigation.aero
+accident-prevention.aero
 act.au
 ad.jp
+addr.com
 adm.br
 adult.ht
 adv.br
 adygeya.ru
+ae.org
+aejrie.no
 aero.mv
 aero.tt
+aerobatic.aero
+aeroclub.aero
+aerodrome.aero
 aeroport.fr
+afjord.no
+ag.it
+agdenes.no
+agents.aero
 agr.br
 agrar.hu
+agriculture.museum
+agrigento.it
+agrinet.tn
 agro.pl
 ah.cn
+ah.no
 aichi.jp
 aid.pl
+aip.ee
+air-surveillance.aero
+air-traffic-control.aero
+air.museum
+aircraft.aero
+airguard.museum
+airline.aero
+airport.aero
+airtraffic.aero
 ak.us
 akita.jp
+aknoluokta.no
+akrehamn.no
+al.it
+al.no
 al.us
+alabama.museum
+alaheadju.no
 aland.fi
+alaska.museum
 alderney.gg
+alessandria.it
+alesund.no
+algard.no
+alstahaug.no
 alt.na
 alt.za
+alta.no
 altai.ru
+altervista.org
+alto-adige.it
+altoadige.it
+alvdal.no
 am.br
+amber.museum
+ambulance.aero
+ambulance.museum
+american.museum
+americana.museum
+americanantiques.museum
+americanart.museum
+amli.no
+amot.no
+amsterdam.museum
 amur.ru
 amursk.ru
+amusement.aero
+an.it
+ancona.it
+and.museum
+andasuolo.no
+andebu.no
+andoy.no
+angelfire.com
+annefrank.museum
+anthro.museum
+anthropology.museum
+antiques.museum
+ao.it
 aomori.jp
+aosta.it
+aoste.it
+ap.it
+appspot.com
+aq.it
+aquarium.museum
+aquila.it
+ar.com
+ar.it
 ar.us
+arboretum.museum
+archaeological.museum
+archaeology.museum
+architecture.museum
+ardal.no
+aremark.no
+arendal.no
+arezzo.it
 arkhangelsk.ru
 army.mil
+arna.no
 arq.br
 art.br
 art.do
 art.dz
 art.ht
+art.museum
 art.pl
+artanddesign.museum
+artcenter.museum
+artdeco.museum
+arteducation.museum
+artgallery.museum
 arts.co
+arts.museum
+arts.nf
 arts.ro
 arts.ve
+artsandcrafts.museum
+as.us
+ascoli-piceno.it
+ascolipiceno.it
+aseral.no
+asker.no
+askim.no
+askoy.no
+askvoll.no
+asmatart.museum
 asn.au
 asn.lv
+asnes.no
 ass.dz
+ass.km
+assassination.museum
 assedic.fr
+assisi.museum
 assn.lk
+asso.ci
 asso.dz
 asso.fr
 asso.gp
 asso.ht
+asso.km
+asso.ma
 asso.mc
 asso.re
+asso.ws
+association.aero
+association.museum
+asti.it
 astrakhan.ru
+astronomy.museum
+at.it
+at.lv
+at.pn
+at.tc
 at.tf
 at.tt
+ath.cx
+atlanta.museum
 atm.pl
 ato.br
 au.com
+au.ms
+au.pn
+au.tc
 au.tt
+audnedaln.no
+augustow.pl
+aukra.no
+aure.no
+aurland.no
+aurskog-holand.no
+austevoll.no
+austin.museum
+australia.museum
+austrheim.no
+author.aero
 auto.pl
+automotive.museum
+av.it
 av.tr
+avellino.it
+averoy.no
+aviation.museum
 avocat.fr
 avoues.fr
+axis.museum
 az.us
+a�roport.ci
+b.bg
+b.se
+ba.it
+babia-gora.pl
+badaddja.no
+badajoz.museum
+baghdad.museum
+bahcavuotna.no
+bahccavuotna.no
+bahn.museum
+baidar.no
 baikal.ru
+bajddar.no
+balat.no
+bale.museum
+balestrand.no
+ballangen.no
+ballooning.aero
+balsan.it
+balsfjord.no
+baltimore.museum
+bamble.no
+bar.pro
+barcelona.museum
+bardu.no
+bari.it
+barletta-andria-trani.it
+barlettaandriatrani.it
 barreau.fr
+barum.no
+baseball.museum
+basel.museum
 bashkiria.ru
+baths.museum
+batsfjord.no
+bauern.museum
 bbs.tr
 bc.ca
 bd.se
+be.tc
 be.tt
+bearalvahki.no
+beardu.no
+beauxarts.museum
+bedzin.pl
+beeldengeluid.museum
+beiarn.no
 bel.tr
+belau.pw
 belgie.be
 belgorod.ru
+bellevue.museum
+belluno.it
+benevento.it
+berg.no
+bergamo.it
+bergbau.museum
+bergen.no
+berkeley.museum
+berlevag.no
+berlin.museum
+bern.museum
+beskidy.pl
+bg.it
+bg.tc
 bg.tf
+bi.it
+bialowieza.pl
 bialystok.pl
 bib.ve
+bible.museum
+bielawa.pl
+biella.it
+bieszczady.pl
+bievat.no
+bilbao.museum
+bill.museum
+bindal.no
 bio.br
 bir.ru
+birdart.museum
+birkenes.no
+birthplace.museum
 biz.az
 biz.bh
 biz.cy
 biz.et
 biz.fj
+biz.ki
 biz.ly
 biz.mv
+biz.mw
 biz.nr
 biz.om
 biz.pk
 biz.pl
 biz.pr
 biz.tj
+biz.tm
 biz.tr
 biz.tt
+biz.ua
 biz.vn
 bj.cn
+bjarkoy.no
+bjerkreim.no
+bjugn.no
+bl.it
 bl.uk
+blog.br
+blog.com
+blog.ru
+blog4ever.com
+blogspot.com
 bmd.br
+bn.it
+bo.it
+bodo.no
+bokn.no
+boleslawiec.pl
+bologna.it
 bolt.hu
+bolzano.it
+bomlo.no
+bonn.museum
+boston.museum
+botanical.museum
+botanicalgarden.museum
+botanicgarden.museum
+botany.museum
 bourse.za
+bozen.it
 br.com
+br.it
+br.ms
+br.tc
 brand.se
+brandywinevalley.museum
+brasil.museum
+bravehost.com
+bravepages.com
+bremanger.no
+brescia.it
+brindisi.it
+bristol.museum
 british-library.uk
+british.museum
+britishcolumbia.museum
+broadcast.museum
+broker.aero
+bronnoy.no
+bronnoysund.no
+brumunddal.no
+brunel.museum
+brussel.museum
+brussels.museum
+bruxelles.museum
 bryansk.ru
+bryne.no
+bs.it
+bu.no
+budejju.no
+building.museum
+burghof.museum
 buryatia.ru
+bus.museum
 busan.kr
+bushey.museum
+by.ru
+bydgoszcz.pl
+bygland.no
+bykle.no
+bytom.pl
+bz.it
+c.bg
+c.la
 c.se
+ca.it
+ca.na
+ca.pn
 ca.tf
 ca.tt
 ca.us
+caa.aero
+cadaques.museum
+cagliari.it
+cahcesuolo.no
+california.museum
+caltanissetta.it
+cambridge.museum
+campobasso.it
+can.br
+can.museum
+canada.museum
+capebreton.museum
+cargo.aero
+carrier.museum
+cartoonart.museum
+casadelamoneda.museum
+caserta.it
 casino.hu
+castle.museum
+castres.museum
+catania.it
+catanzaro.it
+catering.aero
+cb.it
 cbg.ru
 cc.bh
+cc.cc
+cc.na
 cci.fr
+ce.it
+ce.ms
+celtic.museum
+center.museum
+certification.aero
+ch.it
+ch.lv
+ch.pn
+ch.tc
 ch.tf
 ch.vu
 chambagri.fr
+championship.aero
+charter.aero
+chat.ru
+chattanooga.museum
 chel.ru
+cheltenham.museum
 chelyabinsk.ru
 cherkassy.ua
 chernigov.ua
 chernovtsy.ua
+chesapeakebay.museum
 chiba.jp
+chicago.museum
+chieti.it
+children.museum
+childrens.museum
+childrensgarden.museum
+chiropractic.museum
 chirurgiens-dentistes.fr
 chita.ru
+chocolate.museum
+christiansburg.museum
 chukotka.ru
 chungbuk.kr
 chungnam.kr
 chuvashia.ru
+cieszyn.pl
 cim.br
+cincinnati.museum
+cinema.museum
+circus.museum
 city.hu
 city.za
+civilaviation.aero
+civilisation.museum
+civilization.museum
+civilwar.museum
+cjb.net
 ck.ua
+cl.it
+clickbank.net
+clinton.museum
+clock.museum
+club.aero
 club.tw
 cmw.ru
 cn.com
+cn.it
+cn.ms
+cn.pn
 cn.ua
 cng.br
 cnt.br
@@ -190,35 +559,50 @@ co.am
 co.ao
 co.at
 co.ba
+co.bi
 co.bw
+co.cc
+co.ci
 co.ck
 co.cr
+co.cu
 co.dk
 co.ee
 co.fk
 co.gg
+co.gy
 co.hu
 co.id
 co.il
 co.im
 co.in
 co.ir
+co.it
 co.je
 co.jp
 co.ke
+co.kg
 co.kr
+co.lc
 co.ls
 co.ma
+co.me
 co.mu
 co.mw
 co.mz
+co.na
 co.nz
 co.om
+co.pn
+co.pw
 co.rs
 co.rw
+co.sh
 co.st
+co.sz
 co.th
 co.tj
+co.tm
 co.tt
 co.tv
 co.tz
@@ -233,6 +617,15 @@ co.yu
 co.za
 co.zm
 co.zw
+coal.museum
+coastaldefence.museum
+cody.museum
+coldwar.museum
+collection.museum
+colonialwilliamsburg.museum
+coloradoplateau.museum
+columbia.museum
+columbus.museum
 com.ac
 com.ae
 com.af
@@ -249,15 +642,18 @@ com.ba
 com.bb
 com.bd
 com.bh
+com.bi
 com.bm
 com.bn
 com.bo
 com.br
 com.bs
 com.bt
+com.by
 com.bz
 com.cd
 com.ch
+com.ci
 com.cn
 com.co
 com.cu
@@ -282,16 +678,20 @@ com.gp
 com.gr
 com.gt
 com.gu
+com.gy
 com.hk
 com.hn
 com.hr
 com.ht
 com.io
+com.iq
+com.is
 com.jm
 com.jo
 com.kg
 com.kh
 com.ki
+com.km
 com.kw
 com.ky
 com.kz
@@ -305,6 +705,7 @@ com.lv
 com.ly
 com.mg
 com.mk
+com.ml
 com.mm
 com.mn
 com.mo
@@ -344,13 +745,17 @@ com.sc
 com.sd
 com.sg
 com.sh
+com.sl
 com.st
 com.sv
 com.sy
 com.tj
+com.tm
 com.tn
+com.to
 com.tr
 com.tt
+com.tv
 com.tw
 com.ua
 com.uy
@@ -362,53 +767,146 @@ com.vn
 com.vu
 com.ws
 com.ye
+communication.museum
+communications.museum
+community.museum
+como.it
+computer.museum
+computerhistory.museum
 conf.au
 conf.lv
+conference.aero
+congresodelalengua3.ar
 consulado.st
+consultant.aero
+consulting.aero
+contemporary.museum
+contemporaryart.museum
+control.aero
+convent.museum
 coop.br
 coop.ht
+coop.km
 coop.mv
 coop.mw
 coop.tt
+copenhagen.museum
+corp.st
+corporation.museum
+corvette.museum
+cosenza.it
+costume.museum
+council.aero
+countryestate.museum
+county.museum
 cpa.pro
 cq.cn
+cr.it
+crafts.museum
+cranbrook.museum
+creation.museum
+cremona.it
+crew.aero
 cri.nz
 crimea.ua
+crotone.it
+cs.it
 csiro.au
+ct.it
 ct.us
 cul.na
+cultural.museum
+culturalcenter.museum
+culture.museum
+cuneo.it
 cv.ua
+cyber.museum
+cymru.museum
+cyt.cu
+cz.cc
+cz.it
+cz.tc
 cz.tf
+czeladz.pl
+czest.pl
+d.bg
 d.se
 daegu.kr
 daejeon.kr
 dagestan.ru
+dali.museum
+dallas.museum
+database.museum
+davvenjarga.no
+davvesiida.no
 dc.us
+ddr.museum
 de.com
+de.ki
+de.lv
+de.ms
 de.net
+de.pn
+de.tc
 de.tf
 de.tt
 de.us
 de.vu
+deatnu.no
+decorativearts.museum
+defense.tn
+delaware.museum
+delmenhorst.museum
+denmark.museum
+dep.no
+depot.museum
+design.aero
+design.museum
+detroit.museum
+dgca.aero
+dielddanuorri.no
+dinosaur.museum
+discovery.museum
+divtasvuodna.no
+divttasvuotna.no
 dk.org
+dk.tc
 dk.tt
+dlugoleka.pl
 dn.ua
 dnepropetrovsk.ua
 dni.us
 dns.be
+dolls.museum
 donetsk.ua
+donna.no
+donostia.museum
+dovre.no
 dp.ua
 dpn.br
+dr.na
 dr.tr
+drammen.no
+drangedal.no
+drobak.no
+dr�bak.no
 dudinka.ru
+durham.museum
+dyroy.no
 e-burg.ru
+e.bg
 e.se
+e12.ve
 e164.arpa
+eastafrica.museum
+eastcoast.museum
 ebiz.tw
 ecn.br
 ed.ao
+ed.ci
 ed.cr
 ed.jp
+ed.pw
 edu.ac
 edu.af
 edu.ai
@@ -422,11 +920,15 @@ edu.ba
 edu.bb
 edu.bd
 edu.bh
+edu.bi
 edu.bm
 edu.bn
 edu.bo
 edu.br
+edu.bs
 edu.bt
+edu.bz
+edu.ci
 edu.ck
 edu.cn
 edu.co
@@ -443,6 +945,7 @@ edu.et
 edu.ge
 edu.gh
 edu.gi
+edu.gn
 edu.gp
 edu.gr
 edu.gt
@@ -452,21 +955,30 @@ edu.hn
 edu.ht
 edu.hu
 edu.in
+edu.iq
+edu.is
 edu.it
 edu.jm
 edu.jo
 edu.kg
 edu.kh
+edu.ki
+edu.km
+edu.kn
 edu.kw
 edu.ky
 edu.kz
+edu.la
 edu.lb
 edu.lc
 edu.lk
 edu.lr
 edu.lv
 edu.ly
+edu.me
 edu.mg
+edu.mk
+edu.ml
 edu.mm
 edu.mn
 edu.mo
@@ -487,6 +999,7 @@ edu.pf
 edu.ph
 edu.pk
 edu.pl
+edu.pn
 edu.pr
 edu.ps
 edu.pt
@@ -502,16 +1015,21 @@ edu.sd
 edu.sg
 edu.sh
 edu.sk
+edu.sl
 edu.st
 edu.sv
+edu.sy
+edu.tc
 edu.tf
 edu.tj
+edu.to
 edu.tr
 edu.tt
 edu.tw
 edu.ua
 edu.uk
 edu.uy
+edu.vc
 edu.ve
 edu.vi
 edu.vn
@@ -520,92 +1038,283 @@ edu.ws
 edu.ye
 edu.yu
 edu.za
+educ.ar
+education.museum
+educational.museum
+educator.aero
 edunet.tn
+egersund.no
+egyptian.museum
 ehime.jp
+eid.no
+eidfjord.no
+eidsberg.no
+eidskog.no
+eidsvoll.no
+eigersund.no
+eisenbahn.museum
 ekloges.cy
+elblag.pl
+elburg.museum
+elk.pl
+elvendrell.museum
+elverum.no
 embaixada.st
+embroidery.museum
+emergency.aero
+en.it
+encyclopedic.museum
+enebakk.no
 eng.br
+eng.pro
+engerdal.no
+engine.aero
+engineer.aero
+england.museum
+enna.it
 ens.tn
+entertainment.aero
+entomology.museum
+environment.museum
+environmentalconservation.museum
+epilepsy.museum
+equipment.aero
 ernet.in
 erotica.hu
 erotika.hu
 es.kr
+es.pn
+es.tc
+es.tl
 es.tt
 esp.br
+essex.museum
+est.pr
+estate.museum
 etc.br
+ethnology.museum
 eti.br
+etne.no
+etnedal.no
 eu.com
+eu.im
+eu.int
 eu.org
+eu.tc
 eu.tf
 eu.tt
 eun.eg
+euro.tm
+evenassi.no
+evenes.no
+evje-og-hornnes.no
+exchange.aero
+exeter.museum
+exhibition.museum
 experts-comptables.fr
+express.aero
+extra.hu
+f.bg
 f.se
 fam.pk
+family.museum
 far.br
 fareast.ru
+farm.museum
+farmequipment.museum
+farmers.museum
+farmstead.museum
+farsund.no
+fauske.no
 fax.nr
+fc.it
+fe.it
 fed.us
+federation.aero
+fedje.no
+fermo.it
+ferrara.it
+fet.no
+fetsund.no
+fg.it
 fgov.be
 fh.se
 fhs.no
 fhsk.se
 fhv.se
 fi.cr
+fi.it
 fie.ee
+field.museum
+figueres.museum
+filatelia.museum
 film.hu
+film.museum
 fin.ec
 fin.tn
+fineart.museum
+finearts.museum
+finland.museum
+finnoy.no
+firenze.it
 firm.co
 firm.ht
 firm.in
+firm.nf
 firm.ro
 firm.ve
+fitjar.no
 fj.cn
+fjaler.no
+fjell.no
 fl.us
+fla.no
+flakstad.no
+flanders.museum
+flatanger.no
+flekkefjord.no
+flesberg.no
+flight.aero
+flog.br
+flora.no
+florence.it
+florida.museum
+floro.no
 fm.br
+fm.no
 fnd.br
+foggia.it
 folkebibl.no
+folldal.no
+force.museum
+forde.no
+forli-cesena.it
+forlicesena.it
+forsand.no
+fortmissoula.museum
+fortworth.museum
 forum.hu
+fosnes.no
 fot.br
+foundation.museum
+fr.it
+fr.ms
+fr.pn
+fr.tc
 fr.tt
 fr.vu
+frana.no
+francaise.museum
+frankfurt.museum
+franziskaner.museum
+fredrikstad.no
+free.fr
+freehostia.com
+freemasonry.museum
+freeservercity.com
+frei.no
+freiburg.museum
+freight.aero
+fribourg.museum
+frog.museum
+frogn.no
+froland.no
 from.hr
+front.ru
+frosinone.it
+frosta.no
+froya.no
 fst.br
+fuel.aero
 fukui.jp
 fukuoka.jp
 fukushima.jp
+fundacio.museum
+funpic.de
+fuoisku.no
+fuossko.no
+furniture.museum
+fusa.no
+fx.to
 fylkesbibl.no
+fyresdal.no
+g.bg
 g.se
 g12.br
 ga.us
+gaivuotna.no
+gallery.museum
+galsa.no
 game.tw
 games.hu
+gamvik.no
+gangaviika.no
 gangwon.kr
+garden.museum
+gateway.museum
+gaular.no
+gausdal.no
 gb.com
 gb.net
+gbr.me
 gc.ca
 gd.cn
 gda.pl
 gdansk.pl
+gdynia.pl
+ge.it
 geek.nz
+geelvinck.museum
+gemological.museum
 gen.in
 gen.nz
 gen.tr
+genoa.it
+genova.it
+geocities.com
+geocities.jp
+geology.museum
 geometre-expert.fr
+georgia.museum
+get.cu
+getmyip.com
 ggf.br
+giehtavuoatna.no
+giessen.museum
 gifu.jp
+gigazu.net
+gildeskal.no
+giske.no
+gjemnes.no
+gjerdrum.no
+gjerstad.no
+gjesdal.no
+gjovik.no
+glas.museum
+glass.museum
+gliding.aero
+gliwice.pl
+glogow.pl
+gloppen.no
 gmina.pl
+gmxhome.de
+gniezno.pl
+go.ci
+go.com
 go.cr
 go.id
+go.it
 go.jp
 go.ke
 go.kr
+go.pw
+go.ro
 go.th
 go.tj
 go.tz
 go.ug
 gob.bo
+gob.cl
 gob.do
 gob.es
 gob.gt
@@ -616,12 +1325,23 @@ gob.pa
 gob.pe
 gob.pk
 gob.sv
+gob.ve
+gobiernoelectronico.ar
 gok.pk
+gol.no
 gon.pk
+googlegroups.com
+googlepages.com
 gop.pk
+gorge.museum
+gorizia.it
+gorlice.pl
 gos.pk
+gouv.ci
 gouv.fr
 gouv.ht
+gouv.km
+gouv.ml
 gouv.rw
 gov.ac
 gov.ae
@@ -630,6 +1350,7 @@ gov.ai
 gov.al
 gov.am
 gov.ar
+gov.as
 gov.au
 gov.az
 gov.ba
@@ -640,10 +1361,15 @@ gov.bh
 gov.bm
 gov.bo
 gov.br
+gov.bs
 gov.bt
 gov.by
+gov.bz
+gov.cd
 gov.ch
 gov.ck
+gov.cl
+gov.cm
 gov.cn
 gov.co
 gov.cu
@@ -653,6 +1379,7 @@ gov.dm
 gov.do
 gov.dz
 gov.ec
+gov.ee
 gov.eg
 gov.er
 gov.et
@@ -672,7 +1399,9 @@ gov.il
 gov.im
 gov.in
 gov.io
+gov.iq
 gov.ir
+gov.is
 gov.it
 gov.je
 gov.jm
@@ -680,9 +1409,13 @@ gov.jo
 gov.jp
 gov.kg
 gov.kh
+gov.ki
+gov.km
+gov.kn
 gov.kw
 gov.ky
 gov.kz
+gov.la
 gov.lb
 gov.lc
 gov.li
@@ -693,11 +1426,16 @@ gov.lu
 gov.lv
 gov.ly
 gov.ma
+gov.me
 gov.mg
+gov.mk
+gov.ml
 gov.mm
 gov.mn
 gov.mo
+gov.mr
 gov.mt
+gov.mu
 gov.mv
 gov.mw
 gov.my
@@ -708,6 +1446,7 @@ gov.om
 gov.ph
 gov.pk
 gov.pl
+gov.pn
 gov.pr
 gov.ps
 gov.pt
@@ -723,9 +1462,12 @@ gov.sd
 gov.sg
 gov.sh
 gov.sk
+gov.sl
 gov.st
 gov.sy
 gov.tj
+gov.tl
+gov.tm
 gov.tn
 gov.to
 gov.tp
@@ -735,6 +1477,7 @@ gov.tv
 gov.tw
 gov.ua
 gov.uk
+gov.vc
 gov.ve
 gov.vi
 gov.vn
@@ -743,16 +1486,37 @@ gov.ye
 gov.za
 gov.zm
 gov.zw
+government.aero
+government.pn
 govt.nz
+gr.it
 gr.jp
+grajewo.pl
+gran.no
+grandrapids.museum
+grane.no
+granvin.no
+gratangen.no
+gratishost.com
+graz.museum
 greta.fr
+grimstad.no
+grong.no
+grosseto.it
+groundhandling.aero
+group.aero
 grozny.ru
 grp.lk
+grue.no
 gs.cn
 gsm.pl
+gu.us
 gub.uy
 guernsey.gg
+guernsey.museum
+gulen.no
 gunma.jp
+guovdageaidnu.no
 gv.ao
 gv.at
 gwangju.kr
@@ -761,44 +1525,140 @@ gyeongbuk.kr
 gyeonggi.kr
 gyeongnam.kr
 gz.cn
+h.bg
 h.se
 ha.cn
+ha.no
+habmer.no
+hadsel.no
+hagebostad.no
+halden.no
+halloffame.museum
+halsa.no
+hamar.no
+hamaroy.no
+hamburg.museum
+hammarfeasta.no
+hammerfest.no
+handson.museum
+hanggliding.aero
+hapmir.no
+haram.no
+hareid.no
+harstad.no
+harvestcelebration.museum
+hasvik.no
+hattfjelldal.no
+haugesund.no
+hawaii.museum
 hb.cn
 he.cn
+health.museum
 health.vn
+heimatunduhren.museum
+hellas.museum
+helloweb.eu
+helsinki.museum
+hembygdsforbund.museum
+hemne.no
+hemnes.no
+hemsedal.no
 herad.no
+heritage.museum
 hi.cn
 hi.us
 hiroshima.jp
+histoire.museum
+historical.museum
+historicalsociety.museum
+historichouses.museum
+historisch.museum
+historisches.museum
+history.museum
+historyofscience.museum
+hitra.no
+hjartdal.no
+hjelmeland.no
 hk.cn
+hk.ms
+hk.tc
 hl.cn
+hl.no
+hm.no
 hn.cn
+hobol.no
+hof.no
 hokkaido.jp
+hokksund.no
+hol.no
+hole.no
+holmestrand.no
+holtalen.no
+home.pl
+home.ro
+homebuilt.aero
+homeip.net
+honefoss.no
+hornindal.no
+horology.museum
+horten.no
+host.sk
+hostevo.com
+hotbox.ru
 hotel.hu
 hotel.lk
+hotmail.ru
+house.museum
+hoyanger.no
+hoylandet.no
 hs.kr
 hu.com
+hu.tc
+hu2.ru
 huissier-justice.fr
+humanities.museum
+hurdal.no
+hurum.no
+hut2.ru
+hvaler.no
+hyllestad.no
 hyogo.jp
+i.bg
+i.ph
 i.se
 ia.us
 ibaraki.jp
+ibelgique.com
+ibestad.no
+iblogger.org
+ic.cz
 icnet.uk
 id.au
 id.fj
 id.ir
 id.lv
 id.ly
+id.ru
 id.us
 idf.il
 idn.sg
+idoo.com
 idrett.no
 idv.hk
 idv.tw
+ie.tc
+iespana.es
 if.ua
+ifrance.com
+il.im
 il.us
+ilawa.pl
+illustration.museum
+im.it
+imageandsound.museum
 imb.br
-in-addr.arpa
+imperia.it
+in.na
 in.rs
 in.th
 in.ua
@@ -811,8 +1671,14 @@ ind.gt
 ind.in
 ind.je
 ind.tn
+inderoy.no
+indian.museum
+indiana.museum
+indianapolis.museum
+indianmarket.museum
 inf.br
 inf.cu
+inf.mk
 info.au
 info.az
 info.bh
@@ -824,8 +1690,14 @@ info.et
 info.fj
 info.ht
 info.hu
+info.ki
+info.la
+info.ms
 info.mv
+info.na
+info.nf
 info.nr
+info.pk
 info.pl
 info.pr
 info.ro
@@ -838,69 +1710,139 @@ info.vn
 ing.pa
 ingatlan.hu
 inima.al
+insurance.aero
 int.am
 int.ar
 int.az
 int.bo
+int.ci
 int.co
+int.is
+int.la
 int.lk
 int.mv
 int.mw
 int.pt
 int.ru
 int.rw
+int.tc
 int.tf
 int.tj
 int.tt
 int.ve
 int.vn
+intelligence.museum
+interactive.museum
+interia.pl
+interii.pl
 intl.tn
 ip6.arpa
+iquebec.com
+iraq.museum
+irc.pl
 iris.arpa
 irkutsk.ru
+iron.museum
+is.it
 isa.us
+isernia.it
 ishikawa.jp
 isla.pr
+isleofman.museum
+isuisse.com
 it.ao
+it.pn
+it.tc
 it.tt
+its.me
 ivano-frankivsk.ua
 ivanovo.ru
+iveland.no
+ivgu.no
 iwate.jp
+iwebsource.com
 iwi.nz
 iz.hr
 izhevsk.ru
+j.bg
 jamal.ru
+jamison.museum
+jan-mayen.no
 jar.ru
+jaworzno.pl
+jefferson.museum
 jeju.kr
+jelenia-gora.pl
 jeonbuk.kr
 jeonnam.kr
 jersey.je
+jerusalem.museum
+jessheim.no
 jet.uk
+jevnaker.no
+jewelry.museum
+jewish.museum
+jewishart.museum
+jfk.museum
+jgora.pl
+jimdo.com
+jino-net.ru
 jl.cn
 jobs.tt
 jogasz.hu
+jolster.no
+jondal.no
 jor.br
+jorpeland.no
 joshkar-ola.ru
+journal.aero
+journalism.museum
+journalist.aero
+jp.pn
+jpn.com
 js.cn
+judaica.museum
+judygarland.museum
+juedisches.museum
+juif.museum
+jur.pro
+jus.br
 jx.cn
 k-uralsk.ru
+k.bg
 k.se
 k12.ec
 k12.il
 k12.tr
+k12.vi
+kafjord.no
 kagawa.jp
 kagoshima.jp
+kalisz.pl
 kalmykia.ru
 kaluga.ru
 kamchatka.ru
 kanagawa.jp
 kanazawa.jp
+karasjohka.no
+karasjok.no
+karate.museum
 karelia.ru
+karikatur.museum
+karlsoy.no
+karmoy.no
+karpacz.pl
+kartuzy.pl
+kaszuby.pl
 katowice.pl
+kautokeino.no
 kawasaki.jp
 kazan.ru
+kazimierz-dolny.pl
 kchr.ru
 kemerovo.ru
+kepno.pl
+ketrzyn.pl
 kg.kr
 kh.ua
 khabarovsk.ru
@@ -909,77 +1851,244 @@ kharkov.ua
 kherson.ua
 khmelnitskiy.ua
 khv.ru
+kickme.to
+kids.museum
 kids.us
 kiev.ua
+kimsufi.com
+kirkenes.no
 kirov.ru
 kirovograd.ua
 kitakyushu.jp
+klabu.no
+klepp.no
+klodzko.pl
 km.ua
 kms.ru
 kobe.jp
+kobierzyce.pl
 kochi.jp
+koebenhavn.museum
+koeln.museum
 koenig.ru
+kolobrzeg.pl
 komforb.se
 komi.ru
 kommunalforbund.se
 kommune.no
 komvux.se
+kongsberg.no
+kongsvinger.no
+konin.pl
+konskowola.pl
 konyvelo.hu
+kopervik.no
 kostroma.ru
+kr.com
+kr.it
+kr.tc
 kr.ua
+kraanghke.no
+kragero.no
 krakow.pl
 krasnoyarsk.ru
+kristiansand.no
+kristiansund.no
+krodsherad.no
+krokstadelva.no
 ks.ua
 ks.us
 kuban.ru
 kumamoto.jp
+kunst.museum
+kunstsammlung.museum
+kunstunddesign.museum
 kurgan.ru
 kursk.ru
 kustanai.ru
+kutno.pl
 kuzbass.ru
 kv.ua
+kvafjord.no
+kvalsund.no
+kvam.no
+kvanangen.no
+kvinesdal.no
+kvinnherad.no
+kviteseid.no
+kvitsoy.no
+kwik.to
 ky.us
 kyonggi.kr
 kyoto.jp
+l.bg
+l.se
+la-spezia.it
 la.us
+laakesvuemie.no
+labor.museum
+labour.museum
+lahppi.no
+lajolla.museum
 lakas.hu
 lanarb.se
 lanbib.se
+lancashire.museum
+land.ru
+landes.museum
+langevag.no
+lans.museum
+lapy.pl
+laquila.it
+lardal.no
+larsson.museum
+larvik.no
+laspezia.it
+latina.it
+lavagis.no
+lavangen.no
 law.pro
 law.za
+lc.it
+le.it
+lea?gaviika.no
+leangaviika.no
+leasing.aero
+lebesby.no
+lebork.pl
+lecce.it
+lecco.it
+legnica.pl
+leikanger.no
+leirfjord.no
+leirvik.no
+leka.no
+leksvik.no
 lel.br
+lenvik.no
+lerdal.no
+lesja.no
+levanger.no
+lewismiller.museum
+lezajsk.pl
 lg.jp
 lg.ua
+li.it
+lib.ee
+lier.no
+lierne.no
+lillehammer.no
+lillesand.no
+limanowa.pl
+lincoln.museum
+lindas.no
+lindesnes.no
+linz.museum
 lipetsk.ru
-lkd.co.im
+livejournal.com
+living.museum
+livinghistory.museum
+livorno.it
 ln.cn
+lo.it
+loabat.no
+localhistory.museum
+lodi.it
+lodingen.no
 lodz.pl
-ltd.co.im
+logistics.aero
+lom.no
+lomza.pl
+london.museum
+loppa.no
+lorenskog.no
+losangeles.museum
+loten.no
+louvre.museum
+lowicz.pl
+loyalist.museum
+lt.it
 ltd.cy
 ltd.gg
 ltd.gi
 ltd.je
 ltd.lk
 ltd.uk
+lu.it
+lubin.pl
 lublin.pl
+lucca.it
+lucerne.museum
 lugansk.ua
+lukow.pl
+lund.no
+lunner.no
+luroy.no
+luster.no
 lutsk.ua
+luxembourg.museum
+luzern.museum
 lviv.ua
+lyngdal.no
+lyngen.no
+m.bg
 m.se
 ma.us
+macerata.it
+mad.museum
+madrid.museum
 magadan.ru
+magazine.aero
 magnitka.ru
 mail.pl
+mail.ru
+mail15.su
+mail2k.ru
+mail333.su
+maintenance.aero
+malatvuopmi.no
+malbork.pl
+mallorca.museum
+malopolska.pl
+malselv.no
+malvik.no
+manchester.museum
+mandal.no
+mansion.museum
+mansions.museum
+mantova.it
+manx.museum
 maori.nz
+marburg.museum
 mari-el.ru
 mari.ru
 marine.ru
+maritime.museum
+maritimo.museum
+marker.no
+marketplace.aero
+marnardal.no
+maryland.museum
+marylhurst.museum
+masfjorden.no
+masoy.no
+massa-carrara.it
+massacarrara.it
 mat.br
+matera.it
 matsuyama.jp
+matta-varjjat.no
+mazowsze.pl
+mazury.pl
 mb.ca
+mbone.pl
+mc.it
+md.ci
 md.us
+me.it
 me.uk
 me.us
+mecon.ar
 med.br
 med.ec
 med.ee
@@ -987,16 +2096,39 @@ med.ht
 med.ly
 med.om
 med.pa
+med.pl
 med.pro
 med.sa
 med.sd
 medecin.fr
+medecin.km
+media.aero
 media.hu
+media.museum
 media.pl
+medical.museum
+medizinhistorisches.museum
+meeres.museum
+meland.no
+meldal.no
+melhus.no
+meloy.no
+memorial.museum
+meraker.no
+mesaverde.museum
+messina.it
+mi.it
 mi.th
 mi.us
 miasta.pl
+michigan.museum
+microlight.aero
+midatlantic.museum
+midsund.no
+midtre-gauldal.no
 mie.jp
+mielec.pl
+mielno.pl
 mil.ac
 mil.ae
 mil.am
@@ -1007,6 +2139,7 @@ mil.bd
 mil.bo
 mil.br
 mil.by
+mil.cn
 mil.co
 mil.do
 mil.ec
@@ -1021,9 +2154,11 @@ mil.hn
 mil.id
 mil.in
 mil.io
+mil.iq
 mil.jo
 mil.kg
 mil.kh
+mil.km
 mil.kr
 mil.kw
 mil.kz
@@ -1047,67 +2182,158 @@ mil.se
 mil.sh
 mil.sk
 mil.st
+mil.sy
 mil.tj
+mil.tm
+mil.to
 mil.tr
 mil.tw
 mil.uk
 mil.uy
+mil.vc
 mil.ve
 mil.ye
 mil.za
+milan.it
+milano.it
+military.museum
+mill.museum
+mincom.tn
+mine.nu
+miners.museum
+mining.museum
+minnesota.museum
+missile.museum
+missoula.museum
 miyagi.jp
 miyazaki.jp
+mjondalen.no
 mk.ua
+mn.it
 mn.us
+mo-i-rana.no
 mo.cn
+mo.it
 mo.us
+moareke.no
 mob.nr
+mobi.gp
+mobi.na
 mobi.tt
 mobil.nr
 mobile.nr
 mod.gi
 mod.om
 mod.uk
+modalen.no
+modelling.aero
+modena.it
+modern.museum
+modum.no
+molde.no
+moma.museum
+money.museum
+monmouth.museum
+monticello.museum
+montreal.museum
+monza.it
+mooo.com
 mordovia.ru
+moscow.museum
+mosjoen.no
+moskenes.no
 mosreg.ru
+moss.no
+mosvik.no
+motorcycle.museum
+mr.no
+mragowo.pl
+ms.it
 ms.kr
 ms.us
 msk.ru
+mt.it
 mt.us
+muenchen.museum
+muenster.museum
+mulhouse.museum
+muncie.museum
 muni.il
+muosat.no
 murmansk.ru
 mus.br
+museet.museum
 museum.mn
 museum.mv
 museum.mw
 museum.no
 museum.om
 museum.tt
+museumcenter.museum
+museumvereniging.museum
 music.mobi
+music.museum
+mx.na
+mx.tc
 mytis.ru
+myvnc.com
+n.bg
 n.se
+na.by
+na.it
+naamesjevuemie.no
+nacion.ar
 nagano.jp
 nagasaki.jp
 nagoya.jp
 nakhodka.ru
+naklo.pl
 nalchik.ru
+namdalseid.no
 name.ae
 name.az
 name.cy
 name.et
 name.fj
 name.hr
+name.jo
+name.mk
 name.mv
 name.my
+name.na
 name.pr
 name.tj
 name.tr
 name.tt
 name.vn
+namsos.no
+namsskogan.no
+nannestad.no
+naples.it
+napoli.it
 nara.jp
+narod.ru
+naroy.no
+narviika.no
+narvik.no
 nat.tn
 national-library-scotland.uk
+national.museum
+nationalfirearms.museum
+nationalheritage.museum
+nativeamerican.museum
+naturalhistory.museum
+naturalhistorymuseum.museum
+naturalsciences.museum
 naturbruksgymn.se
+nature.museum
+naturhistorisches.museum
+natuurwetenschappen.museum
+naumburg.museum
+naustdal.no
+naval.museum
+navigation.aero
+navuotna.no
 navy.mil
 nb.ca
 nc.us
@@ -1115,10 +2341,19 @@ nd.us
 ne.jp
 ne.ke
 ne.kr
+ne.pw
 ne.tz
 ne.ug
 ne.us
+nebraska.museum
+nedre-eiker.no
 nel.uk
+neostrada.pl
+nesna.no
+nesodden.no
+nesoddtangen.no
+nesseby.no
+nesset.no
 net.ac
 net.ae
 net.af
@@ -1143,6 +2378,7 @@ net.bt
 net.bz
 net.cd
 net.ch
+net.ci
 net.ck
 net.cn
 net.co
@@ -1164,6 +2400,7 @@ net.gp
 net.gr
 net.gt
 net.gu
+net.gy
 net.hk
 net.hn
 net.ht
@@ -1172,7 +2409,9 @@ net.il
 net.im
 net.in
 net.io
+net.iq
 net.ir
+net.is
 net.je
 net.jm
 net.jo
@@ -1180,6 +2419,7 @@ net.jp
 net.kg
 net.kh
 net.ki
+net.kn
 net.kw
 net.ky
 net.kz
@@ -1193,8 +2433,12 @@ net.lu
 net.lv
 net.ly
 net.ma
+net.me
+net.mk
+net.ml
 net.mm
 net.mo
+net.ms
 net.mt
 net.mu
 net.mv
@@ -1216,6 +2460,7 @@ net.pg
 net.ph
 net.pk
 net.pl
+net.pn
 net.pr
 net.ps
 net.pt
@@ -1229,14 +2474,19 @@ net.sc
 net.sd
 net.sg
 net.sh
+net.sl
 net.st
 net.sy
+net.tc
 net.tf
 net.th
 net.tj
+net.tm
 net.tn
+net.to
 net.tr
 net.tt
+net.tv
 net.tw
 net.ua
 net.uk
@@ -1250,8 +2500,19 @@ net.vu
 net.ws
 net.ye
 net.za
+netfirms.com
+netsolhost.com
+neues.museum
 new.ke
+newhampshire.museum
+newjersey.museum
+newmail.ru
+newmexico.museum
+newport.museum
 news.hu
+newspaper.museum
+newyork.museum
+nextmail.ru
 nf.ca
 ngo.lk
 ngo.ph
@@ -1259,21 +2520,31 @@ ngo.pl
 ngo.za
 nh.us
 nhs.uk
+nic.ar
 nic.im
 nic.in
 nic.tt
 nic.uk
+niepce.museum
 nieruchomosci.pl
+nightmail.ru
 niigata.jp
 nikolaev.ua
+ning.com
+nissedal.no
+nittedal.no
 nj.us
 nkz.ru
 nl.ca
+nl.no
 nls.uk
 nm.cn
+nm.ru
 nm.us
 nnov.ru
 no.com
+no.it
+no.tc
 nom.ad
 nom.ag
 nom.br
@@ -1281,6 +2552,7 @@ nom.co
 nom.es
 nom.fk
 nom.fr
+nom.km
 nom.mg
 nom.ni
 nom.pa
@@ -1288,31 +2560,62 @@ nom.pe
 nom.pl
 nom.re
 nom.ro
+nom.sh
 nom.ve
 nom.za
 nome.pt
+nord-aurdal.no
+nord-fron.no
+nord-odal.no
+norddal.no
+nordkapp.no
+nordre-land.no
+nordreisa.no
+nore-og-uvdal.no
+norfolk.museum
 norilsk.ru
+north.museum
 not.br
 notaires.fr
+notaires.km
+notlong.com
+notodden.no
+notteroy.no
 nov.ru
+novara.it
 novosibirsk.ru
+nowaruda.pl
+nrw.museum
 ns.ca
 nsk.ru
 nsn.us
 nsw.au
 nt.au
 nt.ca
+nt.no
 nt.ro
 ntr.br
 nu.ca
+nu.it
+nuernberg.museum
 nui.hu
+nuoro.it
+nuremberg.museum
 nv.us
 nx.cn
 ny.us
+nyc.museum
+nyny.museum
+nysa.pl
+o.bg
 o.se
+oceanographic.museum
+oceanographique.museum
 od.ua
+odda.no
 odessa.ua
 odo.br
+of.no
 off.ai
 og.ao
 oh.us
@@ -1320,23 +2623,46 @@ oita.jp
 ok.us
 okayama.jp
 okinawa.jp
+oksnes.no
+ol.no
+olawa.pl
+olecko.pl
+olkusz.pl
 olsztyn.pl
+omaha.museum
+omasvuotna.no
 omsk.ru
 on.ca
+one.pl
+online.museum
+ontario.museum
+openair.museum
+opoczno.pl
 opole.pl
+oppdal.no
+oppegard.no
 or.at
+or.bi
+or.ci
 or.cr
 or.id
+or.it
 or.jp
 or.ke
 or.kr
+or.mu
+or.na
+or.pw
 or.th
 or.tz
 or.ug
 or.us
+oregon.museum
+oregontrail.museum
 orenburg.ru
 org.ac
 org.ae
+org.af
 org.ag
 org.ai
 org.al
@@ -1349,6 +2675,7 @@ org.ba
 org.bb
 org.bd
 org.bh
+org.bi
 org.bm
 org.bn
 org.bo
@@ -1359,6 +2686,7 @@ org.bw
 org.bz
 org.cd
 org.ch
+org.ci
 org.ck
 org.cn
 org.co
@@ -1392,7 +2720,9 @@ org.il
 org.im
 org.in
 org.io
+org.iq
 org.ir
+org.is
 org.je
 org.jm
 org.jo
@@ -1400,6 +2730,8 @@ org.jp
 org.kg
 org.kh
 org.ki
+org.km
+org.kn
 org.kw
 org.ky
 org.kz
@@ -1414,8 +2746,10 @@ org.lu
 org.lv
 org.ly
 org.ma
+org.me
 org.mg
 org.mk
+org.ml
 org.mm
 org.mn
 org.mo
@@ -1439,6 +2773,7 @@ org.pf
 org.ph
 org.pk
 org.pl
+org.pn
 org.pr
 org.ps
 org.pt
@@ -1447,6 +2782,7 @@ org.qa
 org.ro
 org.rs
 org.ru
+org.rw
 org.sa
 org.sb
 org.sc
@@ -1454,13 +2790,18 @@ org.sd
 org.se
 org.sg
 org.sh
+org.sl
 org.st
 org.sv
 org.sy
+org.sz
 org.tj
+org.tm
 org.tn
+org.to
 org.tr
 org.tt
+org.tv
 org.tw
 org.ua
 org.uk
@@ -1477,115 +2818,357 @@ org.yu
 org.za
 org.zm
 org.zw
+oristano.it
+orkanger.no
+orkdal.no
+orland.no
+orskog.no
+orsta.no
 oryol.ru
 osaka.jp
+osen.no
 oskol.ru
+oslo.no
+osoyro.no
+osteroy.no
+oster�y.no
+ostre-toten.no
+ostroda.pl
+ostroleka.pl
+ostrowiec.pl
+ostrowwlkp.pl
+otago.museum
 otc.au
+other.nf
+overhalla.no
+ovh.net
+ovre-eiker.no
+oxford.museum
+oyer.no
+oygarden.no
+oystre-slidre.no
 oz.au
+p.bg
+p.se
+pa.it
 pa.us
+pacific.museum
+paderborn.museum
+padova.it
+padua.it
+page.tl
+palace.museum
 palana.ru
+paleo.museum
+palermo.it
+palmsprings.museum
+panama.museum
+parachuting.aero
+paragliding.aero
+paris.museum
 parliament.cy
 parliament.uk
+parma.it
 parti.se
+pasadena.museum
+passenger-association.aero
+pavia.it
 pb.ao
+pc.it
 pc.pl
+pd.it
 pe.ca
+pe.it
 pe.kr
 penza.ru
 per.kh
+per.la
+per.nf
 per.sg
 perm.ru
 perso.ht
+perso.tc
+perso.tn
+perugia.it
+pesaro-urbino.it
+pesarourbino.it
+pescara.it
+pg.it
+ph.tc
 pharmacien.fr
+pharmaciens.km
+pharmacy.museum
+philadelphia.museum
+philadelphiaarea.museum
+philately.museum
+phoenix.museum
+photography.museum
+pi.it
+piacenza.it
+pila.pl
+pilot.aero
+pilots.museum
+pisa.it
+pisem.su
+pistoia.it
+pisz.pl
+pittsburgh.museum
+pl.tc
 pl.tf
 pl.ua
-plc.co.im
+planetarium.museum
+plantation.museum
+plants.museum
+plaza.museum
 plc.ly
 plc.uk
 plo.ps
+pn.it
+po.it
+pochta.ru
+pochtamt.ru
+podhale.pl
+podlasie.pl
 pol.dz
 pol.ht
 pol.tr
 police.uk
+polkowice.pl
 poltava.ua
+pomorskie.pl
+pomorze.pl
+pop3.ru
+pordenone.it
+porsanger.no
+porsangu.no
+porsgrunn.no
 port.fr
+portal.museum
+portland.museum
+portlligat.museum
+posts-and-telecommunications.museum
+potenza.it
 powiat.pl
 poznan.pl
 pp.az
 pp.ru
 pp.se
+pp.ua
 ppg.br
+pr.it
+pr.us
+prato.it
 prd.fr
+prd.km
 prd.mg
+preservation.museum
+presidio.museum
+press.aero
 press.cy
 press.ma
+press.museum
 press.se
+presse.ci
 presse.fr
+presse.km
 pri.ee
 principe.st
 priv.at
 priv.hu
+priv.me
 priv.no
 priv.pl
 pro.ae
+pro.az
 pro.br
 pro.cy
 pro.ec
 pro.fj
 pro.ht
 pro.mv
+pro.na
 pro.om
 pro.pr
+pro.tc
 pro.tt
 pro.vn
+proboards.com
+prochowice.pl
+production.aero
+prof.pr
+project.museum
+promocion.ar
+prserv.net
+pruszkow.pl
+przeworsk.pl
 psc.br
 psi.br
 pskov.ru
+pt.it
 ptz.ru
+pu.it
 pub.sa
 publ.pt
+public.museum
+pubol.museum
+pulawy.pl
+pv.it
 pvt.ge
 pyatigorsk.ru
+pz.it
+q.bg
 qc.ca
 qc.com
 qh.cn
 qld.au
 qsl.br
+quebec.museum
+r.bg
+r.se
+ra.it
+rade.no
+radikal.ru
+radom.pl
+radoy.no
+ragusa.it
+rahkkeravju.no
+raholt.no
+railroad.museum
+railway.museum
+raisa.no
+rakkestad.no
+ralingen.no
+rana.no
+randaberg.no
+rauma.no
+ravenna.it
+rawa-maz.pl
+rbcmail.ru
+rc.it
+re.it
 re.kr
 realestate.pl
 rec.br
 rec.co
+rec.nf
 rec.ro
 rec.ve
+recreation.aero
 red.sv
+redirectme.net
+reggio-calabria.it
+reggio-emilia.it
+reggiocalabria.it
+reggioemilia.it
 reklam.hu
 rel.ht
 rel.pl
+rendalen.no
+rennebu.no
+rennesoy.no
+repbody.aero
+republika.pl
+res.aero
 res.in
+research.aero
+research.museum
+resistance.museum
+retina.ar
+rg.it
+ri.it
 ri.us
+rieti.it
+riik.ee
+rimini.it
+rindal.no
+ringebu.no
+ringerike.no
+ringsaker.no
+riodejaneiro.museum
+risor.no
+rissa.no
+rl.no
+rm.it
+rm.ru
+rn.it
 rnd.ru
 rnrt.tn
 rns.tn
 rnu.tn
+ro.im
+ro.it
+roan.no
+rochester.museum
+rockart.museum
+rodoy.no
+rollag.no
+roma.it
+roma.museum
+rome.it
+romsa.no
+romskog.no
+roros.no
+rost.no
+rotorcraft.aero
+rovigo.it
 rovno.ua
+royken.no
+royrvik.no
 rs.ba
 ru.com
+ru.tc
 ru.tf
 rubtsovsk.ru
+ruovat.no
+russia.museum
 rv.ua
 ryazan.ru
+rybnik.pl
+rygge.no
+rzeszow.pl
+s.bg
 s.se
 sa.au
 sa.com
 sa.cr
+sa.it
+safety.aero
 saga.jp
+saintlouis.museum
 saitama.jp
 sakhalin.ru
+salangen.no
+salat.no
+salem.museum
+salerno.it
+saltdal.no
+salvadordali.museum
+salzburg.museum
 samara.ru
+samnanger.no
+sandefjord.no
+sandiego.museum
+sandnes.no
+sandnessjoen.no
+sandoy.no
+sanfrancisco.museum
+sanok.pl
+santabarbara.museum
+santacruz.museum
+santafe.museum
 saotome.st
+sapo.pt
 sapporo.jp
 saratov.ru
 sark.gg
+sarpsborg.no
+saskatchewan.museum
+sassari.it
+satx.museum
+sauda.no
+sauherad.no
+savannahga.museum
+savona.it
 sc.cn
 sc.ke
 sc.kr
@@ -1596,6 +3179,7 @@ sch.gg
 sch.id
 sch.ir
 sch.je
+sch.jo
 sch.lk
 sch.ly
 sch.ng
@@ -1604,186 +3188,586 @@ sch.sa
 sch.sd
 sch.uk
 sch.zm
+schlesisches.museum
+schoenbrunn.museum
+schokoladen.museum
 school.fj
+school.museum
+school.na
 school.nz
 school.za
+schweiz.museum
 sci.eg
+science-fiction.museum
+science.museum
+scienceandhistory.museum
+scienceandindustry.museum
+sciencecenter.museum
+sciencecenters.museum
+sciencehistory.museum
+sciences.museum
+sciencesnaturelles.museum
+scientist.aero
+scotland.museum
 sd.cn
 sd.us
 se.com
+se.net
+se.tc
 se.tt
+seaport.museum
 sebastopol.ua
 sec.ps
+sejny.pl
+sel.no
+selbu.no
+selfip.com
+selfip.net
+selje.no
+seljord.no
 sendai.jp
 seoul.kr
+servebbs.com
+serveftp.com
+services.aero
+settlement.museum
+settlers.museum
 sex.hu
 sex.pl
+sf.no
 sg.tf
 sh.cn
+shell.museum
+sherbrooke.museum
 shiga.jp
 shimane.jp
 shizuoka.jp
 shop.ht
 shop.hu
+shop.ms
 shop.pl
+shop.tc
+show.aero
+shutterfly.com
+si.it
+sibenik.museum
+siellak.no
+siena.it
+sigdal.no
+siljan.no
+silk.museum
 simbirsk.ru
+siracusa.it
+sirdal.no
+site.tc
 sk.ca
+skanit.no
+skanland.no
+skaun.no
+skedsmo.no
+skedsmokorset.no
+ski.museum
+ski.no
+skien.no
+skierva.no
+skiptvet.no
+skjak.no
+skjervoy.no
 sklep.pl
+skoczow.pl
+skodje.no
+skole.museum
+skydiving.aero
+slask.pl
+slattum.no
+sld.cu
 sld.do
 sld.pa
 slg.br
 slupsk.pl
+smola.no
 smolensk.ru
+smtp.ru
 sn.cn
+snaase.no
+snasa.no
+snillfjord.no
+snoasa.no
 snz.ru
+so.it
 soc.lk
+societe.st
+society.museum
+software.aero
+sogndal.no
+sogne.no
+sokndal.no
+sol.ru
+sola.no
+sologne.museum
+solund.no
+somna.no
+sondre-land.no
+sondrio.it
+songdalen.no
+sopot.pl
+sor-aurdal.no
+sor-fron.no
+sor-odal.no
+sor-varanger.no
+sorfold.no
 soros.al
+sorreisa.no
+sortland.no
+sorum.no
 sos.pl
+sosblog.com
+sosnowiec.pl
+soundandvision.museum
+southcarolina.museum
+southwest.museum
+sp.it
+space.museum
 spb.ru
+spjelkavik.no
 sport.hu
+spy.museum
+spydeberg.no
+square.museum
+sr.it
 srv.br
+ss.it
 sshn.se
+st.no
+stadt.museum
+stalbans.museum
+stalowa-wola.pl
+stange.no
+starachowice.pl
+stargard.pl
+starnberg.museum
 stat.no
+state.museum
+stateofdelaware.museum
+stathelle.no
+station.museum
+stavanger.no
+stavern.no
 stavropol.ru
+steam.museum
+steiermark.museum
+steigen.no
+steinkjer.no
+stjohn.museum
+stjordal.no
+stjordalshalsen.no
+stockholm.museum
+stokke.no
+stor-elvdal.no
+stord.no
+stordal.no
 store.co
+store.nf
 store.ro
 store.st
 store.ve
+storfjord.no
+stpetersburg.museum
+strand.no
+stranda.no
+stryn.no
+student.aero
+stuttgart.museum
 stv.ru
+suedtirol.it
+suisse.museum
+sula.no
+suldal.no
 suli.hu
 sumy.ua
+sund.no
+sunndal.no
+surgeonshall.museum
 surgut.ru
+surnadal.no
+surrey.museum
+suwalki.pl
+sv.it
+svalbard.no
+sveio.no
+svelvik.no
+svizzera.museum
+sweden.museum
+swidnica.pl
+swiebodzin.pl
+swinoujscie.pl
 sx.cn
+sydney.museum
+sykkylven.no
 syzran.ru
 szczecin.pl
+szczytno.pl
 szex.hu
 szkola.pl
+szm.com
+t.bg
 t.se
+t3.to
+t35.com
+t35.net
+ta.it
 takamatsu.jp
 tambov.ru
+tana.no
+tananger.no
+tank.museum
+taranto.it
 targi.pl
+tarnobrzeg.pl
 tas.au
 tatarstan.ru
+taxi.aero
+tcm.museum
+te.it
 te.ua
 tec.ve
+technology.museum
 tel.no
 tel.nr
 tel.tr
 telecom.na
+telekommunikation.museum
 telememo.au
+television.museum
+teramo.it
+terni.it
 ternopil.ua
 test.ru
+texas.museum
+textile.museum
+tgory.pl
+th.tc
+theater.museum
+time.museum
+time.no
+timekeeping.museum
+tingvoll.no
+tinn.no
 tirana.al
 tj.cn
+tjeldsund.no
+tjome.no
 tld.am
 tlf.nr
 tm.cy
 tm.fr
 tm.hu
+tm.km
 tm.mc
 tm.mg
 tm.mt
+tm.no
 tm.pl
 tm.ro
 tm.se
 tm.za
 tmp.br
+tn.it
 tn.us
+to.it
 tochigi.jp
+tokke.no
 tokushima.jp
 tokyo.jp
+tolga.no
 tom.ru
 tomsk.ru
+tonsberg.no
+topology.museum
+torino.it
+torino.museum
+torsken.no
 torun.pl
 tottori.jp
+touch.museum
 tourism.pl
 tourism.tn
+town.museum
 toyama.jp
 tozsde.hu
+tp.it
+tr.it
+tr.no
+trader.aero
+trading.aero
+trainer.aero
+trana.no
+tranby.no
+tranoy.no
+transport.museum
+trapani.it
 travel.pl
 travel.tt
 trd.br
+tree.museum
+trentino.it
+trento.it
+treviso.it
+trieste.it
+tripod.com
+troandin.no
+trogstad.no
+trolley.museum
+tromsa.no
+tromso.no
+trondheim.no
+trust.museum
+trustee.museum
+trysil.no
+ts.it
 tsaritsyn.ru
 tsk.ru
 tula.ru
 tur.br
+tur.cu
+turek.pl
+turen.tn
+turin.it
 turystyka.pl
 tuva.ru
 tv.bo
 tv.br
+tv.it
+tv.na
 tv.sd
+tvedestrand.no
 tver.ru
 tw.cn
 tx.us
+tychy.pl
+tydal.no
+tynset.no
+tysfjord.no
+tysnes.no
+tysvar.no
+tysv�r.no
 tyumen.ru
+u.bg
 u.se
+ua.tc
+uba.ar
+ucoz.ru
+ud.it
+udine.it
 udm.ru
 udmurtia.ru
+uhren.museum
 uk.com
 uk.net
+uk.pn
+uk.tc
+uk.to
 uk.tt
 ulan-ude.ru
+ullensaker.no
+ullensvang.no
+ulm.museum
 ulsan.kr
+ulvik.no
 unam.na
 unbi.ba
+unblog.fr
+undersea.museum
+union.aero
 uniti.al
+university.museum
+unjarga.no
+unj�rga.no
+unlugar.com
 unsa.ba
 upt.al
 uri.arpa
+url.st
 urn.arpa
 us.com
+us.ms
+us.na
+us.tc
 us.tf
+us.to
 us.tt
+usa.museum
+usantiques.museum
+usarts.museum
+uscountryestate.museum
+usculture.museum
+usdecorativearts.museum
+usenet.pl
+usgarden.museum
+ushistory.museum
+ushuaia.museum
+uslivinghistory.museum
+ustka.pl
 ut.us
+utah.museum
 utazas.hu
+utsira.no
 utsunomiya.jp
 uu.mt
+uvic.museum
 uy.com
+uz.ua
 uzhgorod.ua
+v.bg
+va.it
+va.no
 va.us
+vaapste.no
+vadso.no
+vaga.no
+vagan.no
+vagsoy.no
+vaksdal.no
+valle.no
+valley.museum
+vang.no
+vantaa.museum
+vanylven.no
+vardo.no
+varese.it
+varggat.no
+varoy.no
 vatican.va
+vb.it
+vc.it
 vdonsk.ru
+ve.it
+vefsn.no
+vega.no
+vegarshei.no
+veg�rshei.no
+venezia.it
+venice.it
+vennesla.no
+verbania.it
+vercelli.it
+verdal.no
+verona.it
+verran.no
+versailles.museum
+vestby.no
+vestnes.no
+vestre-slidre.no
+vestre-toten.no
+vestvagoy.no
 vet.br
 veterinaire.fr
+veterinaire.km
+vevelstad.no
+vf.no
 vgs.no
+vi.it
+vi.us
+vibo-valentia.it
+vibovalentia.it
 vic.au
+vicenza.it
 video.hu
+vik.no
+viking.museum
+vikna.no
+village.museum
+vindafjord.no
 vinnica.ua
+virginia.museum
+virtual.museum
+virtuel.museum
+viterbo.it
+vlaanderen.museum
 vladikavkaz.ru
 vladimir.ru
 vladivostok.ru
+vlog.br
 vn.ua
+voagat.no
+volda.no
 volgograd.ru
+volkenkunde.museum
 vologda.ru
 voronezh.ru
+voss.no
+vossevangen.no
+vr.it
 vrn.ru
+vt.it
 vt.us
+vv.it
 vyatka.ru
+w.bg
 w.se
 wa.au
 wa.us
 wakayama.jp
+walbrzych.pl
+wales.museum
+wallonie.museum
+war.museum
+warmia.pl
 warszawa.pl
+washingtondc.museum
+watch-and-clock.museum
+watchandclock.museum
 waw.pl
+we.bs
 weather.mobi
+web-soft.ru
 web.co
 web.do
 web.id
 web.lk
+web.nf
 web.pk
 web.tj
 web.tr
 web.ve
 web.za
+webcindario.com
+webs.com
+weebly.com
+wegrow.pl
+western.museum
+westfalen.museum
+whaling.museum
+whsites.net
 wi.us
+wielun.pl
+wiki.br
+wildlife.museum
+williamsburg.museum
+windmill.museum
+wlocl.pl
+wloclawek.pl
+wodzislaw.pl
+wolomin.pl
+wordpress.com
+workinggroup.aero
+works.aero
+workshop.museum
 wroc.pl
 wroclaw.pl
+ws.na
 wv.us
 www.ro
 wy.us
+wz.cz
+x.bg
 x.se
+xanga.com
+xf.cz
 xj.cn
+xorg.pl
 xz.cn
+y.bg
 y.se
 yakutia.ru
 yamagata.jp
@@ -1795,15 +3779,31 @@ yekaterinburg.ru
 yk.ca
 yn.cn
 yokohama.jp
+york.museum
+yorkshire.museum
+yosemite.museum
+youth.museum
 yuzhno-sakhalinsk.ru
+z.bg
 z.se
+z8.ru
 za.com
+za.net
+za.org
 za.pl
+zachpomor.pl
+zagan.pl
+zakopane.pl
 zaporizhzhe.ua
+zarow.pl
 zgora.pl
+zgorzelec.pl
 zgrad.ru
 zhitomir.ua
 zj.cn
 zlg.br
+zmail.ru
+zoological.museum
+zoology.museum
 zp.ua
 zt.ua
diff --git a/src/content/zoommanager.js b/src/content/zoommanager.js
index ed2365c..055b82e 100644
--- a/src/content/zoommanager.js
+++ b/src/content/zoommanager.js
@@ -57,6 +57,8 @@ ZoomManager.enlarge = NoSquint.cmd.enlargePrimary;
 ZoomManager.reduce = NoSquint.cmd.reducePrimary;
 ZoomManager.reset = NoSquint.cmd.reset;
 
+/*
 FullZoom.enlarge = NoSquint.cmd.enlargeFullZoom;
 FullZoom.reduce = NoSquint.cmd.reduceFullZoom;
 FullZoom.reset = NoSquint.cmd.reset;
+*/
diff --git a/src/defaults/preferences/nosquint.js b/src/defaults/preferences/nosquint.js
index a67cf00..e0e6dc3 100644
--- a/src/defaults/preferences/nosquint.js
+++ b/src/defaults/preferences/nosquint.js
@@ -5,7 +5,7 @@ pref("extensions.nosquint.rememberSites", true);
 pref("extensions.nosquint.sites", "");
 pref("extensions.nosquint.sitesSaveDelay", 5000);
 pref("extensions.nosquint.exceptions", "*/~* *.sourceforge.net *.google.[*]");
-pref("extensions.nosquint.zoomImages", true);
+pref("extensions.nosquint.zoomImages", false);
 pref("extensions.nosquint.wheelZoomEnabled", true);
 pref("extensions.nosquint.wheelZoomInvert", false);
 pref("extensions.nosquint.hideStatus", false);
@@ -18,5 +18,6 @@ pref("extensions.nosquint.colorBackgroundImages", false);
 pref("extensions.nosquint.linksUnvisited", '0');
 pref("extensions.nosquint.linksVisited", '0');
 pref("extensions.nosquint.linksUnderline", false);
+pref("extensions.nosquint.version", '0');
 pref("privacy.cpd.extensions-nosquint", true);
 pref("privacy.item.extensions-nosquint", true);
diff --git a/src/icon.png b/src/icon.png
new file mode 100644
index 0000000..2d7c782
Binary files /dev/null and b/src/icon.png differ
diff --git a/src/icon64.png b/src/icon64.png
new file mode 100644
index 0000000..4d8bb30
Binary files /dev/null and b/src/icon64.png differ
diff --git a/src/install.rdf b/src/install.rdf
index d156ee1..4bb2d96 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -6,21 +6,20 @@
     
         <em:id>nosquint at urandom.ca</em:id>
         <em:name>NoSquint</em:name>
-        <em:version>2.0</em:version>
+        <em:version>2.1b1</em:version>
         <em:description>Manage site-specific zoom levels and color settings</em:description>
         <em:creator>Jason Tackaberry</em:creator>
         <!-- optional items -->
         <em:homepageURL>http://urandom.ca/nosquint/</em:homepageURL>
         <em:optionsURL>chrome://nosquint/content/dlg-global.xul</em:optionsURL>
-        <em:iconURL>chrome://nosquint/skin/logo-32.png</em:iconURL>
         <em:type>2</em:type> <!-- type=extension --> 
 
         <!-- Firefox -->
         <em:targetApplication>
             <Description>
                 <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
-                <em:minVersion>3.0b4pre</em:minVersion>
-                <em:maxVersion>3.7a1pre</em:maxVersion>
+                <em:minVersion>3.0</em:minVersion>
+                <em:maxVersion>4.0b9pre</em:maxVersion>
             </Description>
         </em:targetApplication>
     </Description>
diff --git a/src/skin/box-grunge.png b/src/skin/box-grunge.png
new file mode 100644
index 0000000..db51638
Binary files /dev/null and b/src/skin/box-grunge.png differ
diff --git a/src/skin/icon96.png b/src/skin/icon96.png
new file mode 100644
index 0000000..6af7bf0
Binary files /dev/null and b/src/skin/icon96.png differ
diff --git a/src/skin/statusbar-shot.jpg b/src/skin/statusbar-shot.jpg
new file mode 100644
index 0000000..d5af667
Binary files /dev/null and b/src/skin/statusbar-shot.jpg differ
diff --git a/src/skin/toolbar-shot.jpg b/src/skin/toolbar-shot.jpg
new file mode 100644
index 0000000..d4ba9b1
Binary files /dev/null and b/src/skin/toolbar-shot.jpg differ

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-mozext/nosquint.git



More information about the Pkg-mozext-commits mailing list