[Pkg-mozext-commits] [SCM] iceweasel extension that enables customization of webpages with user scripts branch, upstream, updated. upstream/0.9.11-1-ge752d17

Andrea Veri av at src.gnome.org
Tue Feb 21 11:45:31 UTC 2012


The following commit has been merged in the upstream branch:
commit e752d1706813c5f2a0fbf7d9e5f833dd8788ca62
Author: Andrea Veri <av at src.gnome.org>
Date:   Tue Feb 21 12:45:49 2012 +0100

    New upstream release 0.9.17

diff --git a/chrome.manifest b/chrome.manifest
index fba1675..f2bb6c1 100644
--- a/chrome.manifest
+++ b/chrome.manifest
@@ -31,8 +31,10 @@ overlay    chrome://greasemonkey/content/options.xul chrome://greasemonkey/conte
 overlay    chrome://greasemonkey/content/newscript.xul chrome://greasemonkey/content/closewindow.xul
 
 locale greasemonkey en-US jar:chrome/greasemonkey.jar!/locale/en-US/
+locale greasemonkey ar jar:chrome/greasemonkey.jar!/locale/ar/
 locale greasemonkey ca-AD jar:chrome/greasemonkey.jar!/locale/ca-AD/
 locale greasemonkey cs jar:chrome/greasemonkey.jar!/locale/cs/
+locale greasemonkey cs-CZ jar:chrome/greasemonkey.jar!/locale/cs-CZ/
 locale greasemonkey da jar:chrome/greasemonkey.jar!/locale/da/
 locale greasemonkey de jar:chrome/greasemonkey.jar!/locale/de/
 locale greasemonkey es jar:chrome/greasemonkey.jar!/locale/es/
@@ -41,14 +43,17 @@ locale greasemonkey es-ES jar:chrome/greasemonkey.jar!/locale/es-ES/
 locale greasemonkey es-MX jar:chrome/greasemonkey.jar!/locale/es-MX/
 locale greasemonkey et-EE jar:chrome/greasemonkey.jar!/locale/et-EE/
 locale greasemonkey fa-IR jar:chrome/greasemonkey.jar!/locale/fa-IR/
+locale greasemonkey fi jar:chrome/greasemonkey.jar!/locale/fi/
 locale greasemonkey fi-FI jar:chrome/greasemonkey.jar!/locale/fi-FI/
 locale greasemonkey fr jar:chrome/greasemonkey.jar!/locale/fr/
 locale greasemonkey gl-ES jar:chrome/greasemonkey.jar!/locale/gl-ES/
 locale greasemonkey he-IL jar:chrome/greasemonkey.jar!/locale/he-IL/
 locale greasemonkey hu jar:chrome/greasemonkey.jar!/locale/hu/
+locale greasemonkey it jar:chrome/greasemonkey.jar!/locale/it/
 locale greasemonkey it-IT jar:chrome/greasemonkey.jar!/locale/it-IT/
 locale greasemonkey ja-JP jar:chrome/greasemonkey.jar!/locale/ja-JP/
 locale greasemonkey ko-KR jar:chrome/greasemonkey.jar!/locale/ko-KR/
+locale greasemonkey lt jar:chrome/greasemonkey.jar!/locale/lt/
 locale greasemonkey nl jar:chrome/greasemonkey.jar!/locale/nl/
 locale greasemonkey pl jar:chrome/greasemonkey.jar!/locale/pl/
 locale greasemonkey pt-BR jar:chrome/greasemonkey.jar!/locale/pt-BR/
@@ -56,8 +61,10 @@ locale greasemonkey ro-RO jar:chrome/greasemonkey.jar!/locale/ro-RO/
 locale greasemonkey ru jar:chrome/greasemonkey.jar!/locale/ru/
 locale greasemonkey ru-RU jar:chrome/greasemonkey.jar!/locale/ru-RU/
 locale greasemonkey si-LK jar:chrome/greasemonkey.jar!/locale/si-LK/
+locale greasemonkey sk-SK jar:chrome/greasemonkey.jar!/locale/sk-SK/
 locale greasemonkey sr jar:chrome/greasemonkey.jar!/locale/sr/
 locale greasemonkey sv-SE jar:chrome/greasemonkey.jar!/locale/sv-SE/
+locale greasemonkey tr jar:chrome/greasemonkey.jar!/locale/tr/
 locale greasemonkey tr-TR jar:chrome/greasemonkey.jar!/locale/tr-TR/
 locale greasemonkey uk jar:chrome/greasemonkey.jar!/locale/uk/
 locale greasemonkey uk-UA jar:chrome/greasemonkey.jar!/locale/uk-UA/
diff --git a/chrome/greasemonkey.jar!/content/addons.js b/chrome/greasemonkey.jar!/content/addons.js
index 20ca7dd..aea884b 100644
--- a/chrome/greasemonkey.jar!/content/addons.js
+++ b/chrome/greasemonkey.jar!/content/addons.js
@@ -8,13 +8,13 @@ var gUserscriptsView = null;
 var GM_os;
 (function() {
 var xulRuntime = Components
-    .classes["@mozilla.org/xre/app-info;1"]
+    .classes['@mozilla.org/xre/app-info;1']
     .getService(Components.interfaces.nsIXULRuntime);
 
 GM_os = xulRuntime.OS;
 })();
 
-(function() {
+(function private_scope() {
 var _origShowView;
 function ourShowView(aView) {
   if ('userscripts' == aView) {
@@ -26,6 +26,8 @@ function ourShowView(aView) {
     if ('userscripts' == gView) gView = null;
 
     _origShowView(aView);
+
+    if ('updates' == aView) greasemonkeyAddons.showScriptUpdates();
   }
 };
 window.GM_overrideShowView = function() {
@@ -36,37 +38,113 @@ window.GM_overrideShowView = function() {
 };
 GM_overrideShowView();
 
-// Set up an "observer" on the config, to keep the displayed items up to date
+var _origInstallUpdates = installUpdatesAll;
+installUpdatesAll = function() {
+  var chromeWin = GM_util.getBrowserWindow();
+  var children = gExtensionsView.children;
+  for (var i = 0, child = null; child = children[i]; i++) {
+    if (!/^urn:greasemonkey:update:item:/.test(child.id)) continue;
+
+    var checkbox = document.getAnonymousElementByAttribute(
+        child, 'anonid', 'includeUpdate');
+    if (!checkbox) continue;
+
+    checkbox.setAttribute('anonid', 'includeScriptUpdate');
+    if (checkbox.checked) {
+      var script = GM_config.getScriptById(child.getAttribute('addonId'));
+      script.installUpdate(chromeWin);
+    }
+  }
+
+  _origInstallUpdates();
+};
+
+var _origBuildContextMenu = buildContextMenu;
+buildContextMenu = function(event) {
+  _origBuildContextMenu(event);
+
+  var selectedItem = gExtensionsView.selectedItem;
+  if (/^urn:greasemonkey:update:item:/.test(selectedItem.id)) {
+    document.getElementById('menuitem_homepage_clone')
+        .setAttribute('hidden', true);
+    document.getElementById('menuitem_about_clone')
+        .setAttribute('hidden', true);
+    document.getElementById('menuseparator_1_clone')
+        .setAttribute('hidden', true);
+    document.getElementById('menuitem_installUpdate_clone')
+        .setAttribute('command', 'cmd_userscript_installUpdate');
+  } else {
+    document.getElementById('menuitem_installUpdate')
+        .setAttribute('command', 'cmd_installUpdate');
+  }
+};
+
+// Set up an 'observer' on the config, to keep the displayed items up to date
 // with their actual state.
 var observer = {
-  notifyEvent: function(script, event, data) {
-    if (event == "install") {
-      var beforeNode = data > -1 ? gUserscriptsView.childNodes[data] : null;
-      var item = greasemonkeyAddons.addScriptToList(script, beforeNode);
-      if (gView == "userscripts") gUserscriptsView.selectedItem = item;
+  notifyEvent: function(script, event, data, aView) {
+    if ('undefined' == typeof aView) var aView = gView;
+
+    var currentViewNode = null;
+    if ('updates' == aView) {
+      currentViewNode = gExtensionsView;
+      this.notifyEvent(script, event, data, 'userscripts');
+    } else if ('userscripts' == aView) {
+      currentViewNode = gUserscriptsView;
+    }
+
+    if ('userscripts' == aView && 'install' == event) {
+      var beforeNode = data > -1 ? currentViewNode.childNodes[data] : null;
+      var item = greasemonkeyAddons.listitemForScript(script);
       item.setAttribute('newAddon', 'true');
+      currentViewNode.insertBefore(item, beforeNode);
+      if ('userscripts' == gView) gUserscriptsView.selectedItem = item;
       return;
+    } else if ('updates' == aView && 'install' == event) {
+      var node = document.getElementById('urn:greasemonkey:'
+          + (aView == 'updates' ? 'update:' : '') + 'item:' + script.id);
+      if (node) currentViewNode.removeChild(node);
+      if (currentViewNode.children.length == 0) {
+        showView('userscripts');
+        document.getElementById('updates-view').hidden = true;
+      }
+      return;
+    } else if ('updates' == aView && 'update-found' == event) {
+      var node = greasemonkeyAddons.listitemForScript(script, true);
+      node.setAttribute('typeName', 'update');
+      currentViewNode.insertBefore(node, null);
     }
 
-    // find the script's node
-    var node = document.getElementById('urn:greasemonkey:item:'+script.id);
-    if (!node) return;
+    var node = document.getElementById('urn:greasemonkey:'
+        + (aView == 'updates' ? 'update:' : '') + 'item:' + script.id);
+    if (!node || !currentViewNode) return;
 
     switch (event) {
-      case "edit-enabled":
+      case 'edit-enabled':
         node.setAttribute('isDisabled', !data);
         break;
-      case "uninstall":
-        gUserscriptsView.removeChild(node);
+      case 'update-found':
+        node.setAttribute('updateable', 'true');
+        node.setAttribute('availableUpdateVersion', data.version);
+        node.setAttribute('availableUpdateURL', data.url);
+        node.setAttribute('providesUpdatesSecurely', data.secure.toString());
+        node.setAttribute('updateAvailableMsg',
+            'Version ' + data.version + ' is available.');
+        document.getElementById('updates-view').hidden = false;
+        showView('updates');
         break;
-      case "move":
+      case 'uninstall':
+        currentViewNode.removeChild(node);
+        break;
+      case 'move':
         gUserscriptsView.removeChild(node);
         gUserscriptsView.insertBefore(node, gUserscriptsView.childNodes[data]);
         greasemonkeyAddons.reselectLastSelected();
         break;
-      case "modified":
-        var item = greasemonkeyAddons.listitemForScript(script);
-        gUserscriptsView.replaceChild(item, node);
+      case 'modified':
+        var item = greasemonkeyAddons.listitemForScript(
+            script, 'updates' == aView);
+        currentViewNode.replaceChild(item, node);
         break;
     }
   }
@@ -114,6 +192,16 @@ window.addEventListener('load', function() {
       setTimeout(showView, 0, 'userscripts');
     }
   }
+
+  var scripts = GM_config.getMatchingScripts(
+      function (script) { return script.updateAvailable; });
+  if (scripts.length > 0) {
+    document.getElementById('updates-view').hidden = false;
+  }
+
+  var contextMenu = document.getElementById("userscriptContextMenu");
+  contextMenu.addEventListener(
+      "popupshowing", greasemonkeyAddons.onContextShowing, false);
 }, false);
 
 window.addEventListener('unload', function() {
@@ -137,7 +225,7 @@ var greasemonkeyAddons = {
     document.getElementById('viewGroup')
         .setAttribute('last-selected', 'userscripts');
     var userscriptsRadio = document.getElementById('userscripts-view');
-    var viewGroup = document.getElementById("viewGroup");
+    var viewGroup = document.getElementById('viewGroup');
     viewGroup.selectedItem = userscriptsRadio;
     greasemonkeyAddons.reselectLastSelected();
     gView='userscripts';
@@ -154,6 +242,18 @@ var greasemonkeyAddons = {
     gExtensionsView.focus();
   },
 
+  showScriptUpdates: function() {
+    var scripts = GM_config.getMatchingScripts(
+        function (script) { return script.updateAvailable; });
+
+    // Add a list item for each script.
+    for (var i = 0, script = null; script = scripts[i]; i++) {
+      var item = greasemonkeyAddons.listitemForScript(script, true);
+      item.setAttribute('typeName', 'update');
+      gExtensionsView.insertBefore(item, null);
+    }
+  },
+
   updateLastSelected: function() {
     if (!gUserscriptsView.selectedItem) return;
     var userscriptsRadio = document.getElementById('userscripts-view');
@@ -194,7 +294,7 @@ var greasemonkeyAddons = {
         }, 0);
   },
 
-  listitemForScript: function(script) {
+  listitemForScript: function(script, updateView) {
     var item = document.createElement('richlistitem');
 
     // Setting these attributes inherits the values into the same place they
@@ -204,8 +304,20 @@ var greasemonkeyAddons = {
     item.setAttribute('description', script.description);
     item.setAttribute('version', script.version);
     item.setAttribute('iconURL', script.icon.fileURL);
-    item.setAttribute('id', 'urn:greasemonkey:item:'+script.id);
+    item.setAttribute('id', 'urn:greasemonkey:'
+        + (updateView ? 'update:' : '') + 'item:' + script.id);
     item.setAttribute('isDisabled', !script.enabled);
+
+    if (script.updateAvailable) {
+      item.setAttribute('updateable', 'true');
+      item.setAttribute('availableUpdateVersion', script._updateVersion);
+      item.setAttribute('availableUpdateURL', script._downloadURL);
+      item.setAttribute('satisfiesDependencies', 'true');
+      item.setAttribute('updateAvailableMsg',
+          'Version ' + script._updateVersion + ' is available.');
+      item.setAttribute('providesUpdatesSecurely', script.updateIsSecure);
+    }
+
     if (script.id in GM_uninstallQueue) {
       item.setAttribute('opType', 'needs-uninstall');
     }
@@ -220,25 +332,32 @@ var greasemonkeyAddons = {
   },
 
   findSelectedScript: function() {
-    if (!gUserscriptsView.selectedItem) return null;
-    var scripts = GM_config.scripts;
-    var selectedScriptId = gUserscriptsView.selectedItem.getAttribute('addonId');
-    for (var i = 0, script = null; script = scripts[i]; i++) {
-      if (selectedScriptId == script.id) {
-        return script;
-      }
+    var currentViewNode = null;
+    if ('updates' == gView) {
+      currentViewNode = gExtensionsView;
+    } else if ('userscripts' == gView) {
+      currentViewNode = gUserscriptsView;
     }
-    return null;
+    if (!currentViewNode || !currentViewNode.selectedItem) return null;
+    var selectedScriptId = currentViewNode.selectedItem.getAttribute('addonId');
+    return GM_config.getScriptById(selectedScriptId) || null;
   },
 
   doCommand: function(command) {
     var script = greasemonkeyAddons.findSelectedScript();
     if (!script) {
-      dump("greasemonkeyAddons.doCommand() could not find selected script.\n");
+      dump('greasemonkeyAddons.doCommand() could not find selected script.\n');
       return;
     }
 
-    var selectedListitem = gUserscriptsView.selectedItem;
+    var currentViewNode = null;
+    if ('updates' == gView) {
+      currentViewNode = gExtensionsView;
+    } else if ('userscripts' == gView) {
+      currentViewNode = gUserscriptsView;
+    }
+
+    var selectedListitem = currentViewNode.selectedItem;
     switch (command) {
     case 'cmd_userscript_edit':
       GM_util.openInEditor(script);
@@ -290,13 +409,23 @@ var greasemonkeyAddons = {
       delete(GM_uninstallQueue[script.id]);
       GM_config.uninstall(script);
       break;
+    case 'cmd_userscript_checkUpdate':
+      script.checkForRemoteUpdate(true);
+      break;
+    case 'cmd_userscript_installUpdate':
+      script.installUpdate(GM_util.getBrowserWindow());
+      break;
+    case 'cmd_userscript_toggleCheckUpdates':
+      script.checkRemoteUpdates = !script.checkRemoteUpdates;
+      GM_util.getService().config._changed(script, "modified", null);
+      break;
     }
   },
 
   buildContextMenu: function(aEvent) {
     var script = greasemonkeyAddons.findSelectedScript();
     if (!script) {
-      dump("greasemonkeyAddons.buildContextMenu() could not find selected script.\n");
+      dump('greasemonkeyAddons.buildContextMenu() could not find selected script.\n');
       return;
     }
 
@@ -317,11 +446,11 @@ var greasemonkeyAddons = {
     }
 
     var standardItems = [
-      'move_up', 'move_down', 'move_top', 'move_bottom', 'sort',
-      'move_separator',
-      'edit', 'show',
-      'edit_separator',
-      'uninstall'];
+        'move_up', 'move_down', 'move_top', 'move_bottom', 'sort',
+        'move_separator',
+        'edit', 'show',
+        'edit_separator',
+        'uninstall', 'toggleCheckUpdates'];
     var uninstallItems = ['uninstall_now', 'cancelUninstall'];
 
     // Set everything hidden now, reveal the right selection below.
@@ -334,6 +463,8 @@ var greasemonkeyAddons = {
       // Set visibility.
       setItemsHidden(false, standardItems);
       setItemsHidden(false, script.enabled ? ['disable'] : ['enable']);
+      setItemsHidden(script.updateAvailable, ['checkUpdate']);
+      setItemsHidden(!script.updateAvailable, ['installUpdate']);
       // Set disabled.
       var atBottom = !selectedItem.nextSibling;
       var atTop = !selectedItem.previousSibling;
@@ -341,23 +472,35 @@ var greasemonkeyAddons = {
       // these values.
       // Todo: better fix.
       setTimeout(function() {
-            setElementDisabledByID('userscript_context_move_up', atTop);
-            setElementDisabledByID('userscript_context_move_down', atBottom);
-            setElementDisabledByID('userscript_context_move_top', atTop);
-            setElementDisabledByID('userscript_context_move_bottom', atBottom);
-            setElementDisabledByID('userscript_context_sort', (atTop && atBottom));
-          }, 0);
+        setElementDisabledByID('userscript_context_move_up', atTop);
+        setElementDisabledByID('userscript_context_move_down', atBottom);
+        setElementDisabledByID('userscript_context_move_top', atTop);
+        setElementDisabledByID('userscript_context_move_bottom', atBottom);
+        setElementDisabledByID('userscript_context_sort', (atTop && atBottom));
+      }, 0);
+    }
+  },
+
+  onContextShowing: function(aEvent) {
+    var script = greasemonkeyAddons.findSelectedScript();
+    var menuitem = document.getElementById(
+        'userscript_context_toggleCheckUpdates');
+    if (script.checkRemoteUpdates) {
+      menuitem.setAttribute('checked', 'true');
+    } else {
+      menuitem.removeAttribute('checked');
     }
   },
 
   onKeypress: function(aEvent) {
-    var viewGroup = document.getElementById("viewGroup");
+    var viewGroup = document.getElementById('viewGroup');
     switch (aEvent.keyCode) {
       case aEvent.DOM_VK_LEFT:
       case aEvent.DOM_VK_RIGHT:
-        let nextFlag = (aEvent.keyCode == aEvent.DOM_VK_RIGHT);
-        if (getComputedStyle(viewGroup, "").direction == "rtl")
+        var nextFlag = (aEvent.keyCode == aEvent.DOM_VK_RIGHT);
+        if ('rtl' == getComputedStyle(viewGroup, '').direction) {
           nextFlag = !nextFlag;
+        }
         viewGroup.checkAdjacentElement(nextFlag);
         break;
       default:
@@ -392,10 +535,9 @@ var greasemonkeyDragObserver = {
     } else if ('application/x-moz-file' == dropData.flavour.contentType) {
       url = GM_util.getUriFromFile(dropData.data).spec;
     }
-    dump("Dropped url: ["+url+"]\n");
     if (url && url.match(/\.user\.js$/)) {
-      // TODO: Make this UI appear in the add-ons win, rather than the browser?
-      GM_util.installUri(GM_util.uriFromUrl(url));
+      GM_util.showInstallDialog(
+          url, GM_util.getBrowserWindow().gBrowser, GM_util.getService());
     }
   },
   getSupportedFlavours: function() {
diff --git a/chrome/greasemonkey.jar!/content/addons.xml b/chrome/greasemonkey.jar!/content/addons.xml
index 63e1c22..0abe5cc 100644
--- a/chrome/greasemonkey.jar!/content/addons.xml
+++ b/chrome/greasemonkey.jar!/content/addons.xml
@@ -66,16 +66,6 @@
             tooltiptext="&cmd.cancelUninstall.tooltip;"
             command="cmd_userscript_uninstall_cancel"
           />
-
-          <!--
-          Todo: Make install/upgrade buttons like extensions if/when added.
-          <xul:button class="installShow cancelInstallButton" label="&cancelInstall.label;"
-                      accesskey="&cancelInstall.accesskey;" tooltiptext="&cmd.cancelInstall.tooltip;"
-                      command="cmd_cancelInstall"/>
-          <xul:button class="upgradeShow cancelUpgradeButton" label="&cancelUpgrade.label;"
-                      accesskey="&cancelUpgrade.accesskey;" tooltiptext="&cmd.cancelUpgrade.tooltip;"
-                      command="cmd_cancelUpgrade"/>
-          -->
         </xul:hbox>
       </xul:vbox>
     </xul:hbox>
diff --git a/chrome/greasemonkey.jar!/content/addons.xul b/chrome/greasemonkey.jar!/content/addons.xul
index d9f8379..776ebc7 100644
--- a/chrome/greasemonkey.jar!/content/addons.xul
+++ b/chrome/greasemonkey.jar!/content/addons.xul
@@ -20,7 +20,6 @@
 <script src="chrome://global/content/nsTransferable.js" />
 
 <script type="application/x-javascript" src="chrome://greasemonkey/content/third-party/mpl-utils.js" />
-<script type="application/x-javascript" src="chrome://greasemonkey/content/scriptdownloader.js" />
 <script type="application/x-javascript" src="chrome://greasemonkey/content/addons.js" />
 
 <radiogroup id="viewGroup">
@@ -42,14 +41,12 @@
 </notificationbox>
 
 <hbox id="commandBarBottom">
-  <!--
   <button id="findUpdatesUserscripts"
     insertafter="checkUpdatesAllButton"
     label="&cmd.checkUpdatesAll.label;"
     accesskey="&cmd.checkUpdatesAll.accesskey;"
-    disabled="true"
+    oncommand="GM_config.checkScriptsForRemoteUpdates();"
   />
-  -->
 
   <label id="getMoreUserscripts" class="text-link"
     insertafter="getMore"
@@ -72,6 +69,7 @@
     <command id="cmd_userscript_edit"/>
     <command id="cmd_userscript_options"/>
     <command id="cmd_userscript_show"/>
+    <command id="cmd_userscript_checkUpdate"/>
     <command id="cmd_userscript_enable"/>
     <command id="cmd_userscript_disable"/>
     <command id="cmd_userscript_uninstall"/>
@@ -84,6 +82,8 @@
     <command id="cmd_userscript_move_bottom"/>
 
     <command id="cmd_userscript_sort"/>
+    <command id="cmd_userscript_installUpdate"/>
+    <command id="cmd_userscript_toggleCheckUpdates" />
   </commandset>
 
   <menupopup id="userscriptContextMenu"
@@ -128,29 +128,18 @@
 
     <menuseparator/>
 
-    <!--
-    Todo: Make install/upgrade menu items like extensions if/when added.
-    <menuitem id="userscript_context_cancelInstall" command="cmd_cancelInstall"
-      label="&cmd.cancelInstall.label;" accesskey="&cmd.cancelInstall.accesskey;"/>
-    <menuitem id="userscript_context_cancelUpgrade" command="cmd_cancelUpgrade"
-      label="&cmd.cancelUpgrade.label;" accesskey="&cmd.cancelUpgrade.accesskey;"/>
-    <menuitem id="userscript_context_checkUpdate" command="cmd_checkUpdate"
+    <menuitem id="userscript_context_checkUpdate" command="cmd_userscript_checkUpdate"
       label="&cmd.checkUpdate.label;" accesskey="&cmd.checkUpdate.accesskey;"/>
-    -->
+    <menuitem id="userscript_context_installUpdate" command="cmd_userscript_installUpdate"
+      label="&cmd.installUpdate.label;" accesskey="&cmd.installUpdate.accesskey;"/>
+    <menuitem id="userscript_context_toggleCheckUpdates" command="cmd_userscript_toggleCheckUpdates"
+      label="&CheckUpdates;" accesskey="&CheckUpdates.accesskey;"
+      type="checkbox" />
 
     <menuitem id="userscript_context_enable" command="cmd_userscript_enable"
       label="&cmd.enable.label;" accesskey="&cmd.enable.accesskey;"/>
     <menuitem id="userscript_context_disable" command="cmd_userscript_disable"
       label="&cmd.disable.label;" accesskey="&cmd.disable.accesskey;"/>
-
-    <!--
-    Todo: as above.
-    <menuitem id="userscript_context_installUpdate" command="cmd_installUpdate"
-      label="&cmd.installUpdate.label;" accesskey="&cmd.installUpdate.accesskey;"/>
-    <menuitem id="userscript_context_includeUpdate" command="cmd_includeUpdate"
-      label="&cmd.includeUpdate.label;" accesskey="&cmd.includeUpdate.accesskey;"
-      type="checkbox"/>
-    -->
   </menupopup>
 </window>
 
diff --git a/chrome/greasemonkey.jar!/content/addons4-overlay.js b/chrome/greasemonkey.jar!/content/addons4-overlay.js
index d1f0766..9877f86 100644
--- a/chrome/greasemonkey.jar!/content/addons4-overlay.js
+++ b/chrome/greasemonkey.jar!/content/addons4-overlay.js
@@ -39,7 +39,7 @@ gViewController.loadView = function(aViewId) {
 // with their actual state.
 var observer = {
   notifyEvent: function observer_notifyEvent(script, event, data) {
-    if (userScriptViewId != gViewController.currentViewId) return;
+    if (!isScriptView()) return;
 
     var addon = ScriptAddonFactoryByScript(script);
     switch (event) {
@@ -47,13 +47,14 @@ var observer = {
         gListView.addItem(addon);
         setEmptyWarningVisible();
         break;
-      case "edit-enabled":
+      case 'edit-enabled':
         addon.userDisabled = !data;
         var item = gListView.getListItemForID(addon.id);
         item.setAttribute('active', data);
         break;
       case 'modified':
         // Bust the addon cache, and get references to the old and new version.
+        if (!data) break;
         var oldAddon = ScriptAddonFactoryByScript({'id': data});
         ScriptAddonReplaceScript(script);
         addon = ScriptAddonFactoryByScript(script);
@@ -76,6 +77,10 @@ function addonIsInstalledScript(aAddon) {
   return true;
 };
 
+function isScriptView() {
+  return 'addons://list/user-script' == gViewController.currentViewId;
+}
+
 function addonExecutesNonFirst(aAddon) {
   if (!aAddon) return false;
   if (SCRIPT_ADDON_TYPE != aAddon.type) return false;
@@ -123,6 +128,13 @@ function init() {
       isEnabled: addonExecutesNonLast,
       doCommand: function(aAddon) { reorderScriptExecution(aAddon, 9999); }
     };
+  gViewController.commands.cmd_userscript_toggleCheckUpdates = {
+      isEnabled: addonIsInstalledScript,
+      doCommand: function(aAddon) {
+        aAddon._script.checkRemoteUpdates = !aAddon._script.checkRemoteUpdates;
+        GM_util.getService().config._changed(aAddon._script, "modified", null);
+      }
+    };
 
   window.addEventListener('ViewChanged', onViewChanged, false);
   onViewChanged(); // initialize on load as well as when it changes later
@@ -130,8 +142,22 @@ function init() {
   document.getElementById('greasemonkey-sort-bar').addEventListener(
       'command', onSortersClicked, false);
   applySort();
+
+  var contextMenu = document.getElementById("addonitem-popup");
+  contextMenu.addEventListener("popupshowing", onContextShowing, false);
 };
 
+function onContextShowing(aEvent) {
+  var addon = gViewController.currentViewObj.getSelectedAddon();
+  var menuitem = document.getElementById(
+      'menuitem_userscript_toggleCheckUpdates');
+  if (addon._script.checkRemoteUpdates) {
+    menuitem.setAttribute('checked', 'true');
+  } else {
+    menuitem.removeAttribute('checked');
+  }
+}
+
 function onSortersClicked(aEvent) {
   if ('button' != aEvent.target.tagName) return;
   var button = aEvent.target;
diff --git a/chrome/greasemonkey.jar!/content/addons4-overlay.xul b/chrome/greasemonkey.jar!/content/addons4-overlay.xul
index cb00869..fce900d 100644
--- a/chrome/greasemonkey.jar!/content/addons4-overlay.xul
+++ b/chrome/greasemonkey.jar!/content/addons4-overlay.xul
@@ -8,6 +8,8 @@
 %greasemonkeyDTD;
 <!ENTITY % greasemonkeyAddonsDTD SYSTEM "chrome://greasemonkey/locale/gm-addons.dtd">
 %greasemonkeyAddonsDTD;
+<!ENTITY % extensionsDTD SYSTEM "chrome://mozapps/locale/extensions/extensions.dtd">
+%extensionsDTD;
 ]>
 
 <overlay id="greasemonkey-browser-overlay"
@@ -30,31 +32,39 @@
   <command id="cmd_userscript_execute_sooner" />
   <command id="cmd_userscript_execute_later" />
   <command id="cmd_userscript_execute_last" />
+  <command id="cmd_userscript_showItemPreferences" />
+  <command id="cmd_userscript_toggleCheckUpdates" />
 </commandset>
 
 <menupopup id="addonitem-popup">
-  <menuitem id="menuitem_userscript_edit" command="cmd_userscript_edit"
-    label="&Edit;" accesskey="&Edit.accesskey;" type="user-script"
+  <menuitem command="cmd_userscript_edit"
+    label="&Edit;" accesskey="&Edit.accesskey;" class="greasemonkey"
   />
-  <menuitem id="menuitem_userscript_show" command="cmd_userscript_show"
-    label="&Show;" accesskey="&Show.accesskey;" type="user-script"
+  <menuitem command="cmd_userscript_show"
+    label="&Show;" accesskey="&Show.accesskey;" class="greasemonkey"
   />
-  <menuseparator type="user-script"/>
-  <menuitem id="menuitem_userscript_execute_first"
-    command="cmd_userscript_execute_first"
-    label="&ExecuteFirst;" type="user-script"
+  <menuseparator class="greasemonkey"/>
+  <menuitem command="cmd_userscript_execute_first"
+    label="&ExecuteFirst;" class="greasemonkey"
   />
-  <menuitem id="menuitem_userscript_execute_sooner"
-    command="cmd_userscript_execute_sooner"
-    label="&ExecuteSooner;" type="user-script"
+  <menuitem command="cmd_userscript_execute_sooner"
+    label="&ExecuteSooner;" class="greasemonkey"
   />
-  <menuitem id="menuitem_userscript_execute_later"
-    command="cmd_userscript_execute_later"
-    label="&ExecuteLater;" type="user-script"
+  <menuitem command="cmd_userscript_execute_later"
+    label="&ExecuteLater;" class="greasemonkey"
   />
-  <menuitem id="menuitem_userscript_execute_last"
-    command="cmd_userscript_execute_last"
-    label="&ExecuteLast;" type="user-script"
+  <menuitem command="cmd_userscript_execute_last"
+    label="&ExecuteLast;" class="greasemonkey"
+  />
+
+  <menuseparator class="greasemonkey"/>
+
+  <menuitem command="cmd_findItemUpdates" class="greasemonkey"
+    label="&cmd.findUpdates.label;" accesskey="&cmd.findUpdates.accesskey;"
+  />
+  <menuitem command="cmd_userscript_toggleCheckUpdates" class="greasemonkey"
+    label="&CheckUpdates;" accesskey="&CheckUpdates.accesskey;"
+    type="checkbox" id="menuitem_userscript_toggleCheckUpdates"
   />
 </menupopup>
 
diff --git a/chrome/greasemonkey.jar!/content/addons4.xul b/chrome/greasemonkey.jar!/content/addons4.xul
index c00bb05..1265500 100755
--- a/chrome/greasemonkey.jar!/content/addons4.xul
+++ b/chrome/greasemonkey.jar!/content/addons4.xul
@@ -5,13 +5,19 @@
 <!-- Just injects the Firefox 4+ specific addons integration code. -->
 <script type="application/x-javascript"><![CDATA[
 window.addEventListener('load', function() {
-Components.utils.import("resource://greasemonkey/addons4.js");
-GM_addonsStartup();
+var addons = {};
+Components.utils.import("resource://greasemonkey/addons4.js", addons);
+addons.GM_addonsStartup();
 }, true);
 
-// Open the addons manager in Firefox >= 4.0
+// Open the scripts manager in Firefox >= 4.0
 function GM_OpenScriptsMgr() {
   BrowserOpenAddonsMgr('addons://list/user-script');
 }
+
+// Open the updates manager in Firefox >= 4.0
+function GM_OpenUpdatesMgr() {
+    BrowserOpenAddonsMgr('addons://updates/available');
+}
 ]]></script>
 </overlay>
diff --git a/chrome/greasemonkey.jar!/content/browser.js b/chrome/greasemonkey.jar!/content/browser.js
index 6d9c016..0494c4c 100644
--- a/chrome/greasemonkey.jar!/content/browser.js
+++ b/chrome/greasemonkey.jar!/content/browser.js
@@ -102,20 +102,11 @@ GM_BrowserUI.contentLoad = function(event) {
   var safeWin = event.target.defaultView;
   var href = safeWin.location.href;
 
-  // Make sure we are still on the page that fired this event, see issue #1083
-  if (href == event.target.documentURI) {
+  // Make sure we are still on the page that fired this event, see issue #1083.
+  // But ignore hashes; see issue #1445.
+  if (href.replace(/#.*/, '') == event.target.documentURI.replace(/#.*/, '')) {
     GM_BrowserUI.gmSvc.runScripts('document-end', safeWin, window);
   }
-
-  // Show the greasemonkey install banner if we are navigating to a .user.js
-  // file in a top-level tab.  If the file was previously cached it might have
-  // been given a number after .user, like gmScript.user-12.js
-  if (safeWin == safeWin.top &&
-      href.match(/\.user(?:-\d+)?\.js$/) &&
-      !/text\/html/i.test(safeWin.document.contentType)) {
-    var browser = GM_BrowserUI.tabBrowser.getBrowserForDocument(safeWin.document);
-    GM_BrowserUI.showInstallBanner(browser);
-  }
 };
 
 GM_BrowserUI.pagehide = function(aEvent) {
@@ -133,67 +124,6 @@ GM_BrowserUI.pageshow = function(aEvent) {
 };
 
 /**
- * Shows the install banner across the top of the tab that is displayed when
- * a user selects "show script source" in the install dialog.
- */
-GM_BrowserUI.showInstallBanner = function(browser) {
-  var greeting = GM_BrowserUI.bundle.getString("greeting.msg");
-
-  var notificationBox = GM_BrowserUI.tabBrowser.getNotificationBox(browser);
-
-  // Remove existing notifications. Notifications get removed
-  // automatically onclick and on page navigation, but we need to remove
-  // them ourselves in the case of reload, or they stack up.
-  for (var i = 0, child; child = notificationBox.childNodes[i]; i++) {
-    if (child.getAttribute("value") == "install-userscript") {
-      notificationBox.removeNotification(child);
-    }
-  }
-
-  notificationBox.appendNotification(
-    greeting,
-    "install-userscript",
-    "chrome://greasemonkey/skin/icon16.png",
-    notificationBox.PRIORITY_WARNING_MEDIUM,
-    [{
-      label: GM_BrowserUI.bundle.getString("greeting.btn"),
-      accessKey: GM_BrowserUI.bundle.getString("greeting.btnAccess"),
-      popup: null,
-      callback: GM_BrowserUI.installCurrentScript
-    }]
-  );
-};
-
-/**
- * Called from greasemonkey service when we should load a user script.
- */
-GM_BrowserUI.startInstallScript = function(uri, contentWin, timer) {
-  if (!timer) {
-    // docs for nsicontentpolicy say we're not supposed to block, so short
-    // timer.
-    window.setTimeout(
-      GM_BrowserUI.startInstallScript, 0, uri, contentWin, true);
-    return;
-  }
-
-  GM_BrowserUI.scriptDownloader_ =
-    new GM_ScriptDownloader(window, uri, GM_BrowserUI.bundle, contentWin);
-  GM_BrowserUI.scriptDownloader_.startInstall();
-};
-
-
-/**
- * Open the tab to show the contents of a script and display the banner to let
- * the user install it.
- */
-GM_BrowserUI.showScriptView = function(scriptDownloader) {
-  GM_BrowserUI.scriptDownloader_ = scriptDownloader;
-
-  var tab = GM_BrowserUI.tabBrowser.addTab(scriptDownloader.script.previewURL);
-  GM_BrowserUI.tabBrowser.selectedTab = tab;
-};
-
-/**
  * Implements nsIObserve.observe. Right now we're only observing our own
  * install-userscript, which happens when the install bar is clicked.
  */
@@ -214,23 +144,6 @@ GM_BrowserUI.observe = function(subject, topic, data) {
 
 GM_BrowserUI.openTab = function(url) {
   gBrowser.selectedTab = gBrowser.addTab(url);
-}
-
-/**
- * Handles the install button getting clicked.
- */
-GM_BrowserUI.installCurrentScript = function() {
-  GM_BrowserUI.scriptDownloader_.installScript();
-};
-
-GM_BrowserUI.installScript = function(script){
-  GM_util.getService().config.install(script);
-
-  var tools = {};
-  Components.utils.import("resource://greasemonkey/GM_notification.js", tools);
-  tools.GM_notification(
-      "'" + script.name + "' "
-      + GM_BrowserUI.bundle.getString("statusbar.installed"));
 };
 
 /**
@@ -292,12 +205,25 @@ GM_BrowserUI.refreshStatus = function() {
   }
 };
 
+// Not used directly, kept for GreaseFire.  See #1507.
+GM_BrowserUI.startInstallScript = function(aUri) {
+  GM_util.showInstallDialog(aUri.spec, gBrowser, GM_util.getService());
+};
+
 GM_BrowserUI.viewContextItemClicked = function() {
   var uri = GM_BrowserUI.getUserScriptLinkUnderPointer();
-
-  GM_BrowserUI.scriptDownloader_ = new GM_ScriptDownloader(
-      window, uri, GM_BrowserUI.bundle);
-  GM_BrowserUI.scriptDownloader_.startViewScript();
+  if (!uri) return;
+
+  var scope = {};
+  Components.utils.import('resource://greasemonkey/remoteScript.js', scope);
+  var rs = new scope.RemoteScript(uri.spec);
+  rs.downloadScript(function(aSuccess) {
+    if (aSuccess) {
+      rs.showSource(gBrowser);
+    } else {
+      alert(rs.errorMessage);
+    }
+  });
 };
 
 GM_BrowserUI.showToolbarButton = function() {
@@ -313,6 +239,10 @@ GM_BrowserUI.showToolbarButton = function() {
   }
 };
 
+GM_BrowserUI.openOptions = function() {
+  openDialog('chrome://greasemonkey/content/options.xul', null, 'modal');
+};
+
 GM_BrowserUI.init();
 
 
@@ -321,20 +251,18 @@ GM_BrowserUI.init();
  * state, right-click opens in an editor.
  */
 function GM_popupClicked(aEvent) {
-  if (aEvent.button == 0 || aEvent.button == 2) {
-    var script = aEvent.target.script;
-    if (!script) return;
-
-    if (aEvent.button == 0) {
-      // left-click: toggle enabled state
-      script.enabled =! script.enabled;
-    } else {
-      // right-click: open in editor
-      GM_util.openInEditor(script);
-    }
-
-    closeMenus(aEvent.target);
+  var script = aEvent.target.script;
+  if (!script) return;
+
+  if ('command' == aEvent.type) {
+    // left-click: toggle enabled state
+    script.enabled =! script.enabled;
+  } else if ('click' == aEvent.type && aEvent.button == 2) {
+    // right-click: open in editor
+    GM_util.openInEditor(script);
   }
+
+  closeMenus(aEvent.target);
 }
 
 
diff --git a/chrome/greasemonkey.jar!/content/browser.xul b/chrome/greasemonkey.jar!/content/browser.xul
index 6b124d1..c73d0e4 100644
--- a/chrome/greasemonkey.jar!/content/browser.xul
+++ b/chrome/greasemonkey.jar!/content/browser.xul
@@ -10,7 +10,6 @@
   <script type="application/x-javascript" src="chrome://greasemonkey/content/menucommander.js" />
   <script type="application/x-javascript" src="chrome://greasemonkey/content/xmlhttprequester.js" />
   <script type="application/x-javascript" src="chrome://greasemonkey/content/miscapis.js" />
-  <script type="application/x-javascript" src="chrome://greasemonkey/content/scriptdownloader.js" />
   <script type="application/x-javascript" src="chrome://greasemonkey/content/browser.js" />
 
   <commandset>
@@ -54,8 +53,9 @@
   >
     <menupopup
       onpopupshowing="GM_showPopup(event);"
-      onclick="GM_popupClicked(event);"
-      oncommand="event.stopPropagation();"
+      onclick="GM_popupClicked(event);event.stopPropagation();"
+      oncommand="GM_popupClicked(event);event.stopPropagation();"
+      oncontextmenu="event.preventDefault();"
     >
       <menuitem class='gm-enabled-item'
         accesskey="&statusbar.enabled.accesskey;"
@@ -64,6 +64,10 @@
         command="gm_toggle_checked"/>
       <menuseparator />
       <menuitem
+        accesskey="&menu.options.accesskey;"
+        label="&menu.options;"
+        oncommand="GM_BrowserUI.openOptions();" />
+      <menuitem
         accesskey="&menu.manage.accesskey;"
         label="&menu.manage;"
         oncommand="GM_OpenScriptsMgr();" />
diff --git a/chrome/greasemonkey.jar!/content/config.js b/chrome/greasemonkey.jar!/content/config.js
index 5653255..d290492 100644
--- a/chrome/greasemonkey.jar!/content/config.js
+++ b/chrome/greasemonkey.jar!/content/config.js
@@ -1,5 +1,6 @@
 Components.utils.import('resource://greasemonkey/constants.js');
 Components.utils.import('resource://greasemonkey/prefmanager.js');
+Components.utils.import('resource://greasemonkey/script.js');
 Components.utils.import('resource://greasemonkey/third-party/MatchPattern.js');
 Components.utils.import('resource://greasemonkey/util.js');
 
@@ -100,7 +101,9 @@ Config.prototype._save = function(saveNow) {
     this._saveTimer = Components.classes["@mozilla.org/timer;1"]
         .createInstance(Components.interfaces.nsITimer);
 
-    var _save = GM_util.hitch(this, "_save"); // dereference 'this' for the closure
+    // dereference 'this' for the closure
+    var _save = GM_util.hitch(this, "_save");
+
     this._saveTimer.initWithCallback(
         {'notify': function() { _save(true); }}, 250,
         Components.interfaces.nsITimer.TYPE_ONE_SHOT);
@@ -108,8 +111,8 @@ Config.prototype._save = function(saveNow) {
   }
 
   var doc = Components.classes["@mozilla.org/xmlextras/domparser;1"]
-    .createInstance(Components.interfaces.nsIDOMParser)
-    .parseFromString("<UserScriptConfig></UserScriptConfig>", "text/xml");
+      .createInstance(Components.interfaces.nsIDOMParser)
+      .parseFromString("<UserScriptConfig></UserScriptConfig>", "text/xml");
 
   for (var i = 0, scriptObj; scriptObj = this._scripts[i]; i++) {
     doc.firstChild.appendChild(doc.createTextNode("\n\t"));
@@ -124,203 +127,23 @@ Config.prototype._save = function(saveNow) {
   GM_util.writeToFile(domSerializer.serializeToString(doc), this._configFile);
 };
 
-Config.prototype.parse = function(source, uri, updateScript) {
-  var script = new Script();
-
-  if (uri) script._downloadURL = uri.spec;
-
-  // read one line at a time looking for start meta delimiter or EOF
-  var lines = source.match(/.+/g);
-  var lnIdx = 0;
-  var result = {};
-  var foundMeta = false;
-
-  while ((result = lines[lnIdx++])) {
-    if (result.indexOf("// ==UserScript==") == 0) {
-      foundMeta = true;
-      break;
-    }
-  }
-
-  // gather up meta lines
-  if (foundMeta) {
-    // used for duplicate resource name detection
-    var previousResourceNames = {};
-    script._rawMeta = "";
-
-    while ((result = lines[lnIdx++])) {
-      if (result.indexOf("// ==/UserScript==") == 0) {
-        break;
-      }
-
-      var match = result.match(/\/\/ \@(\S+)(?:\s+([^\n]+))?/);
-      if (match === null) continue;
-
-      var header = match[1];
-      var value = (match[2] && match[2].replace(/\s+$/, '')) || null;
-
-      if (!value) {
-        switch (header) {
-          case "unwrap":
-            script._unwrap = true;
-            break;
-          default:
-            continue;
-        }
-      }
-
-      switch (header) {
-        case "name":
-        case "namespace":
-        case "description":
-        case "version":
-          script["_" + header] = value;
-          break;
-        case "include":
-          script._includes.push(value);
-          break;
-        case "userInclude":
-          script._userIncludes.push(value);
-          break;
-        case "exclude":
-          script._excludes.push(value);
-          break;
-        case "userExclude":
-          script._userExcludes.push(value);
-          break;
-        case "match":
-          try {
-            var match = new MatchPattern(value);
-            script._matches.push(match);
-          } catch (e) {
-            GM_util.logError("Ignoring @match pattern " + value + " because:\n" + e);
-          }
-          break;
-        case "icon":
-          script._rawMeta += header + '\0' + value + '\0';
-          try {
-            script.icon.metaVal = value;
-          } catch (e) {
-            if (updateScript) {
-              script._dependFail = true;
-            } else if (script.icon.dataUriError) {
-              throw new Error(e.message);
-            } else {
-              throw new Error('Failed to get @icon '+ value);
-            }
-          }
-          break;
-        case "require":
-          try {
-            var reqUri = GM_util.uriFromUrl(value, uri);
-            var scriptRequire = new ScriptRequire(script);
-            scriptRequire._downloadURL = reqUri.spec;
-            script._requires.push(scriptRequire);
-            script._rawMeta += header + '\0' + value + '\0';
-          } catch (e) {
-            if (updateScript) {
-              script._dependFail = true;
-            } else {
-              throw new Error('Failed to @require '+ value);
-            }
-          }
-          break;
-        case "resource":
-          var res = value.match(/(\S+)\s+(.*)/);
-          if (res === null) {
-            // NOTE: Unlocalized strings
-            throw new Error("Invalid syntax for @resource declaration '" +
-                            value + "'. Resources are declared like: " +
-                            "@resource <name> <url>.");
-          }
-
-          var resName = res[1];
-          if (previousResourceNames[resName]) {
-            throw new Error("Duplicate resource name '" + resName + "' " +
-                            "detected. Each resource must have a unique " +
-                            "name.");
-          } else {
-            previousResourceNames[resName] = true;
-          }
-
-          try {
-            var resUri = GM_util.uriFromUrl(res[2], uri);
-            var scriptResource = new ScriptResource(script);
-            scriptResource._name = resName;
-            scriptResource._downloadURL = resUri.spec;
-            script._resources.push(scriptResource);
-            script._rawMeta += header + '\0' + resName + '\0' + resUri.spec + '\0';
-          } catch (e) {
-            if (updateScript) {
-              script._dependFail = true;
-            } else {
-              throw new Error('Failed to get @resource '+ resName +' from '+
-                              res[2]);
-            }
-          }
-          break;
-        case "run-at":
-          script._runAt = value;
-          break;
-      }
-    }
-  }
-
-  // if no meta info, default to reasonable values
-  if (!script._name) {
-    var name = (uri && uri.spec) || (updateScript && updateScript.filename);
-    if (name) {
-      name = name.substring(0, name.indexOf(".user.js"));
-      name = name.substring(name.lastIndexOf("/") + 1);
-      script._name = name;
-    } else {
-      script._name = 'user-script';
-    }
-  }
-  if (!script._namespace && uri) script._namespace = uri.host;
-  if (!script._description) script._description = "";
-  if (!script._version) script._version = "";
-  if ("document-start" != script._runAt && "document-end" != script._runAt) {
-    script._runAt = "document-end";
-  }
-  if (script._includes.length == 0 && script._matches.length == 0) {
-    script._includes.push("*");
-  }
-
-  return script;
-};
+Config.prototype.install = function(script, oldScript) {
+  var existingIndex = this._find(oldScript || script);
+  if (!oldScript) oldScript = this.scripts[existingIndex];
 
-Config.prototype.install = function(script) {
-  var existingIndex = this._find(script);
-  if (existingIndex > -1) {
+  if (oldScript) {
     // Save the old script's state.
-    var oldScript = this._scripts[existingIndex];
     script._enabled = oldScript.enabled;
     script.userExcludes = oldScript.userExcludes;
     script.userIncludes = oldScript.userIncludes;
 
     // Uninstall the old script.
-    this.uninstall(this._scripts[existingIndex], true);
-  }
-
-  script._initFile(script._tempFile);
-  script._tempFile = null;
-
-  // if icon had to be downloaded, then move the file
-  if (script.icon.hasDownloadURL()) {
-    script.icon._initFile();
-  }
-
-  for (var i = 0; i < script._requires.length; i++) {
-    script._requires[i]._initFile();
+    this.uninstall(oldScript, true);
   }
 
-  for (var i = 0; i < script._resources.length; i++) {
-    script._resources[i]._initFile();
-  }
-
-  script._modified = script.file.lastModifiedTime;
   script._dependhash = GM_util.sha1(script._rawMeta);
+  script._installTime = new Date().getTime()
+  script._modified = script.file.lastModifiedTime;
 
   this._scripts.push(script);
 
@@ -398,31 +221,65 @@ Config.prototype.getMatchingScripts = function(testFunc) {
   return this._scripts.filter(testFunc);
 };
 
-Config.prototype.updateModifiedScripts = function(safeWin, chromeWin) {
+Config.prototype.updateModifiedScripts = function(aWhen, aSafeWin, aChromeWin) {
   // Find any updated scripts or scripts with delayed injection
   var scripts = this.getMatchingScripts(
       function (script) {
-        return script.isModified() || 0 != script.pendingExec.length;
+        return script.runAt == aWhen
+            && (script.isModified() || 0 != script.pendingExec.length);
       });
   if (0 == scripts.length) return;
 
   for (var i = 0, script; script = scripts[i]; i++) {
     if (0 == script.pendingExec.length) {
-      var oldScriptId = new String(script.id);
-      var parsedScript = this.parse(
-          script.textContent, GM_util.uriFromUrl(script._downloadURL), !!script);
-      script.updateFromNewScript(parsedScript, safeWin, chromeWin);
-      this._changed(script, "modified", oldScriptId, true);
+      var scope = {};
+      Components.utils.import('resource://greasemonkey/parseScript.js', scope);
+      var parsedScript = scope.parse(
+          script.textContent, GM_util.uriFromUrl(script._downloadURL));
+      // TODO: Show PopupNotifications about parse error(s)?
+      script.updateFromNewScript(parsedScript, aSafeWin, aChromeWin);
     } else {
       // We are already downloading dependencies for this script
       // so add its window to the list
-      script.pendingExec.push({'safeWin': safeWin, 'chromeWin': chromeWin});
+      script.pendingExec.push({'safeWin': aSafeWin, 'chromeWin': aChromeWin});
     }
   }
 
   this._save();
 };
 
+Config.prototype._notifyUpdates = function() {
+  var scripts = this.getMatchingScripts(
+      function (script) { return script.updateAvailable; });
+  if (0 == scripts.length) return;
+
+  GM_util.getBrowserWindow().GM_OpenUpdatesMgr();
+};
+
+Config.prototype.checkScriptsForRemoteUpdates = function(scripts) {
+  var forced = false;
+  if ('undefined' == typeof scripts) {
+    forced = true;
+    var scripts = this.getMatchingScripts(function (script) {
+      return !script.updateAvailable &&
+          script.updateURL &&
+          script.enabled;
+    });
+  }
+
+  scripts.forEach(function(script) {
+    script.checkForRemoteUpdate(forced);
+  });
+};
+
+Config.prototype.getScriptById = function(scriptId) {
+  for (var i = 0, script = null; script = this.scripts[i]; i++) {
+    if (scriptId == script.id) {
+      return script;
+    }
+  }
+};
+
 /**
  * Checks whether the version has changed since the last run and performs
  * any necessary upgrades.
diff --git a/chrome/greasemonkey.jar!/content/install.js b/chrome/greasemonkey.jar!/content/install.js
index 5074163..e6cf66a 100644
--- a/chrome/greasemonkey.jar!/content/install.js
+++ b/chrome/greasemonkey.jar!/content/install.js
@@ -1,121 +1,156 @@
-var GMInstall = {
-  init: function() {
-    this.htmlNs_ = "http://www.w3.org/1999/xhtml";
-
-    this.scriptDownloader_ = window.arguments[0];
-    this.script_ = this.scriptDownloader_.script;
-
-    this.setupIncludes("includes", "includes-desc", this.script_.includes);
-    this.setupIncludes("excludes", "excludes-desc", this.script_.excludes);
-    var matches = [];
-    for (var i = 0, match = null; match = this.script_.matches[i]; i++) {
-      matches.push(match.pattern);
-    }
-    this.setupIncludes("matches", "matches-desc", matches);
+Components.utils.import('resource://greasemonkey/prefmanager.js');
+Components.utils.import('resource://greasemonkey/util.js');
+
+var gRemoteScript = window.arguments[0].wrappedJSObject[0];
+var gBrowser = window.arguments[0].wrappedJSObject[1];
+var gScript = window.arguments[0].wrappedJSObject[2];
+var gHtmlNs = 'http://www.w3.org/1999/xhtml';
+
+var gAcceptButton = null;
+var gCurrentDelay = null;
+var gProgress = 0;
+var gTimer = null;
+var gTotalDelay = new GM_PrefManager().getValue('installDelay', 5);
+
+function init() {
+  setUpIncludes('includes', 'includes-desc', gScript.includes);
+  setUpIncludes('excludes', 'excludes-desc', gScript.excludes);
+
+  var matches = [];
+  for (var i = 0, match = null; match = gScript.matches[i]; i++) {
+    matches.push(match.pattern);
+  }
+  setUpIncludes('matches', 'matches-desc', matches);
 
-    this.dialog_ = document.documentElement;
-    this.extraButton_ = this.dialog_.getButton("extra1");
-    this.extraButton_.setAttribute("type", "checkbox");
+  document.documentElement.getButton('extra1').setAttribute('type', 'checkbox');
 
-    this.acceptButton_ = this.dialog_.getButton("accept");
-    this.acceptButton_.baseLabel = this.acceptButton_.label;
+  gAcceptButton = document.documentElement.getButton('accept');
+  gAcceptButton.baseLabel = gAcceptButton.label;
 
-    this.timer_ = null;
-    this.seconds_ = 0;
-    this.startTimer();
+  startTimer();
 
-    this.bundle = document.getElementById("gm-browser-bundle");
+  var bundle = document.getElementById('gm-browser-bundle');
 
-    var heading = document.getElementById("heading");
-    heading.appendChild(document.createTextNode(
-        this.bundle.getString("greeting.msg")));
+  document.getElementById('heading').appendChild(
+      document.createTextNode(bundle.getString('greeting.msg')));
 
-    var desc = document.getElementById("scriptDescription");
-    desc.appendChild(document.createElementNS(this.htmlNs_, "strong"));
-    desc.firstChild.appendChild(document.createTextNode(this.script_.name));
-    if (this.script_.version) {
-      desc.appendChild(document.createTextNode(' ' + this.script_.version));
-    }
-    desc.appendChild(document.createElementNS(this.htmlNs_, "br"));
-    desc.appendChild(document.createTextNode(this.script_.description));
-  },
+  var desc = document.getElementById('scriptDescription');
+  desc.appendChild(document.createElementNS(gHtmlNs, 'strong'));
+  desc.firstChild.appendChild(document.createTextNode(gScript.name));
+  if (gScript.version) {
+    desc.appendChild(document.createTextNode(' ' + gScript.version));
+  }
+  desc.appendChild(document.createElementNS(gHtmlNs, 'br'));
+  desc.appendChild(document.createTextNode(gScript.description));
+
+  if (gRemoteScript.done) {
+    // Download finished before we could open, fake a progress event.
+    onProgress(null, null, 1);
+  } else {
+    // Otherwise, listen for future progress events.
+    gRemoteScript.onProgress(onProgress);
+  }
+}
 
-  onFocus: function(e) {
-    this.startTimer();
-  },
+function onBlur(e) {
+  stopTimer();
+}
 
-  onBlur: function(e) {
-    this.stopTimer();
-  },
+function onCancel() {
+  gRemoteScript.cleanup();
+  window.close();
+}
 
-  startTimer: function() {
-    this.seconds_ = 4;
-    this.updateLabel();
+function onFocus(e) {
+  startTimer();
+}
 
-    if (this.timer_) {
-      window.clearInterval(this.timer_);
-    }
+function onInterval() {
+  gCurrentDelay--;
+  updateLabel();
 
-    this.timer_ = window.setInterval(function() { GMInstall.onInterval(); }, 500);
-  },
+  if (gCurrentDelay == 0) stopTimer();
+}
 
-  onInterval: function() {
-    this.seconds_--;
-    this.updateLabel();
+function onOk() {
+  gRemoteScript.install();
+  window.setTimeout(window.close, 0);
+}
 
-    if (this.seconds_ == 0) {
-      this.timer_ = window.clearInterval(this.timer_);
-    }
-  },
-
-  stopTimer: function() {
-    this.seconds_ = 5;
-    this.timer_ = window.clearInterval(this.timer_);
-    this.updateLabel();
-  },
-
-  updateLabel: function() {
-    if (this.seconds_ > 0) {
-      this.acceptButton_.focus();
-      this.acceptButton_.disabled = true;
-      this.acceptButton_.label = this.acceptButton_.baseLabel + " (" + this.seconds_ + ")";
-    } else {
-      this.acceptButton_.disabled = false;
-      this.acceptButton_.label = this.acceptButton_.baseLabel;
+function onProgress(aRemoteScript, aEventType, aData) {
+  if (!document) return; // lingering download after window cancel
+  gProgress = Math.floor(100 * aData);
+  if (gRemoteScript.done) {
+    document.getElementById('loading').style.display = 'none';
+    if (gRemoteScript.errorMessage) {
+      document.documentElement.getButton('extra1').disabled = true;
+      document.getElementById('dialogContentBox').style.display = 'none';
+      document.getElementById('errorContentBox').style.display = '-moz-box';
+      document.getElementById('errorMessage')
+          .textContent = gRemoteScript.errorMessage;
+      stopTimer();
+      updateLabel(false);
+      return;
     }
-  },
+  } else {
+    document.getElementById('progressmeter').setAttribute('value', gProgress);
+  }
+  updateLabel();
+}
+
+function onShowSource() {
+  gRemoteScript.showSource(gBrowser);
+  window.setTimeout(window.close, 0);
+}
 
-  setupIncludes: function(box, desc, includes) {
-    if (includes.length > 0) {
-      desc = document.getElementById(desc);
-      document.getElementById(box).style.display = "";
+function pauseTimer() {
+  stopTimer();
+  gCurrentDelay = gTotalDelay;
+  updateLabel();
+}
 
-      for (var i = 0; i < includes.length; i++) {
-        desc.appendChild(document.createTextNode(includes[i]));
-        desc.appendChild(document.createElementNS(this.htmlNs_, "br"));
-      }
+function setUpIncludes(box, desc, includes) {
+  if (includes.length > 0) {
+    desc = document.getElementById(desc);
+    document.getElementById(box).style.display = '';
 
-      desc.removeChild(desc.lastChild);
+    for (var i = 0; i < includes.length; i++) {
+      desc.appendChild(document.createTextNode(includes[i]));
+      desc.appendChild(document.createElementNS(gHtmlNs, 'br'));
     }
-  },
 
-  onOK: function() {
-    this.scriptDownloader_.installScript();
-    window.setTimeout(window.close, 0);
-  },
+    desc.removeChild(desc.lastChild);
+  }
+}
 
-  onCancel: function(){
-    this.scriptDownloader_.cleanupTempFiles();
-    window.close();
-  },
+function startTimer() {
+  gCurrentDelay = gTotalDelay;
+  updateLabel();
 
-  onShowSource: function() {
-    this.scriptDownloader_.showScriptView();
-    window.setTimeout(window.close, 0);
+  gTimer = window.setInterval(onInterval, 500);
+}
+
+function stopTimer() {
+  if (gTimer) window.clearInterval(gTimer);
+  gCurrentDelay = 0;
+}
+
+function updateLabel(aOkAllowed) {
+  if ('undefined' == typeof aOkAllowed) aOkAllowed = true;
+
+  if (gCurrentDelay > 0) {
+    gAcceptButton.focus();
+    gAcceptButton.label = gAcceptButton.baseLabel + ' (' + gCurrentDelay + ')';
+  } else {
+    gAcceptButton.label = gAcceptButton.baseLabel;
   }
-};
+
+  gAcceptButton.disabled = aOkAllowed
+      ? ((gCurrentDelay > 0) || (gProgress < 100))
+      : true;
+}
 
 // See: closewindow.xul .
 function GM_onClose() {
-  GMInstall.onCancel();
+  gRemoteScript.cleanup();
 }
diff --git a/chrome/greasemonkey.jar!/content/install.xul b/chrome/greasemonkey.jar!/content/install.xul
index 36fc3e8..c51b646 100644
--- a/chrome/greasemonkey.jar!/content/install.xul
+++ b/chrome/greasemonkey.jar!/content/install.xul
@@ -13,10 +13,10 @@
   id="greasemonkey"
   title="&install.title;"
   style="width: 32em; height:32em;"
-  onload="GMInstall.init();"
-  ondialogaccept="return GMInstall.onOK();"
-  ondialogcancel="return GMInstall.onCancel();"
-  ondialogextra1="return GMInstall.onShowSource();"
+  onload="init();"
+  ondialogaccept="return onOk();"
+  ondialogcancel="return onCancel();"
+  ondialogextra1="return onShowSource();"
   buttons="accept,cancel,extra1"
   buttonlabelaccept="&install.installbutton;"
   buttonlabelextra1="&install.showscriptsource;"
@@ -24,12 +24,9 @@
 
   <stringbundle id="gm-browser-bundle" src="chrome://greasemonkey/locale/gm-browser.properties" />
 
-  <script type="application/x-javascript" src="chrome://greasemonkey/content/scriptdownloader.js" />
   <script type="application/x-javascript" src="chrome://greasemonkey/content/install.js" />
 
-  <vbox id="dialogContentBox"
-    flex="1"
-  >
+  <vbox id="dialogContentBox" flex="1">
     <description id="heading"
       style="margin-bottom:1em" />
     <vbox id="itemBox"
@@ -76,6 +73,18 @@
       style="margin-bottom:1em"
       class="warning"
     >&install.warning2;</description>
+
+    <vbox id="loading">
+      <label value="&loading;" />
+      <progressmeter id="progressmeter"/>
+    </vbox>
   </vbox>
 
+  <vbox id="errorContentBox" flex="1" style="display: none">
+    <description style="margin-bottom: 1em; font-weight: bold;">
+      <!-- TODO: Localize. -->
+      Download Error
+    </description>
+    <description id="errorMessage" style="white-space: pre-line" />
+  </vbox>
 </dialog>
diff --git a/chrome/greasemonkey.jar!/content/menucommander.js b/chrome/greasemonkey.jar!/content/menucommander.js
index 8c6d263..4c61ad8 100644
--- a/chrome/greasemonkey.jar!/content/menucommander.js
+++ b/chrome/greasemonkey.jar!/content/menucommander.js
@@ -21,14 +21,18 @@ GM_MenuCommander.onPopupShowing = function(aMenuPopup) {
 
   // Add menu items for commands for the active window.
   var haveCommands = false;
-  GM_BrowserUI.gmSvc.withAllMenuCommandsForWindowId(
-      GM_util.windowId(gBrowser.contentWindow),
-      function(index, command) {
-        if (command.frozen) return;
-        aMenuPopup.insertBefore(
-            GM_MenuCommander.createMenuItem(command),
-            aMenuPopup.firstChild);
-        haveCommands = true;
-      });
+  var windowId = GM_util.windowId(gBrowser.contentWindow);
+
+  if(windowId) {
+    GM_BrowserUI.gmSvc.withAllMenuCommandsForWindowId(
+        windowId,
+        function(index, command) {
+          if (command.frozen) return;
+          aMenuPopup.insertBefore(
+              GM_MenuCommander.createMenuItem(command),
+              aMenuPopup.firstChild);
+          haveCommands = true;
+        });
+  }
   aMenuPopup.parentNode.disabled = !haveCommands;
 };
diff --git a/chrome/greasemonkey.jar!/content/miscapis.js b/chrome/greasemonkey.jar!/content/miscapis.js
index dada53a..e690eba 100644
--- a/chrome/greasemonkey.jar!/content/miscapis.js
+++ b/chrome/greasemonkey.jar!/content/miscapis.js
@@ -51,7 +51,7 @@ GM_Resources.prototype.getResourceURL = function(name) {
     return undefined;
   }
 
-  return this.getDep_(name).dataContent;
+  return this._getDep(name).dataContent;
 };
 
 GM_Resources.prototype.getResourceText = function(name) {
@@ -59,10 +59,10 @@ GM_Resources.prototype.getResourceText = function(name) {
     return undefined;
   }
 
-  return this.getDep_(name).textContent;
+  return this._getDep(name).textContent;
 };
 
-GM_Resources.prototype.getDep_ = function(name) {
+GM_Resources.prototype._getDep = function(name) {
   var resources = this.script.resources;
   for (var i = 0, resource; resource = resources[i]; i++) {
     if (resource.name == name) {
diff --git a/chrome/greasemonkey.jar!/content/newscript.js b/chrome/greasemonkey.jar!/content/newscript.js
index b5019db..a5d0924 100644
--- a/chrome/greasemonkey.jar!/content/newscript.js
+++ b/chrome/greasemonkey.jar!/content/newscript.js
@@ -28,7 +28,9 @@ function doInstall() {
   var config = GM_util.getService().config;
 
   // Create a script object with parsed metadata, and ...
-  var script = config.parse(scriptSrc);
+  var scope = {};
+  Components.utils.import('resource://greasemonkey/parseScript.js', scope);
+  var script = scope.parse(scriptSrc);
   // ... make sure entered details will not ruin an existing file.
   if (config.installIsUpdate(script)) {
     var overwrite = confirm(bundle.getString("newscript.exists"));
@@ -37,17 +39,20 @@ function doInstall() {
 
   // finish making the script object ready to install
   // (put this created script into a file -- only way to install it)
-  var tempFile = GM_util.getTempFile();
+  var scope = {};
+  Components.utils.import('resource://greasemonkey/remoteScript.js', scope);
+  var remoteScript = new scope.RemoteScript();
+  var tempFileName = scope.cleanFilename(script.name, 'gm_script') + '.user.js';
+  var tempFile = GM_util.getTempFile(remoteScript._tempDir, tempFileName);
   GM_util.writeToFile(scriptSrc, tempFile, function() {
-    script.setDownloadedFile(tempFile);
-
     // install this script
-    config.install(script);
+    remoteScript.setScript(script, tempFile);
+    remoteScript.install();
     // and fire up the editor!
     GM_util.openInEditor(script);
+
     // persist namespace value
     GM_prefRoot.setValue("newscript_namespace", script.namespace);
-
     // Now that async write is complete, close the window.
     close();
   });
diff --git a/chrome/greasemonkey.jar!/content/newscript.xul b/chrome/greasemonkey.jar!/content/newscript.xul
index c7bbb30..6eb4ec1 100644
--- a/chrome/greasemonkey.jar!/content/newscript.xul
+++ b/chrome/greasemonkey.jar!/content/newscript.xul
@@ -12,7 +12,6 @@
 
   <stringbundle id="gm-browser-bundle" src="chrome://greasemonkey/locale/gm-browser.properties" />
 
-  <script type="application/x-javascript" src="chrome://greasemonkey/content/scriptdownloader.js" />
   <script type="application/x-javascript" src="chrome://greasemonkey/content/newscript.js" />
 
   <vbox>
diff --git a/chrome/greasemonkey.jar!/content/options.js b/chrome/greasemonkey.jar!/content/options.js
index ad0ac08..3c99c02 100644
--- a/chrome/greasemonkey.jar!/content/options.js
+++ b/chrome/greasemonkey.jar!/content/options.js
@@ -2,15 +2,48 @@ Components.utils.import('resource://greasemonkey/prefmanager.js');
 Components.utils.import('resource://greasemonkey/util.js');
 
 function GM_loadOptions() {
-  document.getElementById("check-uninstall")
-      .checked = GM_prefRoot.getValue("uninstallPreferences");
-  document.getElementById("globalExcludes")
+  document.getElementById('check-uninstall')
+      .checked = GM_prefRoot.getValue('uninstallPreferences');
+
+  document.getElementById('globalExcludes')
       .pages = GM_util.getService().config.globalExcludes;
+
+  document.getElementById('check-update')
+      .checked = GM_prefRoot.getValue('enableUpdateChecking');
+  document.getElementById('secure-update')
+      .checked = GM_prefRoot.getValue('requireSecureUpdates');
+
+  document.getElementById('slide-updateInterval')
+      .value = GM_prefRoot.getValue('minDaysBetweenUpdateChecks');
+
+  GM_setMinUpdateIntervalLabel();
+  GM_onChangeUpdateChecking();
 }
 
 function GM_saveOptions(checkbox) {
-  GM_prefRoot.setValue("uninstallPreferences",
-      !!document.getElementById("check-uninstall").checked);
+  GM_prefRoot.setValue('uninstallPreferences',
+      !!document.getElementById('check-uninstall').checked);
   GM_util.getService().config.globalExcludes =
-      document.getElementById("globalExcludes").pages;
+      document.getElementById('globalExcludes').pages;
+  GM_prefRoot.setValue('enableUpdateChecking',
+      !!document.getElementById('check-update').checked);
+  GM_prefRoot.setValue('requireSecureUpdates',
+      !!document.getElementById('secure-update').checked);
+  GM_prefRoot.setValue("minDaysBetweenUpdateChecks", GM_getMinUpdateDays());
+}
+
+function GM_getMinUpdateDays() {
+  return parseInt(document.getElementById('slide-updateInterval').value);
+}
+
+function GM_onChangeUpdateChecking() {
+  var enabled = document.getElementById('check-update').checked;
+  document.getElementById('secure-update').disabled = !enabled;
+  document.getElementById('slide-updateInterval').disabled = !enabled;
+  document.getElementById('label-slide-updateInterval').disabled = !enabled;
+}
+
+function GM_setMinUpdateIntervalLabel() {
+  document.getElementById('txt-updateInterval')
+      .setAttribute('value', GM_getMinUpdateDays());
 }
diff --git a/chrome/greasemonkey.jar!/content/options.xul b/chrome/greasemonkey.jar!/content/options.xul
index 3f7f85f..b18c185 100644
--- a/chrome/greasemonkey.jar!/content/options.xul
+++ b/chrome/greasemonkey.jar!/content/options.xul
@@ -13,12 +13,13 @@
 <dialog
   title="Greasemonkey - &prefWindow.titleWin;"
   xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
-  buttons="accept"
+  buttons="accept,cancel"
 
   id="greasemonkey-options-dialog"
   persist="screenX screenY"
   onload="GM_loadOptions()"
   ondialogaccept="GM_saveOptions()"
+  ondialogcancel="close()"
 >
 <script type="application/x-javascript" src="chrome://greasemonkey/content/options.js" />
 
@@ -39,6 +40,24 @@
     <caption label="&options.globalExcludes;" />
     <cludes id="globalExcludes" />
   </groupbox>
+
+  <groupbox>
+    <caption label="&UpdateChecking;" />
+    <checkbox id="check-update" label="&EnableUpdateChecking;"
+        oncommand="GM_onChangeUpdateChecking()" />
+    <hbox>
+      <separator orient="vertical" />
+      <checkbox id="secure-update" label="&RequireSecureUpdates;" />
+    </hbox>
+    <label value="&UpdateInterval;" control="slide-updateInterval"
+        id="label-slide-updateInterval" />
+    <hbox>
+      <scale id="slide-updateInterval" flex="1"
+        orient="horizontal" min="1" max="30"
+        onchange="GM_setMinUpdateIntervalLabel()"/>
+      <label id="txt-updateInterval" />
+    </hbox>
+  </groupbox>
 </vbox>
 
 </dialog>
diff --git a/chrome/greasemonkey.jar!/content/statusbar.xul b/chrome/greasemonkey.jar!/content/statusbar.xul
index c6e8536..9fcead8 100644
--- a/chrome/greasemonkey.jar!/content/statusbar.xul
+++ b/chrome/greasemonkey.jar!/content/statusbar.xul
@@ -17,6 +17,8 @@
     <menupopup id="gm-status-popup"
       onpopupshowing="GM_showPopup(event);"
       onclick="GM_popupClicked(event);"
+      oncommand="GM_popupClicked(event);"
+      oncontextmenu="event.preventDefault();"
     >
       <menuseparator class="scripts-framed-point" collapsed="true" />
       <menuseparator class="scripts-sep" />
diff --git a/chrome/greasemonkey.jar!/locale/ca-AD/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ca-AD/gm-addons.dtd
index d444a7d..de8a69b 100644
--- a/chrome/greasemonkey.jar!/locale/ca-AD/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ca-AD/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Edit">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Edit this User Script">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Move Down">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Move To Bottom">
diff --git a/chrome/greasemonkey.jar!/locale/ca-AD/gm-browser.properties b/chrome/greasemonkey.jar!/locale/ca-AD/gm-browser.properties
index 81d47ad..7ff5c8a 100644
--- a/chrome/greasemonkey.jar!/locale/ca-AD/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/ca-AD/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
 newscript.exists=A script with that name is already installed.\nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.dtd
index 6a60d07..4743f11 100644
--- a/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Manage User Scripts...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Enabled">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey Installation">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "You should only install scripts from sources that you trust.">
 <!ENTITY install.showscriptsource "Show Script Source">
 <!ENTITY install.installbutton "Install">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Name">
 <!ENTITY newscript.namespace "Namespace">
 <!ENTITY newscript.description "Description">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Uninstall">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.properties
index 281ef1b..51f3e82 100644
--- a/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/ca-AD/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=A User Script Manager for Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/cs/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/cs/gm-addons.dtd
index 228d992..4cf1207 100644
--- a/chrome/greasemonkey.jar!/locale/cs/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/cs/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Upravit">
 <!ENTITY Edit.accesskey "U">
 <!ENTITY Edit.tooltip "Upravit tento uživatelský skript">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Spustit poslední">
 <!ENTITY ExecuteLater "Spustit později">
 <!ENTITY ExecuteSooner "Spustit dříve">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Posunout níže">
 <!ENTITY MoveDown.accesskey "n">
 <!ENTITY MoveToBottom "Posunout úplně dolů">
diff --git a/chrome/greasemonkey.jar!/locale/cs/gm-browser.properties b/chrome/greasemonkey.jar!/locale/cs/gm-browser.properties
index 94f9f4b..f58f080 100644
--- a/chrome/greasemonkey.jar!/locale/cs/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/cs/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Nejprve zvolte váš oblíbený textový editor
 editor.please_pick_executable=Prosím vložte spustitelnou aplikaci, která se použije pro úprav textových souborů.
 editor.could_not_launch=Nelze spustit editor.
 newscript.noname=Prosím poskytněte název vašeho skriptu.
-newscript.nonamespace=Prosím poskytněte správný jmenný prostor pro váš skript.\n(např. "http://userscripts.org/users/useridnumber")
-newscript.exists=Skript s tímto jménem je již nainstalován.\nPřejete si ho přepsat?
+newscript.nonamespace=Prosím poskytněte správný jmenný prostor pro váš skript.n(např. "http://userscripts.org/users/useridnumber")
+newscript.exists=Skript s tímto jménem je již nainstalován.nPřejete si ho přepsat?
diff --git a/chrome/greasemonkey.jar!/locale/cs/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/cs/greasemonkey.dtd
index 7e5fc53..6ae6467 100644
--- a/chrome/greasemonkey.jar!/locale/cs/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/cs/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Správce uživatelských skriptů...">
 <!ENTITY menu.manage.accesskey "S">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Povoleno">
 <!ENTITY statusbar.enabled.accesskey "P">
 <!ENTITY install.title "Instalace Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Měli byste instalovat skripty pouze ze zdrojů, kterým věříte.">
 <!ENTITY install.showscriptsource "Zobrazit zdrojový kód skriptu">
 <!ENTITY install.installbutton "Instalovat">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Název">
 <!ENTITY newscript.namespace "Jmenný prostor">
 <!ENTITY newscript.description "Popis">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Uživatelské skripty">
 <!ENTITY Uninstall "Odinstalovat">
 <!ENTITY AlsoUninstallPrefs "Odinstalovat i přidružená nastavení">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "Nemáte nainstalované uživatelské skripty">
 <!ENTITY greasemonkey.getuserscripts "Získat uživatelské skripty">
diff --git a/chrome/greasemonkey.jar!/locale/cs/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/cs/greasemonkey.properties
index 920c7ff..f6d17e7 100644
--- a/chrome/greasemonkey.jar!/locale/cs/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/cs/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Správce uživatelských skriptů pro Firefox
-error.matchPattern.parse=@spojení: nelze analyzovat vzorek.
-error.matchPattern.scheme=@spojení: Specifikován neplatný vzhled.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@spojení: Určen neplatný hostitel.
+error.matchPattern.parse=@spojení: nelze analyzovat vzorek.
 error.matchPattern.path=@spojení: Specifikována neplatná cesta.
+error.matchPattern.scheme=@spojení: Specifikován neplatný vzhled.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/da/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/da/gm-addons.dtd
index d7bba38..a487ef1 100644
--- a/chrome/greasemonkey.jar!/locale/da/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/da/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Rediger">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Rediger dette User Script">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Kør sidst">
 <!ENTITY ExecuteLater "Kør senere">
 <!ENTITY ExecuteSooner "Kør før">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Flyt op">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Flyt til bunden">
diff --git a/chrome/greasemonkey.jar!/locale/da/gm-browser.properties b/chrome/greasemonkey.jar!/locale/da/gm-browser.properties
index d8867c0..0a47c7e 100644
--- a/chrome/greasemonkey.jar!/locale/da/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/da/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Venligst vælg dit foretrukne tekstredigeringsprogram først
 editor.please_pick_executable=Vælg venligst et program til at bruge til at redigere user sripts.
 editor.could_not_launch=Kunne ikke åbne tekstredigeringsprogram.
 newscript.noname=Venligst navngiv dit script.
-newscript.nonamespace=Giv venligst en valid "nameespace" URL til dit script.\n(e.g. "http://userscripts.org/users/useridnumber")
-newscript.exists=Et script med dette navn er allerede installeret.\nOK at overskrive?
+newscript.nonamespace=Giv venligst en valid "nameespace" URL til dit script.n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.exists=Et script med dette navn er allerede installeret.nOK at overskrive?
diff --git a/chrome/greasemonkey.jar!/locale/da/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/da/greasemonkey.dtd
index 67fd225..5e2e268 100644
--- a/chrome/greasemonkey.jar!/locale/da/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/da/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Administrer User Scripts...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Aktiveret">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey Installation">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Du bør kun installere scripts fra kilder, du stoler på.">
 <!ENTITY install.showscriptsource "Vis Script kildekode">
 <!ENTITY install.installbutton "Installer">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Navn">
 <!ENTITY newscript.namespace "Navnerum">
 <!ENTITY newscript.description "Beskrivelse">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Afinstaller">
 <!ENTITY AlsoUninstallPrefs "Også afinstallere tilhørende indstilliner">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Ingen installerede scripts køres på denne side.">
 <!ENTITY greasemonkey.youhavenoscripts "Du har ikke nogen user scripts installeret">
 <!ENTITY greasemonkey.getuserscripts "Find user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/da/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/da/greasemonkey.properties
index d1c838d..cc65916 100644
--- a/chrome/greasemonkey.jar!/locale/da/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/da/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=En User Script manager til Firefox
-error.matchPattern.parse=@match: Kunne ikke køre mønstret.
-error.matchPattern.scheme=@match: Ugyldigt skema specificeret.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Ugyldig vært specificeret.
+error.matchPattern.parse=@match: Kunne ikke køre mønstret.
 error.matchPattern.path=@match: Ugyldig sti specificeret.
+error.matchPattern.scheme=@match: Ugyldigt skema specificeret.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/de/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/de/gm-addons.dtd
index 461b904..4200fdf 100644
--- a/chrome/greasemonkey.jar!/locale/de/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/de/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatisch auf Updates prüfen">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Bearbeiten">
 <!ENTITY Edit.accesskey "B">
 <!ENTITY Edit.tooltip "Dieses Benutzerskript bearbeiten">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Zuletzt ausführen">
 <!ENTITY ExecuteLater "Später ausführen">
 <!ENTITY ExecuteSooner "Früher ausführen">
+<!ENTITY FindUpdate "Nach Aktualisierungen suchen">
+<!ENTITY InstallUpdate "Aktualisierungen installieren">
 <!ENTITY MoveDown "Nach unten verschieben">
 <!ENTITY MoveDown.accesskey "u">
 <!ENTITY MoveToBottom "Ans Ende verschieben">
diff --git a/chrome/greasemonkey.jar!/locale/de/gm-browser.properties b/chrome/greasemonkey.jar!/locale/de/gm-browser.properties
index cfe46d8..8fa3c12 100644
--- a/chrome/greasemonkey.jar!/locale/de/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/de/gm-browser.properties
@@ -13,7 +13,7 @@ alert.fromURI=Benutzerskript wird heruntergeladen…
 alert.fromURI.failure=Das Benutzerskript konnte nicht heruntergeladen werden
 alert.success=wurde erfolgreich installiert.
 alert.failure=Fehler bei der Installation des Benutzerskripts:
-editor.prompt=Bitte wählen Sie zunächst Ihren bevorzugten Text-Editor aus (z.B. "C:\\Windows\\notepad.exe")
+editor.prompt=Bitte wählen Sie zunächst Ihren bevorzugten Text-Editor aus (z.B. "C:Windowsnotepad.exe")
 editor.please_pick_executable=Bitte wählen Sie eine ausführbare Anwendung zur Bearbeitung der Benutzerskripte aus.
 editor.could_not_launch=Text-Editor konnte nicht gestartet werden.
 newscript.noname=Bitte geben Sie einen Namen für Ihr Skript an.
diff --git a/chrome/greasemonkey.jar!/locale/de/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/de/greasemonkey.dtd
index f659ac9..31d156c 100644
--- a/chrome/greasemonkey.jar!/locale/de/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/de/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Benutzerskripte verwalten…">
 <!ENTITY menu.manage.accesskey "v">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Greasemonkey aktivieren">
 <!ENTITY statusbar.enabled.accesskey "A">
 <!ENTITY install.title "Greasemonkey-Installation">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Sie sollten nur Skripte von Quellen installieren, denen Sie vertrauen.">
 <!ENTITY install.showscriptsource "Skript-Quelltext anzeigen">
 <!ENTITY install.installbutton "Installieren">
+<!ENTITY loading "Wird heruntergeladen…">
 <!ENTITY newscript.name "Name:">
 <!ENTITY newscript.namespace "Namensraum:">
 <!ENTITY newscript.description "Beschreibung:">
@@ -25,13 +28,17 @@
 <!ENTITY newscript.excludes "Nicht auf diese Seiten anwenden (zeilenweise angeben):">
 <!ENTITY options.editor "Editor">
 <!ENTITY options.changeEditor "Editor ändern">
-<!ENTITY options.globalExcludes "Global Excludes">
+<!ENTITY options.globalExcludes "Globale Ausschlüsse">
 <!ENTITY userscripts "Benutzerskripte">
 <!ENTITY Uninstall "Deinstallieren">
 <!ENTITY AlsoUninstallPrefs "Zugehörige Einstellungen ebenfalls entfernen">
+<!ENTITY UpdateChecking "Auf Aktualisierungen überprüfen">
+<!ENTITY EnableUpdateChecking "Automatische Überprüfung der Skripte auf Aktualisierung">
+<!ENTITY UpdateInterval "Minimale Anzahl von Tagen zwischen Aktualisierungsprüfungen">
+<!ENTITY RequireSecureUpdates "Sicherheitsupdate erforderlich">
 <!ENTITY greasemonkey.noscriptshere "Es werden keine installierten Skripte auf dieser Seite ausgeführt.">
 <!ENTITY greasemonkey.youhavenoscripts "Sie haben noch keine Benutzerskripte installiert">
 <!ENTITY greasemonkey.getuserscripts "Benutzerskripte hinzufügen…">
-<!ENTITY scriptprefs.title "Greasemonkey User Script Preferences - !!">
-<!ENTITY scriptprefs.usersettings "User Settings">
-<!ENTITY scriptprefs.scriptsettings "Script Settings">
+<!ENTITY scriptprefs.title "Greasemonkey - Benutzerskript-Einstellungen">
+<!ENTITY scriptprefs.usersettings "Benutzereinstellungen">
+<!ENTITY scriptprefs.scriptsettings "Skript-Einstellungen">
diff --git a/chrome/greasemonkey.jar!/locale/de/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/de/greasemonkey.properties
index cca950a..9772426 100644
--- a/chrome/greasemonkey.jar!/locale/de/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/de/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Ein Benutzerskript-Manager für Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
-error.matchPattern.host=@match: Invalid host specified.
-error.matchPattern.path=@match: Invalid path specified.
+error.downloadingUrl=Fehler beim Herunterladen von URL:
+error.matchPattern.host=@Entsprechung: Ungültige Host angegeben
+error.matchPattern.parse=@Entsprechung: Das Muster konnte nicht analysiert werden.
+error.matchPattern.path=@Entsprechung: Ungültigen Pfad angegeben
+error.matchPattern.scheme=@Entsprechung: Ungültiges Schema angegeben
+error.parsingScript=Skript konnte nicht analysiert werden:
+error.serverReturned=Rückgabe vom Server
+error.unknown=Unbekannter Fehler
diff --git a/chrome/greasemonkey.jar!/locale/en-US/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/en-US/gm-addons.dtd
index d444a7d..de8a69b 100644
--- a/chrome/greasemonkey.jar!/locale/en-US/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/en-US/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Edit">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Edit this User Script">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Move Down">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Move To Bottom">
diff --git a/chrome/greasemonkey.jar!/locale/en-US/gm-browser.properties b/chrome/greasemonkey.jar!/locale/en-US/gm-browser.properties
index 81d47ad..7ff5c8a 100644
--- a/chrome/greasemonkey.jar!/locale/en-US/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/en-US/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
 newscript.exists=A script with that name is already installed.\nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.dtd
index 6a60d07..4743f11 100644
--- a/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Manage User Scripts...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Enabled">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey Installation">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "You should only install scripts from sources that you trust.">
 <!ENTITY install.showscriptsource "Show Script Source">
 <!ENTITY install.installbutton "Install">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Name">
 <!ENTITY newscript.namespace "Namespace">
 <!ENTITY newscript.description "Description">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Uninstall">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.properties
index 281ef1b..51f3e82 100644
--- a/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/en-US/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=A User Script Manager for Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/es-AR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/es-AR/gm-addons.dtd
index 30ddc8a..a0235a8 100644
--- a/chrome/greasemonkey.jar!/locale/es-AR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-AR/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Editar">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Editar este Script">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Ejecutar último">
 <!ENTITY ExecuteLater "Ejecutar después">
 <!ENTITY ExecuteSooner "Ejecutar antes">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Mover abajo">
 <!ENTITY MoveDown.accesskey "b">
 <!ENTITY MoveToBottom "Mover al final">
diff --git a/chrome/greasemonkey.jar!/locale/es-AR/gm-browser.properties b/chrome/greasemonkey.jar!/locale/es-AR/gm-browser.properties
index 6a966e0..27858bd 100644
--- a/chrome/greasemonkey.jar!/locale/es-AR/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/es-AR/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Por favor, primero elija su editor de texto preferido
 editor.please_pick_executable=Por favor, elija una aplicación ejecutable para editar los scripts.
 editor.could_not_launch=No se pudo iniciar el editor.
 newscript.noname=Por favor, proporcione un nombre para su script.
-newscript.nonamespace=Sírvase proporcionar una URI válida para su script.\n (por ejemplo, "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Sírvase proporcionar una URI válida para su script.n (por ejemplo, "http://userscripts.org/users/useridnumber")
 newscript.exists=Un script con ese nombre ya está instalado.\n¿Aceptar para sobrescribir?
diff --git a/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.dtd
index 361032d..22453ce 100644
--- a/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Administrar Scripts...">
 <!ENTITY menu.manage.accesskey "m">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Activar">
 <!ENTITY statusbar.enabled.accesskey "A">
 <!ENTITY install.title "Instalación de Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Sólo debe instalar scripts que provengan de fuentes confiables.">
 <!ENTITY install.showscriptsource "Mostrar código fuente del Script">
 <!ENTITY install.installbutton "Instalar">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Nombre">
 <!ENTITY newscript.namespace "Espacio de nombres">
 <!ENTITY newscript.description "Descripción">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Scripts">
 <!ENTITY Uninstall "Desinstalar">
 <!ENTITY AlsoUninstallPrefs "También desinstalar las preferencias asociadas">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.properties
index 0fd309f..b1d3613 100644
--- a/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/es-AR/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Un administrador de Scripts para Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/es-ES/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/es-ES/gm-addons.dtd
index 1cad5c2..ddcfb8d 100644
--- a/chrome/greasemonkey.jar!/locale/es-ES/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-ES/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "editar">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Edit this User Script">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "ejecutar al final">
 <!ENTITY ExecuteLater "ejecutar despues">
 <!ENTITY ExecuteSooner "ejecutar pronto">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "mover hacia abajo">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "mover el boton">
diff --git a/chrome/greasemonkey.jar!/locale/es-ES/gm-browser.properties b/chrome/greasemonkey.jar!/locale/es-ES/gm-browser.properties
index 81d47ad..7ff5c8a 100644
--- a/chrome/greasemonkey.jar!/locale/es-ES/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/es-ES/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
 newscript.exists=A script with that name is already installed.\nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.dtd
index 6a60d07..4743f11 100644
--- a/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Manage User Scripts...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Enabled">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey Installation">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "You should only install scripts from sources that you trust.">
 <!ENTITY install.showscriptsource "Show Script Source">
 <!ENTITY install.installbutton "Install">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Name">
 <!ENTITY newscript.namespace "Namespace">
 <!ENTITY newscript.description "Description">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Uninstall">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.properties
index 281ef1b..51f3e82 100644
--- a/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/es-ES/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=A User Script Manager for Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/es-MX/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/es-MX/gm-addons.dtd
index 475f19b..4e01d8a 100644
--- a/chrome/greasemonkey.jar!/locale/es-MX/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-MX/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Editar">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Editar">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Ejecutar al final">
 <!ENTITY ExecuteLater "Ejecutar después">
 <!ENTITY ExecuteSooner "Ejecutar pronto">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Mover hacia abajo">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Mover al final">
diff --git a/chrome/greasemonkey.jar!/locale/es-MX/gm-browser.properties b/chrome/greasemonkey.jar!/locale/es-MX/gm-browser.properties
index f3184be..3eeb319 100644
--- a/chrome/greasemonkey.jar!/locale/es-MX/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/es-MX/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Por favor primero seleciona tu editor de texto preferido
 editor.please_pick_executable=Elija una aplicación ejecutable para editar los scripts.
 editor.could_not_launch=No se pudo cargar el Editor.
 newscript.noname=Dale nombre a tu Script.
-newscript.nonamespace=Da una URI válida para tu Script.\n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Da una URI válida para tu Script.n(e.g. "http://userscripts.org/users/useridnumber")
 newscript.exists=Existe un Script con el mismo nombre .\n¿Reemplazarlo?
diff --git a/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.dtd
index 746cc56..6c0a429 100644
--- a/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Gestor de Scripts">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Activado">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Instalación de Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Sólo debes instalar Scripts de fuentes confiables.">
 <!ENTITY install.showscriptsource "Mostrar Código del Script">
 <!ENTITY install.installbutton "Instalar">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Nombre">
 <!ENTITY newscript.namespace "Espacio de nombres">
 <!ENTITY newscript.description "Descripción">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Scripts">
 <!ENTITY Uninstall "Desinstalar">
 <!ENTITY AlsoUninstallPrefs "También desinstalar preferencias asociadas">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.properties
index 5cf93e8..8d45eaf 100644
--- a/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/es-MX/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Un gestor de scripts de usuario para Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/es/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/es/gm-addons.dtd
index 69359fa..d8e9881 100644
--- a/chrome/greasemonkey.jar!/locale/es/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/es/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Editar">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Editar este Script de Usuario">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Ejecutar al ultimo">
 <!ENTITY ExecuteLater "Ejecutar luego">
 <!ENTITY ExecuteSooner "Ejecutar pronto">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Mover abajo">
 <!ENTITY MoveDown.accesskey "M">
 <!ENTITY MoveToBottom "Mover al Final">
diff --git a/chrome/greasemonkey.jar!/locale/es/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/es/greasemonkey.dtd
index 880ccd9..9a4242c 100644
--- a/chrome/greasemonkey.jar!/locale/es/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/es/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Administrar Script de Usuario">
 <!ENTITY menu.manage.accesskey "S">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Activado">
 <!ENTITY statusbar.enabled.accesskey "A">
 <!ENTITY install.title "Instalación de Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Debería instalar scripts solo de fuentes en las que confíe.">
 <!ENTITY install.showscriptsource "Mostrar Fuente de Script">
 <!ENTITY install.installbutton "Instalar">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Nombre">
 <!ENTITY newscript.namespace "Espacio de Nombres">
 <!ENTITY newscript.description "Descripción">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Script de Usuario(secuencia de comandos)">
 <!ENTITY Uninstall "Desinstalar">
 <!ENTITY AlsoUninstallPrefs "También desinstalar preferencias asociadas">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/es/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/es/greasemonkey.properties
index e789e36..44f6bd1 100644
--- a/chrome/greasemonkey.jar!/locale/es/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/es/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Un Administrador de Scripts(secuencia de comandos) para Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/et-EE/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/et-EE/gm-addons.dtd
index 9690675..1c8339f 100644
--- a/chrome/greasemonkey.jar!/locale/et-EE/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/et-EE/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Muuda">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Muuda seda Kasutajaskripti">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Liiguta Allapoole">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Liiguta Viimaseks">
diff --git a/chrome/greasemonkey.jar!/locale/et-EE/gm-browser.properties b/chrome/greasemonkey.jar!/locale/et-EE/gm-browser.properties
index 79233ec..478bfe4 100644
--- a/chrome/greasemonkey.jar!/locale/et-EE/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/et-EE/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
 newscript.exists=A script with that name is already installed.\nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.dtd
index 6f22700..42cd062 100644
--- a/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Halda Kasutajaskripte...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Lubatud">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey Paigaldamine">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "You should only install scripts from sources that you trust.">
 <!ENTITY install.showscriptsource "Näita Skripti Lähtekoodi">
 <!ENTITY install.installbutton "Paigalda">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Nimi">
 <!ENTITY newscript.namespace "Namespace">
 <!ENTITY newscript.description "Tutvustus">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Kasutajaskriptid">
 <!ENTITY Uninstall "Eemalda">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.properties
index cc3edcd..9da8693 100644
--- a/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/et-EE/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Kasutaja Skriptihaldur Firefoxile
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/fa-IR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/fa-IR/gm-addons.dtd
index 9ff07f2..2f28938 100644
--- a/chrome/greasemonkey.jar!/locale/fa-IR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/fa-IR/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "ویرایش">
 <!ENTITY Edit.accesskey ",">
 <!ENTITY Edit.tooltip "ویرایش این دستنویس کاربری">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "اجرای آخرین">
 <!ENTITY ExecuteLater "دیرتر اجرا شود">
 <!ENTITY ExecuteSooner "زود تر اجرا شود">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "حرکت به پایین">
 <!ENTITY MoveDown.accesskey "ح">
 <!ENTITY MoveToBottom "حرکت به انتها">
diff --git a/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.dtd
index 8a85600..9f3882e 100644
--- a/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "ج">
 <!ENTITY menu.manage "مدیریت دستنویس های کاربری...">
 <!ENTITY menu.manage.accesskey "م">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "فعال">
 <!ENTITY statusbar.enabled.accesskey "ع">
 <!ENTITY install.title "فرآیند نصب گریسمانکی">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "شما می بایست فقط دستنویس هایی را نصب کنید که از منابع آنها مطمئن هستید.">
 <!ENTITY install.showscriptsource "نمایش متن دستنویس کاربری">
 <!ENTITY install.installbutton "نصب">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "نام">
 <!ENTITY newscript.namespace "فضای نام">
 <!ENTITY newscript.description "شرح">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "دستنویس های کاربری">
 <!ENTITY Uninstall "عزل">
 <!ENTITY AlsoUninstallPrefs "همچنین حذف تنظیمات وابسته">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "دستنویس ای که در این صفحه اجرا شود موجود نیست.">
 <!ENTITY greasemonkey.youhavenoscripts "شما هیچ دستنویس نسب شده ای ندارید">
 <!ENTITY greasemonkey.getuserscripts "دریافت دستنویس های کاربری">
diff --git a/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.properties
index 8fb646d..e60967b 100644
--- a/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/fa-IR/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=یک مدیر دستنویس کاربری برای روباه آتشین
-error.matchPattern.parse=@تطابق: الگو قابل اجرا نیست.
-error.matchPattern.scheme=@تطابق: طرحی نامعتبر مشخص شده.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@تطابق: میزبانی نامعتبر مشخص شده.
+error.matchPattern.parse=@تطابق: الگو قابل اجرا نیست.
 error.matchPattern.path=@تطابق: مسیری نامعتبر انتخاب شده.
+error.matchPattern.scheme=@تطابق: طرحی نامعتبر مشخص شده.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/fi-FI/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/fi-FI/gm-addons.dtd
index 481c244..f2d6d7e 100644
--- a/chrome/greasemonkey.jar!/locale/fi-FI/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/fi-FI/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Muokkaa">
 <!ENTITY Edit.accesskey "M">
 <!ENTITY Edit.tooltip "Muokkaa tätä skriptiä">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Suorita viimeisenä">
 <!ENTITY ExecuteLater "Suorita myöhemmin">
 <!ENTITY ExecuteSooner "Suorita aiemmin">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Siirrä alaspäin">
 <!ENTITY MoveDown.accesskey "A">
 <!ENTITY MoveToBottom "Siirrä loppuun">
diff --git a/chrome/greasemonkey.jar!/locale/fi-FI/gm-browser.properties b/chrome/greasemonkey.jar!/locale/fi-FI/gm-browser.properties
index bd87a2a..5a6ff39 100644
--- a/chrome/greasemonkey.jar!/locale/fi-FI/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/fi-FI/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Valitse ensin haluamasi tekstieditori
 editor.please_pick_executable=Valitse ohjelma jota haluat käyttää skriptien muokkaamiseen.
 editor.could_not_launch=Tekstieditorin käynnistys epäonnistui.
 newscript.noname=Anna skriptillesi nimi.
-newscript.nonamespace=Anna skriptillesi kelvollinen nimiavaruus-URI.\n(esim. "http://userscripts.org/users/<käyttäjänumero>")
+newscript.nonamespace=Anna skriptillesi kelvollinen nimiavaruus-URI.n(esim. "http://userscripts.org/users/<käyttäjänumero>")
 newscript.exists=Samanniminen skripti on jo asennettuna.\nKorvataanko?
diff --git a/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.dtd
index 9bd2824..908a885 100644
--- a/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "U">
 <!ENTITY menu.manage "Hallinnoi skriptejä...">
 <!ENTITY menu.manage.accesskey "H">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Käytössä">
 <!ENTITY statusbar.enabled.accesskey "K">
 <!ENTITY install.title "Greasemonkey-asennus">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Asenna skriptejä vain luetetuista lähteistä.">
 <!ENTITY install.showscriptsource "Näytä skriptin lähdekoodi">
 <!ENTITY install.installbutton "Asenna">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Nimi">
 <!ENTITY newscript.namespace "Nimiavaruus">
 <!ENTITY newscript.description "Kuvaus">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Skriptit">
 <!ENTITY Uninstall "Poisto">
 <!ENTITY AlsoUninstallPrefs "Poista myös skriptin asetukset">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Mitään skripteistä ei ajeta tällä sivulla.">
 <!ENTITY greasemonkey.youhavenoscripts "Sinulla ei ole yhtään skriptiä asennettuna">
 <!ENTITY greasemonkey.getuserscripts "Hanki skriptejä">
diff --git a/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.properties
index eae5576..026ca83 100644
--- a/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/fi-FI/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Työkalu omien skriptien ajamiseen Firefoxissa
-error.matchPattern.parse=@match: Kaavaimen tulkinta epäonnistui.
-error.matchPattern.scheme=@match: Palvelinprotokolla ei kelpaa.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Palvelimen nimi ei kelpaa.
+error.matchPattern.parse=@match: Kaavaimen tulkinta epäonnistui.
 error.matchPattern.path=@match: Palvelinpolku ei kelpaa.
+error.matchPattern.scheme=@match: Palvelinprotokolla ei kelpaa.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/fr/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/fr/gm-addons.dtd
index ee807e9..1411966 100644
--- a/chrome/greasemonkey.jar!/locale/fr/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/fr/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Modifier">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Modifier ce Script Utilisateur">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Exécuter en dernier">
 <!ENTITY ExecuteLater "Exécuter plus tard">
 <!ENTITY ExecuteSooner "Exécuter plus tôt">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Descendre">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Descendre tout en bas">
diff --git a/chrome/greasemonkey.jar!/locale/fr/gm-browser.properties b/chrome/greasemonkey.jar!/locale/fr/gm-browser.properties
index b917ca2..3520b7d 100644
--- a/chrome/greasemonkey.jar!/locale/fr/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/fr/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Veuillez d'abord choisir votre éditeur de texte préféré
 editor.please_pick_executable=Veuillez choisir l'application exécutable à utiliser pour modifier les scripts utilisateur.
 editor.could_not_launch=Lancement de l'éditeur impossible.
 newscript.noname=Veuillez donner un nom à votre script.
-newscript.nonamespace=Veuillez fournir un espace de nom URI valide pour votre script.\n(par exemple. "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Veuillez fournir un espace de nom URI valide pour votre script.n(par exemple. "http://userscripts.org/users/useridnumber")
 newscript.exists=Un script avec ce nom est déjà installé.\nL'écraser?
diff --git a/chrome/greasemonkey.jar!/locale/fr/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/fr/greasemonkey.dtd
index 57ef4d9..e7e7bd3 100644
--- a/chrome/greasemonkey.jar!/locale/fr/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/fr/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Gérer les Scripts Utilisateur">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Activé">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Installation de Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "N'installez que des scripts à partir de sources dont vous avez confiance.">
 <!ENTITY install.showscriptsource "Afficher la Source du Script">
 <!ENTITY install.installbutton "Installer">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Nom">
 <!ENTITY newscript.namespace "Espace de nom">
 <!ENTITY newscript.description "Description">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Scripts Utilisateur">
 <!ENTITY Uninstall "Désinstaller">
 <!ENTITY AlsoUninstallPrefs "Désinstalle également les préférences associées">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Aucun script installé n'est exécuté sur cette page.">
 <!ENTITY greasemonkey.youhavenoscripts "Vous avez aucun scripts d'installé">
 <!ENTITY greasemonkey.getuserscripts "Obtenir des scripts utilisateur">
diff --git a/chrome/greasemonkey.jar!/locale/fr/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/fr/greasemonkey.properties
index 01404dd..3cc5f57 100644
--- a/chrome/greasemonkey.jar!/locale/fr/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/fr/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Un gestionnaire de script utilisateur pour Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/gl-ES/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/gl-ES/gm-addons.dtd
index a0bab82..e401e13 100644
--- a/chrome/greasemonkey.jar!/locale/gl-ES/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/gl-ES/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Buscar actualizacións automaticamente">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Editar">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Editar este script">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Executar último">
 <!ENTITY ExecuteLater "Executar máis tarde">
 <!ENTITY ExecuteSooner "Executar antes">
+<!ENTITY FindUpdate "Buscar actualizacións">
+<!ENTITY InstallUpdate "Instalar actualizacións">
 <!ENTITY MoveDown "Mover abaixo">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Mover ao fondo">
diff --git a/chrome/greasemonkey.jar!/locale/gl-ES/gm-browser.properties b/chrome/greasemonkey.jar!/locale/gl-ES/gm-browser.properties
index c4a9a36..84cf404 100644
--- a/chrome/greasemonkey.jar!/locale/gl-ES/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/gl-ES/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Escolla primeiro o editor de texto que prefira
 editor.please_pick_executable=Seleccione o executable do aplicativo que desexa para editar os scripts.
 editor.could_not_launch=Non foi posible iniciar o editor.
 newscript.noname=Introduza un nome para o script.
-newscript.nonamespace=Introduza un URI de espazo de nome válido para o script.\n(p.e. "http://userscripts.org/users/useridnumber")
-newscript.exists=Xa hai instalado un script con ese nome\nDesexa sobrescribilo?
+newscript.nonamespace=Introduza un URI de espazo de nome válido para o script.n(p.e. "http://userscripts.org/users/useridnumber")
+newscript.exists=Xa hai instalado un script con ese nomenDesexa sobrescribilo?
diff --git a/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.dtd
index 82c477f..2434032 100644
--- a/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Xestionar os scripts...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Opcións do Greasemonkey...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Activado">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Instalación do Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Debería instalar scripts unicamente de fontes nas que confíe.">
 <!ENTITY install.showscriptsource "Mostrar o código fonte">
 <!ENTITY install.installbutton "Instalar">
+<!ENTITY loading "Descargando...">
 <!ENTITY newscript.name "Nome">
 <!ENTITY newscript.namespace "Espazo do nome">
 <!ENTITY newscript.description "Descrición">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Scripts">
 <!ENTITY Uninstall "Desinstalar">
 <!ENTITY AlsoUninstallPrefs "Tamén desinstalar as preferencias asociadas">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Activar a comprobación automática de actualización de scripts">
+<!ENTITY UpdateInterval "Número mínimo de días entre comprobación de actualizacións">
+<!ENTITY RequireSecureUpdates "Requerir actualizacións de seguranza">
 <!ENTITY greasemonkey.noscriptshere "Ningún script instalado en execución.">
 <!ENTITY greasemonkey.youhavenoscripts "Non ten scripts de usuario instalados">
 <!ENTITY greasemonkey.getuserscripts "Obter scripts">
diff --git a/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.properties
index 07d55ee..46584a4 100644
--- a/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/gl-ES/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Un xestor de scripts de usuario para o Firefox
-error.matchPattern.parse=@match: non foi posible analizar o patrón.
-error.matchPattern.scheme=@match: o esquema indicado é incorrecto.
+error.downloadingUrl=Produciuse un erro descargando URL:
 error.matchPattern.host=@match: o servidor indicado é incorrecto.
+error.matchPattern.parse=@match: non foi posible analizar o patrón.
 error.matchPattern.path=@match: a ruta indicada é incorrecta.
+error.matchPattern.scheme=@match: o esquema indicado é incorrecto.
+error.parsingScript=Non foi posíbel procesar o script:
+error.serverReturned=Servidor devolto
+error.unknown=Erro descoñecido.
diff --git a/chrome/greasemonkey.jar!/locale/he-IL/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/he-IL/gm-addons.dtd
index d85e800..b96df89 100644
--- a/chrome/greasemonkey.jar!/locale/he-IL/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/he-IL/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "עריכה">
 <!ENTITY Edit.accesskey "ע">
 <!ENTITY Edit.tooltip "ערוך סקריפט זה">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "בצע בסוף">
 <!ENTITY ExecuteLater "בצע מאוחר יותר">
 <!ENTITY ExecuteSooner "בצע מוקדם יותר">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "הזז למטה">
 <!ENTITY MoveDown.accesskey "ט">
 <!ENTITY MoveToBottom "הזז לסוף הרשימה">
diff --git a/chrome/greasemonkey.jar!/locale/he-IL/gm-browser.properties b/chrome/greasemonkey.jar!/locale/he-IL/gm-browser.properties
index 90a71d8..8a87d3e 100644
--- a/chrome/greasemonkey.jar!/locale/he-IL/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/he-IL/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=נא בחר תחילה את עורך הטקסט המועדף על
 editor.please_pick_executable=נא לבחור יישום בר-הפעלה לשימוש עריכת סקריפטים של משתמש
 editor.could_not_launch=אין אפשרות להפעיל את העורך
 newscript.noname=נא לבחור שם עבור הסקריפט שלך
-newscript.nonamespace=נא לבחור כתובת אינטרנט תקינה עבור הסקריפט שלך.\n(כגון: "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=נא לבחור כתובת אינטרנט תקינה עבור הסקריפט שלך.n(כגון: "http://userscripts.org/users/useridnumber")
 newscript.exists=סקריפט עם שם זה כבר מותקן.\nלהחליף אותו?
diff --git a/chrome/greasemonkey.jar!/locale/he-IL/gm-cludes.dtd b/chrome/greasemonkey.jar!/locale/he-IL/gm-cludes.dtd
index a2c1e4d..aaacf68 100644
--- a/chrome/greasemonkey.jar!/locale/he-IL/gm-cludes.dtd
+++ b/chrome/greasemonkey.jar!/locale/he-IL/gm-cludes.dtd
@@ -3,6 +3,48 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 ">
 <!ENTITY promptForNewPage.title "הוסף דף">
 <!ENTITY promptForNewPage.defVal "http://example.com/*">
@@ -11,6 +53,48 @@
 
 
 
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
 ">
 <!ENTITY promptForEdit.title "ערוך דף">
 <!ENTITY button.add "הוסף...">
diff --git a/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.dtd
index 9b01f57..a51e4c7 100644
--- a/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "ח">
 <!ENTITY menu.manage "ניהול סקריפטים של משתמש">
 <!ENTITY menu.manage.accesskey "נ">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "הפעל">
 <!ENTITY statusbar.enabled.accesskey "פ">
 <!ENTITY install.title "התקנת גריזמונקי">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "עליך להתקין סקריפטים רק ממקורות שאתה נותן בהם אמון.">
 <!ENTITY install.showscriptsource "הצג קוד מקור של הסקריפט">
 <!ENTITY install.installbutton "התקן">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "שם">
 <!ENTITY newscript.namespace "מרחב">
 <!ENTITY newscript.description "תיאור">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "סקריפטים של משתמש">
 <!ENTITY Uninstall "הסר">
 <!ENTITY AlsoUninstallPrefs "הסר גם את העדפות המשויכות לסקריפט משתמש זה">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "לא קיימים סקריפטים מותקנים פעילים בדף זה.">
 <!ENTITY greasemonkey.youhavenoscripts "לא מותקנים אצלך סקריפטים של משתמש">
 <!ENTITY greasemonkey.getuserscripts "השג סקריפטים של משתמש">
diff --git a/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.properties
index cf010e9..a0521f6 100644
--- a/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/he-IL/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=מנהל סקריפטים של משתמש לפיירפוקס
-error.matchPattern.parse=@ התאמה: אין אפשרות לפצל את הדפוס.
-error.matchPattern.scheme=@ התאמה: תכנית שצויינה אינה תקינה.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@ התאמה: המארח שצויין אינו תקין.
+error.matchPattern.parse=@ התאמה: אין אפשרות לפצל את הדפוס.
 error.matchPattern.path=@ התאמה: נתיב שצויין אינו תקין.
+error.matchPattern.scheme=@ התאמה: תכנית שצויינה אינה תקינה.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/hu/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/hu/gm-addons.dtd
index e040116..0d58867 100644
--- a/chrome/greasemonkey.jar!/locale/hu/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/hu/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Szerkesztés">
 <!ENTITY Edit.accesskey "S">
 <!ENTITY Edit.tooltip "Parancsfájl szerkesztése">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Végrehajtás utolsóként">
 <!ENTITY ExecuteLater "Végrehajtás később">
 <!ENTITY ExecuteSooner "Végrehajtás előbb">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Mozgatás lefele">
 <!ENTITY MoveDown.accesskey "l">
 <!ENTITY MoveToBottom "Mozgatás legalulra">
diff --git a/chrome/greasemonkey.jar!/locale/hu/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/hu/greasemonkey.dtd
index bd56252..7409f94 100644
--- a/chrome/greasemonkey.jar!/locale/hu/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/hu/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "p">
 <!ENTITY menu.manage "Parancsfájlok kezelése...">
 <!ENTITY menu.manage.accesskey "k">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Engedélyezve">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey telepítés">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Csak megbízható forrásból telepítsen parancsfájlt!">
 <!ENTITY install.showscriptsource "Parancsfájl forrásának megtekintése">
 <!ENTITY install.installbutton "Telepítés">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Név">
 <!ENTITY newscript.namespace "Névtér">
 <!ENTITY newscript.description "Leírás">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Parancsfájlok">
 <!ENTITY Uninstall "Eltávolítás">
 <!ENTITY AlsoUninstallPrefs "Hozzákapcsolódó beállítások eltávolítása">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Ezen az oldalon nem futnak telepített parancsfájlok.">
 <!ENTITY greasemonkey.youhavenoscripts "Nincsenek parancsfájlok telepítve">
 <!ENTITY greasemonkey.getuserscripts "Töltsön le parancsfájlokat!">
diff --git a/chrome/greasemonkey.jar!/locale/hu/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/hu/greasemonkey.properties
index ec1b690..00a8f62 100644
--- a/chrome/greasemonkey.jar!/locale/hu/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/hu/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Felhasználói parancsfájl kezelő a Firefoxhoz
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/it-IT/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/it-IT/gm-addons.dtd
index d444a7d..de8a69b 100644
--- a/chrome/greasemonkey.jar!/locale/it-IT/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/it-IT/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Edit">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Edit this User Script">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Move Down">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Move To Bottom">
diff --git a/chrome/greasemonkey.jar!/locale/it-IT/gm-browser.properties b/chrome/greasemonkey.jar!/locale/it-IT/gm-browser.properties
index 5997e14..b847347 100644
--- a/chrome/greasemonkey.jar!/locale/it-IT/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/it-IT/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Come prima operazione, selezionare l'editor testuale desiderato
 editor.please_pick_executable=Selezionare un'applicazione eseguibile da utilizzare per la modifica degli script utente.
 editor.could_not_launch=Impossibile avviare l'editor.
 newscript.noname=Fornire un nome per lo script.
-newscript.nonamespace=Fornire un URI namespace valido per lo script.\n(es.: "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Fornire un URI namespace valido per lo script.n(es.: "http://userscripts.org/users/useridnumber")
 newscript.exists=Uno script con quel nome è già installato.\nSovrasciverlo?
diff --git a/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.dtd
index 9d868ae..55d9075 100644
--- a/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Gestione script utente...">
 <!ENTITY menu.manage.accesskey "G">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Attivo">
 <!ENTITY statusbar.enabled.accesskey "A">
 <!ENTITY install.title "Installazione di Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Installare solo script provenienti da fonti sicure.">
 <!ENTITY install.showscriptsource "Mostra sorgente script utente">
 <!ENTITY install.installbutton "Installa">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Nome">
 <!ENTITY newscript.namespace "Namespace">
 <!ENTITY newscript.description "Descrizione">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Disinstalla">
 <!ENTITY AlsoUninstallPrefs "Disinstalla anche le preferenze associate">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.properties
index 5fd9cf8..e32d72d 100644
--- a/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/it-IT/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Un gestore di script utente per Firefox.
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/ja-JP/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ja-JP/gm-addons.dtd
index 63cd3e0..4f3ee69 100644
--- a/chrome/greasemonkey.jar!/locale/ja-JP/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ja-JP/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "編集">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "このユーザスクリプトを編集します">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "最後に実行">
 <!ENTITY ExecuteLater "後で実行">
 <!ENTITY ExecuteSooner "先に実行">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "下へ移動">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "最後へ移動">
diff --git a/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.dtd
index cd0dba7..36e98ed 100644
--- a/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "ユーザスクリプトの管理...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "有効">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey インストール">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "信頼できるソースからのみスクリプトをインストールすべきです。">
 <!ENTITY install.showscriptsource "スクリプトのソースを表示">
 <!ENTITY install.installbutton "インストール">
+<!ENTITY loading "ダウンロード中...">
 <!ENTITY newscript.name "名前">
 <!ENTITY newscript.namespace "名前空間">
 <!ENTITY newscript.description "説明">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "ユーザスクリプト">
 <!ENTITY Uninstall "削除">
 <!ENTITY AlsoUninstallPrefs "関連付けられた設定も削除">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "このページで実行するスクリプトはインストールされていません。">
 <!ENTITY greasemonkey.youhavenoscripts "スクリプトが何もインストールされていません">
 <!ENTITY greasemonkey.getuserscripts "スクリプトを入手">
diff --git a/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.properties
index 85a7287..064ce64 100644
--- a/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/ja-JP/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Firefox用のユーザスクリプトマネージャ
-error.matchPattern.parse=@match: パターンを解析できませんでした。
-error.matchPattern.scheme=@match: 無効なスキームが指定されました。
+error.downloadingUrl=エラーダウンロードURL:
 error.matchPattern.host=@match: 無効なホストが指定されています。
+error.matchPattern.parse=@match: パターンを解析できませんでした。
 error.matchPattern.path=@match: 無効なパスが指定されています。
+error.matchPattern.scheme=@match: 無効なスキームが指定されました。
+error.parsingScript=スクリプトを解析できません:
+error.serverReturned=サーバーの応答
+error.unknown=不明なエラー
diff --git a/chrome/greasemonkey.jar!/locale/ko-KR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ko-KR/gm-addons.dtd
index 5916a6f..fbb977d 100644
--- a/chrome/greasemonkey.jar!/locale/ko-KR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ko-KR/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "편집">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "이 유저 스크립트 편집">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "마지막에 실행">
 <!ENTITY ExecuteLater "나중에 실행">
 <!ENTITY ExecuteSooner "일찍 실행">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "아래로 이동">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "맨 아래로 이동">
diff --git a/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.dtd
index 79cc5c6..deb1417 100644
--- a/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "유저 스크립트 관리...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "활성화">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "그리스몽키 설치">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "믿을 수 있는 출처에서 나온 스크립트만 설치하셔야 합니다.">
 <!ENTITY install.showscriptsource "스크립트 소스 보기">
 <!ENTITY install.installbutton "설치">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "이름">
 <!ENTITY newscript.namespace "네임스페이스">
 <!ENTITY newscript.description "설명">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "유저 스크립트">
 <!ENTITY Uninstall "삭제">
 <!ENTITY AlsoUninstallPrefs "관련된 환경 설정도 삭제">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.properties
index dabd7c9..b3f18f7 100644
--- a/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/ko-KR/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Firefox를 위한 유저 스크립트 관리자
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/nl/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/nl/gm-addons.dtd
index ff54805..632da48 100644
--- a/chrome/greasemonkey.jar!/locale/nl/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/nl/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Bewerken">
 <!ENTITY Edit.accesskey "W">
 <!ENTITY Edit.tooltip "Dit gebruikersscript bewerken">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Als laatste uitvoeren">
 <!ENTITY ExecuteLater "Later uitvoeren">
 <!ENTITY ExecuteSooner "Eerder uitvoeren">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Omlaag">
 <!ENTITY MoveDown.accesskey "L">
 <!ENTITY MoveToBottom "Onderaan plaatsen">
diff --git a/chrome/greasemonkey.jar!/locale/nl/gm-browser.properties b/chrome/greasemonkey.jar!/locale/nl/gm-browser.properties
index 1c4102e..1561544 100644
--- a/chrome/greasemonkey.jar!/locale/nl/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/nl/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Kies eerst de tekstverwerker van uw voorkeur
 editor.please_pick_executable=Kies een uitvoerbare toepassing die u wilt gebruiken om gebruikersscripts te bewerken.
 editor.could_not_launch=Kan de tekstverwerker niet starten.
 newscript.noname=Geef een naam op voor uw script.
-newscript.nonamespace=Geef een geldige namespace-URI voor uw script op.\n(b.v. “http://userscripts.org/users/useridnumber”)
+newscript.nonamespace=Geef een geldige namespace-URI voor uw script op.n(b.v. “http://userscripts.org/users/useridnumber”)
 newscript.exists=Er is al een script met die naam geïnstalleerd.\nMag dit overschreven worden?
diff --git a/chrome/greasemonkey.jar!/locale/nl/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/nl/greasemonkey.dtd
index 545fb39..1810347 100644
--- a/chrome/greasemonkey.jar!/locale/nl/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/nl/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Gebruikersscripts beheren…">
 <!ENTITY menu.manage.accesskey "U">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Ingeschakeld">
 <!ENTITY statusbar.enabled.accesskey "I">
 <!ENTITY install.title "Greasemonkey-installatie">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Installeer alleen scripts van auteurs die u vertrouwt.">
 <!ENTITY install.showscriptsource "Scriptbron weergeven">
 <!ENTITY install.installbutton "Installeren">
+<!ENTITY loading "Downloaden…">
 <!ENTITY newscript.name "Naam">
 <!ENTITY newscript.namespace "Namespace">
 <!ENTITY newscript.description "Beschrijving">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Gebruikersscripts">
 <!ENTITY Uninstall "Deïnstalleren">
 <!ENTITY AlsoUninstallPrefs "Bijbehorende instellingen ook verwijderen">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Op deze pagina draaien geen geïnstalleerde scripts.">
 <!ENTITY greasemonkey.youhavenoscripts "Er zijn geen gebruikersscripts geïnstalleerd">
 <!ENTITY greasemonkey.getuserscripts "Verkrijg gebruikersscripts">
diff --git a/chrome/greasemonkey.jar!/locale/nl/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/nl/greasemonkey.properties
index 4f7cec1..5889bb3 100644
--- a/chrome/greasemonkey.jar!/locale/nl/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/nl/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Een gebruikersscriptbeheerder voor Firefox
-error.matchPattern.parse=@match: Dit patroon kan niet gelezen worden.
-error.matchPattern.scheme=@match: Ongeldig schema opgegeven.
+error.downloadingUrl=Downloaden mislukt van URL:
 error.matchPattern.host=@match: Ongeldige host opgegeven.
+error.matchPattern.parse=@match: Dit patroon kan niet gelezen worden.
 error.matchPattern.path=@match: Ongeldig pad opgegeven.
+error.matchPattern.scheme=@match: Ongeldig schema opgegeven.
+error.parsingScript=Kon script niet verwerken:
+error.serverReturned=Server antwoordde
+error.unknown=Onbekende fout.
diff --git a/chrome/greasemonkey.jar!/locale/pl/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/pl/gm-addons.dtd
index 45813a6..74b9b75 100644
--- a/chrome/greasemonkey.jar!/locale/pl/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/pl/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatycznie sprawdzaj dostępność aktualizacji">
+<!ENTITY CheckUpdates.accesskey "T">
 <!ENTITY Edit "Edytuj">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Edytuj ten skrypt">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Wykonaj jako ostatni">
 <!ENTITY ExecuteLater "Wykonaj później">
 <!ENTITY ExecuteSooner "Wykonaj wcześniej">
+<!ENTITY FindUpdate "Znajdź aktualizację">
+<!ENTITY InstallUpdate "Zainstaluj aktualizację">
 <!ENTITY MoveDown "Przenieś w dół">
 <!ENTITY MoveDown.accesskey "P">
 <!ENTITY MoveToBottom "Przenieś na dół">
diff --git a/chrome/greasemonkey.jar!/locale/pl/gm-browser.properties b/chrome/greasemonkey.jar!/locale/pl/gm-browser.properties
index 0bbc7e5..fbc6337 100644
--- a/chrome/greasemonkey.jar!/locale/pl/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/pl/gm-browser.properties
@@ -12,10 +12,10 @@ greeting.btnAccess=I
 alert.fromURI=Pobieranie skryptu…
 alert.fromURI.failure=Nie można pobrać skryptu
 alert.success=Zainstalowano
-alert.failure=Wystąpił błąd podczas instalacji skryptu:\n
+alert.failure=Wystąpił błąd podczas instalacji skryptu:n
 editor.prompt=Wybierz najpierw preferowany edytor tekstu
 editor.please_pick_executable=Wskaż plik wykonywalny aplikacji używanej do edycji skryptów.
 editor.could_not_launch=Nie można otworzyć edytora.
 newscript.noname=Wprowadź nazwę skryptu.
-newscript.nonamespace=Wprowadź lokalizację skryptu.\n(Np. http://userscripts.org/users/useridnumber)
+newscript.nonamespace=Wprowadź lokalizację skryptu.n(Np. http://userscripts.org/users/useridnumber)
 newscript.exists=Skrypt o takiej nazwie jest już zainstalowany.\nZastąpić skrypt?
diff --git a/chrome/greasemonkey.jar!/locale/pl/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/pl/greasemonkey.dtd
index 8f334be..66b39fd 100644
--- a/chrome/greasemonkey.jar!/locale/pl/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/pl/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Zarządzaj skryptami…">
 <!ENTITY menu.manage.accesskey "R">
+<!ENTITY menu.options "Greasemonkey – ustawienia…">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Włącz">
 <!ENTITY statusbar.enabled.accesskey "W">
 <!ENTITY install.title "Instalacja skryptu">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Należy instalować tylko skrypty pochodzące z zaufanych źródeł.">
 <!ENTITY install.showscriptsource "Pokaż kod źródłowy skryptu">
 <!ENTITY install.installbutton "Instaluj">
+<!ENTITY loading "Pobieranie…">
 <!ENTITY newscript.name "Nazwa">
 <!ENTITY newscript.namespace "Lokalizacja">
 <!ENTITY newscript.description "Opis">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Skrypty">
 <!ENTITY Uninstall "Odinstaluj">
 <!ENTITY AlsoUninstallPrefs "Odinstaluj również skojarzone ustawienia">
+<!ENTITY UpdateChecking "Sprawdzaj dostępność aktualizacji">
+<!ENTITY EnableUpdateChecking "Włącza automatyczne sprawdzanie dostępności aktualizacji skryptów">
+<!ENTITY UpdateInterval "Minimalna liczba dni pomiędzy kolejnymi sprawdzeniami">
+<!ENTITY RequireSecureUpdates "Wymaga bezpiecznych aktualizacji">
 <!ENTITY greasemonkey.noscriptshere "Na tej stronie nie ma zainstalowanych skryptów do uruchomienia.">
 <!ENTITY greasemonkey.youhavenoscripts "Nie masz zainstalowanych żadnych skryptów użytkownika">
 <!ENTITY greasemonkey.getuserscripts "Pobierz skrypty">
diff --git a/chrome/greasemonkey.jar!/locale/pl/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/pl/greasemonkey.properties
index c040afd..e5e6f3a 100644
--- a/chrome/greasemonkey.jar!/locale/pl/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/pl/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Menedżer skryptów użytkownika
-error.matchPattern.parse=@match: Nie można przetworzyć wzorca.
-error.matchPattern.scheme=@match: Określono nieprawidłowy schemat.
+error.downloadingUrl=Błąd pobierania:
 error.matchPattern.host=@match: Określono nieprawidłowy host.
+error.matchPattern.parse=@match: Nie można przetworzyć wzorca.
 error.matchPattern.path=@match: Określono nieprawidłową ścieżkę.
+error.matchPattern.scheme=@match: Określono nieprawidłowy schemat.
+error.parsingScript=Nie można przetworzyć skryptu:
+error.serverReturned=Zostało zwrócone przez serwer
+error.unknown=Nieznany błąd.
diff --git a/chrome/greasemonkey.jar!/locale/pt-BR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/pt-BR/gm-addons.dtd
index 4ef9b0d..bd03daa 100644
--- a/chrome/greasemonkey.jar!/locale/pt-BR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/pt-BR/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Verificar atualizações automaticamente">
+<!ENTITY CheckUpdates.accesskey "a">
 <!ENTITY Edit "Editar">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Editar este Script de Usuário">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Executar por último">
 <!ENTITY ExecuteLater "Executar depois">
 <!ENTITY ExecuteSooner "Executar antes">
+<!ENTITY FindUpdate "Procurar Atualização">
+<!ENTITY InstallUpdate "Instalar Atualização">
 <!ENTITY MoveDown "Mover Para Baixo">
 <!ENTITY MoveDown.accesskey "B">
 <!ENTITY MoveToBottom "Mover Para o Fim">
diff --git a/chrome/greasemonkey.jar!/locale/pt-BR/gm-browser.properties b/chrome/greasemonkey.jar!/locale/pt-BR/gm-browser.properties
index 684ec21..c97d1d6 100644
--- a/chrome/greasemonkey.jar!/locale/pt-BR/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/pt-BR/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Favor escolher seu editor de texto preferido primeiro
 editor.please_pick_executable=Favor escolher um aplicativo executável para usar para editar scripts de usuário.
 editor.could_not_launch=Não foi possível abrir o editor.
 newscript.noname=Favor atribuir um nome ao seu script.
-newscript.nonamespace=Favor fornecer um namespace válido para seu script.\n(p. ex. "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Favor fornecer um namespace válido para seu script.n(p. ex. "http://userscripts.org/users/useridnumber")
 newscript.exists=Um script com este nome já está instalado.\nSobrescrever?
diff --git a/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.dtd
index 0581b7f..9c4e3e8 100644
--- a/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Gerenciar Scripts de Usuário…">
 <!ENTITY menu.manage.accesskey "G">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Habilitado">
 <!ENTITY statusbar.enabled.accesskey "H">
 <!ENTITY install.title "Instalação do Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Você deve instalar somente scripts de fontes confiáveis.">
 <!ENTITY install.showscriptsource "Mostrar Código-Fonte do Script">
 <!ENTITY install.installbutton "Instalar">
+<!ENTITY loading "Baixando…">
 <!ENTITY newscript.name "Nome">
 <!ENTITY newscript.namespace "Namespace">
 <!ENTITY newscript.description "Descrição">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Scripts de Usuário">
 <!ENTITY Uninstall "Desinstalar">
 <!ENTITY AlsoUninstallPrefs "Desinstalar também configurações associadas">
+<!ENTITY UpdateChecking "Verificação de Atualizações">
+<!ENTITY EnableUpdateChecking "Habilitar verificação automática de atualizações dos scripts">
+<!ENTITY UpdateInterval "Número mínimo de dias entre verificações de atualização">
+<!ENTITY RequireSecureUpdates "Requisitar atualizações seguras">
 <!ENTITY greasemonkey.noscriptshere "Nenhum script instalado será executado nessa página.">
 <!ENTITY greasemonkey.youhavenoscripts "Você não possui nenhum script de usuário instalado">
 <!ENTITY greasemonkey.getuserscripts "Obter scripts de usuário">
diff --git a/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.properties
index 8ee04fa..2af04cf 100644
--- a/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/pt-BR/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Um Gerenciador de Scripts de Usuário para o Firefox
-error.matchPattern.parse=@match: Não foi possível analisar o padrão.
-error.matchPattern.scheme=@match: Esquema especificado inválido.
+error.downloadingUrl=Erro ao baixar a URL:
 error.matchPattern.host=@match: Host especificado inválido.
+error.matchPattern.parse=@match: Não foi possível analisar o padrão.
 error.matchPattern.path=@match: Caminho especificado inválida.
+error.matchPattern.scheme=@match: Esquema especificado inválido.
+error.parsingScript=Não foi possível verificar o script:
+error.serverReturned=O servidor retornou
+error.unknown=Erro desconhecido.
diff --git a/chrome/greasemonkey.jar!/locale/ro-RO/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ro-RO/gm-addons.dtd
index d444a7d..de8a69b 100644
--- a/chrome/greasemonkey.jar!/locale/ro-RO/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ro-RO/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Edit">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Edit this User Script">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Execute last">
 <!ENTITY ExecuteLater "Execute later">
 <!ENTITY ExecuteSooner "Execute sooner">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Move Down">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "Move To Bottom">
diff --git a/chrome/greasemonkey.jar!/locale/ro-RO/gm-browser.properties b/chrome/greasemonkey.jar!/locale/ro-RO/gm-browser.properties
index b09d669..9864e93 100644
--- a/chrome/greasemonkey.jar!/locale/ro-RO/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/ro-RO/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Please choose your preferred text editor first
 editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
 editor.could_not_launch=Could not launch editor.
 newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Please provide a valid namespace URI for your script.n(e.g. "http://userscripts.org/users/useridnumber")
 newscript.exists=A script with that name is already installed.\nOK to overwrite?
diff --git a/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.dtd
index 6a60d07..4743f11 100644
--- a/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Manage User Scripts...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Enabled">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey Installation">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "You should only install scripts from sources that you trust.">
 <!ENTITY install.showscriptsource "Show Script Source">
 <!ENTITY install.installbutton "Install">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Name">
 <!ENTITY newscript.namespace "Namespace">
 <!ENTITY newscript.description "Description">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "User Scripts">
 <!ENTITY Uninstall "Uninstall">
 <!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.properties
index 209a08b..cca4d5d 100644
--- a/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/ro-RO/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Un gestionar de seturi de comenzi ale utilizatorului pentru Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/ru-RU/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ru-RU/gm-addons.dtd
index b8cc1fe..543dfa2 100644
--- a/chrome/greasemonkey.jar!/locale/ru-RU/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ru-RU/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Изменить">
 <!ENTITY Edit.accesskey "з">
 <!ENTITY Edit.tooltip "Редактировать этот скрипт">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Выполнять последним">
 <!ENTITY ExecuteLater "Выполнять позднее">
 <!ENTITY ExecuteSooner "Выполнять ранее">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Переместить ниже">
 <!ENTITY MoveDown.accesskey "и">
 <!ENTITY MoveToBottom "Переместить в конец">
diff --git a/chrome/greasemonkey.jar!/locale/ru-RU/gm-browser.properties b/chrome/greasemonkey.jar!/locale/ru-RU/gm-browser.properties
index f73eb8f..7daf9ce 100644
--- a/chrome/greasemonkey.jar!/locale/ru-RU/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/ru-RU/gm-browser.properties
@@ -13,9 +13,9 @@ alert.fromURI=Загружается скрипт...
 alert.fromURI.failure=Невозможно загрузить скрипт
 alert.success=успешно установлен.
 alert.failure=Ошибка при установке скрипта:
-editor.prompt=Выберите текстовый редактор (напр. "c:\\windows\\notepad.exe")
+editor.prompt=Выберите текстовый редактор (напр. "c:windowsnotepad.exe")
 editor.please_pick_executable=Выберите приложение для редактирования скриптов.
 editor.could_not_launch=Невозможно запустить редактор.
 newscript.noname=Задайте имя для вашего скрипта.
 newscript.nonamespace=Задайте пространство для вашего скрипта.
-newscript.exists=Скрипт с таким же названием уже установлен.\nПерезаписать?
+newscript.exists=Скрипт с таким же названием уже установлен.nПерезаписать?
diff --git a/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.dtd
index 191e603..b33463c 100644
--- a/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "в">
 <!ENTITY menu.manage "Управление скриптами...">
 <!ENTITY menu.manage.accesskey "п">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Включить Greasemonkey">
 <!ENTITY statusbar.enabled.accesskey "к">
 <!ENTITY install.title "Установка скриптов Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Устанавливайте скрипты только из тех источников, которым вы доверяете.">
 <!ENTITY install.showscriptsource "Показать код скрипта">
 <!ENTITY install.installbutton "Начать установку">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Название">
 <!ENTITY newscript.namespace "Пространство имён">
 <!ENTITY newscript.description "Описание">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Пользовательские скрипты">
 <!ENTITY Uninstall "Удалить">
 <!ENTITY AlsoUninstallPrefs "Также удалить все связанные настройки">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.properties
index df3e441..a834df1 100644
--- a/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/ru-RU/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Менеджер пользовательских скриптов для Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/ru/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/ru/gm-addons.dtd
index cd59b7a..0082200 100644
--- a/chrome/greasemonkey.jar!/locale/ru/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/ru/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Изменить">
 <!ENTITY Edit.accesskey "з">
 <!ENTITY Edit.tooltip "Редактировать этот скрипт">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Выполнять последним">
 <!ENTITY ExecuteLater "Выполнять позднее">
 <!ENTITY ExecuteSooner "Выполнять ранее">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Переместить ниже">
 <!ENTITY MoveDown.accesskey "и">
 <!ENTITY MoveToBottom "Переместить в конец">
diff --git a/chrome/greasemonkey.jar!/locale/ru/gm-browser.properties b/chrome/greasemonkey.jar!/locale/ru/gm-browser.properties
index 09e7eec..39f0000 100644
--- a/chrome/greasemonkey.jar!/locale/ru/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/ru/gm-browser.properties
@@ -13,9 +13,9 @@ alert.fromURI=Скрипт загружается…
 alert.fromURI.failure=Невозможно загрузить скрипт
 alert.success=успешно установлен.
 alert.failure=Ошибка при установке скрипта:
-editor.prompt=Выберите текстовый редактор (напр. "c:\\windows\\notepad.exe")
+editor.prompt=Выберите текстовый редактор (напр. "c:windowsnotepad.exe")
 editor.please_pick_executable=Выберите приложение для редактирования скриптов.
 editor.could_not_launch=Невозможно запустить редактор.
 newscript.noname=Задайте имя для вашего скрипта.
 newscript.nonamespace=Задайте пространство для вашего скрипта.
-newscript.exists=Скрипт с таким именем уже установлен.\nПерезаписать?
+newscript.exists=Скрипт с таким именем уже установлен.nПерезаписать?
diff --git a/chrome/greasemonkey.jar!/locale/ru/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/ru/greasemonkey.dtd
index 84233d2..cfb42da 100644
--- a/chrome/greasemonkey.jar!/locale/ru/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/ru/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "с">
 <!ENTITY menu.manage "Управление скриптами...">
 <!ENTITY menu.manage.accesskey "п">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Включить Greasemonkey">
 <!ENTITY statusbar.enabled.accesskey "к">
 <!ENTITY install.title "Установка скриптов Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Устанавливайте скрипты только из доверенных источников.">
 <!ENTITY install.showscriptsource "Показать код скрипта">
 <!ENTITY install.installbutton "Начать установку">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "Название">
 <!ENTITY newscript.namespace "Пространство имен">
 <!ENTITY newscript.description "Описание">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Пользовательские скрипты">
 <!ENTITY Uninstall "Удаление">
 <!ENTITY AlsoUninstallPrefs "Также удалять настройки скриптов">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Для этой страницы нет скриптов">
 <!ENTITY greasemonkey.youhavenoscripts "У вас не установлено ни одного скрипта">
 <!ENTITY greasemonkey.getuserscripts "Скачать скрипты">
diff --git a/chrome/greasemonkey.jar!/locale/ru/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/ru/greasemonkey.properties
index df3e441..a834df1 100644
--- a/chrome/greasemonkey.jar!/locale/ru/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/ru/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Менеджер пользовательских скриптов для Firefox
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/si-LK/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/si-LK/gm-addons.dtd
index a3aa18f..b732eb2 100644
--- a/chrome/greasemonkey.jar!/locale/si-LK/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/si-LK/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "සංස්කරණය">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "මෙම පරිශීලක ස්ක්‍රිප්ටය සංස්කරණය කරන්න">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "අවසානයට ක්‍රියාකරවන්න">
 <!ENTITY ExecuteLater "පසුව ක්‍රියාත්මක කරන්න">
 <!ENTITY ExecuteSooner "ඉක්මනින් ක්‍රියාත්මක කරන්න">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "පහලට යවන්න">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "අවසානයට යවන්න">
diff --git a/chrome/greasemonkey.jar!/locale/si-LK/gm-browser.properties b/chrome/greasemonkey.jar!/locale/si-LK/gm-browser.properties
index 47ecc44..4f7a52f 100644
--- a/chrome/greasemonkey.jar!/locale/si-LK/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/si-LK/gm-browser.properties
@@ -18,4 +18,4 @@ editor.please_pick_executable=පරිශීලක ස්ක්‍රිප්
 editor.could_not_launch=වදන් සකසනය (Editor) ක්‍රියාත්මක කල නොහැක
 newscript.noname=කරුනාකර ඔබගේ ස්ක්‍රිප්ටයට නමක් ලබාදෙන්න
 newscript.nonamespace=කරුනාකර ඔබගේ පරිශීලක ස්ක්‍රිටයට වලංගු නාමාවකාශය URI යක් ලබාදෙන්න (උ.දා. "http://userscripts.org/users/useridnumber")
-newscript.exists=මෙම නමින් දැනටමත් වෙන ස්ක්‍රිප්ටයක් පවතී.\nඋඩින් ලිවීම සදහා OK  ක්ලික් කරන්න ?
+newscript.exists=මෙම නමින් දැනටමත් වෙන ස්ක්‍රිප්ටයක් පවතී.nඋඩින් ලිවීම සදහා OK  ක්ලික් කරන්න ?
diff --git a/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.dtd
index 7f0d573..4de4239 100644
--- a/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "පරිශීලක ස්ක්‍රිප්ට් කලමනාකරනය කරන්න">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "ක්‍රියාත්මකයි">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey ස්ථාපනය">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "ඔබට මූලය (Source) විශ්වාසනම් පමනක් ස්ක්‍රිප්ට්ය ස්ථාපනය කරන්න.">
 <!ENTITY install.showscriptsource "ස්ක්‍රිප්ටයෙහි මූලය පෙන්වන්න">
 <!ENTITY install.installbutton "ස්ථාපනය">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "නම">
 <!ENTITY newscript.namespace "නාමාවකාශය">
 <!ENTITY newscript.description "විස්තරය">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "පරිශීලක ස්ක්‍රිප්ට්">
 <!ENTITY Uninstall "ඉවත් කරන්න">
 <!ENTITY AlsoUninstallPrefs "එසේම ආශ්‍රිත අභිමතද ඉවත් කරන්න">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "No installed scripts run on this page.">
 <!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
 <!ENTITY greasemonkey.getuserscripts "Get user scripts">
diff --git a/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.properties
index 726fa11..8a17c43 100644
--- a/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/si-LK/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=ගිනිහිවලා සදහා පරිශීලක ස්ක්‍රිප්ට් පරිපාලකයකි
-error.matchPattern.parse=@match: Could not parse the pattern.
-error.matchPattern.scheme=@match: Invalid scheme specified.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@match: Invalid host specified.
+error.matchPattern.parse=@match: Could not parse the pattern.
 error.matchPattern.path=@match: Invalid path specified.
+error.matchPattern.scheme=@match: Invalid scheme specified.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/sr/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/sr/gm-addons.dtd
index 5eae54a..a547c34 100644
--- a/chrome/greasemonkey.jar!/locale/sr/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/sr/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Уреди">
 <!ENTITY Edit.accesskey "У">
 <!ENTITY Edit.tooltip "Уреди ову корисничку скрипту">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Изврши последњу">
 <!ENTITY ExecuteLater "Изврши касније">
 <!ENTITY ExecuteSooner "Изврши раније">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Помери надоле">
 <!ENTITY MoveDown.accesskey "Д">
 <!ENTITY MoveToBottom "Помери на крај">
diff --git a/chrome/greasemonkey.jar!/locale/sr/gm-browser.properties b/chrome/greasemonkey.jar!/locale/sr/gm-browser.properties
index a08f791..c12a2dc 100644
--- a/chrome/greasemonkey.jar!/locale/sr/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/sr/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Прво изаберите жељени уређивач текс
 editor.please_pick_executable=Изаберите извршну датотеку програма којег желите користити за уређивање корисничких скрипти.
 editor.could_not_launch=Није могуће покренути уређивач.
 newscript.noname=Унесите назив своје скрипте.
-newscript.nonamespace=Унесите важећу адресу ваше скрипте.\n(нпр. http://userscripts.org/users/useridnumber)
+newscript.nonamespace=Унесите важећу адресу ваше скрипте.n(нпр. http://userscripts.org/users/useridnumber)
 newscript.exists=Скрипта са тим именом већ постоји. Желите ли да је препишете?
diff --git a/chrome/greasemonkey.jar!/locale/sr/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/sr/greasemonkey.dtd
index 9548102..080d1e1 100644
--- a/chrome/greasemonkey.jar!/locale/sr/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/sr/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "Н">
 <!ENTITY menu.manage "Управљање корисничким скриптама…">
 <!ENTITY menu.manage.accesskey "У">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Омогућен">
 <!ENTITY statusbar.enabled.accesskey "о">
 <!ENTITY install.title "Greasemonkey - инсталација">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Скрипте требате инсталирати само са проверених извора.">
 <!ENTITY install.showscriptsource "Прикажи изворни кôд скрипте">
 <!ENTITY install.installbutton "Инсталирај">
+<!ENTITY loading "Преузимање...">
 <!ENTITY newscript.name "Име">
 <!ENTITY newscript.namespace "Namespace">
 <!ENTITY newscript.description "Опис">
@@ -29,9 +32,13 @@
 <!ENTITY userscripts "Корисничке скрипте">
 <!ENTITY Uninstall "Уклони">
 <!ENTITY AlsoUninstallPrefs "Уклони и подешавања">
-<!ENTITY greasemonkey.noscriptshere "Ни једна скрипта се не покреће на овој станици">
+<!ENTITY UpdateChecking "Проверавање ажурирања">
+<!ENTITY EnableUpdateChecking "Омогући аутоматско ажурирање скрипти">
+<!ENTITY UpdateInterval "Најмањи број који прође између две провере ажурирања">
+<!ENTITY RequireSecureUpdates "Тражи безбедносна ажурирања">
+<!ENTITY greasemonkey.noscriptshere "Ниједна скрипта се не покреће на овој станици">
 <!ENTITY greasemonkey.youhavenoscripts "Није инсталирана ни једна корисничка скрипта">
-<!ENTITY greasemonkey.getuserscripts "Набави коприсничке скрипте">
+<!ENTITY greasemonkey.getuserscripts "Набави корисничке скрипте">
 <!ENTITY scriptprefs.title "Подешавања корисничких скрипти за Greasemonkey">
 <!ENTITY scriptprefs.usersettings "Корисничка подешавања">
 <!ENTITY scriptprefs.scriptsettings "Подешавања скрипте">
diff --git a/chrome/greasemonkey.jar!/locale/sr/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/sr/greasemonkey.properties
index 7a32ff6..b49fccc 100644
--- a/chrome/greasemonkey.jar!/locale/sr/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/sr/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Управљач корисничким скриптама
-error.matchPattern.parse=@match: није могуће рашчланити образац
-error.matchPattern.scheme=@match: неисправна назначена шема
+error.downloadingUrl=Грешка приликом преузимања адресе:
 error.matchPattern.host=@match: неисправан назначени хост
+error.matchPattern.parse=@match: није могуће рашчланити образац
 error.matchPattern.path=@match:  неисправна назначена путања
+error.matchPattern.scheme=@match: неисправна назначена шема
+error.parsingScript=Није могуће рашчланити скрипту:
+error.serverReturned=Сервер вратио
+error.unknown=Непозната грешка.
diff --git a/chrome/greasemonkey.jar!/locale/sv-SE/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/sv-SE/gm-addons.dtd
index 3967ecf..4eb20de 100644
--- a/chrome/greasemonkey.jar!/locale/sv-SE/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/sv-SE/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Sök efter uppdateringar automatiskt">
+<!ENTITY CheckUpdates.accesskey "u">
 <!ENTITY Edit "Redigera">
 <!ENTITY Edit.accesskey "R">
 <!ENTITY Edit.tooltip "Redigera detta användarskript">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Kör sist">
 <!ENTITY ExecuteLater "Kör senare">
 <!ENTITY ExecuteSooner "Kör tidigare">
+<!ENTITY FindUpdate "Sök efter uppdatering">
+<!ENTITY InstallUpdate "Installera uppdatering">
 <!ENTITY MoveDown "Flytta nedåt">
 <!ENTITY MoveDown.accesskey "n">
 <!ENTITY MoveToBottom "Flytta nederst">
@@ -21,13 +25,13 @@
 <!ENTITY Sort.Status "Status">
 <!ENTITY Sort.ByName "Sortera efter namn">
 <!ENTITY Sort.Name "Namn">
-<!ENTITY Sort.ByExecution "Sortera efter tillämpningsordning">
-<!ENTITY Sort.Execution "Tillämpningsordning">
+<!ENTITY Sort.ByExecution "Sortera efter körningsordning">
+<!ENTITY Sort.Execution "Körningsordning">
 <!ENTITY SortScripts "Sortera skript">
 <!ENTITY SortScripts.accesskey "o">
 <!ENTITY UninstallCancel "Avbryt avinstallation">
 <!ENTITY UninstallCancel.accesskey "v">
 <!ENTITY UninstallCancel.tooltip "Avbryter avinstallationen av detta användarskript">
-<!ENTITY UninstallCancelDescription "Detta användarskript kommer att avinstalleras när dialogen stängs.  (Eller högerklicka och välj "Avinstallera nu".)">
+<!ENTITY UninstallCancelDescription "Detta användarskript kommer att avinstalleras när dialogen stängs. (Eller högerklicka och välj "Avinstallera nu".)">
 <!ENTITY UninstallNow "Avinstallera nu">
 <!ENTITY UninstallNow.accesskey "A">
diff --git a/chrome/greasemonkey.jar!/locale/sv-SE/gm-browser.properties b/chrome/greasemonkey.jar!/locale/sv-SE/gm-browser.properties
index 591a5f2..96e2d45 100644
--- a/chrome/greasemonkey.jar!/locale/sv-SE/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/sv-SE/gm-browser.properties
@@ -4,18 +4,18 @@ menuitem.install=Installera detta användarskript…
 tooltip.disabled=Greasemonkey är inaktiverat.
 tooltip.enabled=Greasemonkey är aktiverat.
 tooltip.loading=Läser in…
-statusbar.installed=installationen har slutförts
+statusbar.installed=har installerats
 install.msg=Du håller på att installera följande Greasemonkey-användarskript:
 greeting.msg=Det här är ett Greasemonkey-användarskript. klicka på Installera för att börja använda det.
 greeting.btn=Installera
 greeting.btnAccess=I
-alert.fromURI=Laddar ner användarskript…
-alert.fromURI.failure=Kunde inte ladda ner användarskript
+alert.fromURI=Hämtar användarskript…
+alert.fromURI.failure=Det gick inte att hämta användarskriptet
 alert.success=Installationen har slutförts.
 alert.failure=Fel under installation av användarskript:
 editor.prompt=Var vänlig välj först det textredigeringsprogram du föredrar
 editor.please_pick_executable=Var vänlig välj ett körbart program att använda till att redigera användarskript.
 editor.could_not_launch=Kunde inte starta redigeringsprogrammet.
 newscript.noname=Var vänlig ange ett namn på ditt skript.
-newscript.nonamespace=Var vänlig ange en giltig namnrymds-URI för ditt skript.\n(t.ex. "http://userscripts.org/users/användarensidnummer")
+newscript.nonamespace=Var vänlig ange en giltig namnrymds-URI för ditt skript.n(t.ex. "http://userscripts.org/users/användarensIDnummer")
 newscript.exists=Ett skript med det namnet har redan installerats.\nSkall det ersättas?
diff --git a/chrome/greasemonkey.jar!/locale/sv-SE/gm-cludes.dtd b/chrome/greasemonkey.jar!/locale/sv-SE/gm-cludes.dtd
index faead98..9f8ceea 100644
--- a/chrome/greasemonkey.jar!/locale/sv-SE/gm-cludes.dtd
+++ b/chrome/greasemonkey.jar!/locale/sv-SE/gm-cludes.dtd
@@ -1,12 +1,12 @@
-<!ENTITY promptForNewPage.msg "Skriv in en ny adress nedan. Du kan specifiera flera sidor med jokertecknet (*).">
+<!ENTITY promptForNewPage.msg "Skriv in en ny adress nedan. Du kan inkludera flera sidor med jokertecknet (*).">
 <!ENTITY promptForNewPage.title "Lägg till sida">
-<!ENTITY promptForNewPage.defVal "http://example.com/*">
-<!ENTITY promptForEdit.msg "Modifiera adressen av sidan nedan. Du kan specifiera flera sidor med jokertecknet (*).">
+<!ENTITY promptForNewPage.defVal "http://exempel.se/*">
+<!ENTITY promptForEdit.msg "Ändra adressen för sidan nedan. Du kan inkludera flera sidor med jokertecknet (*).">
 <!ENTITY promptForEdit.title "Redigera sida">
-<!ENTITY button.add "Lägg till...">
-<!ENTITY button.addUserExclude "Lägg till som användarundantagen">
-<!ENTITY button.addUserInclude "Lägg till som användarinkluderad">
-<!ENTITY button.edit "Redigera...">
+<!ENTITY button.add "Lägg till…">
+<!ENTITY button.addUserExclude "Lägg till som användarundantag">
+<!ENTITY button.addUserInclude "Lägg till som användarinkludering">
+<!ENTITY button.edit "Redigera…">
 <!ENTITY button.remove "Ta bort">
 <!ENTITY label.grpIncluded "Inkluderade sidor">
 <!ENTITY label.grpExcluded "Undantagna sidor">
diff --git a/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.dtd
index 991377a..7950c05 100644
--- a/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Hantera användarskript…">
 <!ENTITY menu.manage.accesskey "H">
+<!ENTITY menu.options "Inställningar för Greasemonkey…">
+<!ENTITY menu.options.accesskey "I">
 <!ENTITY statusbar.enabled "Aktiverat">
 <!ENTITY statusbar.enabled.accesskey "A">
 <!ENTITY install.title "Installation av Greasemonkey">
@@ -18,17 +20,22 @@
 <!ENTITY install.warning2 "Du bör endast installera skript från källor som du litar på.">
 <!ENTITY install.showscriptsource "Visa skriptkällkod">
 <!ENTITY install.installbutton "Installera">
+<!ENTITY loading "Hämtar…">
 <!ENTITY newscript.name "Namn">
 <!ENTITY newscript.namespace "Namnrymd">
 <!ENTITY newscript.description "Beskrivning">
-<!ENTITY newscript.includes "Inkluderar (ett per rad)">
-<!ENTITY newscript.excludes "Undantar (ett per rad)">
+<!ENTITY newscript.includes "Inkluderingar (ett per rad)">
+<!ENTITY newscript.excludes "Undantag (ett per rad)">
 <!ENTITY options.editor "Redigeringsprogram">
 <!ENTITY options.changeEditor "Byt redigeringsprogram">
 <!ENTITY options.globalExcludes "Globala undantag">
 <!ENTITY userscripts "Användarskript">
 <!ENTITY Uninstall "Avinstallera">
 <!ENTITY AlsoUninstallPrefs "Avinstallera även associerade inställningar">
+<!ENTITY UpdateChecking "Uppdateringskontroll">
+<!ENTITY EnableUpdateChecking "Aktivera automatisk uppdateringskontroll av skript">
+<!ENTITY UpdateInterval "Minsta antal dagar mellan två uppdateringskontroller">
+<!ENTITY RequireSecureUpdates "Kräv säkra uppdateringar">
 <!ENTITY greasemonkey.noscriptshere "Inga installerade skript körs på denna sida.">
 <!ENTITY greasemonkey.youhavenoscripts "Du har inga installerade användarskript">
 <!ENTITY greasemonkey.getuserscripts "Hämta användarskript">
diff --git a/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.properties
index 659c132..117cd83 100644
--- a/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/sv-SE/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=En användarskripthanterare för Firefox
-error.matchPattern.parse=@match: Det gick inte att parsa mönstret.
-error.matchPattern.scheme=@match: Ett ogiltigt schema har angivits.
+error.downloadingUrl=Felaktig hämtnings-URL:
 error.matchPattern.host=@match: En ogiltig värd har angivits.
+error.matchPattern.parse=@match: Det gick inte att parsa mönstret.
 error.matchPattern.path=@match: En ogiltig sökväg har angivits.
+error.matchPattern.scheme=@match: Ett ogiltigt schema har angivits.
+error.parsingScript=Det gick inte att parsa skriptet:
+error.serverReturned=Servern returnerade
+error.unknown=Okänt fel.
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd
index 030e6f5..c0bdf6e 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/tr-TR/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "Düzenle">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "Bu Kullanıcı Betiğini Düzenle">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Son Yürüt">
 <!ENTITY ExecuteLater "Sonra yürüt">
 <!ENTITY ExecuteSooner "Er geç yürüt">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "Aşağı Taşı">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "En alta Taşı">
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties b/chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties
index 7a472c1..2693fed 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/tr-TR/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=Lütfen önce tercih edilen metin editörünü seçin
 editor.please_pick_executable=Lütfen kullanıcı betiklerini düzenlemek için çalıştırılabilir bir uygulama alın.
 editor.could_not_launch=Editör başlatılamadı.
 newscript.noname=Betiğinize bir isim verin.
-newscript.nonamespace=Betiğiniz için geçerli bir URL verin.\n(örneğin "http://userscripts.org/users/useridnumber")
+newscript.nonamespace=Betiğiniz için geçerli bir URL verin.n(örneğin "http://userscripts.org/users/useridnumber")
 newscript.exists=Bu isimde bir betik zaten yüklü.\nÜzerine yazılsın mı?
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd
index 60e5e05..57bbdf1 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "Kullanıcı Betiklerini Yönet...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "Etkin">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey Kurulumu">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Yalnızca güvendiğiniz kaynaklardan gelen betikleri yükleyin.">
 <!ENTITY install.showscriptsource "Betik Kaynağını Göster">
 <!ENTITY install.installbutton "Kur">
+<!ENTITY loading "Downloading ...">
 <!ENTITY newscript.name "İsim">
 <!ENTITY newscript.namespace "İsim alanı">
 <!ENTITY newscript.description "Tanım">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Kullanıcı Betikleri">
 <!ENTITY Uninstall "Kaldır">
 <!ENTITY AlsoUninstallPrefs "Ayrıca ilişkili tercihleri kaldır">
+<!ENTITY UpdateChecking "Update Checking">
+<!ENTITY EnableUpdateChecking "Enable automatic update checking of scripts">
+<!ENTITY UpdateInterval "Minimum number of days between update checks">
+<!ENTITY RequireSecureUpdates "Require secure updates">
 <!ENTITY greasemonkey.noscriptshere "Bu sayfada çalışan yüklenmiş betikler yok">
 <!ENTITY greasemonkey.youhavenoscripts "Yüklü bir kullanıcı betiğiniz yok">
 <!ENTITY greasemonkey.getuserscripts "Kullanıcı betikleri al">
diff --git a/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.properties
index 09ead4f..5b60e27 100644
--- a/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/tr-TR/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Firefox için Bir Kullanıcı Betik Yöneticisi
-error.matchPattern.parse=@eşleşme: Desen ayrıştırılamadı.
-error.matchPattern.scheme=@eşleşme: Belirtilen düzen geçersiz.
+error.downloadingUrl=Error downloading URL:
 error.matchPattern.host=@eşleşme: Belirtilen ana bilgisayar geçersiz.
+error.matchPattern.parse=@eşleşme: Desen ayrıştırılamadı.
 error.matchPattern.path=@eşleşme: Belirtilen yol geçersiz.
+error.matchPattern.scheme=@eşleşme: Belirtilen düzen geçersiz.
+error.parsingScript=Could not parse script:
+error.serverReturned=Server returned
+error.unknown=Unknown error.
diff --git a/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.dtd
index d444a7d..59a2f8d 100644
--- a/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.dtd
@@ -1,33 +1,37 @@
-<!ENTITY Edit "Edit">
-<!ENTITY Edit.accesskey "E">
-<!ENTITY Edit.tooltip "Edit this User Script">
-<!ENTITY ExecuteFirst "Execute first">
-<!ENTITY ExecuteLast "Execute last">
-<!ENTITY ExecuteLater "Execute later">
-<!ENTITY ExecuteSooner "Execute sooner">
-<!ENTITY MoveDown "Move Down">
-<!ENTITY MoveDown.accesskey "D">
-<!ENTITY MoveToBottom "Move To Bottom">
-<!ENTITY MoveToBottom.accesskey "B">
-<!ENTITY MoveToTop "Move To Top">
-<!ENTITY MoveToTop.accesskey "T">
-<!ENTITY MoveUp "Move Up">
-<!ENTITY MoveUp.accesskey "U">
-<!ENTITY NewScript "Create New Script">
-<!ENTITY NewScript.accesskey "C">
-<!ENTITY Show "Show Containing Folder">
-<!ENTITY Show.accesskey "S">
-<!ENTITY Sort.ByStatus "Sort by status">
-<!ENTITY Sort.Status "Status">
-<!ENTITY Sort.ByName "Sort by name">
-<!ENTITY Sort.Name "Name">
-<!ENTITY Sort.ByExecution "Sort by execution order">
-<!ENTITY Sort.Execution "Execution Order">
-<!ENTITY SortScripts "Sort Scripts">
-<!ENTITY SortScripts.accesskey "S">
-<!ENTITY UninstallCancel "Cancel Uninstall">
-<!ENTITY UninstallCancel.accesskey "C">
-<!ENTITY UninstallCancel.tooltip "Cancel uninstallation of this User Script">
-<!ENTITY UninstallCancelDescription "This User Script will be uninstalled when the dialog closes.  (Or right click for "Uninstall Now".)">
-<!ENTITY UninstallNow "Uninstall Now">
-<!ENTITY UninstallNow.accesskey "N">
+<!ENTITY CheckUpdates "Автоматично перевіряти оновлення">
+<!ENTITY CheckUpdates.accesskey "о">
+<!ENTITY Edit "Редагувати">
+<!ENTITY Edit.accesskey "Р">
+<!ENTITY Edit.tooltip "Редагувати цей скрипт">
+<!ENTITY ExecuteFirst "Виконувати першим">
+<!ENTITY ExecuteLast "Виконувати останнім">
+<!ENTITY ExecuteLater "Виконувати пізніше">
+<!ENTITY ExecuteSooner "Виконувати раніше">
+<!ENTITY FindUpdate "Пошук оновлення">
+<!ENTITY InstallUpdate "Встановити оновлення">
+<!ENTITY MoveDown "Нижче">
+<!ENTITY MoveDown.accesskey "Н">
+<!ENTITY MoveToBottom "Донизу">
+<!ENTITY MoveToBottom.accesskey "Д">
+<!ENTITY MoveToTop "Догори">
+<!ENTITY MoveToTop.accesskey "о">
+<!ENTITY MoveUp "Вище">
+<!ENTITY MoveUp.accesskey "щ">
+<!ENTITY NewScript "Створити новий скрипт">
+<!ENTITY NewScript.accesskey "т">
+<!ENTITY Show "Показати теку, що містить скрипт">
+<!ENTITY Show.accesskey "к">
+<!ENTITY Sort.ByStatus "Сортувати за станом">
+<!ENTITY Sort.Status "Стан">
+<!ENTITY Sort.ByName "Сортувати за назвою">
+<!ENTITY Sort.Name "Назва">
+<!ENTITY Sort.ByExecution "Сортувати за порядком виконання">
+<!ENTITY Sort.Execution "Порядок виконання">
+<!ENTITY SortScripts "Сортувати скрипти">
+<!ENTITY SortScripts.accesskey "у">
+<!ENTITY UninstallCancel "Скасувати вилучення">
+<!ENTITY UninstallCancel.accesskey "л">
+<!ENTITY UninstallCancel.tooltip "Скасувати вилучення цього скрипту">
+<!ENTITY UninstallCancelDescription "Цей скрипт буде вилучено після закриття цього повідомлення (клацання правою кнопкою миші, щоб "вилучити негайно").">
+<!ENTITY UninstallNow "Вилучити негайно">
+<!ENTITY UninstallNow.accesskey "ч">
diff --git a/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.properties b/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.properties
index 2a65eb8..8ebf375 100644
--- a/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.properties
+++ b/chrome/greasemonkey.jar!/locale/uk-UA/gm-addons.properties
@@ -1,2 +1,2 @@
-executionorder=Execution Order
-executionorder.tooltip=Sort by execution order
+executionorder=Порядок виконання
+executionorder.tooltip=Сортувати за порядком виконання
diff --git a/chrome/greasemonkey.jar!/locale/uk-UA/gm-browser.properties b/chrome/greasemonkey.jar!/locale/uk-UA/gm-browser.properties
index 81d47ad..22d6074 100644
--- a/chrome/greasemonkey.jar!/locale/uk-UA/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/uk-UA/gm-browser.properties
@@ -1,21 +1,21 @@
-menuitem.manage=Manage User Scripts
-menuitem.new=New User Script
-menuitem.install=Install This User Script...
-tooltip.disabled=Greasemonkey is disabled.
-tooltip.enabled=Greasemonkey is enabled.
-tooltip.loading=Loading...
-statusbar.installed=installed successfully
-install.msg=You are about to install the following Greasemonkey user script:
-greeting.msg=This is a Greasemonkey user script. Click install to start using it.
-greeting.btn=Install
-greeting.btnAccess=I
-alert.fromURI=Downloading user script...
-alert.fromURI.failure=Could not download user script
-alert.success=Installed successfully.
-alert.failure=Error installing user script:
-editor.prompt=Please choose your preferred text editor first
-editor.please_pick_executable=Please pick an executable application to use to edit user scripts.
-editor.could_not_launch=Could not launch editor.
-newscript.noname=Please provide a name for your script.
-newscript.nonamespace=Please provide a valid namespace URI for your script.\n(e.g. "http://userscripts.org/users/useridnumber")
-newscript.exists=A script with that name is already installed.\nOK to overwrite?
+menuitem.manage=Керування скриптами
+menuitem.new=Новий скрипт
+menuitem.install=Встановити скрипт…
+tooltip.disabled=Greasemonkey вимкнено.
+tooltip.enabled=Greasemonkey увімкнено.
+tooltip.loading=Завантаження…
+statusbar.installed=успішно встановлено
+install.msg=Ви намагаєтесь встановити наступний скрипт Greasemonkey:
+greeting.msg=Це скрипт Greasemonkey. Натисніть «Встановити», щоб почати його використовувати.
+greeting.btn=Встановити
+greeting.btnAccess=В
+alert.fromURI=Завантажується скрипт…
+alert.fromURI.failure=Неможливо завантажити скрипт
+alert.success=успішно встановлено.
+alert.failure=Помилка під час встановлення скрипту:
+editor.prompt=Виберіть текстовий редактор (напр. "c:\windows\notepad.exe")
+editor.please_pick_executable=Будь ласка, вкажіть програму, котрою редагувати скрипти.
+editor.could_not_launch=Не можу запустити редактора.
+newscript.noname=Будь ласка, назвіть ваш скрипт.
+newscript.nonamespace=Будь ласка, вкажіть простір імен для вашого скрипту.n(напр. "http://userscripts.org/users/номер")
+newscript.exists=Скрипт з таким іменем вже встановлено.\nБажаєте перезаписати?
diff --git a/chrome/greasemonkey.jar!/locale/uk-UA/gm-cludes.dtd b/chrome/greasemonkey.jar!/locale/uk-UA/gm-cludes.dtd
index 9a397ff..c400fa3 100644
--- a/chrome/greasemonkey.jar!/locale/uk-UA/gm-cludes.dtd
+++ b/chrome/greasemonkey.jar!/locale/uk-UA/gm-cludes.dtd
@@ -1,12 +1,12 @@
-<!ENTITY promptForNewPage.msg "Нижче введіть нову адресу. Ви можете вказувати множини адрес за допомогою символу зірочка (*).">
+<!ENTITY promptForNewPage.msg "Введіть нову адресу. Ви можете вказувати множини адрес за допомогою символу зірочка (*).">
 <!ENTITY promptForNewPage.title "Додати адресу сторінки">
 <!ENTITY promptForNewPage.defVal "http://site.org.ua/*">
-<!ENTITY promptForEdit.msg "Нижче змініть адресу сторінки. Ви можете вказувати множини адрес за допомогою символу зірочка (*).">
+<!ENTITY promptForEdit.msg "Змініть адресу сторінки. Ви можете вказувати множини адрес за допомогою символу зірочка (*).">
 <!ENTITY promptForEdit.title "Редагувати сторінку">
-<!ENTITY button.add "Додати…">
+<!ENTITY button.add "Додати...">
 <!ENTITY button.addUserExclude "Додати як користувацький виняток">
 <!ENTITY button.addUserInclude "Додати як користувацьке включення">
-<!ENTITY button.edit "Редагувати…">
+<!ENTITY button.edit "Редагувати...">
 <!ENTITY button.remove "Вилучити">
 <!ENTITY label.grpIncluded "Охоплені сторінки">
 <!ENTITY label.grpExcluded "Сторінки-винятки">
diff --git a/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.dtd
index e38b1da..4df17ed 100644
--- a/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.dtd
@@ -1,37 +1,44 @@
-<!ENTITY menu.install "Install User Script...">
-<!ENTITY menu.install.accesskey "I">
-<!ENTITY menu.show "View User Script Source">
-<!ENTITY menu.show.accesskey "V">
-<!ENTITY menu.commands "User Script Commands...">
-<!ENTITY menu.commands.accesskey "C">
-<!ENTITY menu.new "New User Script...">
-<!ENTITY menu.new.accesskey "N">
-<!ENTITY menu.manage "Manage User Scripts...">
-<!ENTITY menu.manage.accesskey "M">
-<!ENTITY statusbar.enabled "Enabled">
-<!ENTITY statusbar.enabled.accesskey "E">
-<!ENTITY install.title "Greasemonkey Installation">
-<!ENTITY install.runson "runs on:">
+<!ENTITY menu.install "Встановити скрипт…">
+<!ENTITY menu.install.accesskey "В">
+<!ENTITY menu.show "Переглянути початковий код скрипту">
+<!ENTITY menu.show.accesskey "П">
+<!ENTITY menu.commands "Команди скрипту…">
+<!ENTITY menu.commands.accesskey "К">
+<!ENTITY menu.new "Новий скрипт…">
+<!ENTITY menu.new.accesskey "Н">
+<!ENTITY menu.manage "Керування скриптами…">
+<!ENTITY menu.manage.accesskey "е">
+<!ENTITY menu.options "Налаштування Greasemonkey...">
+<!ENTITY menu.options.accesskey "л">
+<!ENTITY statusbar.enabled "Увімкнено">
+<!ENTITY statusbar.enabled.accesskey "У">
+<!ENTITY install.title "Встановлення Greasemonkey">
+<!ENTITY install.runson "Працює на:">
 <!ENTITY install.matches "збіги:">
-<!ENTITY install.butnoton "does not run on:">
-<!ENTITY install.warning1 "Malicious scripts can violate your privacy and act on your behalf without your knowledge.">
-<!ENTITY install.warning2 "You should only install scripts from sources that you trust.">
-<!ENTITY install.showscriptsource "Show Script Source">
-<!ENTITY install.installbutton "Install">
-<!ENTITY newscript.name "Name">
-<!ENTITY newscript.namespace "Namespace">
-<!ENTITY newscript.description "Description">
-<!ENTITY newscript.includes "Includes (One per line)">
-<!ENTITY newscript.excludes "Excludes (One per line)">
-<!ENTITY options.editor "Editor">
-<!ENTITY options.changeEditor "Change Editor">
+<!ENTITY install.butnoton "Не працює на:">
+<!ENTITY install.warning1 "Сумнівні скрипти можуть порушити вашу конфіденційність без вашого відома!">
+<!ENTITY install.warning2 "Встановлюйте скрипти тільки з тих джерел, яким довіряєте.">
+<!ENTITY install.showscriptsource "Показати початковий код скрипту">
+<!ENTITY install.installbutton "Встановити">
+<!ENTITY loading "Завантаження...">
+<!ENTITY newscript.name "Ім’я">
+<!ENTITY newscript.namespace "Простір імен">
+<!ENTITY newscript.description "Опис">
+<!ENTITY newscript.includes "Охоплення (одне на рядок)">
+<!ENTITY newscript.excludes "Винятки (один на рядок)">
+<!ENTITY options.editor "Редактор">
+<!ENTITY options.changeEditor "Змінити редактор">
 <!ENTITY options.globalExcludes "Глобальні винятки">
-<!ENTITY userscripts "User Scripts">
-<!ENTITY Uninstall "Uninstall">
-<!ENTITY AlsoUninstallPrefs "Also uninstall associated preferences">
+<!ENTITY userscripts "Скрипти">
+<!ENTITY Uninstall "Вилучити">
+<!ENTITY AlsoUninstallPrefs "Вилучити також пов'язані налаштування">
+<!ENTITY UpdateChecking "Перевірка оновлень">
+<!ENTITY EnableUpdateChecking "Увімкнути автоматичну перевірку оновлень для скриптів">
+<!ENTITY UpdateInterval "Інтервал між перевірками (днів)">
+<!ENTITY RequireSecureUpdates "Вимагати безпечних оновлень">
 <!ENTITY greasemonkey.noscriptshere "Жоден зі встановлених скриптів не працює на цій сторінці.">
-<!ENTITY greasemonkey.youhavenoscripts "You don't have any user scripts installed">
-<!ENTITY greasemonkey.getuserscripts "Get user scripts">
+<!ENTITY greasemonkey.youhavenoscripts "Жодних скриптів не встановлено">
+<!ENTITY greasemonkey.getuserscripts "Отримати користувацькі скрипти">
 <!ENTITY scriptprefs.title "Налаштування користувацьких скриптів Greasemonkey - !!">
 <!ENTITY scriptprefs.usersettings "Налаштування">
 <!ENTITY scriptprefs.scriptsettings "Налаштування скрипту">
diff --git a/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.properties
index 335a9e9..fc1f65d 100644
--- a/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/uk-UA/greasemonkey.properties
@@ -1,5 +1,9 @@
-extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=A User Script Manager for Firefox
-error.matchPattern.parse=@match: Неможливо обробити шаблон.
-error.matchPattern.scheme=@match: Вказано неправильну схему.
+extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Керівник скриптами у Firefox
+error.downloadingUrl=Помилка завантаження адреси:
 error.matchPattern.host=@match: Вказано неправильний хост.
+error.matchPattern.parse=@match: Неможливо обробити шаблон.
 error.matchPattern.path=@match: Вказано неправильний шлях.
+error.matchPattern.scheme=@match: Вказано неправильну схему.
+error.parsingScript=Неможливо обробити скрипт:
+error.serverReturned=Відповідь сервера
+error.unknown=Невідома помилка.
diff --git a/chrome/greasemonkey.jar!/locale/uk/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/uk/gm-addons.dtd
index 3c7463a..59a2f8d 100644
--- a/chrome/greasemonkey.jar!/locale/uk/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/uk/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Автоматично перевіряти оновлення">
+<!ENTITY CheckUpdates.accesskey "о">
 <!ENTITY Edit "Редагувати">
 <!ENTITY Edit.accesskey "Р">
 <!ENTITY Edit.tooltip "Редагувати цей скрипт">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "Виконувати останнім">
 <!ENTITY ExecuteLater "Виконувати пізніше">
 <!ENTITY ExecuteSooner "Виконувати раніше">
+<!ENTITY FindUpdate "Пошук оновлення">
+<!ENTITY InstallUpdate "Встановити оновлення">
 <!ENTITY MoveDown "Нижче">
 <!ENTITY MoveDown.accesskey "Н">
 <!ENTITY MoveToBottom "Донизу">
diff --git a/chrome/greasemonkey.jar!/locale/uk/gm-browser.properties b/chrome/greasemonkey.jar!/locale/uk/gm-browser.properties
index 6c20c5d..22d6074 100644
--- a/chrome/greasemonkey.jar!/locale/uk/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/uk/gm-browser.properties
@@ -13,9 +13,9 @@ alert.fromURI=Завантажується скрипт…
 alert.fromURI.failure=Неможливо завантажити скрипт
 alert.success=успішно встановлено.
 alert.failure=Помилка під час встановлення скрипту:
-editor.prompt=Виберіть текстовий редактор (напр. "c:\\windows\\notepad.exe")
-editor.please_pick_executable=Будь ласка вкажіть програму котрою редагувати скрипти.
+editor.prompt=Виберіть текстовий редактор (напр. "c:\windows\notepad.exe")
+editor.please_pick_executable=Будь ласка, вкажіть програму, котрою редагувати скрипти.
 editor.could_not_launch=Не можу запустити редактора.
 newscript.noname=Будь ласка, назвіть ваш скрипт.
-newscript.nonamespace=Будь ласка, вкажіть простір імен для вашого скрипту.\n(напр. "http://userscripts.org/users/номер")
+newscript.nonamespace=Будь ласка, вкажіть простір імен для вашого скрипту.n(напр. "http://userscripts.org/users/номер")
 newscript.exists=Скрипт з таким іменем вже встановлено.\nБажаєте перезаписати?
diff --git a/chrome/greasemonkey.jar!/locale/uk/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/uk/greasemonkey.dtd
index 5570f51..4df17ed 100644
--- a/chrome/greasemonkey.jar!/locale/uk/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/uk/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "Н">
 <!ENTITY menu.manage "Керування скриптами…">
 <!ENTITY menu.manage.accesskey "е">
+<!ENTITY menu.options "Налаштування Greasemonkey...">
+<!ENTITY menu.options.accesskey "л">
 <!ENTITY statusbar.enabled "Увімкнено">
 <!ENTITY statusbar.enabled.accesskey "У">
 <!ENTITY install.title "Встановлення Greasemonkey">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "Встановлюйте скрипти тільки з тих джерел, яким довіряєте.">
 <!ENTITY install.showscriptsource "Показати початковий код скрипту">
 <!ENTITY install.installbutton "Встановити">
+<!ENTITY loading "Завантаження...">
 <!ENTITY newscript.name "Ім’я">
 <!ENTITY newscript.namespace "Простір імен">
 <!ENTITY newscript.description "Опис">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "Скрипти">
 <!ENTITY Uninstall "Вилучити">
 <!ENTITY AlsoUninstallPrefs "Вилучити також пов'язані налаштування">
+<!ENTITY UpdateChecking "Перевірка оновлень">
+<!ENTITY EnableUpdateChecking "Увімкнути автоматичну перевірку оновлень для скриптів">
+<!ENTITY UpdateInterval "Інтервал між перевірками (днів)">
+<!ENTITY RequireSecureUpdates "Вимагати безпечних оновлень">
 <!ENTITY greasemonkey.noscriptshere "Жоден зі встановлених скриптів не працює на цій сторінці.">
 <!ENTITY greasemonkey.youhavenoscripts "Жодних скриптів не встановлено">
 <!ENTITY greasemonkey.getuserscripts "Отримати користувацькі скрипти">
diff --git a/chrome/greasemonkey.jar!/locale/uk/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/uk/greasemonkey.properties
index 38028a2..fc1f65d 100644
--- a/chrome/greasemonkey.jar!/locale/uk/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/uk/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=Керівник скриптами у Firefox
-error.matchPattern.parse=@match: Неможливо обробити шаблон.
-error.matchPattern.scheme=@match: Вказано неправильну схему.
+error.downloadingUrl=Помилка завантаження адреси:
 error.matchPattern.host=@match: Вказано неправильний хост.
+error.matchPattern.parse=@match: Неможливо обробити шаблон.
 error.matchPattern.path=@match: Вказано неправильний шлях.
+error.matchPattern.scheme=@match: Вказано неправильну схему.
+error.parsingScript=Неможливо обробити скрипт:
+error.serverReturned=Відповідь сервера
+error.unknown=Невідома помилка.
diff --git a/chrome/greasemonkey.jar!/locale/zh-CN/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/zh-CN/gm-addons.dtd
index ca11889..75c1802 100644
--- a/chrome/greasemonkey.jar!/locale/zh-CN/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/zh-CN/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "自动检查更新">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "编辑">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "编辑这个用户脚本">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "最后执行">
 <!ENTITY ExecuteLater "稍后执行">
 <!ENTITY ExecuteSooner "稍早执行">
+<!ENTITY FindUpdate "查找更新">
+<!ENTITY InstallUpdate "安装更新">
 <!ENTITY MoveDown "下移">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "移至最后">
diff --git a/chrome/greasemonkey.jar!/locale/zh-CN/gm-browser.properties b/chrome/greasemonkey.jar!/locale/zh-CN/gm-browser.properties
index a9da510..c4172ab 100644
--- a/chrome/greasemonkey.jar!/locale/zh-CN/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/zh-CN/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=请先选择您喜欢用的文本编辑器
 editor.please_pick_executable=请选择一个可执行程序用来编辑用户脚本。
 editor.could_not_launch=无法启动编辑器。
 newscript.noname=请为您的脚本命名。
-newscript.nonamespace=请为您的脚本提供一个有效的命名空间。\n(例如 [http://userscripts.org/users/useridnumber])
-newscript.exists=已安装了同名的脚本。\n覆盖同名的脚本?
+newscript.nonamespace=请为您的脚本提供一个有效的命名空间。(例如 [http://userscripts.org/users/useridnumber])
+newscript.exists=已安装了同名的脚本。覆盖同名的脚本?
diff --git a/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.dtd
index 53d646f..4a168ec 100644
--- a/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "管理用户脚本...">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "启用">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey 安装过程">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "您应该只安装从可信任来源获得的脚本。">
 <!ENTITY install.showscriptsource "显示脚本源代码">
 <!ENTITY install.installbutton "安装">
+<!ENTITY loading "下载中...">
 <!ENTITY newscript.name "名称">
 <!ENTITY newscript.namespace "命名空间">
 <!ENTITY newscript.description "描述">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "用户脚本">
 <!ENTITY Uninstall "卸载">
 <!ENTITY AlsoUninstallPrefs "同时清除相关的首选项设置">
+<!ENTITY UpdateChecking "检查更新">
+<!ENTITY EnableUpdateChecking "启用脚本的自动检查更新">
+<!ENTITY UpdateInterval "两次更新检查间的最小间隔(天)">
+<!ENTITY RequireSecureUpdates "需要安全地更新(HTTPS)">
 <!ENTITY greasemonkey.noscriptshere "在此页面上没有已安装的脚本运行。">
 <!ENTITY greasemonkey.youhavenoscripts "您没有安装任何用户脚本">
 <!ENTITY greasemonkey.getuserscripts "获取用户脚本">
diff --git a/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.properties
index e029a63..ebeb27d 100644
--- a/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/zh-CN/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=用于 Firefox 的用户脚本管理器
-error.matchPattern.parse=@match: 无法解析的模式。
-error.matchPattern.scheme=@match: 指定的模式无效。
+error.downloadingUrl=下载URL时出错:
 error.matchPattern.host=@match: 指定的主机无效。
+error.matchPattern.parse=@match: 无法解析的模式。
 error.matchPattern.path=@match: 指定的路径无效。
+error.matchPattern.scheme=@match: 指定的模式无效。
+error.parsingScript=无法解析的脚本:
+error.serverReturned=服务器返回
+error.unknown=未知错误。
diff --git a/chrome/greasemonkey.jar!/locale/zh-TW/gm-addons.dtd b/chrome/greasemonkey.jar!/locale/zh-TW/gm-addons.dtd
index ffc81c1..9358848 100644
--- a/chrome/greasemonkey.jar!/locale/zh-TW/gm-addons.dtd
+++ b/chrome/greasemonkey.jar!/locale/zh-TW/gm-addons.dtd
@@ -1,3 +1,5 @@
+<!ENTITY CheckUpdates "Automatically check for updates">
+<!ENTITY CheckUpdates.accesskey "U">
 <!ENTITY Edit "編輯">
 <!ENTITY Edit.accesskey "E">
 <!ENTITY Edit.tooltip "編輯此使用者腳本">
@@ -5,6 +7,8 @@
 <!ENTITY ExecuteLast "最後執行">
 <!ENTITY ExecuteLater "較晚執行">
 <!ENTITY ExecuteSooner "較早執行">
+<!ENTITY FindUpdate "Find Update">
+<!ENTITY InstallUpdate "Install Update">
 <!ENTITY MoveDown "下移">
 <!ENTITY MoveDown.accesskey "D">
 <!ENTITY MoveToBottom "移到最下面">
diff --git a/chrome/greasemonkey.jar!/locale/zh-TW/gm-browser.properties b/chrome/greasemonkey.jar!/locale/zh-TW/gm-browser.properties
index 8c82593..9a24247 100644
--- a/chrome/greasemonkey.jar!/locale/zh-TW/gm-browser.properties
+++ b/chrome/greasemonkey.jar!/locale/zh-TW/gm-browser.properties
@@ -17,5 +17,5 @@ editor.prompt=請先選擇您常用的純文字編輯器
 editor.please_pick_executable=請挑一個可執行程式來編輯使用者腳本。
 editor.could_not_launch=無法執行編輯器。
 newscript.noname=請輸入您的使用者腳本的名稱。
-newscript.nonamespace=請為您的腳本提供一個有效的命名空間 URI。\n(例如「http://userscripts.org/users/useridnumber」)
-newscript.exists=已安裝了一個同名的腳本。\n確定要覆蓋嗎?
+newscript.nonamespace=請為您的腳本提供一個有效的命名空間 URI。n(例如「http://userscripts.org/users/useridnumber」)
+newscript.exists=已安裝了一個同名的腳本。n確定要覆蓋嗎?
diff --git a/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.dtd b/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.dtd
index bfd6627..d2a48f2 100644
--- a/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.dtd
+++ b/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.dtd
@@ -8,6 +8,8 @@
 <!ENTITY menu.new.accesskey "N">
 <!ENTITY menu.manage "管理使用者腳本…">
 <!ENTITY menu.manage.accesskey "M">
+<!ENTITY menu.options "Greasemonkey Options...">
+<!ENTITY menu.options.accesskey "O">
 <!ENTITY statusbar.enabled "已啟用">
 <!ENTITY statusbar.enabled.accesskey "E">
 <!ENTITY install.title "Greasemonkey 安裝">
@@ -18,6 +20,7 @@
 <!ENTITY install.warning2 "您應該只安裝來自可信任來源的使用者腳本。">
 <!ENTITY install.showscriptsource "顯示腳本來源">
 <!ENTITY install.installbutton "安裝">
+<!ENTITY loading "下載中…">
 <!ENTITY newscript.name "名稱">
 <!ENTITY newscript.namespace "命名空間">
 <!ENTITY newscript.description "說明">
@@ -29,6 +32,10 @@
 <!ENTITY userscripts "使用者腳本">
 <!ENTITY Uninstall "腳本移除設定">
 <!ENTITY AlsoUninstallPrefs "同時移除相關偏好設定">
+<!ENTITY UpdateChecking "檢查更新">
+<!ENTITY EnableUpdateChecking "自動檢查腳本更新">
+<!ENTITY UpdateInterval "檢查更新的最短時間間隔">
+<!ENTITY RequireSecureUpdates "要求透過安全通道更新">
 <!ENTITY greasemonkey.noscriptshere "沒有任何在此頁面執行的腳本。">
 <!ENTITY greasemonkey.youhavenoscripts "您尚未安裝任何腳本">
 <!ENTITY greasemonkey.getuserscripts "取得使用者腳本">
diff --git a/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.properties b/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.properties
index afb54aa..7dea432 100644
--- a/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.properties
+++ b/chrome/greasemonkey.jar!/locale/zh-TW/greasemonkey.properties
@@ -1,5 +1,9 @@
 extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description=一套 Firefox 的使用者腳本管理器
-error.matchPattern.parse=@match: 無法剖析規則。
-error.matchPattern.scheme=@match: 指定了無效的模式。
+error.downloadingUrl=下載 URL 時發生錯誤:
 error.matchPattern.host=@match: 指定了無效的主機名稱。
+error.matchPattern.parse=@match: 無法剖析規則。
 error.matchPattern.path=@match: 指定了無效的路徑。
+error.matchPattern.scheme=@match: 指定了無效的模式。
+error.parsingScript=無法剖析腳本:
+error.serverReturned=伺服器回應
+error.unknown=未知錯誤。
diff --git a/chrome/greasemonkey.jar!/skin/addons4.css b/chrome/greasemonkey.jar!/skin/addons4.css
index d64ffef..fdb988f 100644
--- a/chrome/greasemonkey.jar!/skin/addons4.css
+++ b/chrome/greasemonkey.jar!/skin/addons4.css
@@ -36,16 +36,16 @@ page.greasemonkey #user-script-list-empty {
 }
 
 /* Do not show native items when view is user scripts. */
-#addonitem-popup:not([addontype="user-script"]) menuitem[type="user-script"],
-#addonitem-popup:not([addontype="user-script"]) menuseparator[type="user-script"],
+#addonitem-popup[addontype="user-script"] menuitem:not(.greasemonkey),
+#addonitem-popup[addontype="user-script"] menuseparator:not(.greasemonkey),
 /* Do not show user script items when view is native. */
-#addonitem-popup[addontype="user-script"] menuitem:not([type]),
-#addonitem-popup[addontype="user-script"] menuseparator:not([type])
+#addonitem-popup:not([addontype="user-script"]) .greasemonkey
 {
   display: none !important;
 }
 
 /* Do show all items (even disabled ones!) when view is user scripts. */
-#addonitem-popup[addontype="user-script"] *[type="user-script"] {
+#addonitem-popup[addontype="user-script"] .greasemonkey
+{
   display: -moz-box !important;
 }
diff --git a/components/greasemonkey.js b/components/greasemonkey.js
index 1c15669..dce6e1f 100644
--- a/components/greasemonkey.js
+++ b/components/greasemonkey.js
@@ -3,6 +3,7 @@
 var DESCRIPTION = "GM_GreasemonkeyService";
 var CONTRACTID = "@greasemonkey.mozdev.org/greasemonkey-service;1";
 var CLASSID = Components.ID("{77bf3650-1cd6-11da-8cd6-0800200c9a66}");
+var GM_GUID = "{e4a8a97b-f2ed-450b-b12d-ee082ba24781}";
 
 var Cc = Components.classes;
 var Ci = Components.interfaces;
@@ -17,7 +18,7 @@ var gExtensionPath = (function() {
   var ioService = Components.classes["@mozilla.org/network/io-service;1"]
       .getService(Components.interfaces.nsIIOService);
   var uri = ioService.newURI(Components.stack.filename, null, null);
-  var file = uri.QueryInterface(Components.interfaces.nsIFileURL).file
+  var file = uri.QueryInterface(Components.interfaces.nsIFileURL).file;
   // ... to find the containing directory.
   var dir = file.parent.parent;
   // Then get the URL back for that path.
@@ -25,12 +26,23 @@ var gExtensionPath = (function() {
   } catch (e) { dump(e+'\n'+uneval(e)+'\n\n'); return 'x'; }
 })();
 
-var gMaxJSVersion = "1.6";
+// Only a particular set of strings are allowed.  See: http://goo.gl/ex2LJ
+var gMaxJSVersion = "1.8";
+var gGreasemonkeyVersion = 'unknown';
+
 var gMenuCommands = [];
 var gStartupHasRun = false;
 
+var gFileProtocolHandler = Components
+    .classes["@mozilla.org/network/protocol;1?name=file"]
+    .getService(Ci.nsIFileProtocolHandler);
+var gTmpDir = Components.classes["@mozilla.org/file/directory_service;1"]
+    .getService(Components.interfaces.nsIProperties)
+    .get("TmpD", Components.interfaces.nsILocalFile);
+
 /////////////////////// Component-global Helper Functions //////////////////////
 
+// TODO: Remove this, see #1318.
 function alert(msg) {
   Cc["@mozilla.org/embedcomp/prompt-service;1"]
     .getService(Ci.nsIPromptService)
@@ -64,6 +76,57 @@ function GM_apiLeakCheck(apiName) {
   return true;
 }
 
+function createSandbox(
+    aScript, aContentWin, aChromeWin, aFirebugConsole, aUrl
+) {
+  var unsafeWin = aContentWin.wrappedJSObject;
+  var sandbox = new Components.utils.Sandbox(aContentWin);
+
+  if (GM_util.compareFirefoxVersion("4.0") < 0) {
+    // Fixes .. something confusing.  Must be before __proto__ assignment.
+    //  See #1192
+    sandbox.document = aContentWin.document;
+  }
+
+  sandbox.__proto__ = aContentWin;
+  sandbox.unsafeWindow = unsafeWin;
+  sandbox.XPathResult = Ci.nsIDOMXPathResult;
+
+  // Temporary workaround for #1318.  TODO: Remove when upstream bug fixed.
+  sandbox.alert = alert;
+
+  sandbox.console = aFirebugConsole ? aFirebugConsole : new GM_console(aScript);
+
+  var imp = sandbox.importFunction;
+  imp(function(css) { GM_addStyle(aContentWin.document, css); }, 'GM_addStyle');
+  imp(GM_util.hitch(new GM_ScriptLogger(aScript), 'log'), 'GM_log');
+  imp(GM_util.hitch(null, registerMenuCommand, aContentWin, aChromeWin, aScript),
+      'GM_registerMenuCommand');
+
+  var scriptStorage = new GM_ScriptStorage(aScript);
+  imp(GM_util.hitch(scriptStorage, 'deleteValue'), 'GM_deleteValue');
+  imp(GM_util.hitch(scriptStorage, 'getValue'), 'GM_getValue');
+  imp(GM_util.hitch(scriptStorage, 'setValue'), 'GM_setValue');
+
+  var scriptResources = new GM_Resources(aScript);
+  imp(GM_util.hitch(scriptResources, 'getResourceURL'), 'GM_getResourceURL');
+  imp(GM_util.hitch(scriptResources, 'getResourceText'), 'GM_getResourceText');
+
+  // The .importMethod() is safe because it can't return object values (I
+  // think?) -- but sometimes we want to, so in that case do a straight assign.
+  // TODO: When minVer=4 check if this is still necessary.
+  sandbox.GM_listValues = GM_util.hitch(scriptStorage, 'listValues');
+  sandbox.GM_openInTab = GM_util.hitch(null, openInTab, aContentWin, aChromeWin);
+  sandbox.GM_xmlhttpRequest = GM_util.hitch(
+      new GM_xmlhttpRequester(aContentWin, aChromeWin, aUrl),
+      'contentStartRequest');
+
+  Components.utils.evalInSandbox(
+      'const GM_info = ' + uneval(info(aScript)), sandbox);
+
+  return sandbox;
+}
+
 function findError(script, lineNumber) {
   var start = 0;
   var end = 1;
@@ -96,19 +159,112 @@ function getFirebugConsole(wrappedContentWin, chromeWin) {
   }
 }
 
+function info(aScript) {
+  return {
+    'version': gGreasemonkeyVersion,
+    'scriptWillUpdate': aScript.isRemoteUpdateAllowed(),
+    'script': {
+      'description': aScript.description,
+      'excludes': aScript.excludes,
+      // 'icon': ???,
+      'includes': aScript.includes,
+      'matches': aScript.matches,
+      'name': aScript.name,
+      'namespace': aScript.namespace,
+      // 'requires': ???,
+      // 'resources': ???,
+      'run-at': aScript.runAt,
+      'unwrap': aScript.unwrap,
+      'version': aScript.version,
+    },
+    'scriptMetaStr': extractMeta(aScript.textContent),
+  }
+}
+
 function isTempScript(uri) {
   if (uri.scheme != "file") return false;
+  var file = gFileProtocolHandler.getFileFromURLSpec(uri.spec);
+  return gTmpDir.contains(file, true);
+}
 
-  var fph = Components.classes["@mozilla.org/network/protocol;1?name=file"]
-      .getService(Ci.nsIFileProtocolHandler);
+function loadGreasemonkeyVersion() {
+  // Find the new version, and call the continuation when ready. (Firefox 4+
+  // gives us only an async API, requiring this cumbersome setup.)
+  if (GM_util.compareFirefoxVersion("4.0") < 0) {
+    // This is too early for Firefox 3.  Sloppy timeout workaround.
+    GM_util.timeout(0, function() {
+      var extMan = Components.classes["@mozilla.org/extensions/manager;1"]
+          .getService(Components.interfaces.nsIExtensionManager);
+      var item = extMan.getItemForID(GM_GUID);
+      gGreasemonkeyVersion = new String(item.version);
+    });
+  } else {
+    Components.utils.import("resource://gre/modules/AddonManager.jsm");
+    AddonManager.getAddonByID(GM_GUID, function(addon) {
+      gGreasemonkeyVersion = new String(addon.version);
+    });
+  }
+}
 
-  var file = fph.getFileFromURLSpec(uri.spec);
-  var tmpDir = Components.classes["@mozilla.org/file/directory_service;1"]
-      .getService(Components.interfaces.nsIProperties)
-      .get("TmpD", Components.interfaces.nsILocalFile);
+function openInTab(safeContentWin, chromeWin, url, aLoadInBackground) {
+  if (!GM_apiLeakCheck("GM_openInTab")) {
+    return undefined;
+  }
+  if ('undefined' == typeof aLoadInBackground) aLoadInBackground = null;
 
-  return file.parent.equals(tmpDir) && file.leafName != "newscript.user.js";
-}
+  var browser = chromeWin.gBrowser;
+  var tabs = browser.mTabs /* Firefox <=3.6 */ || browser.tabs /* >=4.0 */;
+  var currentTab = tabs[
+      browser.getBrowserIndexForDocument(safeContentWin.document)];
+  var newTab = browser.loadOneTab(url, {'inBackground': aLoadInBackground});
+  var newWin = GM_windowForTab(newTab, browser);
+
+  var afterCurrent = Cc["@mozilla.org/preferences-service;1"]
+      .getService(Ci.nsIPrefService)
+      .getBranch("browser.tabs.")
+      .getBoolPref("insertRelatedAfterCurrent");
+  if (afterCurrent) {
+    browser.moveTabTo(newTab, currentTab._tPos + 1);
+  }
+
+  return newWin;
+};
+
+function registerMenuCommand(
+    wrappedContentWin, chromeWin, script,
+    commandName, commandFunc, accessKey, unused, accessKey2
+) {
+  if (!GM_apiLeakCheck("GM_registerMenuCommand")) {
+    return;
+  }
+
+  if (wrappedContentWin.top != wrappedContentWin) {
+    // Only register menu commands for the top level window.
+    return;
+  }
+
+  // Legacy support: if all five parameters were specified, (from when two
+  // were for accelerators) use the last one as the access key.
+  if ('undefined' != typeof accessKey2) {
+    accessKey = accessKey2;
+  }
+
+  if (accessKey
+      && (("string" != typeof accessKey) || (accessKey.length != 1))
+  ) {
+    throw new Error('Error with menu command "'
+        + commandName + '": accessKey must be a single character');
+  }
+
+  var command = {
+      name: commandName,
+      accessKey: accessKey,
+      commandFunc: commandFunc,
+      contentWindow: wrappedContentWin,
+      contentWindowId: GM_util.windowId(wrappedContentWin),
+      frozen: false};
+  gMenuCommands.push(command);
+};
 
 function runScriptInSandbox(code, sandbox, script) {
   try {
@@ -149,6 +305,7 @@ function startup() {
   gStartupHasRun = true;
 
   Cu.import(gmRunScriptFilename);
+  Cu.import("resource://greasemonkey/parseScript.js");
   Cu.import("resource://greasemonkey/prefmanager.js");
   Cu.import("resource://greasemonkey/util.js");  // At top = fail in FF3.
 
@@ -156,18 +313,12 @@ function startup() {
       .getService(Ci.mozIJSSubScriptLoader);
   loader.loadSubScript("chrome://global/content/XPCNativeWrapper.js");
   loader.loadSubScript("chrome://greasemonkey/content/config.js");
-  loader.loadSubScript("chrome://greasemonkey/content/script.js");
-  loader.loadSubScript("chrome://greasemonkey/content/scriptrequire.js");
-  loader.loadSubScript("chrome://greasemonkey/content/scriptresource.js");
-  loader.loadSubScript("chrome://greasemonkey/content/scripticon.js");
   loader.loadSubScript("chrome://greasemonkey/content/miscapis.js");
   loader.loadSubScript("chrome://greasemonkey/content/xmlhttprequester.js");
-  loader.loadSubScript("chrome://greasemonkey/content/scriptdownloader.js");
   loader.loadSubScript("chrome://greasemonkey/content/third-party/mpl-utils.js");
 
-  // Firefox 3.6 and higher supports 1.8.
-  if (GM_util.compareFirefoxVersion("3.6") >= 0) {
-    gMaxJSVersion = "1.8";
+  if (GM_util.compareFirefoxVersion("4.0") >= 0) {
+    gMaxJSVersion = "ECMAv5";
   }
 
   // Firefox <4 reports a different stack.fileName for the module.
@@ -175,6 +326,8 @@ function startup() {
     // Pull the name out of the variable the module exports.
     gmRunScriptFilename = GM_runScript_filename;
   }
+
+  loadGreasemonkeyVersion();
 }
 
 /////////////////////////////////// Service ////////////////////////////////////
@@ -208,70 +361,6 @@ service.prototype.QueryInterface = XPCOMUtils.generateQI([
       Ci.nsIContentPolicy
     ]);
 
-/////////////////////////////////// Privates ///////////////////////////////////
-
-service.prototype._openInTab = function(
-    safeContentWin, chromeWin, url, aLoadInBackground
-) {
-  if (!GM_apiLeakCheck("GM_openInTab")) {
-    return undefined;
-  }
-  if ('undefined' == typeof aLoadInBackground) aLoadInBackground = null;
-
-  var browser = chromeWin.gBrowser;
-  var tabs = browser.mTabs /* Firefox <=3.6 */ || browser.tabs /* >=4.0 */;
-  var currentTab = tabs[
-      browser.getBrowserIndexForDocument(safeContentWin.document)];
-  var newTab = browser.loadOneTab(url, {'inBackground': aLoadInBackground});
-  var newWin = GM_windowForTab(newTab, browser);
-
-  var afterCurrent = Cc["@mozilla.org/preferences-service;1"]
-      .getService(Ci.nsIPrefService)
-      .getBranch("browser.tabs.")
-      .getBoolPref("insertRelatedAfterCurrent");
-  if (afterCurrent) {
-    browser.moveTabTo(newTab, currentTab._tPos + 1);
-  }
-
-  return newWin;
-};
-
-service.prototype._registerMenuCommand = function(
-    wrappedContentWin, chromeWin, script,
-    commandName, commandFunc, accessKey, unused, accessKey2
-) {
-  if (!GM_apiLeakCheck("GM_registerMenuCommand")) {
-    return;
-  }
-
-  if (wrappedContentWin.top != wrappedContentWin) {
-    // Only register menu commands for the top level window.
-    return;
-  }
-
-  // Legacy support: if all five parameters were specified, (from when two
-  // were for accelerators) use the last one as the access key.
-  if ('undefined' != typeof accessKey2) {
-    accessKey = accessKey2;
-  }
-
-  if (accessKey
-      && (("string" != typeof accessKey) || (accessKey.length != 1))
-  ) {
-    throw new Error('Error with menu command "'
-        + commandName + '": accessKey must be a single character');
-  }
-
-  var command = {
-      name: commandName,
-      accessKey: accessKey,
-      commandFunc: commandFunc,
-      contentWindow: wrappedContentWin,
-      contentWindowId: GM_util.windowId(wrappedContentWin),
-      frozen: false};
-  gMenuCommands.push(command);
-};
-
 /////////////////////////////// nsIContentPolicy ///////////////////////////////
 
 service.prototype.shouldLoad = function(ct, cl, org, ctx, mt, ext) {
@@ -292,15 +381,14 @@ service.prototype.shouldLoad = function(ct, cl, org, ctx, mt, ext) {
        || ct == Ci.nsIContentPolicy.TYPE_SUBDOCUMENT)
       && cl.spec.match(/\.user\.js$/)
   ) {
-    if (!this.ignoreNextScript_
-        && !isTempScript(cl)
-        && GM_util.installUri(cl, ctx.contentWindow)
-    ) {
+    if (!this._ignoreNextScript && !isTempScript(cl)) {
+      GM_util.showInstallDialog(cl.spec, ctx, this);
       ret = Ci.nsIContentPolicy.REJECT_REQUEST;
     }
+
+    this._ignoreNextScript = false;
   }
 
-  this.ignoreNextScript_ = false;
   return ret;
 };
 
@@ -335,15 +423,16 @@ service.prototype.__defineGetter__('config', function() {
 });
 
 service.prototype.contentDestroyed = function(contentWindowId) {
-  if (!contentWindowId) return;
   this.withAllMenuCommandsForWindowId(null, function(index, command) {
     var closed = false;
     try { closed = command.contentWindow.closed; } catch (e) { }
 
-    if (closed || (command.contentWindowId == contentWindowId)) {
+    if (closed ||
+        (contentWindowId && (command.contentWindowId == contentWindowId))
+    ) {
       gMenuCommands.splice(index, 1);
     }
-  });
+  }, true);
 };
 
 service.prototype.contentFrozen = function(contentWindowId) {
@@ -365,80 +454,30 @@ service.prototype.runScripts = function(
   if (!GM_util.getEnabled() || !GM_util.isGreasemonkeyable(url)) return;
 
   if (GM_prefRoot.getValue('enableScriptRefreshing')) {
-    this._config.updateModifiedScripts(aWrappedContentWin, aChromeWin);
+    this._config.updateModifiedScripts(aRunWhen, aWrappedContentWin, aChromeWin);
   }
 
   var scripts = this.config.getMatchingScripts(function(script) {
-        return GM_util.scriptMatchesUrlAndRuns(script, url, aRunWhen);
-    });
+    return GM_util.scriptMatchesUrlAndRuns(script, url, aRunWhen);
+  });
   if (scripts.length > 0) {
     this.injectScripts(scripts, url, aWrappedContentWin, aChromeWin);
+    this._config.checkScriptsForRemoteUpdates(scripts);
   }
 };
 
 service.prototype.ignoreNextScript = function() {
-  this.ignoreNextScript_ = true;
+  this._ignoreNextScript = true;
 };
 
 service.prototype.injectScripts = function(
     scripts, url, wrappedContentWin, chromeWin
 ) {
-  var sandbox;
-  var script;
-  var logger;
-  var console;
-  var storage;
-  var xmlhttpRequester;
-  var resources;
-  var unsafeContentWin = wrappedContentWin.wrappedJSObject;
   var firebugConsole = getFirebugConsole(wrappedContentWin, chromeWin);
 
-  for (var i = 0; script = scripts[i]; i++) {
-    sandbox = new Components.utils.Sandbox(wrappedContentWin);
-
-    logger = new GM_ScriptLogger(script);
-
-    console = firebugConsole ? firebugConsole : new GM_console(script);
-
-    storage = new GM_ScriptStorage(script);
-    xmlhttpRequester = new GM_xmlhttpRequester(
-        wrappedContentWin, chromeWin, url);
-    resources = new GM_Resources(script);
-
-    sandbox.unsafeWindow = unsafeContentWin;
-
-    // hack XPathResult since that is so commonly used
-    sandbox.XPathResult = Ci.nsIDOMXPathResult;
-
-    // add our own APIs
-    sandbox.GM_addStyle = function(css) {
-          GM_addStyle(wrappedContentWin.document, css);
-        };
-    sandbox.GM_log = GM_util.hitch(logger, "log");
-    sandbox.console = console;
-    sandbox.GM_setValue = GM_util.hitch(storage, "setValue");
-    sandbox.GM_getValue = GM_util.hitch(storage, "getValue");
-    sandbox.GM_deleteValue = GM_util.hitch(storage, "deleteValue");
-    sandbox.GM_listValues = GM_util.hitch(storage, "listValues");
-    sandbox.GM_getResourceURL = GM_util.hitch(resources, "getResourceURL");
-    sandbox.GM_getResourceText = GM_util.hitch(resources, "getResourceText");
-    sandbox.GM_openInTab = GM_util.hitch(
-        this, "_openInTab", wrappedContentWin, chromeWin);
-    sandbox.GM_xmlhttpRequest = GM_util.hitch(xmlhttpRequester,
-                                         "contentStartRequest");
-    sandbox.GM_registerMenuCommand = GM_util.hitch(
-        this, "_registerMenuCommand", wrappedContentWin, chromeWin, script);
-
-    // Re-wrap the window before assigning it to the sandbox.__proto__
-    // This is a workaround for a bug in which the Security Manager
-    // vetoes the use of eval.
-    sandbox.__proto__ = new XPCNativeWrapper(unsafeContentWin);
-
-    Components.utils.evalInSandbox(
-        "var document = window.document;", sandbox);
-
-    // Temporary workaround for #1318.  TODO: Remove when upstream bug fixed.
-    sandbox.alert = alert;
+  for (var i = 0, script = null; script = scripts[i]; i++) {
+    var sandbox = createSandbox(
+        script, wrappedContentWin, chromeWin, firebugConsole, url);
 
     var requires = [];
     var offsets = [];
@@ -456,7 +495,9 @@ service.prototype.injectScripts = function(
     // These newlines are critical for error line calculation.  The last handles
     // a script whose final line is a line comment, to not break the wrapper
     // function.
-    var scriptSrc = requires.join("\n") + "\n" + script.textContent + "\n";
+    // The semicolons after requires fix a failure of javascript's semicolon
+    // insertion rules (see #1491).
+    var scriptSrc = requires.join(";\n") + ";\n" + script.textContent + "\n";
     if (!script.unwrap) {
       scriptSrc = "(function(){"+ scriptSrc +"})()";
     }
@@ -468,14 +509,16 @@ service.prototype.injectScripts = function(
 };
 
 service.prototype.withAllMenuCommandsForWindowId = function(
-    contentWindowId, callback
+    aContentWindowId, aCallback, aForce
 ) {
+  if(!aContentWindowId && !aForce) return;
+
   var l = gMenuCommands.length - 1;
   for (var i = l, command = null; command = gMenuCommands[i]; i--) {
-    if (!contentWindowId
-        || (command.contentWindowId == contentWindowId)
+    if (aForce
+        || (command.contentWindowId == aContentWindowId)
     ) {
-      callback(i, command);
+      aCallback(i, command);
     }
   }
 };
diff --git a/defaults/preferences/greasemonkey.js b/defaults/preferences/greasemonkey.js
index af7ce6c..5d73716 100644
--- a/defaults/preferences/greasemonkey.js
+++ b/defaults/preferences/greasemonkey.js
@@ -1,8 +1,12 @@
 pref("extensions.{e4a8a97b-f2ed-450b-b12d-ee082ba24781}.description", "chrome://greasemonkey/locale/greasemonkey.properties");
 pref("greasemonkey.fileIsGreaseable", false);
 pref("greasemonkey.globalExcludes", '[]');
+pref("greasemonkey.installDelay", 5);
 pref("greasemonkey.unmhtIsGreaseable", false);
 pref("greasemonkey.enableScriptRefreshing", true);
 pref("greasemonkey.uninstallPreferences", true);
+pref("greasemonkey.enableUpdateChecking", false);
+pref("greasemonkey.minDaysBetweenUpdateChecks", 7);
+pref("greasemonkey.requireSecureUpdates", true);
 pref("greasemonkey.haveInsertedToolbarbutton", false);
 pref("greasemonkey.logChrome", false);
diff --git a/install.rdf b/install.rdf
index dc6c2f6..28a68f5 100644
--- a/install.rdf
+++ b/install.rdf
@@ -6,7 +6,7 @@
   <Description about="urn:mozilla:install-manifest">
 
     <em:id>{e4a8a97b-f2ed-450b-b12d-ee082ba24781}</em:id>
-    <em:version>0.9.11</em:version>
+    <em:version>0.9.17</em:version>
     <em:creator>Aaron Boodman; http://youngpup.net/</em:creator>
     <em:homepageURL>http://www.greasespot.net/</em:homepageURL>
     <em:optionsURL>chrome://greasemonkey/content/options.xul</em:optionsURL>
@@ -38,6 +38,7 @@
     <em:contributor>Nikolas Coukouma; http://atrus.org/</em:contributor>
     <em:contributor>Ori Avtallon</em:contributor>
     <em:contributor>Pak Kei (logo); http://arkidect.com/</em:contributor>
+    <em:contributor>Sam Larison; http://samlarison.com/</em:contributor>
     <em:contributor>Sergio Abreu; http://sitedosergio.sitesbr.net/</em:contributor>
     <em:contributor>Tommi Rautava</em:contributor>
 
@@ -46,7 +47,7 @@
       <Description>
         <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id>
         <em:minVersion>3.6</em:minVersion>
-        <em:maxVersion>7.*</em:maxVersion>
+        <em:maxVersion>12.*</em:maxVersion>
       </Description>
     </em:targetApplication>
 
diff --git a/modules/addons4.js b/modules/addons4.js
index 482facc..ac2f95d 100755
--- a/modules/addons4.js
+++ b/modules/addons4.js
@@ -8,7 +8,9 @@
 // Module exported symbols.
 var EXPORTED_SYMBOLS = [
     'GM_addonsStartup', 'SCRIPT_ADDON_TYPE',
-    'ScriptAddonFactoryByScript', 'ScriptAddonReplaceScript'];
+    'ScriptAddonFactoryByScript', 'ScriptAddonReplaceScript',
+    'ScriptInstallFactoryByAddon',
+    ];
 
 ////////////////////////////////////////////////////////////////////////////////
 // Module level imports / constants / globals.
@@ -44,6 +46,19 @@ var AddonProvider = {
       });
       aCallback(scriptAddons);
     }
+  },
+
+  getInstallsByTypes: function(aTypes, aCallback) {
+    var scriptInstalls = [];
+    GM_util.getService().config.scripts.forEach(function(script) {
+      if (!script.updateAvailable) return;
+
+      var aAddon = ScriptAddonFactoryByScript(script);
+      var scriptInstall = ScriptInstallFactoryByAddon(aAddon);
+
+      scriptInstalls.push(scriptInstall);
+    });
+    aCallback(scriptInstalls);
   }
 };
 
@@ -78,9 +93,10 @@ function ScriptAddon(aScript) {
   this.name = this._script.name;
   this.version = this._script.version;
   this.description = this._script.description;
-  this.iconURL = this._script.icon.fileURL;
-  this.size = this._script.size;
+  this.iconURL = this._script.icon && this._script.icon.fileURL;
   this.updateDate = this._script.modifiedDate;
+  this.providesUpdatesSecurely = !!aScript.updateURL
+      && (0 === aScript.updateURL.indexOf('https:'));
 }
 
 // Required attributes.
@@ -88,17 +104,17 @@ ScriptAddon.prototype.id = null;
 ScriptAddon.prototype.version = null;
 ScriptAddon.prototype.type = SCRIPT_ADDON_TYPE;
 ScriptAddon.prototype.isCompatible = true;
-ScriptAddon.prototype.providesUpdatesSecurely = true;
 ScriptAddon.prototype.blocklistState = 0;
 ScriptAddon.prototype.appDisabled = false;
 ScriptAddon.prototype.scope = AddonManager.SCOPE_PROFILE;
 ScriptAddon.prototype.name = null;
 ScriptAddon.prototype.creator = null;
 ScriptAddon.prototype.pendingOperations = 0;
+ScriptAddon.prototype.applyBackgroundUpdates = AddonManager.AUTOUPDATE_DEFAULT;
+ScriptAddon.prototype.operationsRequiringRestart = AddonManager.OP_NEEDS_RESTART_NONE;
 
 // Optional attributes
 ScriptAddon.prototype.description = null;
-ScriptAddon.prototype.size = null;
 
 // Private and custom attributes.
 ScriptAddon.prototype._script = null;
@@ -115,7 +131,7 @@ function ScriptAddon_getIsActive() {
 });
 
 ScriptAddon.prototype.__defineGetter__('optionsURL',
-function ScriptAddon_getIsActive() {
+function ScriptAddon_getOptionsURL() {
   return 'chrome://greasemonkey/content/scriptprefs.xul#' + this._script.id;
 });
 
@@ -143,6 +159,7 @@ function ScriptAddon_getPermissions() {
   perms |= this.userDisabled
       ? AddonManager.PERM_CAN_ENABLE
       : AddonManager.PERM_CAN_DISABLE;
+  if (this._script.updateURL) perms |= AddonManager.PERM_CAN_UPGRADE;
   return perms;
 });
 
@@ -150,28 +167,27 @@ ScriptAddon.prototype.isCompatibleWith = function() {
   return true;
 };
 
-ScriptAddon.prototype.findUpdates = function(aListener) {
-  if ('onNoCompatibilityUpdateAvailable' in aListener) {
-    aListener.onNoCompatibilityUpdateAvailable(this);
-  }
-  if ('onNoUpdateAvailable' in aListener) {
-    aListener.onNoUpdateAvailable(this);
-  }
-  if ('onUpdateFinished' in aListener) {
-    aListener.onUpdateFinished(this);
+ScriptAddon.prototype.findUpdates = function(aListener, aReason) {
+  function updateCallback(aAvailable) {
+    this._script.handleRemoteUpdate(aAvailable, aListener);
   }
+  this._script.checkForRemoteUpdate(true, GM_util.hitch(this, updateCallback));
+};
+
+ScriptAddon.prototype.toString = function() {
+  return '[ScriptAddon object ' + this.id + ']';
 };
 
 ScriptAddon.prototype.uninstall = function() {
-  AddonManagerPrivate.callAddonListeners("onUninstalling", this, false);
+  AddonManagerPrivate.callAddonListeners('onUninstalling', this, false);
   // TODO: pick an appropriate time, and act on these pending uninstalls.
   this.pendingOperations |= AddonManager.PENDING_UNINSTALL;
-  AddonManagerPrivate.callAddonListeners("onUninstalled", this);
+  AddonManagerPrivate.callAddonListeners('onUninstalled', this);
 };
 
 ScriptAddon.prototype.cancelUninstall = function() {
   this.pendingOperations ^= AddonManager.PENDING_UNINSTALL;
-  AddonManagerPrivate.callAddonListeners("onOperationCancelled", this);
+  AddonManagerPrivate.callAddonListeners('onOperationCancelled', this);
 };
 
 ScriptAddon.prototype.performUninstall = function() {
@@ -179,6 +195,80 @@ ScriptAddon.prototype.performUninstall = function() {
   delete ScriptAddonCache[this.id];
 };
 
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+var ScriptInstallCache = {};
+function ScriptInstallFactoryByAddon(aAddon) {
+  if (!(aAddon.id in ScriptInstallCache)) {
+    ScriptInstallCache[aAddon.id] = new ScriptInstall(aAddon);
+  }
+  return ScriptInstallCache[aAddon.id];
+}
+
+function ScriptInstall(aAddon) {
+  this._script = aAddon._script;
+
+  this.name = this._script.name;
+  this.version = this._script.version;
+  this.iconURL = this._script.icon.fileURL;
+  this.existingAddon = aAddon;
+
+  this._listeners = [];
+}
+
+// Required attributes.
+ScriptInstall.prototype.addon = null;
+ScriptInstall.prototype.error = null;
+ScriptInstall.prototype.file = null;
+ScriptInstall.prototype.maxProgress = -1;
+ScriptInstall.prototype.progress = 0;
+ScriptInstall.prototype.releaseNotesURI = null;
+ScriptInstall.prototype.sourceURI = null;
+ScriptInstall.prototype.state = AddonManager.STATE_AVAILABLE;
+ScriptInstall.prototype.type = 'user-script';
+
+// Private and custom attributes.
+ScriptInstall.prototype._script = null;
+
+ScriptInstall.prototype.install = function() {
+  function progressCallback(aRemoteScript, aType, aData) {
+    this.maxProgress = 100;
+    this.progress = Math.floor(aData * 100);
+    AddonManagerPrivate.callInstallListeners(
+        'onDownloadProgress', this._listeners, this);
+  }
+
+  AddonManagerPrivate.callAddonListeners('onInstallStarted', this);
+  this.state = AddonManager.STATE_DOWNLOADING;
+  this._remoteScript = this._script.installUpdate(
+      GM_util.hitch(this, progressCallback));
+};
+
+ScriptInstall.prototype.cancel = function() {
+  this.state = AddonManager.STATE_AVAILABLE;
+  AddonManagerPrivate.callAddonListeners(
+      'onInstallEnded', this, this.existingAddon);
+  if (this._remoteScript) {
+    this._remoteScript.cleanup();
+    this._remoteScript = null;
+  }
+};
+
+ScriptInstall.prototype.addListener = function AI_addListener(aListener) {
+  if (!this._listeners.some(function(i) { return i == aListener; })) {
+    this._listeners.push(aListener);
+  }
+};
+
+ScriptInstall.prototype.removeListener = function AI_removeListener(aListener) {
+  this._listeners =
+      this._listeners.filter(function(i) { return i != aListener; });
+};
+
+ScriptInstall.prototype.toString = function() {
+  return '[ScriptInstall object ' + this._script.id + ']';
+};
+
 ////////////////////////////////////////////////////////////////////////////////
 
 var WindowObserver = {
diff --git a/modules/third-party/MatchPattern.js b/modules/third-party/MatchPattern.js
index 1be4f39..e95e639 100644
--- a/modules/third-party/MatchPattern.js
+++ b/modules/third-party/MatchPattern.js
@@ -40,8 +40,8 @@
 
 var EXPORTED_SYMBOLS = ['MatchPattern'];
 
-Components.utils.import("resource://gre/modules/NetUtil.jsm");
 Components.utils.import("resource://greasemonkey/third-party/convert2RegExp.js");
+Components.utils.import("resource://greasemonkey/util.js");
 
 var validSchemes = ['http', 'https', 'ftp', 'file'];
 var REG_HOST = /^(?:\*\.)?[^*\/]+$|^\*$|^$/;
diff --git a/modules/third-party/convert2RegExp.js b/modules/third-party/convert2RegExp.js
index 686d6bd..bf88d94 100644
--- a/modules/third-party/convert2RegExp.js
+++ b/modules/third-party/convert2RegExp.js
@@ -28,6 +28,7 @@
 Components.utils.import('resource://greasemonkey/util.js');
 
 var EXPORTED_SYMBOLS = ['GM_convert2RegExp'];
+var tldRegExp = new RegExp("^(\\^(?:[^/]*)(?://)?(?:[^/]*))(\\\\\\.tld)((?:/.*)?)$");
 
 // Converts a pattern in this programs simple notation to a regular expression.
 function GM_convert2RegExp( pattern ) {
@@ -72,15 +73,12 @@ function GM_convert2RegExp( pattern ) {
     }
   }
 
-  var tldRegExp = new RegExp("^(\\^(?:[^/]*)(?://)?(?:[^/]*))(\\\\\\.tld)((?:/.*)?)$");
   var tldRes = res.match(tldRegExp);
-  if (tldRes) {
-    // build the mighty TLD RegExp
-    var tldStr = "\\.(?:demon\\.co\\.uk|esc\\.edu\\.ar|(?:c[oi]\\.)?[^\\.]\\.(?:vt|ne|ks|il|hi|sc|nh|ia|wy|or|ma|vi|tn|in|az|id|nc|co|dc|nd|me|al|ak|de|wv|nm|mo|pr|nj|sd|md|va|ri|ut|ct|pa|ok|ky|mt|ga|la|oh|ms|wi|wa|gu|mi|tx|fl|ca|ar|mn|ny|nv)\\.us|[^\\.]\\.(?:(?:pvt\\.)?k12|cc|tec|lib|state|gen)\\.(?:vt|ne|ks|il|hi|sc|nh|ia|wy|or|ma|vi|tn|in|az|id|nc|co|dc|nd|me|al|ak|de|wv|nm|mo|pr|nj|sd|md|va|ri|ut|ct|pa|ok|ky|mt|ga|la|oh|ms|wi|wa|gu|mi|tx|fl|ca|ar|mn|ny|nv)\\.us|[^\\.]\\.vt|ne|ks|il|hi|sc|nh|ia|wy|or|ma|vi|tn|in|az|id|nc|co|dc|nd|me|al|ak|de|wv|nm|mo|pr|nj|sd|md|va|ri|ut|ct|pa|ok|ky|mt|ga|la|oh|ms|wi|wa|gu|mi|tx|fl|ca|ar|mn|ny|nvus|ne|gg|tr|mm|ki|biz|sj|my|hn|gl|ro|tn|co|br|coop|cy|bo|ck|tc|bv|ke|aero|cs|dm|km|bf|af|mv|ls|tm|jm|pg|ky|ga|pn|sv|mq|hu|za|se|uy|iq|ai|com|ve|na|ba|ph|xxx|no|lv|tf|kz|ma|in|id|si|re|om|by|fi|gs|ir|li|tz|td|cg|pa|am|tv|jo|bi|ee|cd|pk|mn|gd|nz|as|lc|ae|cn|ag|mx|sy|cx|cr|vi|sg|bm|kh|nr|bz|vu|kw|gf|al|uz|eh|int|ht|mw|gm|bg|gu|info|aw|gy|ac|ca|museum|sk|ax|es|kp|bb|sa|et|ie|tl|org|tj|cf|im|mk|de|pro|md|fm|cl|jp|bn|vn|gp|sm|ar|dj|bd|mc|ug|nu|ci|dk|nc|rw|aq|name|st|hm|mo|gq|ps|ge|ao|gr|va|is|mt|gi|la|bh|ms|bt|gb|it|wf|sb|ly|ng|gt|lu|il|pt|mh|eg|kg|pf|um|fr|sr|vg|fj|py|pm|sn|sd|au|sl|gh|us|mr|dz|ye|kn|cm|arpa|bw|lk|mg|tk|su|sc|ru|travel|az|ec|mz|lb|ml|bj|edu|pr|fk|lr|nf|np|do|mp|bs|to|cu|ch|yu|eu|mu|ni|pw|pl|gov|pe|an|ua|uk|gw|tp|kr|je|tt|net|fo|jobs|yt|cc|sh|io|zm|hk|th|so|er|cz|lt|mil|hr|gn|be|qa|cv|vc|tw|ws|ad|sz|at|tg|zw|nl|info\\.tn|org\\.sd|med\\.sd|com\\.hk|org\\.ai|edu\\.sg|at\\.tt|mail\\.pl|net\\.ni|pol\\.dz|hiroshima\\.jp|org\\.bh|edu\\.vu|net\\.im|ernet\\.in|nic\\.tt|com\\.tn|go\\.cr|jersey\\.je|bc\\.ca|com\\.la|go\\.jp|com\\.uy|tourism\\.tn|com\\.ec|conf\\.au|dk\\.org|shizuoka\\.jp|ac\\.vn|matsuyama\\.jp|agro\\.pl|yamaguchi\\.jp|edu\\.vn|yamanashi\\.jp|mil\\.in|sos\\.pl|bj\\.cn|net\\.au|ac\\.ae|psi\\.br|sch\\.ng|org\\.mt|edu\\.ai|edu\\.ck|ac\\.yu|org\\.ws|org\\.ng|rel\\.pl|uk\\.tt|com\\.py|aomori\\.jp|co\\.ug|video\\.hu|net\\.gg|org\\.pk|id\\.au|gov\\.zw|mil\\.tr|net\\.tn|org\\.ly|re\\.kr|mil\\.ye|mil\\.do|com\\.bb|net\\.vi|edu\\.na|co\\.za|asso\\.re|nom\\.pe|edu\\.tw|name\\.et|jl\\.cn|gov\\.ye|ehime\\.jp|miyazaki\\.jp|kanagawa\\.jp|gov\\.au|nm\\.cn|he\\.cn|edu\\.sd|mod\\.om|web\\.ve|edu\\.hk|medecin\\.fr|org\\.cu|info\\.au|edu\\.ve|nx\\.cn|alderney\\.gg|net\\.cu|org\\.za|mb\\.ca|com\\.ye|edu\\.pa|fed\\.us|ac\\.pa|alt\\.na|mil\\.lv|fukuoka\\.jp|gen\\.in|gr\\.jp|gov\\.br|gov\\.ac|id\\.fj|fukui\\.jp|hu\\.com|org\\.gu|net\\.ae|mil\\.ph|ltd\\.je|alt\\.za|gov\\.np|edu\\.jo|net\\.gu|g12\\.br|org\\.tn|store\\.co|fin\\.tn|ac\\.nz|gouv\\.fr|gov\\.il|org\\.ua|org\\.do|org\\.fj|sci\\.eg|gov\\.tt|cci\\.fr|tokyo\\.jp|net\\.lv|gov\\.lc|ind\\.br|ca\\.tt|gos\\.pk|hi\\.cn|net\\.do|co\\.tv|web\\.co|com\\.pa|com\\.ng|ac\\.ma|gov\\.bh|org\\.zw|csiro\\.au|lakas\\.hu|gob\\.ni|gov\\.fk|org\\.sy|gov\\.lb|gov\\.je|ed\\.cr|nb\\.ca|net\\.uy|com\\.ua|media\\.hu|com\\.lb|nom\\.pl|org\\.br|hk\\.cn|co\\.hu|org\\.my|gov\\.dz|sld\\.pa|gob\\.pk|net\\.uk|guernsey\\.gg|nara\\.jp|telememo\\.au|k12\\.tr|org\\.nz|pub\\.sa|edu\\.ac|com\\.dz|edu\\.lv|edu\\.pk|com\\.ph|net\\.na|net\\.et|id\\.lv|au\\.com|ac\\.ng|com\\.my|net\\.cy|unam\\.na|nom\\.za|net\\.np|info\\.pl|priv\\.hu|rec\\.ve|ac\\.uk|edu\\.mm|go\\.ug|ac\\.ug|co\\.dk|net\\.tt|oita\\.jp|fi\\.cr|org\\.ac|aichi\\.jp|org\\.tt|edu\\.bh|us\\.com|ac\\.kr|js\\.cn|edu\\.ni|com\\.mt|fam\\.pk|experts-comptables\\.fr|or\\.kr|org\\.au|web\\.pk|mil\\.jo|biz\\.pl|org\\.np|city\\.hu|org\\.uy|auto\\.pl|aid\\.pl|bib\\.ve|mo\\.cn|br\\.com|dns\\.be|sh\\.cn|org\\.mo|com\\.sg|me\\.uk|gov\\.kw|eun\\.eg|kagoshima\\.jp|ln\\.cn|seoul\\.kr|school\\.fj|com\\.mk|e164\\.arpa|rnu\\.tn|pro\\.ae|org\\.om|gov\\.my|net\\.ye|gov\\.do|co\\.im|org\\.lb|plc\\.co\\.im|net\\.jp|go\\.id|net\\.tw|gov\\.ai|tlf\\.nr|ac\\.im|com\\.do|net\\.py|tozsde\\.hu|com\\.na|tottori\\.jp|net\\.ge|gov\\.cn|org\\.bb|net\\.bs|ac\\.za|rns\\.tn|biz\\.pk|gov\\.ge|org\\.uk|org\\.fk|nhs\\.uk|net\\.bh|tm\\.za|co\\.nz|gov\\.jp|jogasz\\.hu|shop\\.pl|media\\.pl|chiba\\.jp|city\\.za|org\\.ck|net\\.id|com\\.ar|gon\\.pk|gov\\.om|idf\\.il|net\\.cn|prd\\.fr|co\\.in|or\\.ug|red\\.sv|edu\\.lb|k12\\.ec|gx\\.cn|net\\.nz|info\\.hu|ac\\.zw|info\\.tt|com\\.ws|org\\.gg|com\\.et|ac\\.jp|ac\\.at|avocat\\.fr|org\\.ph|sark\\.gg|org\\.ve|tm\\.pl|net\\.pg|gov\\.co|com\\.lc|film\\.hu|ishikawa\\.jp|hotel\\.hu|hl\\.cn|edu\\.ge|com\\.bm|ac\\.om|tec\\.ve|edu\\.tr|cq\\.cn|com\\.pk|firm\\.in|inf\\.br|gunma\\.jp|gov\\.tn|oz\\.au|nf\\.ca|akita\\.jp|net\\.sd|tourism\\.pl|net\\.bb|or\\.at|idv\\.tw|dni\\.us|org\\.mx|conf\\.lv|net\\.jo|nic\\.in|info\\.vn|pe\\.kr|tw\\.cn|org\\.eg|ad\\.jp|hb\\.cn|kyonggi\\.kr|bourse\\.za|org\\.sb|gov\\.gg|net\\.br|mil\\.pe|kobe\\.jp|net\\.sa|edu\\.mt|org\\.vn|yokohama\\.jp|net\\.il|ac\\.cr|edu\\.sb|nagano\\.jp|travel\\.pl|gov\\.tr|com\\.sv|co\\.il|rec\\.br|biz\\.om|com\\.mm|com\\.az|org\\.vu|edu\\.ng|com\\.mx|info\\.co|realestate\\.pl|mil\\.sh|yamagata\\.jp|or\\.id|org\\.ae|greta\\.fr|k12\\.il|com\\.tw|gov\\.ve|arts\\.ve|cul\\.na|gov\\.kh|org\\.bm|etc\\.br|or\\.th|ch\\.vu|de\\.tt|ind\\.je|org\\.tw|nom\\.fr|co\\.tt|net\\.lc|intl\\.tn|shiga\\.jp|pvt\\.ge|gov\\.ua|org\\.pe|net\\.kh|co\\.vi|iwi\\.nz|biz\\.vn|gov\\.ck|edu\\.eg|zj\\.cn|press\\.ma|ac\\.in|eu\\.tt|art\\.do|med\\.ec|bbs\\.tr|gov\\.uk|edu\\.ua|eu\\.com|web\\.do|szex\\.hu|mil\\.kh|gen\\.nz|okinawa\\.jp|mob\\.nr|edu\\.ws|edu\\.sv|xj\\.cn|net\\.ru|dk\\.tt|erotika\\.hu|com\\.sh|cn\\.com|edu\\.pl|com\\.nc|org\\.il|arts\\.co|chirurgiens-dentistes\\.fr|net\\.pa|takamatsu\\.jp|net\\.ng|org\\.hu|net\\.in|net\\.vu|gen\\.tr|shop\\.hu|com\\.ae|tokushima\\.jp|za\\.com|gov\\.eg|co\\.jp|uba\\.ar|net\\.my|biz\\.et|art\\.br|ac\\.fk|gob\\.pe|com\\.bs|co\\.ae|de\\.net|net\\.eg|hyogo\\.jp|edunet\\.tn|museum\\.om|nom\\.ve|rnrt\\.tn|hn\\.cn|com\\.fk|edu\\.dz|ne\\.kr|co\\.je|sch\\.uk|priv\\.pl|sp\\.br|net\\.hk|name\\.vn|com\\.sa|edu\\.bm|qc\\.ca|bolt\\.hu|per\\.kh|sn\\.cn|mil\\.id|kagawa\\.jp|utsunomiya\\.jp|erotica\\.hu|gd\\.cn|net\\.tr|edu\\.np|asn\\.au|com\\.gu|ind\\.tn|mil\\.br|net\\.lb|nom\\.co|org\\.la|mil\\.pl|ac\\.il|gov\\.jo|com\\.kw|edu\\.sh|otc\\.au|gmina\\.pl|per\\.sg|gov\\.mo|int\\.ve|news\\.hu|sec\\.ps|ac\\.pg|health\\.vn|sex\\.pl|net\\.nc|qc\\.com|idv\\.hk|org\\.hk|gok\\.pk|com\\.ac|tochigi\\.jp|gsm\\.pl|law\\.za|pro\\.vn|edu\\.pe|info\\.et|sch\\.gg|com\\.vn|gov\\.bm|com\\.cn|mod\\.uk|gov\\.ps|toyama\\.jp|gv\\.at|yk\\.ca|org\\.et|suli\\.hu|edu\\.my|org\\.mm|co\\.yu|int\\.ar|pe\\.ca|tm\\.hu|net\\.sb|org\\.yu|com\\.ru|com\\.pe|edu\\.kh|edu\\.kw|org\\.qa|med\\.om|net\\.ws|org\\.in|turystyka\\.pl|store\\.ve|org\\.bs|mil\\.uy|net\\.ar|iwate\\.jp|org\\.nc|us\\.tt|gov\\.sh|nom\\.fk|go\\.th|gov\\.ec|com\\.br|edu\\.do|gov\\.ng|pro\\.tt|sapporo\\.jp|net\\.ua|tm\\.fr|com\\.lv|com\\.mo|edu\\.uk|fin\\.ec|edu\\.ps|ru\\.com|edu\\.ec|ac\\.fj|net\\.mm|veterinaire\\.fr|nom\\.re|ingatlan\\.hu|fr\\.vu|ne\\.jp|int\\.co|gov\\.cy|org\\.lv|de\\.com|nagasaki\\.jp|com\\.sb|gov\\.za|org\\.lc|com\\.fj|ind\\.in|or\\.cr|sc\\.cn|chambagri\\.fr|or\\.jp|forum\\.hu|tmp\\.br|reklam\\.hu|gob\\.sv|com\\.pl|saitama\\.jp|name\\.tt|niigata\\.jp|sklep\\.pl|nom\\.ni|co\\.ma|net\\.la|co\\.om|pharmacien\\.fr|port\\.fr|mil\\.gu|au\\.tt|edu\\.gu|ngo\\.ph|com\\.ve|ac\\.th|gov\\.fj|barreau\\.fr|net\\.ac|ac\\.je|org\\.kw|sport\\.hu|ac\\.cn|net\\.bm|ibaraki\\.jp|tel\\.no|org\\.cy|edu\\.mo|gb\\.net|kyoto\\.jp|sch\\.sa|com\\.au|edu\\.lc|fax\\.nr|gov\\.mm|it\\.tt|org\\.jo|nat\\.tn|mil\\.ve|be\\.tt|org\\.az|rec\\.co|co\\.ve|gifu\\.jp|net\\.th|hokkaido\\.jp|ac\\.gg|go\\.kr|edu\\.ye|qh\\.cn|ab\\.ca|org\\.cn|no\\.com|co\\.uk|gov\\.gu|de\\.vu|miasta\\.pl|kawasaki\\.jp|co\\.cr|miyagi\\.jp|org\\.jp|osaka\\.jp|web\\.za|net\\.za|gov\\.pk|gov\\.vn|agrar\\.hu|asn\\.lv|org\\.sv|net\\.sh|org\\.sa|org\\.dz|assedic\\.fr|com\\.sy|net\\.ph|mil\\.ge|es\\.tt|mobile\\.nr|co\\.kr|ltd\\.uk|ac\\.be|fgov\\.be|geek\\.nz|ind\\.gg|net\\.mt|maori\\.nz|ens\\.tn|edu\\.py|gov\\.sd|gov\\.qa|nt\\.ca|com\\.pg|org\\.kh|pc\\.pl|com\\.eg|net\\.ly|se\\.com|gb\\.com|edu\\.ar|sch\\.je|mil\\.ac|mil\\.ar|okayama\\.jp|gov\\.sg|ac\\.id|co\\.id|com\\.ly|huissier-justice\\.fr|nic\\.im|gov\\.lv|nu\\.ca|org\\.sg|com\\.kh|org\\.vi|sa\\.cr|lg\\.jp|ns\\.ca|edu\\.co|gov\\.im|edu\\.om|net\\.dz|org\\.pl|pp\\.ru|tm\\.mt|org\\.ar|co\\.gg|org\\.im|edu\\.qa|org\\.py|edu\\.uy|targi\\.pl|com\\.ge|gub\\.uy|gov\\.ar|ltd\\.gg|fr\\.tt|net\\.qa|com\\.np|ass\\.dz|se\\.tt|com\\.ai|org\\.ma|plo\\.ps|co\\.at|med\\.sa|net\\.sg|kanazawa\\.jp|com\\.fr|school\\.za|net\\.pl|ngo\\.za|net\\.sy|ed\\.jp|org\\.na|net\\.ma|asso\\.fr|police\\.uk|powiat\\.pl|govt\\.nz|sk\\.ca|tj\\.cn|mil\\.ec|com\\.jo|net\\.mo|notaires\\.fr|avoues\\.fr|aeroport\\.fr|yn\\.cn|gov\\.et|gov\\.sa|gov\\.ae|com\\.tt|art\\.dz|firm\\.ve|com\\.sd|school\\.nz|edu\\.et|gob\\.pa|telecom\\.na|ac\\.cy|gz\\.cn|net\\.kw|mobil\\.nr|nic\\.uk|co\\.th|com\\.vu|com\\.re|belgie\\.be|nl\\.ca|uk\\.com|com\\.om|utazas\\.hu|presse\\.fr|co\\.ck|xz\\.cn|org\\.tr|mil\\.co|edu\\.cn|net\\.ec|on\\.ca|konyvelo\\.hu|gop\\.pk|net\\.om|info\\.ve|com\\.ni|sa\\.com|com\\.tr|sch\\.sd|fukushima\\.jp|tel\\.nr|atm\\.pl|kitakyushu\\.jp|com\\.qa|firm\\.co|edu\\.tt|games\\.hu|mil\\.nz|cri\\.nz|net\\.az|org\\.ge|mie\\.jp|net\\.mx|sch\\.ae|nieruchomosci\\.pl|int\\.vn|edu\\.za|com\\.cy|wakayama\\.jp|gov\\.hk|org\\.pa|edu\\.au|gov\\.in|pro\\.om|2000\\.hu|szkola\\.pl|shimane\\.jp|co\\.zw|gove\\.tw|com\\.co|net\\.ck|net\\.pk|net\\.ve|org\\.ru|uk\\.net|org\\.co|uu\\.mt|com\\.cu|mil\\.za|plc\\.uk|lkd\\.co\\.im|gs\\.cn|sex\\.hu|net\\.je|kumamoto\\.jp|mil\\.lb|edu\\.yu|gov\\.ws|sendai\\.jp|eu\\.org|ah\\.cn|net\\.vn|gov\\.sb|net\\.pe|nagoya\\.jp|geometre-expert\\.fr|net\\.fk|biz\\.tt|org\\.sh|edu\\.sa|saga\\.jp|sx\\.cn|org\\.je|org\\.ye|muni\\.il|kochi\\.jp|com\\.bh|org\\.ec|priv\\.at|gov\\.sy|org\\.ni|casino\\.hu|res\\.in|uy\\.com)";
-
-    // insert it
-    res = tldRes[1] + tldStr + tldRes[3];
-  }
+  if (tldRes) res = tldRes[1] + tldStr + tldRes[3];
   return new RegExp(res + "$", "i");
 }
 GM_convert2RegExp = GM_util.memoize(GM_convert2RegExp);
+
+// This is intentionally and exactly the last line, to make it easier to update
+// via the publicsuffix.sh script.
+var tldStr = "\\.(?:demon\\.co\\.uk|esc\\.edu\\.ar|(?:c[oi]\\.)?[^\\.]\\.(?:vt|ne|ks|il|hi|sc|nh|ia|wy|or|ma|vi|tn|in|az|id|nc|co|dc|nd|me|al|ak|de|wv|nm|mo|pr|nj|sd|md|va|ri|ut|ct|pa|ok|ky|mt|ga|la|oh|ms|wi|wa|gu|mi|tx|fl|ca|ar|mn|ny|nv)\\.us|[^\\.]\\.(?:(?:pvt\\.)?k12|cc|tec|lib|state|gen)\\.(?:vt|ne|ks|il|hi|sc|nh|ia|wy|or|ma|vi|tn|in|az|id|nc|co|dc|nd|me|al|ak|de|wv|nm|mo|pr|nj|sd|md|va|ri|ut|ct|pa|ok|ky|mt|ga|la|oh|ms|wi|wa|gu|mi|tx|fl|ca|ar|mn|ny|nv)\\.us|[^\\.]\\.vt|ne|ks|il|hi|sc|nh|ia|wy|or|ma|vi|tn|in|az|id|nc|co|dc|nd|me|al|ak|de|wv|nm|mo|pr|nj|sd|md|va|ri|ut|ct|pa|ok|ky|mt|ga|la|oh|ms|wi|wa|gu|mi|tx|fl|ca|ar|mn|ny|nvus|ne|gg|tr|mm|ki|biz|sj|my|hn|gl|ro|tn|co|br|coop|cy|bo|ck|tc|bv|ke|aero|cs|dm|km|bf|af|mv|ls|tm|jm|pg|ky|ga|pn|sv|mq|hu|za|se|uy|iq|ai|com|ve|na|ba|ph|xxx|no|lv|tf|kz|ma|in|id|si|re|om|by|fi|gs|ir|li|tz|td|cg|pa|am|tv|jo|bi|ee|cd|pk|mn|gd|nz|as|lc|ae|cn|ag|mx|sy|cx|cr|vi|sg|bm|kh|nr|bz|vu|kw|gf|al|uz|eh|int|ht|mw|gm|bg|gu|info|aw|gy|ac|ca|museum|sk|ax|es|kp|bb|sa|et|ie|tl|org|tj|cf|im|mk|de|pro|md|fm|cl|jp|bn|vn|gp|sm|ar|dj|bd|mc|ug|nu|ci|dk|nc|rw|aq|name|st|hm|mo|gq|ps|ge|ao|gr|va|is|mt|gi|la|bh|ms|bt|gb|it|wf|sb|ly|ng|gt|lu|il|pt|mh|eg|kg|pf|um|fr|sr|vg|fj|py|pm|sn|sd|au|sl|gh|us|mr|dz|ye|kn|cm|arpa|bw|lk|mg|tk|su|sc|ru|travel|az|ec|mz|lb|ml|bj|edu|pr|fk|lr|nf|np|do|mp|bs|to|cu|ch|yu|eu|mu|ni|pw|pl|gov|pe|an|ua|uk|gw|tp|kr|je|tt|net|fo|jobs|yt|cc|sh|io|zm|hk|th|so|er|cz|lt|mil|hr|gn|be|qa|cv|vc|tw|ws|ad|sz|at|tg|zw|nl|info\\.tn|org\\.sd|med\\.sd|com\\.hk|org\\.ai|edu\\.sg|at\\.tt|mail\\.pl|net\\.ni|pol\\.dz|hiroshima\\.jp|org\\.bh|edu\\.vu|net\\.im|ernet\\.in|nic\\.tt|com\\.tn|go\\.cr|jersey\\.je|bc\\.ca|com\\.la|go\\.jp|com\\.uy|tourism\\.tn|com\\.ec|conf\\.au|dk\\.org|shizuoka\\.jp|ac\\.vn|matsuyama\\.jp|agro\\.pl|yamaguchi\\.jp|edu\\.vn|yamanashi\\.jp|mil\\.in|sos\\.pl|bj\\.cn|net\\.au|ac\\.ae|psi\\.br|sch\\.ng|org\\.mt|edu\\.ai|edu\\.ck|ac\\.yu|org\\.ws|org\\.ng|rel\\.pl|uk\\.tt|com\\.py|aomori\\.jp|co\\.ug|video\\.hu|net\\.gg|org\\.pk|id\\.au|gov\\.zw|mil\\.tr|net\\.tn|org\\.ly|re\\.kr|mil\\.ye|mil\\.do|com\\.bb|net\\.vi|edu\\.na|co\\.za|asso\\.re|nom\\.pe|edu\\.tw|name\\.et|jl\\.cn|gov\\.ye|ehime\\.jp|miyazaki\\.jp|kanagawa\\.jp|gov\\.au|nm\\.cn|he\\.cn|edu\\.sd|mod\\.om|web\\.ve|edu\\.hk|medecin\\.fr|org\\.cu|info\\.au|edu\\.ve|nx\\.cn|alderney\\.gg|net\\.cu|org\\.za|mb\\.ca|com\\.ye|edu\\.pa|fed\\.us|ac\\.pa|alt\\.na|mil\\.lv|fukuoka\\.jp|gen\\.in|gr\\.jp|gov\\.br|gov\\.ac|id\\.fj|fukui\\.jp|hu\\.com|org\\.gu|net\\.ae|mil\\.ph|ltd\\.je|alt\\.za|gov\\.np|edu\\.jo|net\\.gu|g12\\.br|org\\.tn|store\\.co|fin\\.tn|ac\\.nz|gouv\\.fr|gov\\.il|org\\.ua|org\\.do|org\\.fj|sci\\.eg|gov\\.tt|cci\\.fr|tokyo\\.jp|net\\.lv|gov\\.lc|ind\\.br|ca\\.tt|gos\\.pk|hi\\.cn|net\\.do|co\\.tv|web\\.co|com\\.pa|com\\.ng|ac\\.ma|gov\\.bh|org\\.zw|csiro\\.au|lakas\\.hu|gob\\.ni|gov\\.fk|org\\.sy|gov\\.lb|gov\\.je|ed\\.cr|nb\\.ca|net\\.uy|com\\.ua|media\\.hu|com\\.lb|nom\\.pl|org\\.br|hk\\.cn|co\\.hu|org\\.my|gov\\.dz|sld\\.pa|gob\\.pk|net\\.uk|guernsey\\.gg|nara\\.jp|telememo\\.au|k12\\.tr|org\\.nz|pub\\.sa|edu\\.ac|com\\.dz|edu\\.lv|edu\\.pk|com\\.ph|net\\.na|net\\.et|id\\.lv|au\\.com|ac\\.ng|com\\.my|net\\.cy|unam\\.na|nom\\.za|net\\.np|info\\.pl|priv\\.hu|rec\\.ve|ac\\.uk|edu\\.mm|go\\.ug|ac\\.ug|co\\.dk|net\\.tt|oita\\.jp|fi\\.cr|org\\.ac|aichi\\.jp|org\\.tt|edu\\.bh|us\\.com|ac\\.kr|js\\.cn|edu\\.ni|com\\.mt|fam\\.pk|experts-comptables\\.fr|or\\.kr|org\\.au|web\\.pk|mil\\.jo|biz\\.pl|org\\.np|city\\.hu|org\\.uy|auto\\.pl|aid\\.pl|bib\\.ve|mo\\.cn|br\\.com|dns\\.be|sh\\.cn|org\\.mo|com\\.sg|me\\.uk|gov\\.kw|eun\\.eg|kagoshima\\.jp|ln\\.cn|seoul\\.kr|school\\.fj|com\\.mk|e164\\.arpa|rnu\\.tn|pro\\.ae|org\\.om|gov\\.my|net\\.ye|gov\\.do|co\\.im|org\\.lb|plc\\.co\\.im|net\\.jp|go\\.id|net\\.tw|gov\\.ai|tlf\\.nr|ac\\.im|com\\.do|net\\.py|tozsde\\.hu|com\\.na|tottori\\.jp|net\\.ge|gov\\.cn|org\\.bb|net\\.bs|ac\\.za|rns\\.tn|biz\\.pk|gov\\.ge|org\\.uk|org\\.fk|nhs\\.uk|net\\.bh|tm\\.za|co\\.nz|gov\\.jp|jogasz\\.hu|shop\\.pl|media\\.pl|chiba\\.jp|city\\.za|org\\.ck|net\\.id|com\\.ar|gon\\.pk|gov\\.om|idf\\.il|net\\.cn|prd\\.fr|co\\.in|or\\.ug|red\\.sv|edu\\.lb|k12\\.ec|gx\\.cn|net\\.nz|info\\.hu|ac\\.zw|info\\.tt|com\\.ws|org\\.gg|com\\.et|ac\\.jp|ac\\.at|avocat\\.fr|org\\.ph|sark\\.gg|org\\.ve|tm\\.pl|net\\.pg|gov\\.co|com\\.lc|film\\.hu|ishikawa\\.jp|hotel\\.hu|hl\\.cn|edu\\.ge|com\\.bm|ac\\.om|tec\\.ve|edu\\.tr|cq\\.cn|com\\.pk|firm\\.in|inf\\.br|gunma\\.jp|gov\\.tn|oz\\.au|nf\\.ca|akita\\.jp|net\\.sd|tourism\\.pl|net\\.bb|or\\.at|idv\\.tw|dni\\.us|org\\.mx|conf\\.lv|net\\.jo|nic\\.in|info\\.vn|pe\\.kr|tw\\.cn|org\\.eg|ad\\.jp|hb\\.cn|kyonggi\\.kr|bourse\\.za|org\\.sb|gov\\.gg|net\\.br|mil\\.pe|kobe\\.jp|net\\.sa|edu\\.mt|org\\.vn|yokohama\\.jp|net\\.il|ac\\.cr|edu\\.sb|nagano\\.jp|travel\\.pl|gov\\.tr|com\\.sv|co\\.il|rec\\.br|biz\\.om|com\\.mm|com\\.az|org\\.vu|edu\\.ng|com\\.mx|info\\.co|realestate\\.pl|mil\\.sh|yamagata\\.jp|or\\.id|org\\.ae|greta\\.fr|k12\\.il|com\\.tw|gov\\.ve|arts\\.ve|cul\\.na|gov\\.kh|org\\.bm|etc\\.br|or\\.th|ch\\.vu|de\\.tt|ind\\.je|org\\.tw|nom\\.fr|co\\.tt|net\\.lc|intl\\.tn|shiga\\.jp|pvt\\.ge|gov\\.ua|org\\.pe|net\\.kh|co\\.vi|iwi\\.nz|biz\\.vn|gov\\.ck|edu\\.eg|zj\\.cn|press\\.ma|ac\\.in|eu\\.tt|art\\.do|med\\.ec|bbs\\.tr|gov\\.uk|edu\\.ua|eu\\.com|web\\.do|szex\\.hu|mil\\.kh|gen\\.nz|okinawa\\.jp|mob\\.nr|edu\\.ws|edu\\.sv|xj\\.cn|net\\.ru|dk\\.tt|erotika\\.hu|com\\.sh|cn\\.com|edu\\.pl|com\\.nc|org\\.il|arts\\.co|chirurgiens-dentistes\\.fr|net\\.pa|takamatsu\\.jp|net\\.ng|org\\.hu|net\\.in|net\\.vu|gen\\.tr|shop\\.hu|com\\.ae|tokushima\\.jp|za\\.com|gov\\.eg|co\\.jp|uba\\.ar|net\\.my|biz\\.et|art\\.br|ac\\.fk|gob\\.pe|com\\.bs|co\\.ae|de\\.net|net\\.eg|hyogo\\.jp|edunet\\.tn|museum\\.om|nom\\.ve|rnrt\\.tn|hn\\.cn|com\\.fk|edu\\.dz|ne\\.kr|co\\.je|sch\\.uk|priv\\.pl|sp\\.br|net\\.hk|name\\.vn|com\\.sa|edu\\.bm|qc\\.ca|bolt\\.hu|per\\.kh|sn\\.cn|mil\\.id|kagawa\\.jp|utsunomiya\\.jp|erotica\\.hu|gd\\.cn|net\\.tr|edu\\.np|asn\\.au|com\\.gu|ind\\.tn|mil\\.br|net\\.lb|nom\\.co|org\\.la|mil\\.pl|ac\\.il|gov\\.jo|com\\.kw|edu\\.sh|otc\\.au|gmina\\.pl|per\\.sg|gov\\.mo|int\\.ve|news\\.hu|sec\\.ps|ac\\.pg|health\\.vn|sex\\.pl|net\\.nc|qc\\.com|idv\\.hk|org\\.hk|gok\\.pk|com\\.ac|tochigi\\.jp|gsm\\.pl|law\\.za|pro\\.vn|edu\\.pe|info\\.et|sch\\.gg|com\\.vn|gov\\.bm|com\\.cn|mod\\.uk|gov\\.ps|toyama\\.jp|gv\\.at|yk\\.ca|org\\.et|suli\\.hu|edu\\.my|org\\.mm|co\\.yu|int\\.ar|pe\\.ca|tm\\.hu|net\\.sb|org\\.yu|com\\.ru|com\\.pe|edu\\.kh|edu\\.kw|org\\.qa|med\\.om|net\\.ws|org\\.in|turystyka\\.pl|store\\.ve|org\\.bs|mil\\.uy|net\\.ar|iwate\\.jp|org\\.nc|us\\.tt|gov\\.sh|nom\\.fk|go\\.th|gov\\.ec|com\\.br|edu\\.do|gov\\.ng|pro\\.tt|sapporo\\.jp|net\\.ua|tm\\.fr|com\\.lv|com\\.mo|edu\\.uk|fin\\.ec|edu\\.ps|ru\\.com|edu\\.ec|ac\\.fj|net\\.mm|veterinaire\\.fr|nom\\.re|ingatlan\\.hu|fr\\.vu|ne\\.jp|int\\.co|gov\\.cy|org\\.lv|de\\.com|nagasaki\\.jp|com\\.sb|gov\\.za|org\\.lc|com\\.fj|ind\\.in|or\\.cr|sc\\.cn|chambagri\\.fr|or\\.jp|forum\\.hu|tmp\\.br|reklam\\.hu|gob\\.sv|com\\.pl|saitama\\.jp|name\\.tt|niigata\\.jp|sklep\\.pl|nom\\.ni|co\\.ma|net\\.la|co\\.om|pharmacien\\.fr|port\\.fr|mil\\.gu|au\\.tt|edu\\.gu|ngo\\.ph|com\\.ve|ac\\.th|gov\\.fj|barreau\\.fr|net\\.ac|ac\\.je|org\\.kw|sport\\.hu|ac\\.cn|net\\.bm|ibaraki\\.jp|tel\\.no|org\\.cy|edu\\.mo|gb\\.net|kyoto\\.jp|sch\\.sa|com\\.au|edu\\.lc|fax\\.nr|gov\\.mm|it\\.tt|org\\.jo|nat\\.tn|mil\\.ve|be\\.tt|org\\.az|rec\\.co|co\\.ve|gifu\\.jp|net\\.th|hokkaido\\.jp|ac\\.gg|go\\.kr|edu\\.ye|qh\\.cn|ab\\.ca|org\\.cn|no\\.com|co\\.uk|gov\\.gu|de\\.vu|miasta\\.pl|kawasaki\\.jp|co\\.cr|miyagi\\.jp|org\\.jp|osaka\\.jp|web\\.za|net\\.za|gov\\.pk|gov\\.vn|agrar\\.hu|asn\\.lv|org\\.sv|net\\.sh|org\\.sa|org\\.dz|assedic\\.fr|com\\.sy|net\\.ph|mil\\.ge|es\\.tt|mobile\\.nr|co\\.kr|ltd\\.uk|ac\\.be|fgov\\.be|geek\\.nz|ind\\.gg|net\\.mt|maori\\.nz|ens\\.tn|edu\\.py|gov\\.sd|gov\\.qa|nt\\.ca|com\\.pg|org\\.kh|pc\\.pl|com\\.eg|net\\.ly|se\\.com|gb\\.com|edu\\.ar|sch\\.je|mil\\.ac|mil\\.ar|okayama\\.jp|gov\\.sg|ac\\.id|co\\.id|com\\.ly|huissier-justice\\.fr|nic\\.im|gov\\.lv|nu\\.ca|org\\.sg|com\\.kh|org\\.vi|sa\\.cr|lg\\.jp|ns\\.ca|edu\\.co|gov\\.im|edu\\.om|net\\.dz|org\\.pl|pp\\.ru|tm\\.mt|org\\.ar|co\\.gg|org\\.im|edu\\.qa|org\\.py|edu\\.uy|targi\\.pl|com\\.ge|gub\\.uy|gov\\.ar|ltd\\.gg|fr\\.tt|net\\.qa|com\\.np|ass\\.dz|se\\.tt|com\\.ai|org\\.ma|plo\\.ps|co\\.at|med\\.sa|net\\.sg|kanazawa\\.jp|com\\.fr|school\\.za|net\\.pl|ngo\\.za|net\\.sy|ed\\.jp|org\\.na|net\\.ma|asso\\.fr|police\\.uk|powiat\\.pl|govt\\.nz|sk\\.ca|tj\\.cn|mil\\.ec|com\\.jo|net\\.mo|notaires\\.fr|avoues\\.fr|aeroport\\.fr|yn\\.cn|gov\\.et|gov\\.sa|gov\\.ae|com\\.tt|art\\.dz|firm\\.ve|com\\.sd|school\\.nz|edu\\.et|gob\\.pa|telecom\\.na|ac\\.cy|gz\\.cn|net\\.kw|mobil\\.nr|nic\\.uk|co\\.th|com\\.vu|com\\.re|belgie\\.be|nl\\.ca|uk\\.com|com\\.om|utazas\\.hu|presse\\.fr|co\\.ck|xz\\.cn|org\\.tr|mil\\.co|edu\\.cn|net\\.ec|on\\.ca|konyvelo\\.hu|gop\\.pk|net\\.om|info\\.ve|com\\.ni|sa\\.com|com\\.tr|sch\\.sd|fukushima\\.jp|tel\\.nr|atm\\.pl|kitakyushu\\.jp|com\\.qa|firm\\.co|edu\\.tt|games\\.hu|mil\\.nz|cri\\.nz|net\\.az|org\\.ge|mie\\.jp|net\\.mx|sch\\.ae|nieruchomosci\\.pl|int\\.vn|edu\\.za|com\\.cy|wakayama\\.jp|gov\\.hk|org\\.pa|edu\\.au|gov\\.in|pro\\.om|2000\\.hu|szkola\\.pl|shimane\\.jp|co\\.zw|gove\\.tw|com\\.co|net\\.ck|net\\.pk|net\\.ve|org\\.ru|uk\\.net|org\\.co|uu\\.mt|com\\.cu|mil\\.za|plc\\.uk|lkd\\.co\\.im|gs\\.cn|sex\\.hu|net\\.je|kumamoto\\.jp|mil\\.lb|edu\\.yu|gov\\.ws|sendai\\.jp|eu\\.org|ah\\.cn|net\\.vn|gov\\.sb|net\\.pe|nagoya\\.jp|geometre-expert\\.fr|net\\.fk|biz\\.tt|org\\.sh|edu\\.sa|saga\\.jp|sx\\.cn|org\\.je|org\\.ye|muni\\.il|kochi\\.jp|com\\.bh|org\\.ec|priv\\.at|gov\\.sy|org\\.ni|casino\\.hu|res\\.in|uy\\.com)";
diff --git a/modules/util/getEditor.js b/modules/util/getEditor.js
index b2cd81f..8b4960e 100644
--- a/modules/util/getEditor.js
+++ b/modules/util/getEditor.js
@@ -1,6 +1,13 @@
 Components.utils.import('resource://greasemonkey/prefmanager.js');
+Components.utils.import('resource://greasemonkey/util.js');
 
-const EXPORTED_SYMBOLS = ['getEditor'];
+var EXPORTED_SYMBOLS = ['getEditor'];
+var stringBundle = Components
+    .classes["@mozilla.org/intl/stringbundle;1"]
+    .getService(Components.interfaces.nsIStringBundleService)
+    .createBundle("chrome://greasemonkey/locale/gm-browser.properties");
+var EDITOR_PROMPT = stringBundle.GetStringFromName("editor.prompt");
+var PICK_EXE = stringBundle.GetStringFromName("editor.please_pick_executable");
 
 function getEditor(change) {
   var editorPath = GM_prefRoot.getValue("editor");
@@ -9,7 +16,7 @@ function getEditor(change) {
     var editor;
     try {
       editor = Components.classes["@mozilla.org/file/local;1"]
-                   .createInstance(Components.interfaces.nsILocalFile);
+          .createInstance(Components.interfaces.nsILocalFile);
       editor.followLinks = true;
       editor.initWithPath(editorPath);
     } catch (e) {
@@ -30,12 +37,11 @@ function getEditor(change) {
   while (true) {
     var nsIFilePicker = Components.interfaces.nsIFilePicker;
     var filePicker = Components.classes["@mozilla.org/filepicker;1"]
-                               .createInstance(nsIFilePicker);
+        .createInstance(nsIFilePicker);
 
-    filePicker.init(window, GM_stringBundle.GetStringFromName("editor.prompt"),
-                    nsIFilePicker.modeOpen);
-    filePicker.appendFilters(nsIFilePicker.filterApplication);
-    filePicker.appendFilters(nsIFilePicker.filterAll);
+    filePicker.init(
+        GM_util.getBrowserWindow(), EDITOR_PROMPT, nsIFilePicker.modeOpen);
+    filePicker.appendFilters(nsIFilePicker.filterApps);
 
     if (filePicker.show() != nsIFilePicker.returnOK) {
       // The user canceled, return null.
@@ -46,7 +52,7 @@ function getEditor(change) {
       GM_prefRoot.setValue("editor", filePicker.file.path);
       return filePicker.file;
     } else {
-      alert(GM_stringBundle.GetStringFromName("editor.please_pick_executable"));
+      GM_util.alert(PICK_EXE);
     }
   }
 }
diff --git a/modules/util/getTempFile.js b/modules/util/getTempFile.js
index 771ab65..4c64800 100644
--- a/modules/util/getTempFile.js
+++ b/modules/util/getTempFile.js
@@ -7,9 +7,9 @@ const TMP_DIR = Components.classes["@mozilla.org/file/directory_service;1"]
     .getService(Components.interfaces.nsIProperties)
     .get("TmpD", Components.interfaces.nsILocalFile);
 
-function getTempFile() {
-  var file = TMP_DIR.clone();
-  file.append("gm-temp");
+function getTempFile(aRoot, aLeaf) {
+  var file = (aRoot || TMP_DIR).clone();
+  file.append(aLeaf || 'gm-temp');
   file.createUnique(NORMAL_FILE_TYPE, GM_constants.fileMask);
   return file;
 }
diff --git a/modules/util/hitch.js b/modules/util/hitch.js
index ba53619..b0ad646 100644
--- a/modules/util/hitch.js
+++ b/modules/util/hitch.js
@@ -1,8 +1,15 @@
 const EXPORTED_SYMBOLS = ['hitch'];
 
-function hitch(obj, meth) {
-  if (!obj[meth]) {
-    throw "method '" + meth + "' does not exist on object '" + obj + "'";
+function hitch(obj, method) {
+  if (obj && method && ('string' == typeof method)) {
+    if (!obj[method]) {
+      throw "method '" + method + "' does not exist on object '" + obj + "'";
+    }
+    method = obj[method];
+  } else if ('function' == typeof method) {
+    obj = obj || {};
+  } else {
+    throw "Invalid arguments to GM_util.hitch().";
   }
 
   var staticArgs = Array.prototype.splice.call(arguments, 2, arguments.length);
@@ -17,6 +24,6 @@ function hitch(obj, meth) {
 
     // invoke the original function with the correct this obj and the combined
     // list of static and dynamic arguments.
-    return obj[meth].apply(obj, args);
+    return method.apply(obj, args);
   };
 }
diff --git a/modules/util/openInEditor.js b/modules/util/openInEditor.js
index a8352ec..5fbef72 100644
--- a/modules/util/openInEditor.js
+++ b/modules/util/openInEditor.js
@@ -25,8 +25,8 @@ function openInEditor(script) {
     var xulRuntime = Components.classes["@mozilla.org/xre/app-info;1"]
         .getService(Components.interfaces.nsIXULRuntime);
     if ("Darwin"==xulRuntime.OS) {
-      args = ["-a", appFile.path, script.file.path];
-        editor = Components.classes["@mozilla.org/file/local;1"]
+      args = ["-a", editor.path, script.file.path];
+      editor = Components.classes["@mozilla.org/file/local;1"]
           .createInstance(Components.interfaces.nsILocalFile);
       editor.followLinks = true;
       editor.initWithPath("/usr/bin/open");
@@ -39,7 +39,7 @@ function openInEditor(script) {
   } catch (e) {
     // Something may be wrong with the editor the user selected. Remove so that
     // next time they can pick a different one.
-    alert(COULD_NOT_LAUNCH + "\n" + e);
+    GM_util.alert(COULD_NOT_LAUNCH + "\n" + e);
     GM_prefRoot.remove("editor");
     throw(e);
   }
diff --git a/modules/util/uriFromUrl.js b/modules/util/uriFromUrl.js
index 472afeb..50c25a3 100644
--- a/modules/util/uriFromUrl.js
+++ b/modules/util/uriFromUrl.js
@@ -2,11 +2,11 @@ Components.utils.import('resource://greasemonkey/util.js');
 
 var EXPORTED_SYMBOLS = ['uriFromUrl'];
 
+var ioService = Components.classes["@mozilla.org/network/io-service;1"]
+    .getService(Components.interfaces.nsIIOService);
+
 function uriFromUrl(url, base) {
-  var ioService = Components.classes["@mozilla.org/network/io-service;1"]
-      .getService(Components.interfaces.nsIIOService);
   var baseUri = null;
-
   if (typeof base === "string") {
     baseUri = GM_util.uriFromUrl(base);
   } else if (base) {
diff --git a/modules/util/writeToFile.js b/modules/util/writeToFile.js
index 29da4ad..07f93f7 100644
--- a/modules/util/writeToFile.js
+++ b/modules/util/writeToFile.js
@@ -12,9 +12,6 @@ const converter = Components
     .createInstance(Components.interfaces.nsIScriptableUnicodeConverter);
 converter.charset = "UTF-8";
 
-const ostream = Components
-    .classes["@mozilla.org/network/safe-file-output-stream;1"]
-    .createInstance(Components.interfaces.nsIFileOutputStream);
 
 /** Given string data and an nsIFile, write it safely to that file. */
 function writeToFile(aData, aFile, aCallback) {
@@ -24,6 +21,9 @@ function writeToFile(aData, aFile, aCallback) {
   // Create a temporary file (stream) to hold the data.
   var tmpFile = aFile.clone();
   tmpFile.createUnique(NORMAL_FILE_TYPE, GM_constants.fileMask);
+  var ostream = Components
+      .classes["@mozilla.org/network/safe-file-output-stream;1"]
+      .createInstance(Components.interfaces.nsIFileOutputStream);
   ostream.init(tmpFile, STREAM_FLAGS, GM_constants.fileMask, 0);
 
   NetUtil.asyncCopy(istream, ostream, function(status) {

-- 
iceweasel extension that enables customization of webpages with user scripts



More information about the Pkg-mozext-commits mailing list