Bug 568691 - Convert existing JS components to use NSGetFactory and add manifest files for them. In a followup we will link the .manifest files together at packaging time. This patch was developed on Linux: Windows and Mac may require additional changes.
authorBenjamin Smedberg <benjamin@smedbergs.us>
Tue, 22 Jun 2010 12:59:15 -0400
changeset 47015 90afd1e80d77886ae95fc83c2f0385ad59b2e687
parent 47014 41ad403536cfd89fe113a06ea9768bc44663aa41
child 47016 21d8bc633dfae548bdbdc5d3c1f538cec582c152
push idunknown
push userunknown
push dateunknown
bugs568691
milestone1.9.3a6pre
first release with
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
last release without
nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
Bug 568691 - Convert existing JS components to use NSGetFactory and add manifest files for them. In a followup we will link the .manifest files together at packaging time. This patch was developed on Linux: Windows and Mac may require additional changes.
browser/components/BrowserComponents.manifest
browser/components/Makefile.in
browser/components/feeds/src/BrowserFeeds.manifest
browser/components/feeds/src/FeedConverter.js
browser/components/feeds/src/FeedWriter.js
browser/components/feeds/src/Makefile.in
browser/components/feeds/src/WebContentConverter.js
browser/components/nsBrowserContentHandler.js
browser/components/nsBrowserGlue.js
browser/components/places/src/BrowserPlaces.manifest
browser/components/places/src/Makefile.in
browser/components/places/src/PlacesProtocolHandler.js
browser/components/places/src/nsPlacesTransactionsService.js
browser/components/privatebrowsing/src/Makefile.in
browser/components/privatebrowsing/src/nsPrivateBrowsingService.js
browser/components/privatebrowsing/src/nsPrivateBrowsingService.manifest
browser/components/safebrowsing/Makefile.in
browser/components/safebrowsing/src/nsSafebrowsingApplication.js
browser/components/safebrowsing/src/nsSafebrowsingApplication.manifest
browser/components/sessionstore/src/Makefile.in
browser/components/sessionstore/src/nsSessionStartup.js
browser/components/sessionstore/src/nsSessionStore.js
browser/components/sessionstore/src/nsSessionStore.manifest
browser/components/shell/src/Makefile.in
browser/components/shell/src/nsSetDefaultBrowser.js
browser/components/shell/src/nsSetDefaultBrowser.manifest
browser/components/sidebar/src/Makefile.in
browser/components/sidebar/src/nsSidebar.js
browser/components/sidebar/src/nsSidebar.manifest
browser/fuel/src/Makefile.in
browser/fuel/src/fuelApplication.js
browser/fuel/src/fuelApplication.manifest
browser/installer/package-manifest.in
config/rules.mk
content/base/src/Makefile.in
content/base/src/contentAreaDropListener.js
content/base/src/contentAreaDropListener.manifest
content/base/src/contentSecurityPolicy.js
content/base/src/contentSecurityPolicy.manifest
content/base/src/nsBadCertHandler.js
content/base/src/nsBadCertHandler.manifest
content/xslt/src/xslt/Makefile.in
content/xslt/src/xslt/txEXSLTRegExFunctions.js
content/xslt/src/xslt/txEXSLTRegExFunctions.manifest
content/xslt/src/xslt/txStylesheetCompiler.cpp
dom/src/geolocation/GPSDGeolocationProvider.js
dom/src/geolocation/GPSDGeolocationProvider.manifest
dom/src/geolocation/Makefile.in
dom/src/geolocation/NetworkGeolocationProvider.js
dom/src/geolocation/NetworkGeolocationProvider.manifest
layout/tools/pageloader/Makefile.in
layout/tools/pageloader/tp-cmdline.js
layout/tools/pageloader/tp-cmdline.manifest
layout/tools/reftest/Makefile.in
layout/tools/reftest/reftest-cmdline.js
layout/tools/reftest/reftest-cmdline.manifest
netwerk/base/src/Makefile.in
netwerk/base/src/nsProxyAutoConfig.js
netwerk/base/src/nsProxyAutoConfig.manifest
netwerk/test/httpserver/Makefile.in
netwerk/test/httpserver/httpd.js
netwerk/test/httpserver/httpd.manifest
toolkit/components/Makefile.in
toolkit/components/console/Makefile.in
toolkit/components/console/jsconsole-clhandler.js
toolkit/components/console/jsconsole-clhandler.manifest
toolkit/components/contentprefs/src/Makefile.in
toolkit/components/contentprefs/src/nsContentPrefService.js
toolkit/components/contentprefs/src/nsContentPrefService.manifest
toolkit/components/downloads/src/Makefile.in
toolkit/components/downloads/src/nsDownloadManagerUI.js
toolkit/components/downloads/src/nsDownloadManagerUI.manifest
toolkit/components/feeds/src/FeedProcessor.js
toolkit/components/feeds/src/FeedProcessor.manifest
toolkit/components/feeds/src/Makefile.in
toolkit/components/filepicker/src/Makefile.in
toolkit/components/filepicker/src/nsFilePicker.js
toolkit/components/filepicker/src/nsFilePicker.js.in
toolkit/components/filepicker/src/nsFilePicker.manifest
toolkit/components/nsDefaultCLH.js
toolkit/components/nsDefaultCLH.manifest
toolkit/components/passwordmgr/src/Makefile.in
toolkit/components/passwordmgr/src/crypto-SDR.js
toolkit/components/passwordmgr/src/nsLoginInfo.js
toolkit/components/passwordmgr/src/nsLoginManager.js
toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js
toolkit/components/passwordmgr/src/passwordmgr.manifest
toolkit/components/passwordmgr/src/storage-Legacy.js
toolkit/components/passwordmgr/src/storage-mozStorage.js
toolkit/components/places/src/Makefile.in
toolkit/components/places/src/nsLivemarkService.js
toolkit/components/places/src/nsMicrosummaryService.js
toolkit/components/places/src/nsPlacesDBFlush.js
toolkit/components/places/src/nsPlacesExpiration.js
toolkit/components/places/src/nsTaggingService.js
toolkit/components/places/src/toolkitplaces.manifest
toolkit/components/prompts/src/Makefile.in
toolkit/components/prompts/src/nsPrompter.js
toolkit/components/prompts/src/nsPrompter.manifest
toolkit/components/satchel/src/Makefile.in
toolkit/components/satchel/src/nsFormAutoComplete.js
toolkit/components/satchel/src/nsFormHistory.js
toolkit/components/satchel/src/satchel.manifest
toolkit/components/search/Makefile.in
toolkit/components/search/nsSearchService.js
toolkit/components/search/nsSearchSuggestions.js
toolkit/components/search/toolkitsearch.manifest
toolkit/components/startup/src/Makefile.in
toolkit/components/startup/src/nsTryToClose.js
toolkit/components/startup/src/nsTryToClose.manifest
toolkit/components/url-classifier/src/Makefile.in
toolkit/components/url-classifier/src/nsURLClassifier.manifest
toolkit/components/url-classifier/src/nsUrlClassifierLib.js
toolkit/components/url-classifier/src/nsUrlClassifierListManager.js
toolkit/components/urlformatter/src/Makefile.in
toolkit/components/urlformatter/src/nsURLFormatter.js
toolkit/components/urlformatter/src/nsURLFormatter.manifest
toolkit/mozapps/downloads/Makefile.in
toolkit/mozapps/downloads/nsHelperAppDlg.js
toolkit/mozapps/downloads/nsHelperAppDlg.manifest
toolkit/mozapps/extensions/Makefile.in
toolkit/mozapps/extensions/addonManager.js
toolkit/mozapps/extensions/amContentHandler.js
toolkit/mozapps/extensions/amWebInstallListener.js
toolkit/mozapps/extensions/extensions.manifest
toolkit/mozapps/extensions/nsBlocklistService.js
toolkit/mozapps/handling/Makefile.in
toolkit/mozapps/handling/nsContentDispatchChooser.js
toolkit/mozapps/handling/nsContentDispatchChooser.manifest
toolkit/mozapps/plugins/Makefile.in
toolkit/mozapps/plugins/pluginGlue.js
toolkit/mozapps/plugins/pluginGlue.manifest
toolkit/mozapps/update/Makefile.in
toolkit/mozapps/update/nsUpdateService.js
toolkit/mozapps/update/nsUpdateService.manifest
toolkit/mozapps/update/nsUpdateServiceStub.js
toolkit/mozapps/update/nsUpdateTimerManager.js
toolkit/mozapps/update/nsUpdateTimerManager.manifest
uriloader/exthandler/Makefile.in
uriloader/exthandler/nsHandlerService.js
uriloader/exthandler/nsHandlerService.manifest
uriloader/exthandler/nsWebHandlerApp.js
uriloader/exthandler/nsWebHandlerApp.manifest
xpcom/ds/Makefile.in
xpcom/ds/nsINIProcessor.manifest
new file mode 100644
--- /dev/null
+++ b/browser/components/BrowserComponents.manifest
@@ -0,0 +1,30 @@
+component {5d0ce354-df01-421a-83fb-7ead0990c24e} nsBrowserContentHandler.js application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/browser/clh;1 {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+component {47cd0651-b1be-4a0f-b5c4-10e5a573ef71} nsBrowserContentHandler.js application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/browser/final-clh;1 {47cd0651-b1be-4a0f-b5c4-10e5a573ef71} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=text/html {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=application/vnd.mozilla.xul+xml {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+#ifdef MOZ_SVG
+contract @mozilla.org/uriloader/content-handler;1?type=image/svg+xml {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+#endif
+contract @mozilla.org/uriloader/content-handler;1?type=text/rdf {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=text/xml {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=application/xhtml+xml {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=text/css {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=text/plain {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=image/gif {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=image/jpeg {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=image/jpg {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=image/png {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=image/bmp {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=image/x-icon {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=image/vnd.microsoft.icon {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/uriloader/content-handler;1?type=application/http-index-format {5d0ce354-df01-421a-83fb-7ead0990c24e} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+category command-line-handler m-browser @mozilla.org/browser/clh;1 application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+category command-line-handler x-default @mozilla.org/browser/final-clh;1 application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+category command-line-validator b-browser @mozilla.org/browser/clh;1 application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+component {eab9012e-5f74-4cbc-b2b5-a590235513cc} nsBrowserGlue.js application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/browser/browserglue;1 {eab9012e-5f74-4cbc-b2b5-a590235513cc} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+category app-startup nsBrowserGlue service,@mozilla.org/browser/browserglue;1 application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+component {C6E8C44D-9F39-4AF7-BCC0-76E38A8310F5} nsBrowserGlue.js application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+contract @mozilla.org/geolocation/prompt;1 {C6E8C44D-9F39-4AF7-BCC0-76E38A8310F5} application={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
--- a/browser/components/Makefile.in
+++ b/browser/components/Makefile.in
@@ -46,16 +46,17 @@ MODULE = browsercomps
 XPIDL_MODULE = browsercompsbase
 
 XPIDLSRCS = \
   nsIBrowserGlue.idl \
   nsIBrowserHandler.idl \
   $(NULL)
 
 EXTRA_PP_COMPONENTS = \
+  BrowserComponents.manifest \
   nsBrowserContentHandler.js \
   nsBrowserGlue.js \
   $(NULL)
 
 EXTRA_JS_MODULES = distribution.js
 
 PARALLEL_DIRS = \
   about \
new file mode 100644
--- /dev/null
+++ b/browser/components/feeds/src/BrowserFeeds.manifest
@@ -0,0 +1,16 @@
+component {229fa115-9412-4d32-baf3-2fc407f76fb1} FeedConverter.js
+contract @mozilla.org/streamconv;1?from=application/vnd.mozilla.maybe.feed&to=*/* {229fa115-9412-4d32-baf3-2fc407f76fb1}
+contract @mozilla.org/streamconv;1?from=application/vnd.mozilla.maybe.video.feed&to=*/* {229fa115-9412-4d32-baf3-2fc407f76fb1}
+contract @mozilla.org/streamconv;1?from=application/vnd.mozilla.maybe.audio.feed&to=*/* {229fa115-9412-4d32-baf3-2fc407f76fb1}
+component {2376201c-bbc6-472f-9b62-7548040a61c6} FeedConverter.js
+contract @mozilla.org/browser/feeds/result-service;1 {2376201c-bbc6-472f-9b62-7548040a61c6}
+component {4f91ef2e-57ba-472e-ab7a-b4999e42d6c0} FeedConverter.js
+contract @mozilla.org/network/protocol;1?name=feed {4f91ef2e-57ba-472e-ab7a-b4999e42d6c0}
+component {1c31ed79-accd-4b94-b517-06e0c81999d5} FeedConverter.js
+contract @mozilla.org/network/protocol;1?name=pcast {1c31ed79-accd-4b94-b517-06e0c81999d5}
+component {49bb6593-3aff-4eb3-a068-2712c28bd58e} FeedWriter.js
+contract @mozilla.org/browser/feeds/result-writer;1 {49bb6593-3aff-4eb3-a068-2712c28bd58e}
+category JavaScript-global-constructor FeedWriter @mozilla.org/browser/feeds/result-writer;1
+component {792a7e82-06a0-437c-af63-b2d12e808acc} WebContentConverter.js
+contract @mozilla.org/embeddor.implemented/web-content-handler-registrar;1 {792a7e82-06a0-437c-af63-b2d12e808acc}
+category app-startup WebContentConverter service,@mozilla.org/embeddor.implemented/web-content-handler-registrar;1
\ No newline at end of file
--- a/browser/components/feeds/src/FeedConverter.js
+++ b/browser/components/feeds/src/FeedConverter.js
@@ -32,37 +32,30 @@
 # use your version of this file under the terms of the MPL, indicate your
 # decision by deleting the provisions above and replace them with the notice
 # and other provisions required by the GPL or the LGPL. If you do not delete
 # the provisions above, a recipient may use your version of this file under
 # the terms of any one of the MPL, the GPL or the LGPL.
 #
 # ***** END LICENSE BLOCK ***** */
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 Components.utils.import("resource://gre/modules/debug.js");
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 const Cr = Components.results;
 
 function LOG(str) {
   dump("*** " + str + "\n");
 }
 
-const FC_CLASSID = Components.ID("{229fa115-9412-4d32-baf3-2fc407f76fb1}");
-const FC_CLASSNAME = "Feed Stream Converter";
-const FS_CLASSID = Components.ID("{2376201c-bbc6-472f-9b62-7548040a61c6}");
-const FS_CLASSNAME = "Feed Result Service";
 const FS_CONTRACTID = "@mozilla.org/browser/feeds/result-service;1";
 const FPH_CONTRACTID = "@mozilla.org/network/protocol;1?name=feed";
-const FPH_CLASSID = Components.ID("{4f91ef2e-57ba-472e-ab7a-b4999e42d6c0}");
-const FPH_CLASSNAME = "Feed Protocol Handler";
 const PCPH_CONTRACTID = "@mozilla.org/network/protocol;1?name=pcast";
-const PCPH_CLASSID = Components.ID("{1c31ed79-accd-4b94-b517-06e0c81999d5}");
-const PCPH_CLASSNAME = "Podcast Protocol Handler";
 
 const TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed";
 const TYPE_MAYBE_VIDEO_FEED = "application/vnd.mozilla.maybe.video.feed";
 const TYPE_MAYBE_AUDIO_FEED = "application/vnd.mozilla.maybe.audio.feed";
 const TYPE_ANY = "*/*";
 
 const FEEDHANDLER_URI = "about:feeds";
 
@@ -143,16 +136,18 @@ function safeGetCharPref(pref, defaultVa
   catch (e) {
   }
   return defaultValue;
 }
 
 function FeedConverter() {
 }
 FeedConverter.prototype = {
+  classID: Components.ID("{229fa115-9412-4d32-baf3-2fc407f76fb1}"),
+
   /**
    * This is the downloaded text data for the feed.
    */
   _data: null,
   
   /**
    * This is the object listening to the conversion, which is ultimately the
    * docshell for the load.
@@ -363,36 +358,25 @@ FeedConverter.prototype = {
         iid.equals(Ci.nsIStreamListener) ||
         iid.equals(Ci.nsIRequestObserver)||
         iid.equals(Ci.nsISupports))
       return this;
     throw Cr.NS_ERROR_NO_INTERFACE;
   },
 };
 
-var FeedConverterFactory = {
-  createInstance: function FS_createInstance(outer, iid) {
-    if (outer != null)
-      throw Cr.NS_ERROR_NO_AGGREGATION;
-    return new FeedConverter().QueryInterface(iid);
-  },
-
-  QueryInterface: function FS_QueryInterface(iid) {
-    if (iid.equals(Ci.nsIFactory) ||
-        iid.equals(Ci.nsISupports))
-      return this;
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-};
-
 /**
  * Keeps parsed FeedResults around for use elsewhere in the UI after the stream
  * converter completes. 
  */
-var FeedResultService = {
+function FeedResultService()
+{ }
+
+FeedResultService.prototype = {
+  classID: Components.ID("{2376201c-bbc6-472f-9b62-7548040a61c6}"),
   
   /**
    * A URI spec -> [nsIFeedResult] hash. We have to keep a list as the
    * value in case the same URI is requested concurrently.
    */
   _results: { },
   
   /**
@@ -529,25 +513,26 @@ var FeedResultService = {
     throw Cr.NS_ERROR_NOT_IMPLEMENTED;
   },
 };
 
 /**
  * A protocol handler that attempts to deal with the variant forms of feed:
  * URIs that are actually either http or https.
  */
-function FeedProtocolHandler(scheme) {
-  this._scheme = scheme;
-  var ios = 
+function GenericProtocolHandler() {
+}
+FeedProtocolHandler.prototype = {
+  _init: function FPH_init() {
+    var ios = 
       Cc["@mozilla.org/network/io-service;1"].
       getService(Ci.nsIIOService);
-  this._http = ios.getProtocolHandler("http");
-}
-FeedProtocolHandler.prototype = {
-  _scheme: "",
+    this._http = ios.getProtocolHandler("http");
+  },
+
   get scheme() {
     return this._scheme;
   },
   
   get protocolFlags() {
     return this._http.protocolFlags;
   },
   
@@ -613,77 +598,26 @@ FeedProtocolHandler.prototype = {
   QueryInterface: function FPH_QueryInterface(iid) {
     if (iid.equals(Ci.nsIProtocolHandler) ||
         iid.equals(Ci.nsISupports))
       return this;
     throw Cr.NS_ERROR_NO_INTERFACE;
   }  
 };
 
-var Module = {
-  QueryInterface: function M_QueryInterface(iid) {
-    if (iid.equals(Ci.nsIModule) ||
-        iid.equals(Ci.nsISupports))
-      return this;
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-  
-  getClassObject: function M_getClassObject(cm, cid, iid) {
-    if (!iid.equals(Ci.nsIFactory))
-      throw Cr.NS_ERROR_NOT_IMPLEMENTED;
-    
-    if (cid.equals(FS_CLASSID))
-      return FeedResultService;
-    if (cid.equals(FPH_CLASSID))
-      return new GenericComponentFactory(FeedProtocolHandler, "feed");
-    if (cid.equals(PCPH_CLASSID))
-      return new GenericComponentFactory(FeedProtocolHandler, "pcast");
-    if (cid.equals(FC_CLASSID))
-      return new GenericComponentFactory(FeedConverter);
-      
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-  
-  registerSelf: function M_registerSelf(cm, file, location, type) {
-    var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
-    
-    cr.registerFactoryLocation(FS_CLASSID, FS_CLASSNAME, FS_CONTRACTID,
-                               file, location, type);
-    cr.registerFactoryLocation(FPH_CLASSID, FPH_CLASSNAME, FPH_CONTRACTID,
-                               file, location, type);
-    cr.registerFactoryLocation(PCPH_CLASSID, PCPH_CLASSNAME, PCPH_CONTRACTID,
-                               file, location, type);
+function FeedProtocolHandler()
+{
+  this._init();
+}
+FeedProtocolHandler.prototype = new GenericProtocolHandler();
+FeedProtocolHandler.prototype._scheme = "feed";
+FeedProtocolHandler.classID = Components.ID("{4f91ef2e-57ba-472e-ab7a-b4999e42d6c0}");
 
-    // The feed converter is always attached, since parsing must be done to 
-    // determine whether or not auto-handling can occur. 
-    const converterPrefix = "@mozilla.org/streamconv;1?from=";
-    var converterContractID = 
-        converterPrefix + TYPE_MAYBE_FEED + "&to=" + TYPE_ANY;
-    cr.registerFactoryLocation(FC_CLASSID, FC_CLASSNAME, converterContractID,
-                               file, location, type);
-
-    converterContractID = 
-        converterPrefix + TYPE_MAYBE_VIDEO_FEED + "&to=" + TYPE_ANY;
-    cr.registerFactoryLocation(FC_CLASSID, FC_CLASSNAME, converterContractID,
-                               file, location, type);
+function PCastProtocolHandler()
+{
+  this._init();
+}
+PCastProtocolHandler.prototype = new GenericProtocolHandler();
+PCastProtocolHandler.prototype._scheme = "pcast";
+PCastProtocolHandler.prototype.classID = Components.ID("{1c31ed79-accd-4b94-b517-06e0c81999d5}");
 
-    converterContractID = 
-        converterPrefix + TYPE_MAYBE_AUDIO_FEED + "&to=" + TYPE_ANY;
-    cr.registerFactoryLocation(FC_CLASSID, FC_CLASSNAME, converterContractID,
-                               file, location, type);
-    },
-  
-  unregisterSelf: function M_unregisterSelf(cm, location, type) {
-    var cr = cm.QueryInterface(Ci.nsIComponentRegistrar);
-    cr.unregisterFactoryLocation(FPH_CLASSID, location);
-    cr.unregisterFactoryLocation(PCPH_CLASSID, location);
-  },
-  
-  canUnload: function M_canUnload(cm) {
-    return true;
-  }
-};
-
-function NSGetModule(cm, file) {
-  return Module;
-}
-
-#include GenericFactory.js
+var components = [FeedConverter, FeedResultService, FeedProtocolHandler, PCastProtocolHandler];
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
--- a/browser/components/feeds/src/FeedWriter.js
+++ b/browser/components/feeds/src/FeedWriter.js
@@ -1411,22 +1411,17 @@ FeedWriter.prototype = {
 
   // nsIClassInfo
   getInterfaces: function FW_getInterfaces(countRef) {
     var interfaces = [Ci.nsIFeedWriter, Ci.nsIClassInfo, Ci.nsISupports];
     countRef.value = interfaces.length;
     return interfaces;
   },
   getHelperForLanguage: function FW_getHelperForLanguage(language) null,
-  contractID: "@mozilla.org/browser/feeds/result-writer;1",
-  classDescription: "Feed Writer",
   classID: Components.ID("{49bb6593-3aff-4eb3-a068-2712c28bd58e}"),
   implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
   flags: Ci.nsIClassInfo.DOM_OBJECT,
-  _xpcom_categories: [{ category: "JavaScript-global-constructor",
-                        entry: "BrowserFeedWriter"}],
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIFeedWriter, Ci.nsIClassInfo,
                                          Ci.nsIDOMEventListener, Ci.nsIObserver,
                                          Ci.nsINavHistoryObserver])
 };
 
-function NSGetModule(cm, file)
-  XPCOMUtils.generateModule([FeedWriter]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([FeedWriter]);
--- a/browser/components/feeds/src/Makefile.in
+++ b/browser/components/feeds/src/Makefile.in
@@ -49,16 +49,20 @@ ifndef MOZ_MEMORY
 USE_STATIC_LIBS = 1
 endif
 
 DEFINES += \
 	-DMOZ_APP_NAME=$(MOZ_APP_NAME) \
 	-DMOZ_APP_DISPLAYNAME=$(MOZ_APP_DISPLAYNAME) \
 	$(NULL)
 
+EXTRA_COMPONENTS = \
+  BrowserFeeds.manifest \
+  $(NULL)
+
 EXTRA_PP_COMPONENTS = \
 	FeedConverter.js \
 	FeedWriter.js \
 	WebContentConverter.js \
 	$(NULL)
 
 
 CPPSRCS = nsFeedSniffer.cpp
--- a/browser/components/feeds/src/WebContentConverter.js
+++ b/browser/components/feeds/src/WebContentConverter.js
@@ -44,17 +44,16 @@ const Ci = Components.interfaces;
 const Cr = Components.results;
 
 function LOG(str) {
   dump("*** " + str + "\n");
 }
 
 const WCCR_CONTRACTID = "@mozilla.org/embeddor.implemented/web-content-handler-registrar;1";
 const WCCR_CLASSID = Components.ID("{792a7e82-06a0-437c-af63-b2d12e808acc}");
-const WCCR_CLASSNAME = "Web Content Handler Registrar";
 
 const WCC_CLASSID = Components.ID("{db7ebf28-cc40-415f-8a51-1b111851df1e}");
 const WCC_CLASSNAME = "Web Service Handler";
 
 const TYPE_MAYBE_FEED = "application/vnd.mozilla.maybe.feed";
 const TYPE_ANY = "*/*";
 
 const PREF_CONTENTHANDLERS_AUTO = "browser.contentHandlers.auto.";
@@ -920,18 +919,16 @@ WebContentConverterRegistrar.prototype =
         [Ci.nsIWebContentConverterService, Ci.nsIWebContentHandlerRegistrar,
          Ci.nsIObserver, Ci.nsIClassInfo, Ci.nsIFactory, Ci.nsISupports];
     countRef.value = interfaces.length;
     return interfaces;
   },
   getHelperForLanguage: function WCCR_getHelperForLanguage(language) {
     return null;
   },
-  contractID: WCCR_CONTRACTID,
-  classDescription: WCCR_CLASSNAME,
   classID: WCCR_CLASSID,
   implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
   flags: Ci.nsIClassInfo.DOM_OBJECT,
   
   /**
    * See nsISupports
    */
   QueryInterface: XPCOMUtils.generateQI(
@@ -943,12 +940,9 @@ WebContentConverterRegistrar.prototype =
       Ci.nsISupports]),
 
   _xpcom_categories: [{
     category: "app-startup",
     service: true
   }]
 };
 
-function NSGetModule(cm, file) {
-  return XPCOMUtils.generateModule([WebContentConverterRegistrar]);
-}
-
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([WebContentConverterRegistrar]);
--- a/browser/components/nsBrowserContentHandler.js
+++ b/browser/components/nsBrowserContentHandler.js
@@ -31,29 +31,30 @@
 # use your version of this file under the terms of the MPL, indicate your
 # decision by deleting the provisions above and replace them with the notice
 # and other provisions required by the GPL or the LGPL. If you do not delete
 # the provisions above, a recipient may use your version of this file under
 # the terms of any one of the MPL, the GPL or the LGPL.
 #
 # ***** END LICENSE BLOCK *****
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
 const nsISupports            = Components.interfaces.nsISupports;
 
 const nsIBrowserDOMWindow    = Components.interfaces.nsIBrowserDOMWindow;
 const nsIBrowserHandler      = Components.interfaces.nsIBrowserHandler;
 const nsIBrowserHistory      = Components.interfaces.nsIBrowserHistory;
 const nsIChannel             = Components.interfaces.nsIChannel;
 const nsICommandLine         = Components.interfaces.nsICommandLine;
 const nsICommandLineHandler  = Components.interfaces.nsICommandLineHandler;
 const nsIContentHandler      = Components.interfaces.nsIContentHandler;
 const nsIDocShellTreeItem    = Components.interfaces.nsIDocShellTreeItem;
 const nsIDOMChromeWindow     = Components.interfaces.nsIDOMChromeWindow;
 const nsIDOMWindow           = Components.interfaces.nsIDOMWindow;
-const nsIFactory             = Components.interfaces.nsIFactory;
 const nsIFileURL             = Components.interfaces.nsIFileURL;
 const nsIHttpProtocolHandler = Components.interfaces.nsIHttpProtocolHandler;
 const nsIInterfaceRequestor  = Components.interfaces.nsIInterfaceRequestor;
 const nsINetUtil             = Components.interfaces.nsINetUtil;
 const nsIPrefBranch          = Components.interfaces.nsIPrefBranch;
 const nsIPrefLocalizedString = Components.interfaces.nsIPrefLocalizedString;
 const nsISupportsString      = Components.interfaces.nsISupportsString;
 const nsIURIFixup            = Components.interfaces.nsIURIFixup;
@@ -319,24 +320,37 @@ function doSearch(searchTerm, cmdLine) {
   sa.AppendElement(submission.postData);
 
   // XXXbsmedberg: use handURIToExistingBrowser to obey tabbed-browsing
   // preferences, but need nsIBrowserDOMWindow extensions
 
   var wwatch = Components.classes["@mozilla.org/embedcomp/window-watcher;1"]
                          .getService(nsIWindowWatcher);
 
-  return wwatch.openWindow(null, nsBrowserContentHandler.chromeURL,
+  return wwatch.openWindow(null, gBrowserContentHandler.chromeURL,
                            "_blank",
                            "chrome,dialog=no,all" +
-                             nsBrowserContentHandler.getFeatures(cmdLine),
+                           gBrowserContentHandler.getFeatures(cmdLine),
                            sa);
 }
 
-var nsBrowserContentHandler = {
+function nsBrowserContentHandler()
+{
+}
+nsBrowserContentHandler.prototype = {
+  classID: Components.ID("{5d0ce354-df01-421a-83fb-7ead0990c24e}"),
+
+  _xpcom_factory: {
+    createInstance: function bch_factory_ci(outer, iid) {
+      if (outer)
+        throw Components.results.NS_ERROR_NO_AGGREGATION;
+      return gBrowserContentHandler.QueryInterface(iid);
+    }
+  },
+
   /* helper functions */
 
   mChromeURL : null,
 
   get chromeURL() {
     if (this.mChromeURL) {
       return this.mChromeURL;
     }
@@ -349,18 +363,17 @@ var nsBrowserContentHandler = {
   },
 
   /* nsISupports */
   QueryInterface : function bch_QI(iid) {
     if (!iid.equals(nsISupports) &&
         !iid.equals(nsICommandLineHandler) &&
         !iid.equals(nsIBrowserHandler) &&
         !iid.equals(nsIContentHandler) &&
-        !iid.equals(nsICommandLineValidator) &&
-        !iid.equals(nsIFactory))
+        !iid.equals(nsICommandLineValidator))
       throw Components.results.NS_ERROR_NO_INTERFACE;
 
     return this;
   },
 
   /* nsICommandLineHandler */
   handle : function bch_handle(cmdLine) {
     if (cmdLine.handleFlag("browser", false)) {
@@ -688,65 +701,56 @@ var nsBrowserContentHandler = {
     if (urlFlagIdx > -1 && (osintFlagIdx > -1 ||
         cmdLine.state == nsICommandLine.STATE_REMOTE_EXPLICIT)) {
       var urlParam = cmdLine.getArgument(urlFlagIdx + 1);
       if (cmdLine.length != urlFlagIdx + 2 || /firefoxurl:/.test(urlParam))
         throw NS_ERROR_ABORT;
       cmdLine.handleFlag("osint", false)
     }
   },
-
-  /* nsIFactory */
-  createInstance: function bch_CI(outer, iid) {
-    if (outer != null)
-      throw Components.results.NS_ERROR_NO_AGGREGATION;
+};
+var gBrowserContentHandler = new nsBrowserContentHandler();
 
-    return this.QueryInterface(iid);
-  },
-    
-  lockFactory : function bch_lock(lock) {
-    /* no-op */
-  }
-};
-
-const bch_contractID = "@mozilla.org/browser/clh;1";
-const bch_CID = Components.ID("{5d0ce354-df01-421a-83fb-7ead0990c24e}");
 const CONTRACTID_PREFIX = "@mozilla.org/uriloader/content-handler;1?type=";
 
 function handURIToExistingBrowser(uri, location, cmdLine)
 {
   if (!shouldLoadURI(uri))
     return;
 
   var navWin = getMostRecentBrowserWindow();
   if (!navWin) {
     // if we couldn't load it in an existing window, open a new one
-    openWindow(null, nsBrowserContentHandler.chromeURL, "_blank",
-               "chrome,dialog=no,all" + nsBrowserContentHandler.getFeatures(cmdLine),
+    openWindow(null, gBrowserContentHandler.chromeURL, "_blank",
+               "chrome,dialog=no,all" + gBrowserContentHandler.getFeatures(cmdLine),
                uri.spec);
     return;
   }
 
   var navNav = navWin.QueryInterface(nsIInterfaceRequestor)
                      .getInterface(nsIWebNavigation);
   var rootItem = navNav.QueryInterface(nsIDocShellTreeItem).rootTreeItem;
   var rootWin = rootItem.QueryInterface(nsIInterfaceRequestor)
                         .getInterface(nsIDOMWindow);
   var bwin = rootWin.QueryInterface(nsIDOMChromeWindow).browserDOMWindow;
   bwin.openURI(uri, null, location,
                nsIBrowserDOMWindow.OPEN_EXTERNAL);
 }
 
+function nsDefaultCommandLineHandler()
+{
+}
 
-var nsDefaultCommandLineHandler = {
+nsDefaultCommandLineHandler.prototype = {
+  classID: Components.ID("{47cd0651-b1be-4a0f-b5c4-10e5a573ef71}"),
+
   /* nsISupports */
   QueryInterface : function dch_QI(iid) {
     if (!iid.equals(nsISupports) &&
-        !iid.equals(nsICommandLineHandler) &&
-        !iid.equals(nsIFactory))
+        !iid.equals(nsICommandLineHandler))
       throw Components.results.NS_ERROR_NO_INTERFACE;
 
     return this;
   },
 
   // List of uri's that were passed via the command line without the app
   // running and have already been handled. This is compared against uri's
   // opened using DDE on Win32 so we only open one of the requests.
@@ -838,155 +842,28 @@ var nsDefaultCommandLineHandler = {
           return;
         }
         catch (e) {
         }
       }
 
       var URLlist = urilist.filter(shouldLoadURI).map(function (u) u.spec);
       if (URLlist.length) {
-        openWindow(null, nsBrowserContentHandler.chromeURL, "_blank",
-                   "chrome,dialog=no,all" + nsBrowserContentHandler.getFeatures(cmdLine),
+        openWindow(null, gBrowserContentHandler.chromeURL, "_blank",
+                   "chrome,dialog=no,all" + gBrowserContentHandler.getFeatures(cmdLine),
                    URLlist);
       }
 
     }
     else if (!cmdLine.preventDefault) {
       // Passing defaultArgs, so use NO_EXTERNAL_URIS
-      openWindow(null, nsBrowserContentHandler.chromeURL, "_blank",
-                 "chrome,dialog=no,all" + nsBrowserContentHandler.getFeatures(cmdLine),
-                 nsBrowserContentHandler.defaultArgs, NO_EXTERNAL_URIS);
+      openWindow(null, gBrowserContentHandler.chromeURL, "_blank",
+                 "chrome,dialog=no,all" + gBrowserContentHandler.getFeatures(cmdLine),
+                 gBrowserContentHandler.defaultArgs, NO_EXTERNAL_URIS);
     }
   },
 
   // XXX localize me... how?
   helpInfo : "Usage: firefox [-flags] [<url>]\n",
-
-  /* nsIFactory */
-  createInstance: function dch_CI(outer, iid) {
-    if (outer != null)
-      throw Components.results.NS_ERROR_NO_AGGREGATION;
-
-    return this.QueryInterface(iid);
-  },
-    
-  lockFactory : function dch_lock(lock) {
-    /* no-op */
-  }
 };
 
-const dch_contractID = "@mozilla.org/browser/final-clh;1";
-const dch_CID = Components.ID("{47cd0651-b1be-4a0f-b5c4-10e5a573ef71}");
-
-var Module = {
-  /* nsISupports */
-  QueryInterface: function mod_QI(iid) {
-    if (iid.equals(Components.interfaces.nsIModule) ||
-        iid.equals(Components.interfaces.nsISupports))
-      return this;
-
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
-
-  /* nsIModule */
-  getClassObject: function mod_getco(compMgr, cid, iid) {
-    if (cid.equals(bch_CID))
-      return nsBrowserContentHandler.QueryInterface(iid);
-
-    if (cid.equals(dch_CID))
-      return nsDefaultCommandLineHandler.QueryInterface(iid);
-
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
-    
-  registerSelf: function mod_regself(compMgr, fileSpec, location, type) {
-    if (Components.classes["@mozilla.org/xre/app-info;1"]) {
-      // Don't register these if Firefox is launching a XULRunner application
-      const FIREFOX_UID = "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}";
-      var appInfo = Components.classes["@mozilla.org/xre/app-info;1"]
-                              .getService(Components.interfaces.nsIXULAppInfo);
-      if (appInfo.ID != FIREFOX_UID)
-        return;
-    }
-
-    var compReg =
-      compMgr.QueryInterface( Components.interfaces.nsIComponentRegistrar );
-
-    compReg.registerFactoryLocation( bch_CID,
-                                     "nsBrowserContentHandler",
-                                     bch_contractID,
-                                     fileSpec,
-                                     location,
-                                     type );
-    compReg.registerFactoryLocation( dch_CID,
-                                     "nsDefaultCommandLineHandler",
-                                     dch_contractID,
-                                     fileSpec,
-                                     location,
-                                     type );
-
-    function registerType(contentType) {
-      compReg.registerFactoryLocation( bch_CID,
-                                       "Browser Cmdline Handler",
-                                       CONTRACTID_PREFIX + contentType,
-                                       fileSpec,
-                                       location,
-                                       type );
-    }
-
-    registerType("text/html");
-    registerType("application/vnd.mozilla.xul+xml");
-#ifdef MOZ_SVG
-    registerType("image/svg+xml");
-#endif
-    registerType("text/rdf");
-    registerType("text/xml");
-    registerType("application/xhtml+xml");
-    registerType("text/css");
-    registerType("text/plain");
-    registerType("image/gif");
-    registerType("image/jpeg");
-    registerType("image/jpg");
-    registerType("image/png");
-    registerType("image/bmp");
-    registerType("image/x-icon");
-    registerType("image/vnd.microsoft.icon");
-    registerType("application/http-index-format");
-
-    var catMan = Components.classes["@mozilla.org/categorymanager;1"]
-                           .getService(nsICategoryManager);
-
-    catMan.addCategoryEntry("command-line-handler",
-                            "m-browser",
-                            bch_contractID, true, true);
-    catMan.addCategoryEntry("command-line-handler",
-                            "x-default",
-                            dch_contractID, true, true);
-    catMan.addCategoryEntry("command-line-validator",
-                            "b-browser",
-                            bch_contractID, true, true);
-  },
-    
-  unregisterSelf : function mod_unregself(compMgr, location, type) {
-    var compReg = compMgr.QueryInterface(nsIComponentRegistrar);
-    compReg.unregisterFactoryLocation(bch_CID, location);
-    compReg.unregisterFactoryLocation(dch_CID, location);
-
-    var catMan = Components.classes["@mozilla.org/categorymanager;1"]
-                           .getService(nsICategoryManager);
-
-    catMan.deleteCategoryEntry("command-line-handler",
-                               "m-browser", true);
-    catMan.deleteCategoryEntry("command-line-handler",
-                               "x-default", true);
-    catMan.deleteCategoryEntry("command-line-validator",
-                               "b-browser", true);
-  },
-
-  canUnload: function(compMgr) {
-    return true;
-  }
-};
-
-// NSGetModule: Return the nsIModule object.
-function NSGetModule(compMgr, fileSpec) {
-  return Module;
-}
+var components = [nsBrowserContentHandler, nsDefaultCommandLineHandler];
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
--- a/browser/components/nsBrowserGlue.js
+++ b/browser/components/nsBrowserGlue.js
@@ -1229,41 +1229,30 @@ BrowserGlue.prototype = {
         return win;
     }
     return null;
 #endif
   },
 
 
   // for XPCOM
-  classDescription: "Firefox Browser Glue Service",
   classID:          Components.ID("{eab9012e-5f74-4cbc-b2b5-a590235513cc}"),
-  contractID:       "@mozilla.org/browser/browserglue;1",
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
                                          Ci.nsISupportsWeakReference,
                                          Ci.nsIBrowserGlue]),
 
   // redefine the default factory for XPCOMUtils
   _xpcom_factory: BrowserGlueServiceFactory,
-
-  // get this contractID registered for certain categories via XPCOMUtils
-  _xpcom_categories: [
-    // make BrowserGlue a startup observer
-    { category: "app-startup", service: true,
-      apps: [ /* Firefox */ "{ec8030f7-c20a-464f-9b0e-13a3a9e97384}" ] }
-  ]
 }
 
 function GeolocationPrompt() {}
 
 GeolocationPrompt.prototype = {
-  classDescription: "Geolocation Prompting Component",
   classID:          Components.ID("{C6E8C44D-9F39-4AF7-BCC0-76E38A8310F5}"),
-  contractID:       "@mozilla.org/geolocation/prompt;1",
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIGeolocationPrompt]),
  
   prompt: function GP_prompt(request) {
     var result = Services.perms.testExactPermission(request.requestingURI, "geo");
 
     if (result == Ci.nsIPermissionManager.ALLOW_ACTION) {
       request.allow();
@@ -1379,13 +1368,10 @@ GeolocationPrompt.prototype = {
       };
 
       chromeWindowObject.setTimeout(geolocation_hacks_to_notification, 0);
 
     }
   },
 };
 
-
-//module initialization
-function NSGetModule(aCompMgr, aFileSpec) {
-  return XPCOMUtils.generateModule([BrowserGlue, GeolocationPrompt]);
-}
+var components = [BrowserGlue, GeolocationPrompt];
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
new file mode 100644
--- /dev/null
+++ b/browser/components/places/src/BrowserPlaces.manifest
@@ -0,0 +1,4 @@
+component {c0844a84-5a12-4808-80a8-809cb002bb4f} nsPlacesTransactionService.js
+contract @mozilla.org/browser/placesTransactionsService;1 {c0844a84-5a12-4808-80a8-809cb002bb4f}
+component {6bcb9bde-9018-4443-a071-c32653469597} PlacesProtocolHandler.js
+contract @mozilla.org/network/protocol;1?name=place {6bcb9bde-9018-4443-a071-c32653469597}
--- a/browser/components/places/src/Makefile.in
+++ b/browser/components/places/src/Makefile.in
@@ -40,16 +40,17 @@
 DEPTH = ../../../..
 topsrcdir = @top_srcdir@
 srcdir = @srcdir@
 VPATH = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 EXTRA_COMPONENTS = \
+  BrowserPlaces.manifest \
   nsPlacesTransactionsService.js \
   PlacesProtocolHandler.js \
   $(NULL)
 
 EXTRA_JS_MODULES = \
   PlacesUIUtils.jsm \
   $(NULL)
 
--- a/browser/components/places/src/PlacesProtocolHandler.js
+++ b/browser/components/places/src/PlacesProtocolHandler.js
@@ -71,18 +71,12 @@ PlacesProtocolHandler.prototype = {
   allowPort: function PPH_allowPort(aPort, aScheme) {
     return false;
   },
 
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsIProtocolHandler
   ]),
 
-  classDescription: "Places Protocol Handler",
-  contractID: "@mozilla.org/network/protocol;1?name=" + SCHEME,
   classID: Components.ID("{6bcb9bde-9018-4443-a071-c32653469597}")
 };
 
-function NSGetModule(aCompMgr, aFileSpec) {
-  return XPCOMUtils.generateModule([
-    PlacesProtocolHandler
-  ]);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([PlacesProtocolHandler]);
--- a/browser/components/places/src/nsPlacesTransactionsService.js
+++ b/browser/components/places/src/nsPlacesTransactionsService.js
@@ -42,17 +42,16 @@ let Ci = Components.interfaces;
 let Cc = Components.classes;
 let Cr = Components.results;
 let Cu = Components.utils;
 
 const LOAD_IN_SIDEBAR_ANNO = "bookmarkProperties/loadInSidebar";
 const DESCRIPTION_ANNO = "bookmarkProperties/description";
 
 const CLASS_ID = Components.ID("c0844a84-5a12-4808-80a8-809cb002bb4f");
-const CONTRACT_ID = "@mozilla.org/browser/placesTransactionsService;1";
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
 XPCOMUtils.defineLazyGetter(this, "Services", function() {
   Cu.import("resource://gre/modules/Services.jsm");
   return Services;
 });
 
@@ -67,19 +66,17 @@ const MIN_TRANSACTIONS_FOR_BATCH = 5;
 
 function placesTransactionsService() {
   Services.obs.addObserver(this, PlacesUtils.TOPIC_SHUTDOWN, false);
   this.mTransactionManager = Cc["@mozilla.org/transactionmanager;1"].
                              createInstance(Ci.nsITransactionManager);
 }
 
 placesTransactionsService.prototype = {
-  classDescription: "Places Transaction Manager",
   classID: CLASS_ID,
-  contractID: CONTRACT_ID,
 
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsIPlacesTransactionsService,
     Ci.nsITransactionManager,
     Ci.nsIObserver,
   ]),
 
   // nsIObserver
@@ -1182,12 +1179,9 @@ placesUntagURITransaction.prototype = {
     PlacesUtils.tagging.untagURI(this._uri, this._tags);
   },
 
   undoTransaction: function PUTU_undoTransaction() {
     PlacesUtils.tagging.tagURI(this._uri, this._tags);
   }
 };
 
-
-function NSGetModule(aCompMgr, aFileSpec) {
-  return XPCOMUtils.generateModule([placesTransactionsService]);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([placesTransactionsService]);
--- a/browser/components/privatebrowsing/src/Makefile.in
+++ b/browser/components/privatebrowsing/src/Makefile.in
@@ -52,13 +52,17 @@ endif
 
 
 CPPSRCS = \
 	nsPrivateBrowsingServiceWrapper.cpp \
 	$(NULL)
 
 LOCAL_INCLUDES = -I$(srcdir)/../../build
 
+EXTRA_COMPONENTS = \
+  nsPrivateBrowsingService.manifest \
+  $(NULL)
+
 EXTRA_PP_COMPONENTS = \
 	nsPrivateBrowsingService.js \
 	$(NULL)
 
 include $(topsrcdir)/config/rules.mk
--- a/browser/components/privatebrowsing/src/nsPrivateBrowsingService.js
+++ b/browser/components/privatebrowsing/src/nsPrivateBrowsingService.js
@@ -125,23 +125,17 @@ PrivateBrowsingService.prototype = {
 
   // List of view source window URIs for restoring later
   _viewSrcURLs: [],
 
   // List of nsIXULWindows we are going to be closing during the transition
   _windowsToClose: [],
 
   // XPCOM registration
-  classDescription: "PrivateBrowsing Service",
-  contractID: "@mozilla.org/privatebrowsing;1",
   classID: Components.ID("{c31f4883-839b-45f6-82ad-a6a9bc5ad599}"),
-  _xpcom_categories: [
-    { category: "command-line-handler", entry: "m-privatebrowsing" },
-    { category: "app-startup", service: true }
-  ],
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIPrivateBrowsingService, 
                                          Ci.nsIObserver,
                                          Ci.nsISupportsWeakReference,
                                          Ci.nsICommandLineHandler]),
 
   _unload: function PBS__destroy() {
     // Force an exit from the private browsing mode on shutdown
@@ -695,10 +689,9 @@ PrivateBrowsingService.prototype = {
       }
     }
 
     // Everybody else (including extensions)
     this._obs.notifyObservers(null, "browser:purge-domain-data", aDomain);
   }
 };
 
-function NSGetModule(compMgr, fileSpec)
-  XPCOMUtils.generateModule([PrivateBrowsingService]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([PrivateBrowsingService]);
new file mode 100644
--- /dev/null
+++ b/browser/components/privatebrowsing/src/nsPrivateBrowsingService.manifest
@@ -0,0 +1,4 @@
+component {c31f4883-839b-45f6-82ad-a6a9bc5ad599} nsPrivateBrowsingService.js
+contract @mozilla.org/privatebrowsing;1 {c31f4883-839b-45f6-82ad-a6a9bc5ad599}
+category command-line-handler m-privatebrowsing @mozilla.org/privatebrowsing;1
+category app-startup nsPrivateBrowsingService service,@mozilla.org/privatebrowsing;1
--- a/browser/components/safebrowsing/Makefile.in
+++ b/browser/components/safebrowsing/Makefile.in
@@ -48,14 +48,17 @@ DIRS      = src
 ifdef ENABLE_TESTS
 DIRS += content/test
 endif
 
 ifdef MOZILLA_OFFICIAL
 DEFINES += -DOFFICIAL_BUILD=1
 endif
 
-# EXTRA_COMPONENTS installs components written in JS to dist/bin/components
+EXTRA_COMPONENTS = \
+  src/nsSafebrowsingApplication.manifest \
+  $(NULL)
+
 EXTRA_PP_COMPONENTS = \
          src/nsSafebrowsingApplication.js \
          $(NULL)
 
 include $(topsrcdir)/config/rules.mk
--- a/browser/components/safebrowsing/src/nsSafebrowsingApplication.js
+++ b/browser/components/safebrowsing/src/nsSafebrowsingApplication.js
@@ -1,11 +1,13 @@
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
 // This is copied from toolkit/components/content/js/lang.js.
 // It seems cleaner to copy this rather than #include from so far away.
 Function.prototype.inherits = function(parentCtor) {
   var tempCtor = function(){};
   tempCtor.prototype = parentCtor.prototype;
   this.superClass_ = parentCtor.prototype;
   this.prototype = new tempCtor();
 }  
@@ -31,56 +33,24 @@ function Init() {
   modScope.G_Protocol4Parser = jslib.G_Protocol4Parser;
   modScope.PROT_UrlCrypto = jslib.PROT_UrlCrypto;
   modScope.RequestBackoff = jslib.RequestBackoff;
   
   // We only need to call Init once
   modScope.Init = function() {};
 }
 
-// Module object
-function SafebrowsingApplicationMod() {
-  this.firstTime = true;
-  this.cid = Components.ID("{c64d0bcb-8270-4ca7-a0b3-3380c8ffecb5}");
-  this.progid = "@mozilla.org/safebrowsing/application;1";
+function SafeBrowsingApplication()
+{
 }
-
-SafebrowsingApplicationMod.prototype.registerSelf = function(compMgr, fileSpec, loc, type) {
-  if (this.firstTime) {
-    this.firstTime = false;
-    throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
-  }
-  compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
-  compMgr.registerFactoryLocation(this.cid,
-                                  "Safebrowsing Application Module",
-                                  this.progid,
-                                  fileSpec,
-                                  loc,
-                                  type);
+SafeBrowsingApplication.prototype = {
+  classID: Components.ID("{c64d0bcb-8270-4ca7-a0b3-3380c8ffecb5}"),
+  _xpcom_factory: {
+    createInstance: function(outer, iid) {
+      if (outer != null)
+        throw Components.results.NS_ERROR_NO_AGGREGATION;
+      Init();
+      return new PROT_Application();
+    }
+  },
 };
 
-SafebrowsingApplicationMod.prototype.getClassObject = function(compMgr, cid, iid) {  
-  if (!cid.equals(this.cid))
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  if (!iid.equals(Ci.nsIFactory))
-    throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-
-  return this.factory;
-}
-
-SafebrowsingApplicationMod.prototype.canUnload = function(compMgr) {
-  return true;
-}
-
-SafebrowsingApplicationMod.prototype.factory = {
-  createInstance: function(outer, iid) {
-    if (outer != null)
-      throw Components.results.NS_ERROR_NO_AGGREGATION;
-    Init();
-    return new PROT_Application();
-  }
-};
-
-var ApplicationModInst = new SafebrowsingApplicationMod();
-
-function NSGetModule(compMgr, fileSpec) {
-  return ApplicationModInst;
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([SafeBrowsingApplication]);
new file mode 100644
--- /dev/null
+++ b/browser/components/safebrowsing/src/nsSafebrowsingApplication.manifest
@@ -0,0 +1,2 @@
+component {c64d0bcb-8270-4ca7-a0b3-3380c8ffecb5} nsSafebrowsingApplication.js
+contract @mozilla.org/safebrowsing/application;1 {c64d0bcb-8270-4ca7-a0b3-3380c8ffecb5}
--- a/browser/components/sessionstore/src/Makefile.in
+++ b/browser/components/sessionstore/src/Makefile.in
@@ -34,14 +34,18 @@
 
 DEPTH     = ../../../..
 topsrcdir = @top_srcdir@
 srcdir    = @srcdir@
 VPATH     = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
+EXTRA_COMPONENTS = \
+  nsSessionStore.manifest \
+  $(NULL)
+
 EXTRA_PP_COMPONENTS = \
 	nsSessionStore.js \
 	nsSessionStartup.js \
 	$(NULL)
 
 include $(topsrcdir)/config/rules.mk
--- a/browser/components/sessionstore/src/nsSessionStartup.js
+++ b/browser/components/sessionstore/src/nsSessionStartup.js
@@ -304,22 +304,12 @@ SessionStartup.prototype = {
 
     return null;
   },
 
   /* ........ QueryInterface .............. */
   QueryInterface : XPCOMUtils.generateQI([Ci.nsIObserver,
                                           Ci.nsISupportsWeakReference,
                                           Ci.nsISessionStartup]),
-  classDescription: "Browser Session Startup Service",
   classID:          Components.ID("{ec7a6c20-e081-11da-8ad9-0800200c9a66}"),
-  contractID:       "@mozilla.org/browser/sessionstartup;1",
-
-  // get this contractID registered for certain categories via XPCOMUtils
-  _xpcom_categories: [
-    // make ourselves a startup observer
-    { category: "app-startup", service: true }
-  ]
-
 };
 
-function NSGetModule(aCompMgr, aFileSpec)
-  XPCOMUtils.generateModule([SessionStartup]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([SessionStartup]);
--- a/browser/components/sessionstore/src/nsSessionStore.js
+++ b/browser/components/sessionstore/src/nsSessionStore.js
@@ -143,18 +143,16 @@ function debug(aMsg) {
 }
 
 /* :::::::: The Service ::::::::::::::: */
 
 function SessionStoreService() {
 }
 
 SessionStoreService.prototype = {
-  classDescription: "Browser Session Store Service",
-  contractID: "@mozilla.org/browser/sessionstore;1",
   classID: Components.ID("{5280606b-2510-4fe0-97ef-9b5a22eafe6b}"),
   QueryInterface: XPCOMUtils.generateQI([Ci.nsISessionStore,
                                          Ci.nsIDOMEventListener,
                                          Ci.nsIObserver,
                                          Ci.nsISupportsWeakReference]),
 
   // xul:tab attributes to (re)store (extensions might want to hook in here);
   // the favicon is always saved for the about:sessionrestore page
@@ -3084,10 +3082,9 @@ String.prototype.hasRootDomain = functio
   if (this == aDomain)
     return true;
 
   let prevChar = this[index - 1];
   return (index == (this.length - aDomain.length)) &&
          (prevChar == "." || prevChar == "/");
 }
 
-function NSGetModule(aComMgr, aFileSpec)
-  XPCOMUtils.generateModule([SessionStoreService]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([SessionStoreService]);
new file mode 100644
--- /dev/null
+++ b/browser/components/sessionstore/src/nsSessionStore.manifest
@@ -0,0 +1,5 @@
+component {5280606b-2510-4fe0-97ef-9b5a22eafe6b} nsSessionStore.js
+contract @mozilla.org/browser/sessionstore;1 {5280606b-2510-4fe0-97ef-9b5a22eafe6b}
+component {ec7a6c20-e081-11da-8ad9-0800200c9a66} nsSessionStartup.js
+contract @mozilla.org/browser/sessionstartup;1 {ec7a6c20-e081-11da-8ad9-0800200c9a66}
+category app-startup nsSessionStartup service,@mozilla.org/browser/sessionstartup;1
--- a/browser/components/shell/src/Makefile.in
+++ b/browser/components/shell/src/Makefile.in
@@ -61,17 +61,17 @@ CPPSRCS = nsGNOMEShellService.cpp
 endif
 endif
 endif
 
 ifdef CPPSRCS
 LIBRARY_NAME = shellservice_s
 endif
 
-EXTRA_COMPONENTS = nsSetDefaultBrowser.js
+EXTRA_COMPONENTS = nsSetDefaultBrowser.js nsSetDefaultBrowser.manifest
 
 include $(topsrcdir)/config/rules.mk
 
 DEFINES += -DMOZ_APP_NAME=\"$(MOZ_APP_NAME)\"
 
 CXXFLAGS += $(TK_CFLAGS)
 
 clobber::
--- a/browser/components/shell/src/nsSetDefaultBrowser.js
+++ b/browser/components/shell/src/nsSetDefaultBrowser.js
@@ -52,21 +52,13 @@ nsSetDefaultBrowser.prototype = {
       var shell = Cc["@mozilla.org/browser/shell-service;1"].
                   getService(Ci.nsIShellService);
       shell.setDefaultBrowser(true, true);
     }
   },
 
   helpInfo: "  -setDefaultBrowser Set this app as the default browser.\n",
 
-  classDescription: "Default Browser Cmdline Handler",
-  contractID: "@mozilla.org/browser/default-browser-clh;1",
   classID: Components.ID("{F57899D0-4E2C-4ac6-9E29-50C736103B0C}"),
   QueryInterface: XPCOMUtils.generateQI([Ci.nsICommandLineHandler]),
-  _xpcom_categories: [{
-    category: "command-line-handler",
-    entry: "m-setdefaultbrowser"
-  }]
-}
+};
 
-function NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule([nsSetDefaultBrowser]);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([nsSetDefaultBrowser]);
new file mode 100644
--- /dev/null
+++ b/browser/components/shell/src/nsSetDefaultBrowser.manifest
@@ -0,0 +1,3 @@
+component {F57899D0-4E2C-4ac6-9E29-50C736103B0C} nsSetDefaultBrowser.js
+contract @mozilla.org/browser/default-browser-clh;1 {F57899D0-4E2C-4ac6-9E29-50C736103B0C}
+category command-line-handler m-setdefaultbrowser @mozilla.org/browser/default-browser-clh;1
--- a/browser/components/sidebar/src/Makefile.in
+++ b/browser/components/sidebar/src/Makefile.in
@@ -37,12 +37,13 @@
 
 DEPTH		= ../../../..
 topsrcdir	= @top_srcdir@
 srcdir		= @srcdir@
 VPATH		= @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
+EXTRA_COMPONENTS = nsSidebar.manifest
 EXTRA_PP_COMPONENTS = nsSidebar.js
 
 include $(topsrcdir)/config/rules.mk
 
--- a/browser/components/sidebar/src/nsSidebar.js
+++ b/browser/components/sidebar/src/nsSidebar.js
@@ -36,36 +36,22 @@
 # use your version of this file under the terms of the MPL, indicate your
 # decision by deleting the provisions above and replace them with the notice
 # and other provisions required by the GPL or the LGPL. If you do not delete
 # the provisions above, a recipient may use your version of this file under
 # the terms of any one of the MPL, the GPL or the LGPL.
 #
 # ***** END LICENSE BLOCK *****
 
-/*
- * No magic constructor behaviour, as is de rigeur for XPCOM.
- * If you must perform some initialization, and it could possibly fail (even
- * due to an out-of-memory condition), you should use an Init method, which
- * can convey failure appropriately (thrown exception in JS,
- * NS_FAILED(nsresult) return in C++).
- *
- * In JS, you can actually cheat, because a thrown exception will cause the
- * CreateInstance call to fail in turn, but not all languages are so lucky.
- * (Though ANSI C++ provides exceptions, they are verboten in Mozilla code
- * for portability reasons -- and even when you're building completely
- * platform-specific code, you can't throw across an XPCOM method boundary.)
- */
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 
 const DEBUG = false; /* set to false to suppress debug messages */
 
-const SIDEBAR_CONTRACTID        = "@mozilla.org/sidebar;1";
 const SIDEBAR_CID               = Components.ID("{22117140-9c6e-11d3-aaf1-00805f8a4905}");
 const nsISupports               = Components.interfaces.nsISupports;
-const nsIFactory                = Components.interfaces.nsIFactory;
 const nsISidebar                = Components.interfaces.nsISidebar;
 const nsISidebarExternal        = Components.interfaces.nsISidebarExternal;
 const nsIClassInfo              = Components.interfaces.nsIClassInfo;
 
 // File extension for Sherlock search plugin description files
 const SHERLOCK_FILE_EXT_REGEXP = /\.src$/i;
 
 function nsSidebar()
@@ -76,16 +62,18 @@ function nsSidebar()
         Components.classes[PROMPTSERVICE_CONTRACTID].getService(nsIPromptService);
 
     const SEARCHSERVICE_CONTRACTID = "@mozilla.org/browser/search-service;1";
     const nsIBrowserSearchService = Components.interfaces.nsIBrowserSearchService;
     this.searchService =
       Components.classes[SEARCHSERVICE_CONTRACTID].getService(nsIBrowserSearchService);
 }
 
+nsSidebar.prototype.classID = SIDEBAR_CID;
+
 nsSidebar.prototype.nc = "http://home.netscape.com/NC-rdf#";
 
 function sidebarURLSecurityCheck(url)
 {
     if (!/^(https?:|ftp:)/i.test(url)) {
         Components.utils.reportError("Invalid argument passed to window.sidebar.addPanel: Unsupported panel URL." );
         return false;
     }
@@ -277,86 +265,19 @@ nsSidebar.prototype.QueryInterface =
 function (iid) {
     if (iid.equals(nsISidebar) ||
         iid.equals(nsISidebarExternal) ||
         iid.equals(nsIClassInfo) ||
         iid.equals(nsISupports))
         return this;
 
     throw Components.results.NS_ERROR_NO_INTERFACE;
-}
-
-var sidebarModule = new Object();
-
-sidebarModule.registerSelf =
-function (compMgr, fileSpec, location, type)
-{
-    debug("registering (all right -- a JavaScript module!)");
-    compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
-
-    compMgr.registerFactoryLocation(SIDEBAR_CID,
-                                    "Sidebar JS Component",
-                                    SIDEBAR_CONTRACTID,
-                                    fileSpec,
-                                    location,
-                                    type);
-
-    const CATMAN_CONTRACTID = "@mozilla.org/categorymanager;1";
-    const nsICategoryManager = Components.interfaces.nsICategoryManager;
-    var catman = Components.classes[CATMAN_CONTRACTID].
-                            getService(nsICategoryManager);
-
-    const JAVASCRIPT_GLOBAL_PROPERTY_CATEGORY = "JavaScript-global-property";
-    catman.addCategoryEntry(JAVASCRIPT_GLOBAL_PROPERTY_CATEGORY,
-                            "sidebar",
-                            SIDEBAR_CONTRACTID,
-                            true,
-                            true);
+};
 
-    catman.addCategoryEntry(JAVASCRIPT_GLOBAL_PROPERTY_CATEGORY,
-                            "external",
-                            SIDEBAR_CONTRACTID,
-                            true,
-                            true);
-}
-
-sidebarModule.getClassObject =
-function (compMgr, cid, iid) {
-    if (!cid.equals(SIDEBAR_CID))
-        throw Components.results.NS_ERROR_NO_INTERFACE;
-
-    if (!iid.equals(Components.interfaces.nsIFactory))
-        throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-
-    return sidebarFactory;
-}
-
-sidebarModule.canUnload =
-function(compMgr)
-{
-    debug("Unloading component.");
-    return true;
-}
-
-/* factory object */
-var sidebarFactory = new Object();
-
-sidebarFactory.createInstance =
-function (outer, iid) {
-    debug("CI: " + iid);
-    if (outer != null)
-        throw Components.results.NS_ERROR_NO_AGGREGATION;
-
-    return (new nsSidebar()).QueryInterface(iid);
-}
-
-/* entrypoint */
-function NSGetModule(compMgr, fileSpec) {
-    return sidebarModule;
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([nsSidebar]);
 
 /* static functions */
 if (DEBUG)
     debug = function (s) { dump("-*- sidebar component: " + s + "\n"); }
 else
     debug = function (s) {}
 
 // String bundle service
new file mode 100644
--- /dev/null
+++ b/browser/components/sidebar/src/nsSidebar.manifest
@@ -0,0 +1,4 @@
+component {22117140-9c6e-11d3-aaf1-00805f8a4905} nsSidebar.js
+contract @mozilla.org/sidebar;1 {22117140-9c6e-11d3-aaf1-00805f8a4905}
+category JavaScript-global-property sidebar @mozilla.org/sidebar;1
+category JavaScript-global-property sidebar @mozilla.org/sidebar;1
--- a/browser/fuel/src/Makefile.in
+++ b/browser/fuel/src/Makefile.in
@@ -39,11 +39,12 @@ DEPTH     = ../../..
 topsrcdir = @top_srcdir@
 srcdir    = @srcdir@
 VPATH     = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE = fuel
 
+EXTRA_COMPONENTS = fuelApplication.manifest
 EXTRA_PP_COMPONENTS = fuelApplication.js
 
 include $(topsrcdir)/config/rules.mk
--- a/browser/fuel/src/fuelApplication.js
+++ b/browser/fuel/src/fuelApplication.js
@@ -663,19 +663,17 @@ function Application() {
   this.initToolkitHelpers();
   this._bookmarks = null;
 }
 
 //=================================================
 // Application implementation
 Application.prototype = {
   // for nsIClassInfo + XPCOMUtils
-  classDescription: "Application",
   classID:          Components.ID("fe74cf80-aa2d-11db-abbd-0800200c9a66"),
-  contractID:       "@mozilla.org/fuel/application;1",
 
   // redefine the default factory for XPCOMUtils
   _xpcom_factory: ApplicationFactory,
 
   // for nsISupports
   QueryInterface : XPCOMUtils.generateQI([Ci.fuelIApplication, Ci.extIApplication,
                                           Ci.nsIObserver, Ci.nsIClassInfo]),
 
@@ -713,16 +711,15 @@ Application.prototype = {
     return win;
   },
 
   get activeWindow() {
     return new Window(Utilities.windowMediator.getMostRecentWindow("navigator:browser"));
   }
 };
 
-//module initialization
-function NSGetModule(aCompMgr, aFileSpec) {
-  // set the proto, defined in extApplication.js
-  Application.prototype.__proto__ = extApplication.prototype;
-  return XPCOMUtils.generateModule([Application]);
-}
+#include ../../../toolkit/components/exthelper/extApplication.js
 
-#include ../../../toolkit/components/exthelper/extApplication.js
+// set the proto, defined in extApplication.js
+Application.prototype.__proto__ = extApplication.prototype;
+
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([Application]);
+
new file mode 100644
--- /dev/null
+++ b/browser/fuel/src/fuelApplication.manifest
@@ -0,0 +1,2 @@
+component {fe74cf80-aa2d-11db-abbd-0800200c9a66} fuelApplication.js
+contract @mozilla.org/fuel/application;1 {fe74cf80-aa2d-11db-abbd-0800200c9a66}
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -255,95 +255,132 @@
 @BINPATH@/components/xpcom_xpti.xpt
 @BINPATH@/components/xpconnect.xpt
 @BINPATH@/components/xulapp.xpt
 @BINPATH@/components/xuldoc.xpt
 @BINPATH@/components/xultmpl.xpt
 @BINPATH@/components/zipwriter.xpt
 
 ; JavaScript components
+@BINPATH@/components/FeedProcessor.manifest
 @BINPATH@/components/FeedProcessor.js
+@BINPATH@/components/BrowserFeeds.manifest
 @BINPATH@/components/FeedConverter.js
 @BINPATH@/components/FeedWriter.js
+@BINPATH@/components/fuelApplication.manifest
 @BINPATH@/components/fuelApplication.js
 @BINPATH@/components/WebContentConverter.js
+@BINPATH@/components/BrowserComponents.manifest
 @BINPATH@/components/nsBrowserContentHandler.js
 @BINPATH@/components/nsBrowserGlue.js
+@BINPATH@/components/nsSetDefaultBrowser.manifest
 @BINPATH@/components/nsSetDefaultBrowser.js
 @BINPATH@/components/nsMicrosummaryService.js
+@BINPATH@/components/BrowserPlaces.manifest
 @BINPATH@/components/nsPlacesTransactionsService.js
+@BINPATH@/components/nsPrivateBrowsingService.manifest
 @BINPATH@/components/nsPrivateBrowsingService.js
+@BINPATH@/components/toolkitsearch.manifest
 @BINPATH@/components/nsSearchService.js
 @BINPATH@/components/nsSearchSuggestions.js
+@BINPATH@/components/nsTryToClose.manifest
 @BINPATH@/components/nsTryToClose.js
+@BINPATH@/components/passwordmgr.manifest
 @BINPATH@/components/nsLoginInfo.js
 @BINPATH@/components/nsLoginManager.js
 @BINPATH@/components/nsLoginManagerPrompter.js
 @BINPATH@/components/storage-Legacy.js
 @BINPATH@/components/storage-mozStorage.js
 @BINPATH@/components/crypto-SDR.js
+@BINPATH@/components/jsconsole-clhandler.manifest
 @BINPATH@/components/jsconsole-clhandler.js
 #ifdef MOZ_GTK2
+@BINPATH@/components/nsFilePicker.manifest
 @BINPATH@/components/nsFilePicker.js
 #endif
+@BINPATH@/components/nsHelperAppDlg.manifest
 @BINPATH@/components/nsHelperAppDlg.js
+@BINPATH@/components/nsDownloadManagerUI.manifest
 @BINPATH@/components/nsDownloadManagerUI.js
+@BINPATH@/components/nsProxyAutoConfig.manifest
 @BINPATH@/components/nsProxyAutoConfig.js
+@BINPATH@/components/NetworkGeolocationProvider.manifest
 @BINPATH@/components/NetworkGeolocationProvider.js
+@BINPATH@/components/GPSDGeolocationProvider.manifest
 @BINPATH@/components/GPSDGeolocationProvider.js
+@BINPATH@/components/nsSidebar.manifest
 @BINPATH@/components/nsSidebar.js
+@BINPATH@/components/extensions.manifest
 @BINPATH@/components/addonManager.js
 @BINPATH@/components/amContentHandler.js
 @BINPATH@/components/amWebInstallListener.js
 @BINPATH@/components/nsBlocklistService.js
 #ifdef MOZ_UPDATER
+@BINPATH@/components/nsUpdateService.manifest
 @BINPATH@/components/nsUpdateService.js
 @BINPATH@/components/nsUpdateServiceStub.js
 #endif
+@BINPATH@/components/nsUpdateTimerManager.manifest
 @BINPATH@/components/nsUpdateTimerManager.js
-@BINPATH@/components/pluginGlue.js
+@BINPATH@/components/pluginGlue.manifest
+@BINPATH@/components/nsSessionStore.manifest
 @BINPATH@/components/nsSessionStartup.js
 @BINPATH@/components/nsSessionStore.js
+@BINPATH@/components/nsURLFormatter.manifest
 @BINPATH@/components/nsURLFormatter.js
 #ifndef XP_OS2
 @BINPATH@/components/@DLL_PREFIX@browsercomps@DLL_SUFFIX@
 #else
 @BINPATH@/components/brwsrcmp@DLL_SUFFIX@
 #endif
+@BINPATH@/components/txEXSLTRegExFunctions.manifest
 @BINPATH@/components/txEXSLTRegExFunctions.js
 @BINPATH@/components/nsLivemarkService.js
 @BINPATH@/components/nsTaggingService.js
 @BINPATH@/components/nsPlacesDBFlush.js
 @BINPATH@/components/nsPlacesAutoComplete.js
 @BINPATH@/components/nsPlacesExpiration.js
 @BINPATH@/components/PlacesProtocolHandler.js
+@BINPATH@/components/nsDefaultCLH.manifest
 @BINPATH@/components/nsDefaultCLH.js
+@BINPATH@/components/nsContentPrefService.manifest
 @BINPATH@/components/nsContentPrefService.js
+@BINPATH@/components/nsContentDispatchChooser.manifest
 @BINPATH@/components/nsContentDispatchChooser.js
+@BINPATH@/components/nsHandlerService.manifest
 @BINPATH@/components/nsHandlerService.js
+@BINPATH@/components/nsWebHandlerApp.manifest
 @BINPATH@/components/nsWebHandlerApp.js
+@BINPATH@/components/nsBadCertHandler.manifest
 @BINPATH@/components/nsBadCertHandler.js
+@BINPATH@/components/satchel.manifest
 @BINPATH@/components/nsFormAutoComplete.js
 @BINPATH@/components/nsFormHistory.js
+@BINPATH@/components/contentSecurityPolicy.manifest
 @BINPATH@/components/contentSecurityPolicy.js
+@BINPATH@/components/contentAreaDropListener.manifest
 @BINPATH@/components/contentAreaDropListener.js
 #ifdef XP_MACOSX
 @BINPATH@/components/libalerts_s.dylib
 #endif
 #ifdef MOZ_ENABLE_DBUS
 @BINPATH@/components/@DLL_PREFIX@dbusservice@DLL_SUFFIX@
 #endif
+@BINPATH@/components/nsINIProcessor.manifest
 @BINPATH@/components/nsINIProcessor.js
+@BINPATH@/components/nsPrompter.manifest
 @BINPATH@/components/nsPrompter.js
 
 ; Modules
 @BINPATH@/modules/*
 
 ; Safe Browsing
+@BINPATH@/components/nsSafebrowsingApplication.manifest
 @BINPATH@/components/nsSafebrowsingApplication.js
+@BINPATH@/components/nsURLClassifier.manifest
 @BINPATH@/components/nsUrlClassifierListManager.js
 @BINPATH@/components/nsUrlClassifierLib.js
 @BINPATH@/components/url-classifier.xpt
 
 ; GNOME hooks
 #ifdef MOZ_ENABLE_GNOME_COMPONENT
 @BINPATH@/components/@DLL_PREFIX@mozgnome@DLL_SUFFIX@
 #endif
--- a/config/rules.mk
+++ b/config/rules.mk
@@ -1802,36 +1802,40 @@ endif
 export:: $(JAVA_DIST_DIR) $(JAVADEPFILES) $(JAVA_INSTALL_DIR)
 	(cd $(JAVA_GEN_DIR) && tar $(TAR_CREATE_FLAGS) - .) | (cd $(JAVA_INSTALL_DIR) && tar -xf -)
 
 endif # XPIDLSRCS
 endif # MOZ_JAVAXPCOM
 
 ################################################################################
 # Copy each element of EXTRA_COMPONENTS to $(FINAL_TARGET)/components
+ifneq (,$(filter %.js,$(EXTRA_COMPONENTS) $(EXTRA_PP_COMPONENTS)))
+ifeq (,$(filter %.manifest,$(EXTRA_COMPONENTS) $(EXTRA_PP_COMPONENTS)))
+$(error .js component without matching .manifest)
+endif
+endif
+
 ifdef EXTRA_COMPONENTS
 libs:: $(EXTRA_COMPONENTS)
 ifndef NO_DIST_INSTALL
 	$(INSTALL) $(IFLAGS1) $^ $(FINAL_TARGET)/components
-	@$(PYTHON) $(MOZILLA_DIR)/config/buildlist.py $(FINAL_TARGET)/components/components.list $(notdir $^)
 endif
 
 endif
 
 ifdef EXTRA_PP_COMPONENTS
 libs:: $(EXTRA_PP_COMPONENTS)
 ifndef NO_DIST_INSTALL
 	$(EXIT_ON_ERROR) \
 	$(NSINSTALL) -D $(FINAL_TARGET)/components; \
 	for i in $^; do \
 	  fname=`basename $$i`; \
 	  dest=$(FINAL_TARGET)/components/$${fname}; \
 	  $(RM) -f $$dest; \
 	  $(PYTHON) $(topsrcdir)/config/Preprocessor.py $(DEFINES) $(ACDEFINES) $(XULPPFLAGS) $$i > $$dest; \
-	  $(PYTHON) $(MOZILLA_DIR)/config/buildlist.py $(FINAL_TARGET)/components/components.list $$fname; \
 	done
 endif
 
 endif
 
 ################################################################################
 # Copy each element of EXTRA_JS_MODULES to $(FINAL_TARGET)/modules
 ifdef EXTRA_JS_MODULES
--- a/content/base/src/Makefile.in
+++ b/content/base/src/Makefile.in
@@ -153,18 +153,21 @@ CPPSRCS		= \
 GQI_SRCS = contentbase.gqi
 
 # we don't want the shared lib, but we want to force the creation of a
 # static lib.
 FORCE_STATIC_LIB = 1
 
 EXTRA_COMPONENTS = \
 		$(srcdir)/nsBadCertHandler.js \
+		nsBadCertHandler.manifest \
 		contentSecurityPolicy.js \
+		contentSecurityPolicy.manifest \
 		contentAreaDropListener.js \
+		contentAreaDropListener.manifest \
 		$(NULL)
 
 EXTRA_JS_MODULES = \
 		CSPUtils.jsm \
 		$(NULL)
 
 include $(topsrcdir)/config/rules.mk
 
--- a/content/base/src/contentAreaDropListener.js
+++ b/content/base/src/contentAreaDropListener.js
@@ -9,19 +9,17 @@ const Ci = Components.interfaces;
 // cannot be dropped if it is not a valid uri or the source of the drag cannot
 // access the uri. This prevents, for example, a source document from tricking
 // the user into dragging a chrome url.
 
 function ContentAreaDropListener() { };
 
 ContentAreaDropListener.prototype =
 {
-  classDescription: "A component that handles dragover and drop events on a content area",
   classID:          Components.ID("{1f34bc80-1bc7-11d6-a384-d705dd0746fc}"),
-  contractID:       "@mozilla.org/content/dropped-link-handler;1",
   QueryInterface:   XPCOMUtils.generateQI([Ci.nsIDroppedLinkHandler, Ci.nsISupports]),
 
   _getDropURL : function (dt)
   {
     let types = dt.types;
     for (let t = 0; t < types.length; t++) {
       let type = types[t];
       switch (type) {
new file mode 100644
--- /dev/null
+++ b/content/base/src/contentAreaDropListener.manifest
@@ -0,0 +1,2 @@
+component {1f34bc80-1bc7-11d6-a384-d705dd0746fc} contentAreaDropListener.js
+contract @mozilla.org/content/dropped-link-handler;1 {1f34bc80-1bc7-11d6-a384-d705dd0746fc}
--- a/content/base/src/contentSecurityPolicy.js
+++ b/content/base/src/contentSecurityPolicy.js
@@ -108,24 +108,19 @@ function ContentSecurityPolicy() {
 
   /* These must go through the catch-all */
   csp._MAPPINGS[cp.TYPE_XBL]               = cspr_sd.ALLOW;
   csp._MAPPINGS[cp.TYPE_PING]              = cspr_sd.ALLOW;
   csp._MAPPINGS[cp.TYPE_DTD]               = cspr_sd.ALLOW;
 }
 
 ContentSecurityPolicy.prototype = {
-  classDescription: "Content Security Policy Component",
-  contractID:       "@mozilla.org/contentsecuritypolicy;1",
   classID:          Components.ID("{AB36A2BF-CB32-4AA6-AB41-6B4E4444A221}"),
   QueryInterface:   XPCOMUtils.generateQI([Ci.nsIContentSecurityPolicy]),
 
-  // get this contractID registered for certain categories via XPCOMUtils
-  _xpcom_categories: [ ],
-
   get isInitialized() {
     return this._isInitialized;
   },
 
   set isInitialized (foo) {
     this._isInitialized = foo;
   },
 
@@ -433,12 +428,9 @@ ContentSecurityPolicy.prototype = {
     // frame-ancestors check is done outside the ContentPolicy
     var res = Ci.nsIContentPolicy.ACCEPT;
     CSPdebug("shouldProcess aContext=" + aContext);
     return res;
   },
 
 };
 
-
-
-function NSGetModule(aComMgr, aFileSpec)
-  XPCOMUtils.generateModule([ContentSecurityPolicy]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([ContentSecurityPolicy]);
new file mode 100644
--- /dev/null
+++ b/content/base/src/contentSecurityPolicy.manifest
@@ -0,0 +1,2 @@
+component {AB36A2BF-CB32-4AA6-AB41-6B4E4444A221} contentSecurityPolicy.js
+contract @mozilla.org/contentsecuritypolicy;1 {AB36A2BF-CB32-4AA6-AB41-6B4E4444A221}
--- a/content/base/src/nsBadCertHandler.js
+++ b/content/base/src/nsBadCertHandler.js
@@ -68,16 +68,12 @@ BadCertHandler.prototype = {
     return this.QueryInterface(iid);
   },
 
   // nsISupports
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIBadCertListener2,
                                          Ci.nsISSLErrorListener,
                                          Ci.nsIInterfaceRequestor]),
 
-  classDescription: "XMLHttpRequest Bad Cert Handler",
   classID:          Components.ID("{dbded6ec-edbf-4054-a834-287b82c260f9}"),
-  contractID:       "@mozilla.org/content/xmlhttprequest-bad-cert-handler;1"
 };
 
-function NSGetModule(aCompMgr, aFileSpec) {
-  return XPCOMUtils.generateModule([BadCertHandler]);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([BadCertHandler]);
new file mode 100644
--- /dev/null
+++ b/content/base/src/nsBadCertHandler.manifest
@@ -0,0 +1,2 @@
+component {dbded6ec-edbf-4054-a834-287b82c260f9} nsBadCertHandler.js
+contract @mozilla.org/content/xmlhttprequest-bad-cert-handler;1 {dbded6ec-edbf-4054-a834-287b82c260f9}
\ No newline at end of file
--- a/content/xslt/src/xslt/Makefile.in
+++ b/content/xslt/src/xslt/Makefile.in
@@ -88,17 +88,20 @@ CPPSRCS += txMozillaStylesheetCompiler.c
            txMozillaXMLOutput.cpp \
            txMozillaXSLTProcessor.cpp
 endif
 
 # we don't want the shared lib, but we want to force the creation of a
 # static lib.
 FORCE_STATIC_LIB = 1
 
-EXTRA_COMPONENTS = $(srcdir)/txEXSLTRegExFunctions.js
+EXTRA_COMPONENTS = \
+  txEXSLTRegExFunctions.js \
+  txEXSLTRegExFunctions.manifest \
+  $(NULL)
 
 include $(topsrcdir)/config/rules.mk
 
 INCLUDES += \
 	-I$(srcdir) \
 	-I$(srcdir)/../base \
 	-I$(srcdir)/../xml \
 	-I$(srcdir)/../xpath \
--- a/content/xslt/src/xslt/txEXSLTRegExFunctions.js
+++ b/content/xslt/src/xslt/txEXSLTRegExFunctions.js
@@ -32,33 +32,32 @@
  * use your version of this file under the terms of the MPL, indicate your
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
-const EXSLT_REGEXP_CONTRACTID = "@mozilla.org/exslt/regexp;1";
-const EXSLT_REGEXP_CID = Components.ID("{18a03189-067b-4978-b4f1-bafe35292ed6}");
-const EXSLT_REGEXP_NS = "http://exslt.org/regular-expressions";
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
 const EXSLT_REGEXP_DESC = "EXSLT RegExp extension functions"
 
-const XSLT_EXTENSIONS_CAT = "XSLT extension functions";
-
 const CATMAN_CONTRACTID = "@mozilla.org/categorymanager;1";
 const NODESET_CONTRACTID = "@mozilla.org/transformiix-nodeset;1";
 
 const Ci = Components.interfaces;
 
 function txEXSLTRegExFunctions()
 {
 }
 
 txEXSLTRegExFunctions.prototype = {
+    classID: Components.ID("{18a03189-067b-4978-b4f1-bafe35292ed6}"),
+
     QueryInterface: function(iid) {
         if (iid.equals(Ci.nsISupports) ||
             iid.equals(Ci.txIEXSLTRegExFunctions))
             return this;
 
         if (iid.equals(Ci.nsIClassInfo))
             return txEXSLTRegExModule.factory
 
@@ -100,89 +99,56 @@ txEXSLTRegExFunctions.prototype = {
         var re = new RegExp(regex, flags);
 
         return re.test(str);
     }
 }
 
 var SingletonInstance = null;
 
-var txEXSLTRegExModule = {
-    registerSelf: function(compMgr, fileSpec, location, type) {
-        compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
-        compMgr.registerFactoryLocation(EXSLT_REGEXP_CID, EXSLT_REGEXP_DESC,
-                                        EXSLT_REGEXP_CONTRACTID, fileSpec,
-                                        location, type);
+function NSGetFactory(cid)
+{
+    if (!cid.equals(EXSLT_REGEXP_CID))
+        throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
 
-        var catman = Components.classes[CATMAN_CONTRACTID]
-                               .getService(Ci.nsICategoryManager);
-        catman.addCategoryEntry(XSLT_EXTENSIONS_CAT, EXSLT_REGEXP_NS,
-                                EXSLT_REGEXP_CONTRACTID, true, true);
-    },
+
+    return kFactory;
+}
 
-    unregisterSelf: function(compMgr, location, loaderStr) {
-        compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
-        compMgr.unregisterFactoryLocation(EXSLT_REGEXP_CID, location);
-
-        var catman = Components.classes[CATMAN_CONTRACTID]
-                               .getService(Ci.nsICategoryManager);
-        catman.deleteCategoryEntry(XSLT_EXTENSIONS_CAT, EXSLT_REGEXP_NS, true);
-    },
+const kFactory = {
+    QueryInterface: function(iid) {
+        if (iid.equals(Ci.nsISupports) ||
+            iid.equals(Ci.nsIFactory) ||
+            iid.equals(Ci.nsIClassInfo))
+            return this;
 
-    getClassObject: function(compMgr, cid, iid) {
-        if (!cid.equals(EXSLT_REGEXP_CID))
-            throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-
-        if (!iid.equals(Ci.nsIFactory) &&
-            !iid.equals(Ci.nsIClassInfo))
-            throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-
-        return this.factory;
+        throw Components.results.NS_ERROR_NO_INTERFACE;
     },
 
-    factory: {
-        QueryInterface: function(iid) {
-            if (iid.equals(Ci.nsISupports) ||
-                iid.equals(Ci.nsIFactory) ||
-                iid.equals(Ci.nsIClassInfo))
-                return this;
-
-            throw Components.results.NS_ERROR_NO_INTERFACE;
-        },
-
-        createInstance: function(outer, iid) {
-            if (outer != null)
-                throw Components.results.NS_ERROR_NO_AGGREGATION;
-
-            if (SingletonInstance == null)
-                SingletonInstance = new txEXSLTRegExFunctions();
+    createInstance: function(outer, iid) {
+        if (outer != null)
+            throw Components.results.NS_ERROR_NO_AGGREGATION;
 
-            return SingletonInstance.QueryInterface(iid);
-        },
-
-        getInterfaces: function(countRef) {
-            var interfaces = [
-                Ci.txIEXSLTRegExFunctions
-            ];
-            countRef.value = interfaces.length;
+        if (SingletonInstance == null)
+            SingletonInstance = new txEXSLTRegExFunctions();
 
-            return interfaces;
-         },
-
-         getHelperForLanguage: function(language) {
-             return null;
-         },
-
-         contractID: EXSLT_REGEXP_CONTRACTID,
-         classDescription: EXSLT_REGEXP_DESC,
-         classID: EXSLT_REGEXP_CID,
-         implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
-         flags: Ci.nsIClassInfo.SINGLETON
+        return SingletonInstance.QueryInterface(iid);
     },
 
-    canUnload: function(compMgr) {
-        return true;
-    }
+    getInterfaces: function(countRef) {
+        var interfaces = [
+            Ci.txIEXSLTRegExFunctions
+        ];
+        countRef.value = interfaces.length;
+
+        return interfaces;
+    },
+
+    getHelperForLanguage: function(language) {
+        return null;
+    },
+
+    contractID: EXSLT_REGEXP_CONTRACTID,
+    classDescription: EXSLT_REGEXP_DESC,
+    classID: EXSLT_REGEXP_CID,
+    implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
+    flags: Ci.nsIClassInfo.SINGLETON
 };
-
-function NSGetModule(compMgr, fileSpec) {
-    return txEXSLTRegExModule;
-}
new file mode 100644
--- /dev/null
+++ b/content/xslt/src/xslt/txEXSLTRegExFunctions.manifest
@@ -0,0 +1,3 @@
+component {18a03189-067b-4978-b4f1-bafe35292ed6} txEXSLTRegExFunctions.js
+contract @mozilla.org/exslt/regexp;1 {18a03189-067b-4978-b4f1-bafe35292ed6}
+category XSLT-extension-functions http://exslt.org/regular-expressions @mozilla.org/exslt/regexp;1
--- a/content/xslt/src/xslt/txStylesheetCompiler.cpp
+++ b/content/xslt/src/xslt/txStylesheetCompiler.cpp
@@ -1057,17 +1057,17 @@ findFunction(nsIAtom* aName, PRInt32 aNa
             do_GetService(NS_CATEGORYMANAGER_CONTRACTID, &rv);
         NS_ENSURE_SUCCESS(rv, rv);
 
         nsAutoString namespaceURI;
         rv = txNamespaceManager::getNamespaceURI(aNamespaceID, namespaceURI);
         NS_ENSURE_SUCCESS(rv, rv);
 
         nsXPIDLCString contractID;
-        rv = catman->GetCategoryEntry("XSLT extension functions",
+        rv = catman->GetCategoryEntry("XSLT-extension-functions",
                                       NS_ConvertUTF16toUTF8(namespaceURI).get(),
                                       getter_Copies(contractID));
         if (rv == NS_ERROR_NOT_AVAILABLE) {
             return NS_ERROR_XPATH_UNKNOWN_FUNCTION;
         }
         NS_ENSURE_SUCCESS(rv, rv);
 
         map = sXPCOMFunctionMappings->AppendElement();
--- a/dom/src/geolocation/GPSDGeolocationProvider.js
+++ b/dom/src/geolocation/GPSDGeolocationProvider.js
@@ -129,22 +129,17 @@ function GPSDProvider() {
     gLoggingEnabled = this.prefService.getBoolPref("geo.gpsd.logging.enabled");
   } catch (e) {}
 };
 
 GPSDProvider.prototype = {
   
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIGeolocationProvider]),
   
-  classDescription: "Returns a geolocation from a GPSD source",
   classID: Components.ID("{0A3BE523-0F2A-32CC-CCD8-1E5986D5A79D}"),
-  contractID: "@mozilla.org/geolocation/gpsd/provider;1",
-  _xpcom_categories: [{
-    category: "geolocation-provider",
-  }],
   
   prefService: null,
 
   transport: null,
   outputStream: null,
   inputStream: null,
   
   startup: function() {
@@ -256,13 +251,9 @@ GPSDProvider.prototype = {
     var pump = Cc["@mozilla.org/network/input-stream-pump;1"].createInstance(Ci.nsIInputStreamPump);
     pump.init(this.inputStream, -1, -1, 0, 0, false);
     pump.asyncRead(dataListener, null);
 
   },
   
 };
 
-var components = [GPSDProvider];
-
-function NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule(components);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetModule([GPSDProvider]);
new file mode 100644
--- /dev/null
+++ b/dom/src/geolocation/GPSDGeolocationProvider.manifest
@@ -0,0 +1,3 @@
+component {0A3BE523-0F2A-32CC-CCD8-1E5986D5A79D} GPSDGeolocationProvider.manifest
+contract @mozilla.org/geolocation/gpsd/provider;1 {0A3BE523-0F2A-32CC-CCD8-1E5986D5A79D}
+category geolocation-provider GPSDProvider @mozilla.org/geolocation/gpsd/provider;1
--- a/dom/src/geolocation/Makefile.in
+++ b/dom/src/geolocation/Makefile.in
@@ -72,15 +72,17 @@ endif
 
 ifeq ($(MOZ_WIDGET_TOOLKIT),android)
 CPPSRCS         += AndroidLocationProvider.cpp nsGeoPosition.cpp
 EXPORTS         += nsGeoPosition.h
 endif
 
 EXTRA_COMPONENTS = \
                  NetworkGeolocationProvider.js \
+                 NetworkGeolocationProvider.manifest \
                  GPSDGeolocationProvider.js \
+                 GPSDGeolocationProvider.manifest \
                  $(NULL)
 
 
 include $(topsrcdir)/config/rules.mk
 
 DEFINES += -D_IMPL_NS_LAYOUT
--- a/dom/src/geolocation/NetworkGeolocationProvider.js
+++ b/dom/src/geolocation/NetworkGeolocationProvider.js
@@ -39,19 +39,16 @@ WifiGeoAddressObject.prototype = {
 
     getInterfaces: function(countRef) {
         var interfaces = [Ci.nsIDOMGeoPositionAddress, Ci.nsIClassInfo, Ci.nsISupports];
         countRef.value = interfaces.length;
         return interfaces;
     },
 
     getHelperForLanguage: function(language) null,
-    contractID: "",
-    classDescription: "wifi geo position address object",
-    classID: null,
     implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
     flags: Ci.nsIClassInfo.DOM_OBJECT,
 };
 
 function WifiGeoCoordsObject(lat, lon, acc, alt, altacc) {
     this.latitude = lat;
     this.longitude = lon;
     this.accuracy = acc;
@@ -65,19 +62,17 @@ WifiGeoCoordsObject.prototype = {
 
     getInterfaces: function(countRef) {
         var interfaces = [Ci.nsIDOMGeoPositionCoords, Ci.nsIClassInfo, Ci.nsISupports];
         countRef.value = interfaces.length;
         return interfaces;
     },
 
     getHelperForLanguage: function(language) null,
-    contractID: "",
     classDescription: "wifi geo position coords object",
-    classID: null,
     implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
     flags: Ci.nsIClassInfo.DOM_OBJECT,
 
     latitude: 0,
     longitude: 0,
     accuracy: 0,
     altitude: 0,
     altitudeAccuracy: 0,
@@ -116,19 +111,17 @@ WifiGeoPositionObject.prototype = {
     // Class Info is required to be able to pass objects back into the DOM.
     getInterfaces: function(countRef) {
         var interfaces = [Ci.nsIDOMGeoPosition, Ci.nsIClassInfo, Ci.nsISupports];
         countRef.value = interfaces.length;
         return interfaces;
     },
 
     getHelperForLanguage: function(language) null,
-    contractID: "",
     classDescription: "wifi geo location position object",
-    classID: null,
     implementationLanguage: Ci.nsIProgrammingLanguage.JAVASCRIPT,
     flags: Ci.nsIClassInfo.DOM_OBJECT,
 
     coords: null,
     timestamp: 0,
 };
 
 function HELD() {};
@@ -223,19 +216,17 @@ function WifiGeoPositionProvider() {
 
     try {
         gTestingEnabled = this.prefService.getBoolPref("geo.wifi.testing");
     } catch (e) {}
 
 };
 
 WifiGeoPositionProvider.prototype = {
-    classDescription: "A component that returns a geolocation based on WIFI",
     classID:          Components.ID("{77DA64D3-7458-4920-9491-86CC9914F904}"),
-    contractID:       "@mozilla.org/geolocation/provider;1",
     QueryInterface:   XPCOMUtils.generateQI([Ci.nsIGeolocationProvider,
                                              Ci.nsIWifiListener,
                                              Ci.nsITimerCallback]),
 
     prefService:     null,
 
     provider_url:    null,
     wifi_service:    null,
@@ -441,12 +432,9 @@ WifiGeoPositionProvider.prototype = {
     notify: function (timer) {
         if (this.hasSeenWiFi == false)
             this.onChange(null);
         this.timer = null;
     },
 
 };
 
-var components = [WifiGeoPositionProvider];
-function NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule(components);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([WifiGeoPositionProvider]);
new file mode 100644
--- /dev/null
+++ b/dom/src/geolocation/NetworkGeolocationProvider.manifest
@@ -0,0 +1,2 @@
+component {77DA64D3-7458-4920-9491-86CC9914F904} NetworkGeolocationProvider.js
+contract @mozilla.org/geolocation/provider;1 {77DA64D3-7458-4920-9491-86CC9914F904}
--- a/layout/tools/pageloader/Makefile.in
+++ b/layout/tools/pageloader/Makefile.in
@@ -41,11 +41,12 @@ srcdir		= @srcdir@
 VPATH		= @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE		= layout
 
 EXTRA_COMPONENTS= \
 		tp-cmdline.js \
+		tp-cmdline.manifest \
 		$(NULL)
 
 include $(topsrcdir)/config/rules.mk
--- a/layout/tools/pageloader/tp-cmdline.js
+++ b/layout/tools/pageloader/tp-cmdline.js
@@ -32,44 +32,35 @@
  * use your version of this file under the terms of the MPL, indicate your
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
 // This only implements nsICommandLineHandler, since it needs
 // to handle multiple arguments.
 
-const TP_CMDLINE_CONTRACTID     = "@mozilla.org/commandlinehandler/general-startup;1?type=tp";
-const TP_CMDLINE_CLSID          = Components.ID('{8AF052F5-8EFE-4359-8266-E16498A82E8B}');
-const CATMAN_CONTRACTID         = "@mozilla.org/categorymanager;1";
 const nsISupports               = Components.interfaces.nsISupports;
   
-const nsICategoryManager        = Components.interfaces.nsICategoryManager;
 const nsICommandLine            = Components.interfaces.nsICommandLine;
 const nsICommandLineHandler     = Components.interfaces.nsICommandLineHandler;
-const nsIComponentRegistrar     = Components.interfaces.nsIComponentRegistrar;
 const nsISupportsString         = Components.interfaces.nsISupportsString;
 const nsIWindowWatcher          = Components.interfaces.nsIWindowWatcher;
 
 function PageLoaderCmdLineHandler() {}
 PageLoaderCmdLineHandler.prototype =
 {
-  /* nsISupports */
-  QueryInterface : function handler_QI(iid) {
-    if (iid.equals(nsISupports))
-      return this;
+  classID: Components.ID('{8AF052F5-8EFE-4359-8266-E16498A82E8B}'),
 
-    if (nsICommandLineHandler && iid.equals(nsICommandLineHandler))
-      return this;
-
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
+  /* nsISupports */
+  QueryInterface : XPCOMUtils.generateQI([nsICommandLineHandler]),
 
   /* nsICommandLineHandler */
   handle : function handler_handle(cmdLine) {
     var args = {};
     try {
       var uristr = cmdLine.handleFlagWithParam("tp", false);
       if (uristr == null)
         return;
@@ -120,74 +111,9 @@ PageLoaderCmdLineHandler.prototype =
   "  -tpheight height   Height of window\n" +
   "  -tpoffline         Force offline mode\n" +
   "  -tpnoisy           Dump the name of the last loaded page to console\n" + 
   "  -tptimeout         Max amount of time given for a page to load, quit if exceeded\n" +
   "  -tpnoforcecc       Don't force cycle collection between each pageload\n"
 
 };
 
-
-var PageLoaderCmdLineFactory =
-{
-  createInstance : function(outer, iid)
-  {
-    if (outer != null) {
-      throw Components.results.NS_ERROR_NO_AGGREGATION;
-    }
-
-    return new PageLoaderCmdLineHandler().QueryInterface(iid);
-  }
-};
-
-
-var PageLoaderCmdLineModule =
-{
-  registerSelf : function(compMgr, fileSpec, location, type)
-  {
-    compMgr = compMgr.QueryInterface(nsIComponentRegistrar);
-
-    compMgr.registerFactoryLocation(TP_CMDLINE_CLSID,
-                                    "PageLoader CommandLine Service",
-                                    TP_CMDLINE_CONTRACTID,
-                                    fileSpec,
-                                    location,
-                                    type);
-
-    var catman = Components.classes[CATMAN_CONTRACTID].getService(nsICategoryManager);
-    catman.addCategoryEntry("command-line-handler",
-                            "m-tp",
-                            TP_CMDLINE_CONTRACTID, true, true);
-  },
-
-  unregisterSelf : function(compMgr, fileSpec, location)
-  {
-    compMgr = compMgr.QueryInterface(nsIComponentRegistrar);
-
-    compMgr.unregisterFactoryLocation(TP_CMDLINE_CLSID, fileSpec);
-    catman = Components.classes[CATMAN_CONTRACTID].getService(nsICategoryManager);
-    catman.deleteCategoryEntry("command-line-handler",
-                               "m-tp", true);
-  },
-
-  getClassObject : function(compMgr, cid, iid)
-  {
-    if (cid.equals(TP_CMDLINE_CLSID)) {
-      return PageLoaderCmdLineFactory;
-    }
-
-    if (!iid.equals(Components.interfaces.nsIFactory)) {
-      throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-    }
-
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
-
-  canUnload : function(compMgr)
-  {
-    return true;
-  }
-};
-
-
-function NSGetModule(compMgr, fileSpec) {
-  return PageLoaderCmdLineModule;
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([PageLoaderCmdLineHandler]);
new file mode 100644
--- /dev/null
+++ b/layout/tools/pageloader/tp-cmdline.manifest
@@ -0,0 +1,3 @@
+component {8AF052F5-8EFE-4359-8266-E16498A82E8B} tp-cmdline.js
+contract @mozilla.org/commandlinehandler/general-startup;1?type=tp {8AF052F5-8EFE-4359-8266-E16498A82E8B}
+category command-line-handler m-tp @mozilla.org/commandlinehandler/general-startup;1?type=tp
--- a/layout/tools/reftest/Makefile.in
+++ b/layout/tools/reftest/Makefile.in
@@ -41,16 +41,17 @@ srcdir		= @srcdir@
 VPATH		= @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE		= reftest
 
 EXTRA_COMPONENTS= \
 		reftest-cmdline.js \
+		reftest-cmdline.manifest \
 		$(NULL)
 
 ifdef XPI_NAME
 DIST_FILES = install.rdf
 
 # Used in install.rdf
 USE_EXTENSION_MANIFEST=1
 endif
--- a/layout/tools/reftest/reftest-cmdline.js
+++ b/layout/tools/reftest/reftest-cmdline.js
@@ -31,57 +31,32 @@
  * use your version of this file under the terms of the MPL, indicate your
  * decision by deleting the provisions above and replace them with the notice
  * and other provisions required by the GPL or the LGPL. If you do not delete
  * the provisions above, a recipient may use your version of this file under
  * the terms of any one of the MPL, the GPL or the LGPL.
  *
  * ***** END LICENSE BLOCK ***** */
 
-// NOTE: this file implements both the seamonkey nsICmdLineHandler and
-// the toolkit nsICommandLineHandler, using runtime detection.
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 
-const REFTEST_CMDLINE_CONTRACTID     = "@mozilla.org/commandlinehandler/general-startup;1?type=reftest";
-const REFTEST_CMDLINE_CLSID          = Components.ID('{32530271-8c1b-4b7d-a812-218e42c6bb23}');
-const CATMAN_CONTRACTID              = "@mozilla.org/categorymanager;1";
 const nsISupports                    = Components.interfaces.nsISupports;
   
-const nsICategoryManager             = Components.interfaces.nsICategoryManager;
-const nsICmdLineHandler              = Components.interfaces.nsICmdLineHandler;
 const nsICommandLine                 = Components.interfaces.nsICommandLine;
 const nsICommandLineHandler          = Components.interfaces.nsICommandLineHandler;
-const nsIComponentRegistrar          = Components.interfaces.nsIComponentRegistrar;
 const nsISupportsString              = Components.interfaces.nsISupportsString;
 const nsIWindowWatcher               = Components.interfaces.nsIWindowWatcher;
 
 function RefTestCmdLineHandler() {}
 RefTestCmdLineHandler.prototype =
 {
-  /* nsISupports */
-  QueryInterface : function handler_QI(iid) {
-    if (iid.equals(nsISupports))
-      return this;
-
-    if (nsICmdLineHandler && iid.equals(nsICmdLineHandler))
-      return this;
-
-    if (nsICommandLineHandler && iid.equals(nsICommandLineHandler))
-      return this;
+  classID: Components.ID('{32530271-8c1b-4b7d-a812-218e42c6bb23}'),
 
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
-
-  /* nsICmdLineHandler */
-  commandLineArgument : "-reftest",
-  prefNameForStartup : "general.startup.reftest",
-  chromeUrlForTask : "chrome://reftest/content/reftest.xul",
-  helpText : "Run layout acceptance tests on given manifest.",
-  handlesArgs : true,
-  defaultArgs : "",
-  openWindowWithArgs : true,
+  /* nsISupports */
+  QueryInterface: XPCOMUtils.generateQI([nsICommandLineHandler]),
 
   /* nsICommandLineHandler */
   handle : function handler_handle(cmdLine) {
     var args = { };
     args.wrappedJSObject = args;
     try {
       var uristr = cmdLine.handleFlagWithParam("reftest", false);
       if (uristr == null)
@@ -121,79 +96,9 @@ RefTestCmdLineHandler.prototype =
     wwatch.openWindow(null, "chrome://reftest/content/reftest.xul", "_blank",
                       "chrome,dialog=no,all", args);
     cmdLine.preventDefault = true;
   },
 
   helpInfo : "  -reftest <file>    Run layout acceptance tests on given manifest.\n"
 };
 
-
-var RefTestCmdLineFactory =
-{
-  createInstance : function(outer, iid)
-  {
-    if (outer != null) {
-      throw Components.results.NS_ERROR_NO_AGGREGATION;
-    }
-
-    return new RefTestCmdLineHandler().QueryInterface(iid);
-  }
-};
-
-
-var RefTestCmdLineModule =
-{
-  registerSelf : function(compMgr, fileSpec, location, type)
-  {
-    compMgr = compMgr.QueryInterface(nsIComponentRegistrar);
-
-    compMgr.registerFactoryLocation(REFTEST_CMDLINE_CLSID,
-                                    "RefTest CommandLine Service",
-                                    REFTEST_CMDLINE_CONTRACTID,
-                                    fileSpec,
-                                    location,
-                                    type);
-
-    var catman = Components.classes[CATMAN_CONTRACTID].getService(nsICategoryManager);
-    catman.addCategoryEntry("command-line-argument-handlers",
-                            "reftest command line handler",
-                            REFTEST_CMDLINE_CONTRACTID, true, true);
-    catman.addCategoryEntry("command-line-handler",
-                            "m-reftest",
-                            REFTEST_CMDLINE_CONTRACTID, true, true);
-  },
-
-  unregisterSelf : function(compMgr, fileSpec, location)
-  {
-    compMgr = compMgr.QueryInterface(nsIComponentRegistrar);
-
-    compMgr.unregisterFactoryLocation(REFTEST_CMDLINE_CLSID, fileSpec);
-    catman = Components.classes[CATMAN_CONTRACTID].getService(nsICategoryManager);
-    catman.deleteCategoryEntry("command-line-argument-handlers",
-                               "reftest command line handler", true);
-    catman.deleteCategoryEntry("command-line-handler",
-                               "m-reftest", true);
-  },
-
-  getClassObject : function(compMgr, cid, iid)
-  {
-    if (cid.equals(REFTEST_CMDLINE_CLSID)) {
-      return RefTestCmdLineFactory;
-    }
-
-    if (!iid.equals(Components.interfaces.nsIFactory)) {
-      throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-    }
-
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
-
-  canUnload : function(compMgr)
-  {
-    return true;
-  }
-};
-
-
-function NSGetModule(compMgr, fileSpec) {
-  return RefTestCmdLineModule;
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([RefTestCmdLineHandler]);
new file mode 100644
--- /dev/null
+++ b/layout/tools/reftest/reftest-cmdline.manifest
@@ -0,0 +1,3 @@
+component {32530271-8c1b-4b7d-a812-218e42c6bb23} reftest-cmdline.js
+contract @mozilla.org/commandlinehandler/general-startup;1?type=reftest {32530271-8c1b-4b7d-a812-218e42c6bb23}
+category command-line-handler m-reftest @mozilla.org/commandlinehandler/general-startup;1?type=reftest
--- a/netwerk/base/src/Makefile.in
+++ b/netwerk/base/src/Makefile.in
@@ -112,16 +112,17 @@ ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
 else
 	CPPSRCS += nsURLHelperUnix.cpp
 endif
 endif
 endif
 
 EXTRA_COMPONENTS = \
 		$(srcdir)/nsProxyAutoConfig.js \
+		$(srcdir)/nsProxyAutoConfig.manifest \
 		$(NULL)
 
 EXTRA_JS_MODULES = \
 		NetUtil.jsm \
 		$(NULL)
 
 # we don't want the shared lib, but we want to force the creation of a
 # static lib.
--- a/netwerk/base/src/nsProxyAutoConfig.js
+++ b/netwerk/base/src/nsProxyAutoConfig.js
@@ -39,37 +39,38 @@
  *
  * ***** END LICENSE BLOCK ***** */
 
 /*
    Script for Proxy Auto Config in the new world order.
        - Gagan Saksena 04/24/00 
 */
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
 const kDNS_CONTRACTID = "@mozilla.org/network/dns-service;1";
-const kPAC_CONTRACTID = "@mozilla.org/network/proxy-auto-config;1";
-const kPAC_CID = Components.ID("{63ac8c66-1dd2-11b2-b070-84d00d3eaece}");
 
 const nsISupports        = Components.interfaces.nsISupports;
 const nsIProxyAutoConfig = Components.interfaces.nsIProxyAutoConfig;
 const nsIDNSService      = Components.interfaces.nsIDNSService;
 
+var dns;
+
 // implementor of nsIProxyAutoConfig
-function nsProxyAutoConfig() {};
+function nsProxyAutoConfig() {
+    dns = Components.classes[kDNS_CONTRACTID].getService(nsIDNSService);
+};
 
 nsProxyAutoConfig.prototype = {
+    classID: Components.ID("63ac8c66-1dd2-11b2-b070-84d00d3eaece"),
+
     // sandbox in which we eval loaded autoconfig js file
     _sandBox: null, 
 
-    QueryInterface: function(iid) {
-        if (iid.Equals(nsIProxyAutoConfig) ||
-            iid.Equals(nsISupports))
-            return this;
-        throw Components.results.NS_ERROR_NO_INTERFACE;
-    },
+    QueryInterface: XPCOMUtils.generateQI([nsIProxyAutoConfig]),
 
     init: function(pacURI, pacText) {
         // remove PAC configuration if requested
         if (pacURI == "" || pacText == "") {
             this._sandBox = null;
             return;
         }
 
@@ -124,64 +125,17 @@ function myIpAddress() {
 function dnsResolve(host) {
     try {
         return dns.resolve(host, 0).getNextAddrAsString();
     } catch (e) {
         return null;
     }
 }
 
-var pacModule = new Object();
-
-pacModule.registerSelf =
-    function (compMgr, fileSpec, location, type) {
-        compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
-        compMgr.registerFactoryLocation(kPAC_CID,
-                                        "nsProxyAutoConfig",
-                                        kPAC_CONTRACTID,
-                                        fileSpec, 
-                                        location, 
-                                        type);
-    }
-
-pacModule.getClassObject =
-function (compMgr, cid, iid) {
-        if (!cid.equals(kPAC_CID))
-            throw Components.results.NS_ERROR_NO_INTERFACE;
-
-        if (!iid.equals(Components.interfaces.nsIFactory))
-            throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-
-        return pacFactory;
-    }
-
-pacModule.canUnload =
-    function (compMgr) {
-        return true;
-    }
-
-var pacFactory = new Object();
-pacFactory.createInstance =
-    function (outer, iid) {
-        if (outer != null)
-            throw Components.results.NS_ERROR_NO_AGGREGATION;
-
-        if (!iid.equals(nsIProxyAutoConfig) &&
-            !iid.equals(Components.interfaces.nsISupports)) {
-            throw Components.results.NS_ERROR_NO_INTERFACE;
-        }
-        return pac;
-    }
-
-function NSGetModule(compMgr, fileSpec) {
-    return pacModule;
-}
-
-var pac = new nsProxyAutoConfig() ;
-var dns = Components.classes[kDNS_CONTRACTID].getService(nsIDNSService);
+NSGetFactory = XPCOMUtils.generateNSGetFactory([nsProxyAutoConfig]);
 
 var pacUtils = 
 "function dnsDomainIs(host, domain) {\n" +
 "    return (host.length >= domain.length &&\n" +
 "            host.substring(host.length - domain.length) == domain);\n" +
 "}\n" +
 
 "function dnsDomainLevels(host) {\n" +
new file mode 100644
--- /dev/null
+++ b/netwerk/base/src/nsProxyAutoConfig.manifest
@@ -0,0 +1,2 @@
+component {63ac8c66-1dd2-11b2-b070-84d00d3eaece} nsProxyAutoConfig.js
+contract "@mozilla.org/network/proxy-auto-config;1" {63ac8c66-1dd2-11b2-b070-84d00d3eaece}
--- a/netwerk/test/httpserver/Makefile.in
+++ b/netwerk/test/httpserver/Makefile.in
@@ -42,16 +42,17 @@ srcdir		= @srcdir@
 VPATH		= @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE          = test_necko
 
 EXTRA_COMPONENTS = \
                    httpd.js \
+                   httpd.manifest \
                    $(NULL)
 
 XPIDLSRCS       = \
                   nsIHttpServer.idl \
                   $(NULL)
 
 XPCSHELL_TESTS = test
 
--- a/netwerk/test/httpserver/httpd.js
+++ b/netwerk/test/httpserver/httpd.js
@@ -5132,89 +5132,27 @@ function makeFactory(ctor)
              if (Ci.nsIFactory.equals(aIID) ||
                  Ci.nsISupports.equals(aIID))
                return this;
              throw Cr.NS_ERROR_NO_INTERFACE;
            }
          };
 }
 
-/** The XPCOM module containing the HTTP server. */
-const module =
+const kServerCID = Components.ID("{54ef6f81-30af-4b1d-ac55-8ba811293e41}");
+const kServerFactory = makeFactory(nsHttpServer);
+
+function NSGetFactory(cid)
 {
-  // nsISupports
-  QueryInterface: function(aIID)
-  {
-    if (Ci.nsIModule.equals(aIID) ||
-        Ci.nsISupports.equals(aIID))
-      return this;
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-
-  // nsIModule
-  registerSelf: function(compMgr, fileSpec, location, type)
-  {
-    compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
+  if (cid.equals(kServerCID)
+    return kServerFactory;
     
-    for (var key in this._objects)
-    {
-      var obj = this._objects[key];
-      compMgr.registerFactoryLocation(obj.CID, obj.className, obj.contractID,
-                                               fileSpec, location, type);
-    }
-  },
-  unregisterSelf: function (compMgr, location, type)
-  {
-    compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
-
-    for (var key in this._objects)
-    {
-      var obj = this._objects[key];
-      compMgr.unregisterFactoryLocation(obj.CID, location);
-    }
-  },
-  getClassObject: function(compMgr, cid, iid)
-  {
-    if (!iid.equals(Ci.nsIFactory))
-      throw Cr.NS_ERROR_NOT_IMPLEMENTED;
-
-    for (var key in this._objects)
-    {
-      if (cid.equals(this._objects[key].CID))
-        return this._objects[key].factory;
-    }
-    
-    throw Cr.NS_ERROR_NO_INTERFACE;
-  },
-  canUnload: function(compMgr)
-  {
-    return true;
-  },
-
-  // private implementation
-  _objects:
-  {
-    server:
-    {
-      CID:         Components.ID("{54ef6f81-30af-4b1d-ac55-8ba811293e41}"),
-      contractID:  "@mozilla.org/server/jshttp;1",
-      className:   "httpd.js server",
-      factory:     makeFactory(nsHttpServer)
-    }
-  }
-};
-
-
-/** NSGetModule, so this code can be used as a JS component. */
-function NSGetModule(compMgr, fileSpec)
-{
-  return module;
+  throw Cr.NS_ERROR_FACTORY_NOT_REGISTERED;
 }
 
-
 /**
  * Creates a new HTTP server listening for loopback traffic on the given port,
  * starts it, and runs the server until the server processes a shutdown request,
  * spinning an event loop so that events posted by the server's socket are
  * processed.
  *
  * This method is primarily intended for use in running this script from within
  * xpcshell and running a functional HTTP server without having to deal with
new file mode 100644
--- /dev/null
+++ b/netwerk/test/httpserver/httpd.manifest
@@ -0,0 +1,2 @@
+component {54ef6f81-30af-4b1d-ac55-8ba811293e41} httpd.js
+contract 54ef6f81-30af-4b1d-ac55-8ba811293e41 {@mozilla.org/server/jshttp;1}
\ No newline at end of file
--- a/toolkit/components/Makefile.in
+++ b/toolkit/components/Makefile.in
@@ -125,10 +125,11 @@ ifdef MOZ_FASTSTART
 PARALLEL_DIRS += faststart
 endif
 
 DIRS += \
   build \
   $(NULL)
 
 EXTRA_PP_COMPONENTS = nsDefaultCLH.js
+EXTRA_COMPONENTS = nsDefaultCLH.manifest
 
 include $(topsrcdir)/config/rules.mk
--- a/toolkit/components/console/Makefile.in
+++ b/toolkit/components/console/Makefile.in
@@ -38,12 +38,12 @@
 
 DEPTH     = ../../..
 topsrcdir = @top_srcdir@
 srcdir    = @srcdir@
 VPATH     = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
-EXTRA_PP_COMPONENTS = jsconsole-clhandler.js
+EXTRA_PP_COMPONENTS = jsconsole-clhandler.js jsconsole-clhandler.manifest
 
 include $(topsrcdir)/config/rules.mk
 
--- a/toolkit/components/console/jsconsole-clhandler.js
+++ b/toolkit/components/console/jsconsole-clhandler.js
@@ -61,17 +61,13 @@ jsConsoleHandler.prototype = {
     }
 
     if (cmdLine.state == Ci.nsICommandLine.STATE_REMOTE_AUTO)
       cmdLine.preventDefault = true;
   },
 
   helpInfo : "  -jsconsole         Open the Error console.\n",
 
-  classDescription: "jsConsoleHandler",
   classID: Components.ID("{2cd0c310-e127-44d0-88fc-4435c9ab4d4b}"),
-  contractID: "@mozilla.org/toolkit/console-clh;1",
   QueryInterface: XPCOMUtils.generateQI([Ci.nsICommandLineHandler]),
-  _xpcom_categories: [{category: "command-line-handler", entry: "b-jsconsole"}]
 };
 
-function NSGetModule(compMgr, fileSpec)
-  XPCOMUtils.generateModule([jsConsoleHandler]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([jsConsoleHandler]);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/console/jsconsole-clhandler.manifest
@@ -0,0 +1,3 @@
+component {2cd0c310-e127-44d0-88fc-4435c9ab4d4b} jsconsole-clhandler.js
+contract @mozilla.org/toolkit/console-clh;1 {2cd0c310-e127-44d0-88fc-4435c9ab4d4b}
+category command-line-handler b-jsconsole @mozilla.org/toolkit/console-clh;1
--- a/toolkit/components/contentprefs/src/Makefile.in
+++ b/toolkit/components/contentprefs/src/Makefile.in
@@ -38,11 +38,11 @@ DEPTH      = ../../../..
 topsrcdir  = @top_srcdir@
 srcdir     = @srcdir@
 VPATH      = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE = contentprefs
 
-EXTRA_COMPONENTS = nsContentPrefService.js
+EXTRA_COMPONENTS = nsContentPrefService.js nsContentPrefService.manifest
 
 include $(topsrcdir)/config/rules.mk
--- a/toolkit/components/contentprefs/src/nsContentPrefService.js
+++ b/toolkit/components/contentprefs/src/nsContentPrefService.js
@@ -53,19 +53,17 @@ function ContentPrefService() {
   // Observe shutdown so we can shut down the database connection.
   this._observerSvc.addObserver(this, "xpcom-shutdown", false);
 }
 
 ContentPrefService.prototype = {
   //**************************************************************************//
   // XPCOM Plumbing
 
-  classDescription: "Content Pref Service",
   classID:          Components.ID("{e6a3f533-4ffa-4615-8eb4-d4e72d883fa7}"),
-  contractID:       "@mozilla.org/content-pref/service;1",
   QueryInterface:   XPCOMUtils.generateQI([Ci.nsIContentPrefService]),
 
 
   //**************************************************************************//
   // Convenience Getters
 
   // Observer Service
   __observerSvc: null,
@@ -1019,22 +1017,19 @@ ContentPrefService.prototype = {
 
 
 function HostnameGrouper() {}
 
 HostnameGrouper.prototype = {
   //**************************************************************************//
   // XPCOM Plumbing
   
-  classDescription: "Hostname Grouper",
   classID:          Components.ID("{8df290ae-dcaa-4c11-98a5-2429a4dc97bb}"),
-  contractID:       "@mozilla.org/content-pref/hostname-grouper;1",
   QueryInterface:   XPCOMUtils.generateQI([Ci.nsIContentURIGrouper]),
 
-
   //**************************************************************************//
   // nsIContentURIGrouper
 
   group: function HostnameGrouper_group(aURI) {
     var group;
 
     try {
       // Accessing the host property of the URI will throw an exception
@@ -1098,11 +1093,9 @@ AsyncStatement.prototype = {
     });
   }
 };
 
 //****************************************************************************//
 // XPCOM Plumbing
 
 var components = [ContentPrefService, HostnameGrouper];
-var NSGetModule = function ContentPrefService_NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule(components);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/contentprefs/src/nsContentPrefService.manifest
@@ -0,0 +1,4 @@
+component {e6a3f533-4ffa-4615-8eb4-d4e72d883fa7} nsContentPrefService.js
+contract @mozilla.org/content-pref/service;1 {e6a3f533-4ffa-4615-8eb4-d4e72d883fa7}
+component {8df290ae-dcaa-4c11-98a5-2429a4dc97bb} nsContentPrefService.js
+contract @mozilla.org/content-pref/hostname-grouper;1 {8df290ae-dcaa-4c11-98a5-2429a4dc97bb}
--- a/toolkit/components/downloads/src/Makefile.in
+++ b/toolkit/components/downloads/src/Makefile.in
@@ -63,15 +63,16 @@ endif
 # definition of MOZ_SUITE is only added via config.mk
 include $(topsrcdir)/config/config.mk
 
 ifndef MOZ_SUITE
 # XXX - Until Suite builds off XULRunner we can't guarantee our implementation
 # of nsIDownloadManagerUI overrides toolkit's.
 EXTRA_COMPONENTS = \
   nsDownloadManagerUI.js \
+  nsDownloadManagerUI.manifest \
   $(NULL)
 endif
 
 include $(topsrcdir)/config/rules.mk
 
 EXTRA_DSO_LDOPTS += $(MOZ_COMPONENT_LIBS)
 
--- a/toolkit/components/downloads/src/nsDownloadManagerUI.js
+++ b/toolkit/components/downloads/src/nsDownloadManagerUI.js
@@ -46,19 +46,17 @@ const DOWNLOAD_MANAGER_URL = "chrome://m
 const PREF_FLASH_COUNT = "browser.download.manager.flashCount";
 
 ////////////////////////////////////////////////////////////////////////////////
 //// nsDownloadManagerUI class
 
 function nsDownloadManagerUI() {}
 
 nsDownloadManagerUI.prototype = {
-  classDescription: "Used to show the Download Manager's UI to the user",
   classID: Components.ID("7dfdf0d1-aff6-4a34-bad1-d0fe74601642"),
-  contractID: "@mozilla.org/download-manager-ui;1",
 
   //////////////////////////////////////////////////////////////////////////////
   //// nsIDownloadManagerUI
 
   show: function show(aWindowContext, aID, aReason)
   {
     if (!aReason)
       aReason = Ci.nsIDownloadManagerUI.REASON_USER_INTERACTED;
@@ -146,14 +144,10 @@ nsDownloadManagerUI.prototype = {
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIDownloadManagerUI])
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 //// Module
 
 let components = [nsDownloadManagerUI];
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
 
-function NSGetModule(compMgr, fileSpec)
-{
-  return XPCOMUtils.generateModule(components);
-}
-
new file mode 100644
--- /dev/null
+++ b/toolkit/components/downloads/src/nsDownloadManagerUI.manifest
@@ -0,0 +1,2 @@
+component {7dfdf0d1-aff6-4a34-bad1-d0fe74601642} nsDownloadManagerUI.js
+contract @mozilla.org/download-manager-ui;1 {7dfdf0d1-aff6-4a34-bad1-d0fe74601642}
--- a/toolkit/components/feeds/src/FeedProcessor.js
+++ b/toolkit/components/feeds/src/FeedProcessor.js
@@ -246,19 +246,17 @@ FeedResult.prototype = {
   uri: null,
   stylesheet: null,
 
   registerExtensionPrefix: function FR_registerExtensionPrefix(ns, prefix) {
     throw Cr.NS_ERROR_NOT_IMPLEMENTED;
   },
 
   // XPCOM stuff
-  classDescription: FR_CLASSNAME,
   classID: FR_CLASSID,
-  contractID: FR_CONTRACTID,
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIFeedResult])
 }  
 
 function Feed() {
   this.subtitle = null;
   this.title = null;
   this.items = Cc[ARRAY_CONTRACTID].createInstance(Ci.nsIMutableArray);
   this.link = null;
@@ -422,19 +420,17 @@ Feed.prototype = {
           this.fields.setPropertyAsAString(fieldLists[i][j],
                                            textConstruct.text);
         }
       }
     }
   },
   
   // XPCOM stuff
-  classDescription: FEED_CLASSNAME,
   classID: FEED_CLASSID,
-  contractID: FEED_CONTRACTID,
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIFeed, Ci.nsIFeedContainer])
 }
 
 function Entry() {
   this.summary = null;
   this.content = null;
   this.title = null;
   this.fields = Cc["@mozilla.org/hash-property-bag;1"].
@@ -635,19 +631,17 @@ Entry.prototype = {
         enc.setPropertyAsAString("length", contentElement.getPropertyAsAString("fileSize"));
       }
 
       this._addToEnclosures(enc);
     }
   },
 
   // XPCOM stuff
-  classDescription: ENTRY_CLASSNAME,
   classID: ENTRY_CLASSID,
-  contractID: ENTRY_CONTRACTID,
   QueryInterface: XPCOMUtils.generateQI(
     [Ci.nsIFeedEntry, Ci.nsIFeedContainer]
   )
 }
 
 Entry.prototype._atomLinksToURI = Feed.prototype._atomLinksToURI;
 Entry.prototype._resolveURI = Feed.prototype._resolveURI;
 Entry.prototype._resetBagMembersToRawText = 
@@ -687,19 +681,17 @@ TextConstruct.prototype = {
     else
       return null;
 
     return this.unescapeHTML.parseFragment(this.text, isXML,
                                            this.base, element);
   },
  
   // XPCOM stuff
-  classDescription: TEXTCONSTRUCT_CLASSNAME,
   classID: TEXTCONSTRUCT_CLASSID,
-  contractID: TEXTCONSTRUCT_CONTRACTID,
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIFeedTextConstruct])
 }
 
 // Generator represents the software that produced the feed
 function Generator() {
   this.lang = null;
   this.agent = null;
   this.version = null;
@@ -727,19 +719,17 @@ Generator.prototype = {
     uriAttribute = this._attributes.getValueFromName(RDF_NS,"resource");
     if (uriAttribute) {
       this.agent = uriAttribute;
       this.uri = strToURI(uriAttribute, this.baseURI);
     }
   },
 
   // XPCOM stuff
-  classDescription: GENERATOR_CLASSNAME,
   classID: GENERATOR_CLASSID,
-  contractID: GENERATOR_CONTRACTID,
   QueryInterface: XPCOMUtils.generateQI(
     [Ci.nsIFeedGenerator, Ci.nsIFeedElementBase]
   )
 }
 
 function Person() {
   this.name = null;
   this.uri = null;
@@ -747,19 +737,17 @@ function Person() {
 
   // nsIFeedElementBase
   this.attributes = null;
   this.baseURI = null;
 }
 
 Person.prototype = {
   // XPCOM stuff
-  classDescription: PERSON_CLASSNAME,
   classID: PERSON_CLASSID,
-  contractID: PERSON_CONTRACTID,
   QueryInterface: XPCOMUtils.generateQI(
     [Ci.nsIFeedPerson, Ci.nsIFeedElementBase]
   )
 }
 
 /** 
  * Map a list of fields into properties on a container.
  *
@@ -1918,23 +1906,19 @@ FeedProcessor.prototype = {
     // XHTML will cause us to peek too far. The XHTML handler will
     // send us an end element to call. RFC4287-valid feeds allow a
     // more graceful way to handle this. Unfortunately, we can't count
     // on compliance at this point.
     this.endElement(uri, localName, qName);
   },
 
   // XPCOM stuff
-  classDescription: FP_CLASSNAME,
   classID: FP_CLASSID,
-  contractID: FP_CONTRACTID,
   QueryInterface: XPCOMUtils.generateQI(
     [Ci.nsIFeedProcessor, Ci.nsISAXContentHandler, Ci.nsISAXErrorHandler,
      Ci.nsIStreamListener, Ci.nsIRequestObserver]
   )
 }
 
 var components = [FeedProcessor, FeedResult, Feed, Entry,
                   TextConstruct, Generator, Person];
-function NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule(components);
-  
-}
+
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/feeds/src/FeedProcessor.manifest
@@ -0,0 +1,14 @@
+component {072a5c3d-30c6-4f07-b87f-9f63d51403f2} FeedProcessor.js
+contract @mozilla.org/feed-result;1 {072a5c3d-30c6-4f07-b87f-9f63d51403f2}
+component {5d0cfa97-69dd-4e5e-ac84-f253162e8f9a} FeedProcessor.js
+contract @mozilla.org/feed;1 {5d0cfa97-69dd-4e5e-ac84-f253162e8f9a}
+component {8e4444ff-8e99-4bdd-aa7f-fb3c1c77319f} FeedProcessor.js
+contract @mozilla.org/feed-entry;1 {8e4444ff-8e99-4bdd-aa7f-fb3c1c77319f}
+component {b992ddcd-3899-4320-9909-924b3e72c922} FeedProcessor.js
+contract @mozilla.org/feed-textconstruct;1 {b992ddcd-3899-4320-9909-924b3e72c922}
+component {414af362-9ad8-4296-898e-62247f25a20e} FeedProcessor.js
+contract @mozilla.org/feed-generator;1 {414af362-9ad8-4296-898e-62247f25a20e}
+component {95c963b7-20b2-11db-92f6-001422106990} FeedProcessor.js
+contract @mozilla.org/feed-person;1 {95c963b7-20b2-11db-92f6-001422106990}
+component {26acb1f0-28fc-43bc-867a-a46aabc85dd4} FeedProcessor.js
+contract @mozilla.org/feed-processor;1 {26acb1f0-28fc-43bc-867a-a46aabc85dd4}
--- a/toolkit/components/feeds/src/Makefile.in
+++ b/toolkit/components/feeds/src/Makefile.in
@@ -47,11 +47,11 @@ LIBRARY_NAME	= feed_s
 MOZILLA_INTERNAL_API = 1
 FORCE_STATIC_LIB = 1
 LIBXUL_LIBRARY = 1
 
 
 CPPSRCS		= nsScriptableUnescapeHTML.cpp \
 		$(NULL)
 
-EXTRA_COMPONENTS = FeedProcessor.js
+EXTRA_COMPONENTS = FeedProcessor.js FeedProcessor.manifest
 
 include $(topsrcdir)/config/rules.mk
--- a/toolkit/components/filepicker/src/Makefile.in
+++ b/toolkit/components/filepicker/src/Makefile.in
@@ -53,18 +53,13 @@ MODULE_NAME	= nsFileViewModule
 LIBXUL_LIBRARY	= 1
 
 
 CPPSRCS		= \
 		nsFileView.cpp \
 		$(NULL)
 
 EXTRA_COMPONENTS = nsFilePicker.js
-
-GARBAGE += nsFilePicker.js
+EXTRA_PP_COMPONENTS = nsFilePicker.manifest
 
 include $(topsrcdir)/config/rules.mk
 
 EXTRA_DSO_LDOPTS += $(MOZ_COMPONENT_LIBS)
-
-nsFilePicker.js: nsFilePicker.js.in
-	$(PYTHON) $(MOZILLA_DIR)/config/Preprocessor.py $(DEFINES) $(ACDEFINES) $^ > $@
-
rename from toolkit/components/filepicker/src/nsFilePicker.js.in
rename to toolkit/components/filepicker/src/nsFilePicker.js
--- a/toolkit/components/filepicker/src/nsFilePicker.js.in
+++ b/toolkit/components/filepicker/src/nsFilePicker.js
@@ -45,21 +45,20 @@
  *
  * In JS, you can actually cheat, because a thrown exception will cause the
  * CreateInstance call to fail in turn, but not all languages are so lucky.
  * (Though ANSI C++ provides exceptions, they are verboten in Mozilla code
  * for portability reasons -- and even when you're building completely
  * platform-specific code, you can't throw across an XPCOM method boundary.)
  */
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 
 const DEBUG = false; /* set to true to enable debug messages */
 
-const FILEPICKER_CONTRACTID     = "@mozilla.org/filepicker;1";
-const FILEPICKER_CID        = Components.ID("{54ae32f8-1dd2-11b2-a209-df7c505370f8}");
 const LOCAL_FILE_CONTRACTID = "@mozilla.org/file/local;1";
 const APPSHELL_SERV_CONTRACTID  = "@mozilla.org/appshell/appShellService;1";
 const STRBUNDLE_SERV_CONTRACTID = "@mozilla.org/intl/stringbundle;1";
 
 const nsIAppShellService    = Components.interfaces.nsIAppShellService;
 const nsILocalFile          = Components.interfaces.nsILocalFile;
 const nsIFileURL            = Components.interfaces.nsIFileURL;
 const nsISupports           = Components.interfaces.nsISupports;
@@ -94,16 +93,26 @@ function nsFilePicker()
       var dir = Components.classes[LOCAL_FILE_CONTRACTID].createInstance(nsILocalFile);
       dir.initWithPath(lastDirectory);
       this.mDisplayDirectory = dir;
     } catch (e) {}
   }
 }
 
 nsFilePicker.prototype = {
+  classID: Components.ID("{54ae32f8-1dd2-11b2-a209-df7c505370f8}");
+
+  QueryInterface: function(iid) {
+    if (iid.equals(nsIFilePicker) ||
+        iid.equals(nsISupports))
+      return this;
+
+    throw Components.results.NS_ERROR_NO_INTERFACE;
+  },
+
 
   /* attribute nsILocalFile displayDirectory; */
   set displayDirectory(a) {
     this.mDisplayDirectory = a &&
       a.clone().QueryInterface(nsILocalFile);
   },
   get displayDirectory()  {
     return this.mDisplayDirectory &&
@@ -190,24 +199,16 @@ nsFilePicker.prototype = {
     }
   },
 
   appendFilter: function(title, extensions) {
     this.mFilterTitles.push(title);
     this.mFilters.push(extensions);
   },
 
-  QueryInterface: function(iid) {
-    if (iid.equals(nsIFilePicker) ||
-        iid.equals(nsISupports))
-      return this;
-
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
-
   show: function() {
     var o = new Object();
     o.title = this.mTitle;
     o.mode = this.mMode;
     o.displayDirectory = this.mDisplayDirectory;
     o.defaultString = this.mDefaultString;
     o.filterIndex = this.mFilterIndex;
     o.filters = new Object();
@@ -259,79 +260,21 @@ nsFilePicker.prototype = {
       return o.retvals.buttonStatus;
     } catch(ex) { dump("unable to open file picker\n" + ex + "\n"); }
 
     return null;
   }
 }
 
 if (DEBUG)
-    debug = function (s) { dump("-*- filepicker: " + s + "\n"); }
+  debug = function (s) { dump("-*- filepicker: " + s + "\n"); };
 else
-    debug = function (s) {}
-
-/* module foo */
-
-var filePickerModule = new Object();
-
-filePickerModule.registerSelf =
-function (compMgr, fileSpec, location, type)
-{
-    debug("registering (all right -- a JavaScript module!)");
-    compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
-
-    compMgr.registerFactoryLocation(FILEPICKER_CID,
-                                    "FilePicker JS Component",
-#ifndef MOZ_WIDGET_GTK2
-                                    FILEPICKER_CONTRACTID,
-#else
-                                    "",
-#endif
-                                    fileSpec,
-                                    location,
-                                    type);
-}
-
-filePickerModule.getClassObject =
-function (compMgr, cid, iid) {
-    if (!cid.equals(FILEPICKER_CID))
-        throw Components.results.NS_ERROR_NO_INTERFACE;
+  debug = function (s) {};
 
-    if (!iid.equals(Components.interfaces.nsIFactory))
-        throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-
-    return filePickerFactory;
-}
-
-filePickerModule.canUnload =
-function(compMgr)
-{
-    debug("Unloading component.");
-    return true;
-}
-
-/* factory object */
-var filePickerFactory = new Object();
-
-filePickerFactory.createInstance =
-function (outer, iid) {
-    debug("CI: " + iid);
-    debug("IID:" + nsIFilePicker);
-    if (outer != null)
-        throw Components.results.NS_ERROR_NO_AGGREGATION;
-
-    return (new nsFilePicker()).QueryInterface(iid);
-}
-
-/* entrypoint */
-function NSGetModule(compMgr, fileSpec) {
-    return filePickerModule;
-}
-
-
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([nsFilePicker]);
 
 /* crap from strres.js that I want to use for string bundles since I can't include another .js file.... */
 
 var strBundleService = null;
 
 function srGetStrBundle(path)
 {
   var strBundle = null;
new file mode 100644
--- /dev/null
+++ b/toolkit/components/filepicker/src/nsFilePicker.manifest
@@ -0,0 +1,4 @@
+component {54ae32f8-1dd2-11b2-a209-df7c505370f8} nsFilePicker.js
+#ifndef MOZ_WIDGET_GTK2
+contract @mozilla.org/filepicker;1 {54ae32f8-1dd2-11b2-a209-df7c505370f8}
+#endif
--- a/toolkit/components/nsDefaultCLH.js
+++ b/toolkit/components/nsDefaultCLH.js
@@ -31,24 +31,22 @@
 # use your version of this file under the terms of the MPL, indicate your
 # decision by deleting the provisions above and replace them with the notice
 # and other provisions required by the GPL or the LGPL. If you do not delete
 # the provisions above, a recipient may use your version of this file under
 # the terms of any one of the MPL, the GPL or the LGPL.
 #
 # ***** END LICENSE BLOCK *****
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
 const nsISupports              = Components.interfaces.nsISupports;
 
-const nsICategoryManager       = Components.interfaces.nsICategoryManager;
-const nsIComponentRegistrar    = Components.interfaces.nsIComponentRegistrar;
 const nsICommandLine           = Components.interfaces.nsICommandLine;
 const nsICommandLineHandler    = Components.interfaces.nsICommandLineHandler;
-const nsIFactory               = Components.interfaces.nsIFactory;
-const nsIModule                = Components.interfaces.nsIModule;
 const nsIPrefBranch            = Components.interfaces.nsIPrefBranch;
 const nsISupportsString        = Components.interfaces.nsISupportsString;
 const nsIWindowWatcher         = Components.interfaces.nsIWindowWatcher;
 const nsIProperties            = Components.interfaces.nsIProperties;
 const nsIFile                  = Components.interfaces.nsIFile;
 const nsISimpleEnumerator      = Components.interfaces.nsISimpleEnumerator;
 
 /**
@@ -63,27 +61,23 @@ const nsISimpleEnumerator      = Compone
  */
 
 function getDirectoryService()
 {
   return Components.classes["@mozilla.org/file/directory_service;1"]
                    .getService(nsIProperties);
 }
 
-var nsDefaultCLH = {
+function nsDefaultCLH() { }
+nsDefaultCLH.prototype = {
+  classID: Components.ID("{6ebc941a-f2ff-4d56-b3b6-f7d0b9d73344}"),
+
   /* nsISupports */
 
-  QueryInterface : function clh_QI(iid) {
-    if (iid.equals(nsICommandLineHandler) ||
-        iid.equals(nsIFactory) ||
-        iid.equals(nsISupports))
-      return this;
-
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
+  QueryInterface : XPCOMUtils.generateQI([nsICommandLineHandler]),
 
   /* nsICommandLineHandler */
 
   handle : function clh_handle(cmdLine) {
     var printDir;
     while (printDir = cmdLine.handleFlagWithParam("print-xpcom-dir", false)) {
       var out = "print-xpcom-dir(\"" + printDir + "\"): ";
       try {
@@ -155,83 +149,11 @@ var nsDefaultCLH = {
                             .getService(nsIWindowWatcher);
       wwatch.openWindow(null, chromeURI, "_blank",
                         flags, cmdLine);
     }
     catch (e) { }
   },
 
   helpInfo : "",
-
-  /* nsIFactory */
-
-  createInstance : function mdh_CI(outer, iid) {
-    if (outer != null)
-      throw Components.results.NS_ERROR_NO_AGGREGATION;
-
-    return this.QueryInterface(iid);
-  },
-
-  lockFactory : function mdh_lock(lock) {
-    /* no-op */
-  }
 };
 
-const clh_contractID = "@mozilla.org/toolkit/default-clh;1";
-const clh_CID = Components.ID("{6ebc941a-f2ff-4d56-b3b6-f7d0b9d73344}");
-
-var Module = {
-  /* nsISupports */
-
-  QueryInterface : function mod_QI(iid) {
-    if (iid.equals(nsIModule) ||
-        iid.equals(nsISupports))
-      return this;
-
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  },
-
-  /* nsIModule */
-
-  getClassObject : function mod_gch(compMgr, cid, iid) {
-    if (cid.equals(clh_CID))
-      return nsDefaultCLH.QueryInterface(iid);
-
-    throw components.results.NS_ERROR_FAILURE;
-  },
-
-  registerSelf : function mod_regself(compMgr, fileSpec, location, type) {
-    var compReg = compMgr.QueryInterface(nsIComponentRegistrar);
-
-    compReg.registerFactoryLocation(clh_CID,
-                                    "nsDefaultCLH",
-                                    clh_contractID,
-                                    fileSpec,
-                                    location,
-                                    type);
-
-    var catMan = Components.classes["@mozilla.org/categorymanager;1"]
-                           .getService(nsICategoryManager);
-
-    catMan.addCategoryEntry("command-line-handler",
-                            "y-default",
-                            clh_contractID, true, true);
-  },
-
-  unregisterSelf : function mod_unreg(compMgr, location, type) {
-    var compReg = compMgr.QueryInterface(nsIComponentRegistrar);
-    compReg.unregisterFactoryLocation(clh_CID, location);
-
-    var catMan = Components.classes["@mozilla.org/categorymanager;1"]
-                           .getService(nsICategoryManager);
-
-    catMan.deleteCategoryEntry("command-line-handler",
-                               "y-default");
-  },
-
-  canUnload : function (compMgr) {
-    return true;
-  }
-};
-
-function NSGetModule(compMgr, fileSpec) {
-  return Module;
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([nsDefaultCLH]);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/nsDefaultCLH.manifest
@@ -0,0 +1,3 @@
+component {6ebc941a-f2ff-4d56-b3b6-f7d0b9d73344} nsDefaultCLH.js
+contract @mozilla.org/toolkit/default-clh;1 {6ebc941a-f2ff-4d56-b3b6-f7d0b9d73344}
+category command-line-handler y-default @mozilla.org/toolkit/default-clh;1
--- a/toolkit/components/passwordmgr/src/Makefile.in
+++ b/toolkit/components/passwordmgr/src/Makefile.in
@@ -39,18 +39,18 @@ topsrcdir = @top_srcdir@
 srcdir    = @srcdir@
 VPATH   = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE = loginmgr
 
 EXTRA_COMPONENTS = \
+			passwordmgr.manifest \
 			nsLoginManager.js \
 			nsLoginManagerPrompter.js \
 			nsLoginInfo.js \
 			storage-Legacy.js \
 			storage-mozStorage.js \
 			crypto-SDR.js \
 			$(NULL)
 
-
 include $(topsrcdir)/config/rules.mk
--- a/toolkit/components/passwordmgr/src/crypto-SDR.js
+++ b/toolkit/components/passwordmgr/src/crypto-SDR.js
@@ -43,18 +43,16 @@ Components.utils.import("resource://gre/
 Components.utils.import("resource://gre/modules/Services.jsm");
 
 function LoginManagerCrypto_SDR() {
     this.init();
 };
 
 LoginManagerCrypto_SDR.prototype = {
 
-    classDescription  : "LoginManagerCrypto_SDR",
-    contractID : "@mozilla.org/login-manager/crypto/SDR;1",
     classID : Components.ID("{dc6c2976-0f73-4f1f-b9ff-3d72b4e28309}"),
     QueryInterface : XPCOMUtils.generateQI([Ci.nsILoginManagerCrypto]),
 
     __decoderRing : null,  // nsSecretDecoderRing service
     get _decoderRing() {
         if (!this.__decoderRing)
             this.__decoderRing = Cc["@mozilla.org/security/sdr;1"].
                                  getService(Ci.nsISecretDecoderRing);
@@ -178,11 +176,9 @@ LoginManagerCrypto_SDR.prototype = {
                 throw Components.Exception("Couldn't decrypt string", Cr.NS_ERROR_FAILURE);
         }
 
         return plainText;
     }
 }; // end of nsLoginManagerCrypto_SDR implementation
 
 let component = [LoginManagerCrypto_SDR];
-function NSGetModule(compMgr, fileSpec) {
-    return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(component);
--- a/toolkit/components/passwordmgr/src/nsLoginInfo.js
+++ b/toolkit/components/passwordmgr/src/nsLoginInfo.js
@@ -39,18 +39,16 @@ const Cc = Components.classes;
 const Ci = Components.interfaces;
 
 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 
 function nsLoginInfo() {}
 
 nsLoginInfo.prototype = {
 
-    classDescription  : "LoginInfo",
-    contractID : "@mozilla.org/login-manager/loginInfo;1",
     classID : Components.ID("{0f2f347c-1e4f-40cc-8efd-792dea70a85e}"),
     QueryInterface: XPCOMUtils.generateQI([Ci.nsILoginInfo, Ci.nsILoginMetaInfo]), 
 
     // Allow storage-Legacy.js to get at the JS object so it can
     // slap on a few extra properties for internal use.
     get wrappedJSObject() {
         return this;
     },
@@ -136,12 +134,9 @@ nsLoginInfo.prototype = {
     guid : null,
     timeCreated : null,
     timeLastUsed : null,
     timePasswordChanged : null,
     timesUsed : null
 
 }; // end of nsLoginInfo implementation
 
-var component = [nsLoginInfo];
-function NSGetModule(compMgr, fileSpec) {
-    return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([nsLoginInfo]);
--- a/toolkit/components/passwordmgr/src/nsLoginManager.js
+++ b/toolkit/components/passwordmgr/src/nsLoginManager.js
@@ -43,18 +43,16 @@ Components.utils.import("resource://gre/
 Components.utils.import("resource://gre/modules/Services.jsm");
 
 function LoginManager() {
     this.init();
 }
 
 LoginManager.prototype = {
 
-    classDescription: "LoginManager",
-    contractID: "@mozilla.org/login-manager;1",
     classID: Components.ID("{cb9e0de8-3598-4ed7-857b-827f011ad5d8}"),
     QueryInterface : XPCOMUtils.generateQI([Ci.nsILoginManager,
                                             Ci.nsISupportsWeakReference]),
 
 
     /* ---------- private memebers ---------- */
 
 
@@ -1351,12 +1349,9 @@ UserAutoCompleteResult.prototype = {
         if (removeFromDB) {
             var pwmgr = Cc["@mozilla.org/login-manager;1"].
                         getService(Ci.nsILoginManager);
             pwmgr.removeLogin(removedLogin);
         }
     }
 };
 
-var component = [LoginManager];
-function NSGetModule (compMgr, fileSpec) {
-    return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([LoginManager]);
--- a/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js
+++ b/toolkit/components/passwordmgr/src/nsLoginManagerPrompter.js
@@ -51,18 +51,16 @@ Components.utils.import("resource://gre/
  * Invoked by [toolkit/components/prompts/src/nsPrompter.js]
  */
 function LoginManagerPromptFactory() {
     Services.obs.addObserver(this, "quit-application-granted", true);
 }
 
 LoginManagerPromptFactory.prototype = {
 
-    classDescription : "LoginManagerPromptFactory",
-    contractID : "@mozilla.org/passwordmanager/authpromptfactory;1",
     classID : Components.ID("{749e62f4-60ae-4569-a8a2-de78b649660e}"),
     QueryInterface : XPCOMUtils.generateQI([Ci.nsIPromptFactory, Ci.nsIObserver, Ci.nsISupportsWeakReference]),
 
     _debug : false,
     _asyncPrompts : {},
     _asyncPromptInProgress : false,
 
     observe : function (subject, topic, data) {
@@ -178,18 +176,16 @@ LoginManagerPromptFactory.prototype = {
  *
  * nsILoginManagerPrompter: Used by Login Manager for saving/changing logins
  * found in HTML forms.
  */
 function LoginManagerPrompter() {}
 
 LoginManagerPrompter.prototype = {
 
-    classDescription : "LoginManagerPrompter",
-    contractID : "@mozilla.org/login-manager/prompter;1",
     classID : Components.ID("{8aa66d77-1bbb-45a6-991e-b8f47751c291}"),
     QueryInterface : XPCOMUtils.generateQI([Ci.nsIAuthPrompt,
                                             Ci.nsIAuthPrompt2,
                                             Ci.nsILoginManagerPrompter]),
 
     _factory       : null,
     _window        : null,
     _debug         : false, // mirrors signon.debug
@@ -1377,11 +1373,9 @@ LoginManagerPrompter.prototype = {
             }
         }
     }
 
 }; // end of LoginManagerPrompter implementation
 
 
 var component = [LoginManagerPromptFactory, LoginManagerPrompter];
-function NSGetModule(compMgr, fileSpec) {
-    return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(component);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/passwordmgr/src/passwordmgr.manifest
@@ -0,0 +1,14 @@
+component {cb9e0de8-3598-4ed7-857b-827f011ad5d8} nsLoginManager.js
+contract @mozilla.org/login-manager;1 {cb9e0de8-3598-4ed7-857b-827f011ad5d8}
+component {749e62f4-60ae-4569-a8a2-de78b649660e} nsLoginManagerPrompter.js
+contract @mozilla.org/passwordmanager/authpromptfactory;1 {749e62f4-60ae-4569-a8a2-de78b649660e}
+component {8aa66d77-1bbb-45a6-991e-b8f47751c291} nsLoginManagerPrompter.js
+contract @mozilla.org/login-manager/prompter;1 {8aa66d77-1bbb-45a6-991e-b8f47751c291}
+component {0f2f347c-1e4f-40cc-8efd-792dea70a85e} nsLoginInfo.js
+contract @mozilla.org/login-manager/loginInfo;1 {0f2f347c-1e4f-40cc-8efd-792dea70a85e}
+component {e09e4ca6-276b-4bb4-8b71-0635a3a2a007} storage-Legacy.js
+contract @mozilla.org/login-manager/storage/legacy;1 {e09e4ca6-276b-4bb4-8b71-0635a3a2a007}
+component {8c2023b9-175c-477e-9761-44ae7b549756} storage-mozStorage.js
+contract @mozilla.org/login-manager/storage/mozStorage;1 {8c2023b9-175c-477e-9761-44ae7b549756}
+component {dc6c2976-0f73-4f1f-b9ff-3d72b4e28309} crypto-SDR.js
+contract @mozilla.org/login-manager/crypto/SDR;1 {dc6c2976-0f73-4f1f-b9ff-3d72b4e28309}
--- a/toolkit/components/passwordmgr/src/storage-Legacy.js
+++ b/toolkit/components/passwordmgr/src/storage-Legacy.js
@@ -39,18 +39,16 @@ const Cc = Components.classes;
 const Ci = Components.interfaces;
 
 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 
 function LoginManagerStorage_legacy() { };
 
 LoginManagerStorage_legacy.prototype = {
 
-    classDescription  : "LoginManagerStorage_legacy",
-    contractID : "@mozilla.org/login-manager/storage/legacy;1",
     classID : Components.ID("{e09e4ca6-276b-4bb4-8b71-0635a3a2a007}"),
     QueryInterface : XPCOMUtils.generateQI([Ci.nsILoginManagerStorage,
                                     Ci.nsILoginManagerIEMigrationHelper]),
 
     __logService : null, // Console logging service, used for debugging.
     get _logService() {
         if (!this.__logService)
             this.__logService = Cc["@mozilla.org/consoleservice;1"].
@@ -1486,12 +1484,9 @@ LoginManagerStorage_legacy.prototype = {
 
         // Add logins via the login manager (and not this.addLogin),
         // lest an alternative storage module be in use.
         for each (var login in logins)
             this._migrationLoginManager.addLogin(login);
     }
 }; // end of nsLoginManagerStorage_legacy implementation
 
-var component = [LoginManagerStorage_legacy];
-function NSGetModule(compMgr, fileSpec) {
-    return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([LoginManagerStorage_legacy]);
--- a/toolkit/components/passwordmgr/src/storage-mozStorage.js
+++ b/toolkit/components/passwordmgr/src/storage-mozStorage.js
@@ -49,18 +49,16 @@ const ENCTYPE_SDR = 1;
 
 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 Components.utils.import("resource://gre/modules/Services.jsm");
 
 function LoginManagerStorage_mozStorage() { };
 
 LoginManagerStorage_mozStorage.prototype = {
 
-    classDescription  : "LoginManagerStorage_mozStorage",
-    contractID : "@mozilla.org/login-manager/storage/mozStorage;1",
     classID : Components.ID("{8c2023b9-175c-477e-9761-44ae7b549756}"),
     QueryInterface : XPCOMUtils.generateQI([Ci.nsILoginManagerStorage]),
 
     __crypto : null,  // nsILoginManagerCrypto service
     get _crypto() {
         if (!this.__crypto)
             this.__crypto = Cc["@mozilla.org/login-manager/crypto/SDR;1"].
                             getService(Ci.nsILoginManagerCrypto);
@@ -1557,11 +1555,9 @@ LoginManagerStorage_mozStorage.prototype
         // Close the connection, ignore 'already closed' error
         try { this._dbConnection.close() } catch(e) {}
         this._signonsFile.remove(false);
     }
 
 }; // end of nsLoginManagerStorage_mozStorage implementation
 
 let component = [LoginManagerStorage_mozStorage];
-function NSGetModule(compMgr, fileSpec) {
-    return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(component);
--- a/toolkit/components/places/src/Makefile.in
+++ b/toolkit/components/places/src/Makefile.in
@@ -73,16 +73,17 @@ EXTRA_DSO_LDOPTS += \
 	$(DEPTH)/db/morkreader/$(LIB_PREFIX)morkreader_s.$(LIB_SUFFIX) \
 	$(MOZ_UNICHARUTIL_LIBS) \
 	$(MOZ_COMPONENT_LIBS) \
 	$(NULL)
 
 LOCAL_INCLUDES += -I$(srcdir)/../../build
 
 EXTRA_COMPONENTS = \
+  toolkitplaces.manifest \
   nsLivemarkService.js \
   nsTaggingService.js \
   nsPlacesDBFlush.js \
   nsPlacesExpiration.js \
   nsMicrosummaryService.js \
   $(NULL)
 
 ifdef MOZ_XUL
--- a/toolkit/components/places/src/nsLivemarkService.js
+++ b/toolkit/components/places/src/nsLivemarkService.js
@@ -503,18 +503,16 @@ LivemarkService.prototype = {
     // remove the livemark from the update array
     this._livemarks.splice(livemarkIndex, 1);
 
     if (livemark.loadGroup)
       livemark.loadGroup.cancel(Components.results.NS_BINDING_ABORTED);
   },
 
   // nsISupports
-  classDescription: "Livemark Service",
-  contractID: LS_CONTRACTID,
   classID: Components.ID("{dca61eb5-c7cd-4df1-b0fb-d0722baba251}"),
 
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsILivemarkService
   , Ci.nsINavBookmarkObserver
   , Ci.nsIObserver
   ])
 };
@@ -713,11 +711,9 @@ LivemarkLoadListener.prototype = {
   , Ci.nsINavHistoryBatchCallback
   , Ci.nsIBadCertListener2
   , Ci.nsISSLErrorListener
   , Ci.nsIInterfaceRequestor
   ])
 }
 
 let component = [LivemarkService];
-function NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(component);
--- a/toolkit/components/places/src/nsMicrosummaryService.js
+++ b/toolkit/components/places/src/nsMicrosummaryService.js
@@ -53,18 +53,16 @@ const MODE_WRONLY   = 0x02;
 const MODE_CREATE   = 0x08;
 const MODE_TRUNCATE = 0x20;
 
 const NS_ERROR_MODULE_DOM = 2152923136;
 const NS_ERROR_DOM_BAD_URI = NS_ERROR_MODULE_DOM + 1012;
 
 // How often to check for microsummaries that need updating, in milliseconds.
 const CHECK_INTERVAL = 15 * 1000; // 15 seconds
-// How often to check for generator updates, in seconds
-const GENERATOR_INTERVAL = 7 * 86400; // 1 week
 
 // The default value of the update interval, used if there is no user's pref.
 const DEFAULT_UPDATE_INTERVAL_MINUTES = 30;
 
 const MICSUM_NS = "http://www.mozilla.org/microsummaries/0.1";
 const XSLT_NS = "http://www.w3.org/1999/XSL/Transform";
 
 const ANNO_MICSUM_GEN_URI    = "microsummary/generatorURI";
@@ -122,24 +120,17 @@ MicrosummaryService.prototype = {
   // A cache of local microsummary generators.  This gets built on startup
   // by the _cacheLocalGenerators() method.
   _localGenerators: {},
 
   // The timer that periodically checks for microsummaries needing updating.
   _timer: null,
 
   // XPCOM registration
-  classDescription: "Microsummary Service",
-  contractID: "@mozilla.org/microsummary/service;1",
   classID: Components.ID("{460a9792-b154-4f26-a922-0f653e2c8f91}"),
-  _xpcom_categories: [{ category: "update-timer",
-                        value: "@mozilla.org/microsummary/service;1," +
-                               "getService,microsummary-generator-update-timer," +
-                               "browser.microsummary.generatorUpdateInterval," +
-                               GENERATOR_INTERVAL }],
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIMicrosummaryService, 
                                          Ci.nsITimerCallback,
                                          Ci.nsISupportsWeakReference,
                                          Ci.nsIAnnotationObserver,
                                          Ci.nsIObserver]),
 
   // nsIObserver
   observe: function MSS_observe(subject, topic, data) {
@@ -2151,11 +2142,9 @@ function sanitizeName(aName) {
   // If our input had not enough valid characters, use a random name.
   if (name.length < MIN_GENERATOR_NAME_LENGTH)
     name = Math.random().toString(36).replace(/^.*\./, '');
 
   // Force max length.
   return name.substring(0, MAX_GENERATOR_NAME_LENGTH);
 }
 
-function NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule([MicrosummaryService]);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([MicrosummaryService]);
--- a/toolkit/components/places/src/nsPlacesDBFlush.js
+++ b/toolkit/components/places/src/nsPlacesDBFlush.js
@@ -376,36 +376,24 @@ nsPlacesDBFlush.prototype = {
     timer.initWithCallback(this, this._syncInterval * 1000,
                            Ci.nsITimer.TYPE_REPEATING_SLACK);
     return timer;
   },
 
   //////////////////////////////////////////////////////////////////////////////
   //// nsISupports
 
-  classDescription: "Used to synchronize the temporary and permanent tables of Places",
   classID: Components.ID("c1751cfc-e8f1-4ade-b0bb-f74edfb8ef6a"),
-  contractID: "@mozilla.org/places/sync;1",
-
-  // Registering in these categories makes us get initialized when either of
-  // those listeners would be notified.
-  _xpcom_categories: [
-    { category: "bookmark-observers" },
-    { category: "history-observers" },
-  ],
 
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsIObserver,
     Ci.nsINavBookmarkObserver,
     Ci.nsINavHistoryObserver,
     Ci.nsITimerCallback,
     Ci.mozIStorageStatementCallback,
   ])
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 //// Module Registration
 
 let components = [nsPlacesDBFlush];
-function NSGetModule(compMgr, fileSpec)
-{
-  return XPCOMUtils.generateModule(components);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
--- a/toolkit/components/places/src/nsPlacesExpiration.js
+++ b/toolkit/components/places/src/nsPlacesExpiration.js
@@ -881,36 +881,25 @@ nsPlacesExpiration.prototype = {
     timer.initWithCallback(this, interval * 1000,
                            Ci.nsITimer.TYPE_REPEATING_SLACK);
     return this._timer = timer;
   },
 
   //////////////////////////////////////////////////////////////////////////////
   //// nsISupports
 
-  classDescription: "Used to expire obsolete data from Places",
   classID: Components.ID("705a423f-2f69-42f3-b9fe-1517e0dee56f"),
-  contractID: "@mozilla.org/places/expiration;1",
-
-  // Registering in these categories makes us get initialized when either of
-  // those listeners would be notified.
-  _xpcom_categories: [
-    { category: "history-observers" },
-  ],
 
   _xpcom_factory: nsPlacesExpirationFactory,
 
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsIObserver,
     Ci.nsINavHistoryObserver,
     Ci.nsITimerCallback,
     Ci.mozIStorageStatementCallback,
   ])
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 //// Module Registration
 
 let components = [nsPlacesExpiration];
-function NSGetModule(compMgr, fileSpec)
-{
-  return XPCOMUtils.generateModule(components);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
--- a/toolkit/components/places/src/nsTaggingService.js
+++ b/toolkit/components/places/src/nsTaggingService.js
@@ -429,18 +429,16 @@ TaggingService.prototype = {
   onItemMoved: function(aItemId, aOldParent, aOldIndex, aNewParent, aNewIndex,
                         aItemType) {
     if (this._tagFolders[aItemId] && this._bms.tagFolder == aOldParent &&
         this._bms.tagFolder != aNewParent)
       delete this._tagFolders[aItemId];
   },
 
   // nsISupports
-  classDescription: "Places Tagging Service",
-  contractID: "@mozilla.org/browser/tagging-service;1",
   classID: Components.ID("{bbc23860-2553-479d-8b78-94d9038334f7}"),
   
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsITaggingService
   , Ci.nsINavBookmarkObserver
   , Ci.nsIObserver
   ])
 };
@@ -651,17 +649,13 @@ TagAutoCompleteSearch.prototype = {
     this._stopped = true;
   },
 
   // nsISupports
   QueryInterface: XPCOMUtils.generateQI([
     Ci.nsIAutoCompleteSearch
   ]),
 
-  classDescription: "Places Tag AutoComplete",
-  contractID: "@mozilla.org/autocomplete/search;1?name=places-tag-autocomplete",
   classID: Components.ID("{1dcc23b0-d4cb-11dc-9ad6-479d56d89593}")
 };
 
 let component = [TaggingService, TagAutoCompleteSearch];
-function NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(component);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/places/src/toolkitplaces.manifest
@@ -0,0 +1,17 @@
+component {dca61eb5-c7cd-4df1-b0fb-d0722baba251} nsLivemarkService.js
+contract @mozilla.org/browser/livemark-service;2 {dca61eb5-c7cd-4df1-b0fb-d0722baba251}
+component {bbc23860-2553-479d-8b78-94d9038334f7} nsTaggingService.js
+contract @mozilla.org/browser/tagging-service;1 {bbc23860-2553-479d-8b78-94d9038334f7}
+component {1dcc23b0-d4cb-11dc-9ad6-479d56d89593 nsTaggingService.js
+contract @mozilla.org/autocomplete/search;1?name=places-tag-autocomplete {1dcc23b0-d4cb-11dc-9ad6-479d56d89593
+component {c1751cfc-e8f1-4ade-b0bb-f74edfb8ef6a} nsPlacesDBFlush.js
+contract @mozilla.org/places/sync;1 {c1751cfc-e8f1-4ade-b0bb-f74edfb8ef6a}
+category bookmark-observers nsPlacesDBFlush @mozilla.org/places/sync;1
+category history-observers nsPlacesDBFlush @mozilla.org/places/sync;1
+component {705a423f-2f69-42f3-b9fe-1517e0dee56f} nsPlacesExpiration.js
+contract @mozilla.org/places/expiration;1 {705a423f-2f69-42f3-b9fe-1517e0dee56f}
+category history-observers nsPlacesExpiration @mozilla.org/places/expiration;1
+component {460a9792-b154-4f26-a922-0f653e2c8f91} nsMicrosummaryService.js
+contract @mozilla.org/microsummary/service;1 {460a9792-b154-4f26-a922-0f653e2c8f91}
+# How often to check for generator updates, in seconds 7 * 86400 == 1 week
+category update-timer nsMicrosummaryService @mozilla.org/microsummary/service;1,getService,microsummary-generator-update-timer,browser.microsummary.generatorUpdateInterval,604800
--- a/toolkit/components/prompts/src/Makefile.in
+++ b/toolkit/components/prompts/src/Makefile.in
@@ -40,11 +40,12 @@ srcdir    = @srcdir@
 VPATH     = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE = prompter
 
 EXTRA_COMPONENTS = \
     nsPrompter.js \
+    nsPrompter.manifest \
     $(NULL)
 
 include $(topsrcdir)/config/rules.mk
--- a/toolkit/components/prompts/src/nsPrompter.js
+++ b/toolkit/components/prompts/src/nsPrompter.js
@@ -43,18 +43,16 @@ const Cu = Components.utils;
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 Cu.import("resource://gre/modules/Services.jsm");
 
 function Prompter() {
     // Note that EmbedPrompter clones this implementation.
 }
 
 Prompter.prototype = {
-    classDescription : "Prompter",
-    contractID       : "@mozilla.org/prompter;1",
     classID          : Components.ID("{1c978d25-b37f-43a8-a2d6-0c7a239ead87}"),
     QueryInterface   : XPCOMUtils.generateQI([Ci.nsIPromptFactory, Ci.nsIPromptService, Ci.nsIPromptService2]),
 
 
     /* ----------  private memebers  ---------- */
 
     pickPrompter : function (domWin) {
         return new ModalPrompter(domWin);
@@ -690,18 +688,16 @@ ModalPrompter.prototype = {
         throw Cr.NS_ERROR_NOT_IMPLEMENTED;
     },
 };
 
 
 function AuthPromptAdapterFactory() {
 }
 AuthPromptAdapterFactory.prototype = {
-    classDescription : "AuthPromptAdapterFactory",
-    contractID       : "@mozilla.org/network/authprompt-adapter-factory;1",
     classID          : Components.ID("{6e134924-6c3a-4d86-81ac-69432dd971dc}"),
     QueryInterface   : XPCOMUtils.generateQI([Ci.nsIAuthPromptAdapterFactory]),
 
     /* ----------  nsIAuthPromptAdapterFactory ---------- */
 
     createAdapter : function (oldPrompter) {
         return new AuthPromptAdapter(oldPrompter);
     }
@@ -745,17 +741,12 @@ AuthPromptAdapter.prototype = {
 };
 
 
 // Wrapper using the old embedding contractID, since it's already common in
 // the addon ecosystem.
 function EmbedPrompter() {
 }
 EmbedPrompter.prototype = new Prompter();
-EmbedPrompter.prototype.classDescription = "EmbedPrompter";
-EmbedPrompter.prototype.contractID       = "@mozilla.org/embedcomp/prompt-service;1"; // NS_PROMPTSERVICE_CONTRACTID
 EmbedPrompter.prototype.classID          = Components.ID("{7ad1b327-6dfa-46ec-9234-f2a620ea7e00}");
 
-
 var component = [Prompter, EmbedPrompter, AuthPromptAdapterFactory];
-function NSGetModule (compMgr, fileSpec) {
-    return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(component);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/prompts/src/nsPrompter.manifest
@@ -0,0 +1,6 @@
+component {1c978d25-b37f-43a8-a2d6-0c7a239ead87} nsPrompter.js
+contract @mozilla.org/prompter;1 {1c978d25-b37f-43a8-a2d6-0c7a239ead87}
+component {6e134924-6c3a-4d86-81ac-69432dd971dc} nsPrompter.js
+contract @mozilla.org/network/authprompt-adapter-factory;1 {6e134924-6c3a-4d86-81ac-69432dd971dc}
+component {7ad1b327-6dfa-46ec-9234-f2a620ea7e00} nsPrompter.js
+contract @mozilla.org/embedcomp/prompt-service;1 {7ad1b327-6dfa-46ec-9234-f2a620ea7e00}
--- a/toolkit/components/satchel/src/Makefile.in
+++ b/toolkit/components/satchel/src/Makefile.in
@@ -48,16 +48,17 @@ LIBRARY_NAME = satchel
 MODULE_NAME = satchel
 IS_COMPONENT = 1
 LIBXUL_LIBRARY = 1
 EXPORT_LIBRARY = 1
 
 EXTRA_COMPONENTS = \
 	nsFormHistory.js \
 	nsFormAutoComplete.js \
+	satchel.manifest \
 	$(NULL)
 
 
 CPPSRCS = nsFormFillController.cpp \
           $(NULL)
 
 LOCAL_INCLUDES = \
 	-I$(srcdir)/../../build \
--- a/toolkit/components/satchel/src/nsFormAutoComplete.js
+++ b/toolkit/components/satchel/src/nsFormAutoComplete.js
@@ -42,18 +42,16 @@ const Cr = Components.results;
 Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 Components.utils.import("resource://gre/modules/Services.jsm");
 
 function FormAutoComplete() {
     this.init();
 }
 
 FormAutoComplete.prototype = {
-    classDescription : "FormAutoComplete",
-    contractID       : "@mozilla.org/satchel/form-autocomplete;1",
     classID          : Components.ID("{c11c21b2-71c9-4f87-a0f8-5e13f50495fd}"),
     QueryInterface   : XPCOMUtils.generateQI([Ci.nsIFormAutoComplete, Ci.nsISupportsWeakReference]),
 
     __formHistory : null,
     get _formHistory() {
         if (!this.__formHistory)
             this.__formHistory = Cc["@mozilla.org/satchel/form-history;1"].
                                  getService(Ci.nsIFormHistory2);
@@ -444,11 +442,9 @@ FormAutoCompleteResult.prototype = {
         let [removedEntry] = this.entries.splice(index, 1);
 
         if (removeFromDB)
             this.formHistory.removeEntry(this.fieldName, removedEntry.text);
     }
 };
 
 let component = [FormAutoComplete];
-function NSGetModule (compMgr, fileSpec) {
-    return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(component);
--- a/toolkit/components/satchel/src/nsFormHistory.js
+++ b/toolkit/components/satchel/src/nsFormHistory.js
@@ -46,18 +46,16 @@ Components.utils.import("resource://gre/
 const DB_VERSION = 3;
 const DAY_IN_MS  = 86400000; // 1 day in milliseconds
 
 function FormHistory() {
     this.init();
 }
 
 FormHistory.prototype = {
-    classDescription : "FormHistory",
-    contractID       : "@mozilla.org/satchel/form-history;1",
     classID          : Components.ID("{0c1bb408-71a2-403f-854a-3a0659829ded}"),
     QueryInterface   : XPCOMUtils.generateQI([Ci.nsIFormHistory2, Ci.nsIObserver, Ci.nsIFormSubmitObserver, Ci.nsISupportsWeakReference]),
 
     debug          : true,
     enabled        : true,
     saveHttpsForms : true,
     prefBranch     : null,
 
@@ -929,11 +927,9 @@ FormHistory.prototype = {
 
         // Close the connection, ignore 'already closed' error
         try { this.dbConnection.close() } catch(e) {}
         this.dbFile.remove(false);
     }
 };
 
 let component = [FormHistory];
-function NSGetModule (compMgr, fileSpec) {
-    return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(component);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/satchel/src/satchel.manifest
@@ -0,0 +1,4 @@
+component {0c1bb408-71a2-403f-854a-3a0659829ded} nsFormHistory.js
+contract @mozilla.org/satchel/form-history;1 {0c1bb408-71a2-403f-854a-3a0659829ded}
+component {c11c21b2-71c9-4f87-a0f8-5e13f50495fd} nsFormAutoComplete.js
+contract @mozilla.org/satchel/form-autocomplete;1 {c11c21b2-71c9-4f87-a0f8-5e13f50495fd}
\ No newline at end of file
--- a/toolkit/components/search/Makefile.in
+++ b/toolkit/components/search/Makefile.in
@@ -43,14 +43,15 @@ VPATH     = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE = toolkitsearch
 XPIDL_MODULE = toolkitsearch
 
 XPIDLSRCS = nsIBrowserSearchService.idl
 
+EXTRA_COMPONENTS = toolkitsearch.manifest
 EXTRA_PP_COMPONENTS = nsSearchService.js \
 	nsSearchSuggestions.js
 
 DEFINES += -DMOZ_DISTRIBUTION_ID=$(MOZ_DISTRIBUTION_ID)
 
 include $(topsrcdir)/config/rules.mk
--- a/toolkit/components/search/nsSearchService.js
+++ b/toolkit/components/search/nsSearchService.js
@@ -37,16 +37,18 @@
 # the terms of any one of the MPL, the GPL or the LGPL.
 #
 # ***** END LICENSE BLOCK *****
 
 const Ci = Components.interfaces;
 const Cc = Components.classes;
 const Cr = Components.results;
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
 const PERMS_FILE      = 0644;
 const PERMS_DIRECTORY = 0755;
 
 const MODE_RDONLY   = 0x01;
 const MODE_WRONLY   = 0x02;
 const MODE_CREATE   = 0x08;
 const MODE_APPEND   = 0x10;
 const MODE_TRUNCATE = 0x20;
@@ -2464,16 +2466,18 @@ function SearchService() {
     this._loadEngines();
   } catch (ex) {
     LOG("_init: failure loading engines: " + ex);
   }
   gEnginesLoaded = true;
   this._addObservers();
 }
 SearchService.prototype = {
+  classID: Components.ID("{7319788a-fe93-4db3-9f39-818cf08f4256}"),
+
   _engines: { },
   __sortedEngines: null,
   get _sortedEngines() {
     if (!this.__sortedEngines)
       return this._buildSortedEngineList();
     return this.__sortedEngines;
   },
 
@@ -3673,67 +3677,11 @@ var engineUpdateService = {
     if (engine._iconUpdateURL) {
       // If we're updating the engine too, use the new engine object,
       // otherwise use the existing engine object.
       (testEngine || engine)._setIcon(engine._iconUpdateURL, true);
     }
   }
 };
 
-const kClassID    = Components.ID("{7319788a-fe93-4db3-9f39-818cf08f4256}");
-const kClassName  = "Browser Search Service";
-const kContractID = "@mozilla.org/browser/search-service;1";
-
-// nsIFactory
-const kFactory = {
-  createInstance: function (outer, iid) {
-    if (outer != null)
-      throw Cr.NS_ERROR_NO_AGGREGATION;
-    return (new SearchService()).QueryInterface(iid);
-  }
-};
-
-// nsIModule
-const gModule = {
-  get _catMan() {
-    return Cc["@mozilla.org/categorymanager;1"].
-           getService(Ci.nsICategoryManager);
-  },
-
-  registerSelf: function (componentManager, fileSpec, location, type) {
-    componentManager.QueryInterface(Ci.nsIComponentRegistrar);
-    componentManager.registerFactoryLocation(kClassID,
-                                             kClassName,
-                                             kContractID,
-                                             fileSpec, location, type);
-    this._catMan.addCategoryEntry("update-timer", kClassName,
-                                  kContractID + 
-                                  ",getService," +
-                                  "search-engine-update-timer," +
-                                  BROWSER_SEARCH_PREF + "update.interval," +
-                                  "21600", /* 6 hours */
-                                  true, true);
-  },
-
-  unregisterSelf: function(componentManager, fileSpec, location) {
-    componentManager.QueryInterface(Ci.nsIComponentRegistrar);
-    componentManager.unregisterFactoryLocation(kClassID, fileSpec);
-    this._catMan.deleteCategoryEntry("update-timer", kClassName, true);
-  },
-
-  getClassObject: function (componentManager, cid, iid) {
-    if (!cid.equals(kClassID))
-      throw Cr.NS_ERROR_NO_INTERFACE;
-    if (!iid.equals(Ci.nsIFactory))
-      throw Cr.NS_ERROR_NOT_IMPLEMENTED;
-    return kFactory;
-  },
-
-  canUnload: function (componentManager) {
-    return true;
-  }
-};
-
-function NSGetModule(componentManager, fileSpec) {
-  return gModule;
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([SearchService]);
 
 #include ../../../toolkit/content/debug.js
--- a/toolkit/components/search/nsSearchSuggestions.js
+++ b/toolkit/components/search/nsSearchSuggestions.js
@@ -745,19 +745,15 @@ SearchSuggestLoadListener.prototype = {
  * @constructor
  */
 function SearchSuggestAutoComplete() {
   // This calls _init() in the parent class (SuggestAutoComplete) via the
   // prototype, below.
   this._init();
 }
 SearchSuggestAutoComplete.prototype = {
-  classDescription: "Remote Search Suggestions",
-  contractID: "@mozilla.org/autocomplete/search;1?name=search-autocomplete",
   classID: Components.ID("{aa892eb4-ffbf-477d-9f9a-06c995ae9f27}"),
   __proto__: SuggestAutoComplete.prototype,
   serviceURL: ""
 };
 
 var component = [SearchSuggestAutoComplete];
-function NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule(component);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(component);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/search/toolkitsearch.manifest
@@ -0,0 +1,6 @@
+component {7319788a-fe93-4db3-9f39-818cf08f4256} nsSearchService.js
+contract @mozilla.org/browser/search-service;1 {7319788a-fe93-4db3-9f39-818cf08f4256}
+# 21600 == 6 hours
+category update-timer nsSearchService @mozilla.org/browser/search-service;1,getService,search-engine-update-timer,browser.search.update.interval,21600
+component {aa892eb4-ffbf-477d-9f9a-06c995ae9f27} nsSearchSuggestions.js
+contract @mozilla.org/autocomplete/search;1?name=search-autocomplete {aa892eb4-ffbf-477d-9f9a-06c995ae9f27}
\ No newline at end of file
--- a/toolkit/components/startup/src/Makefile.in
+++ b/toolkit/components/startup/src/Makefile.in
@@ -60,11 +60,11 @@ else
 ifeq (cocoa,$(MOZ_WIDGET_TOOLKIT))
 CMMSRCS += nsUserInfoMac.mm
 else
 CPPSRCS += nsUserInfoUnix.cpp
 endif
 endif
 endif
 
-EXTRA_COMPONENTS = nsTryToClose.js
+EXTRA_COMPONENTS = nsTryToClose.js nsTryToClose.manifest
 
 include $(topsrcdir)/config/rules.mk
--- a/toolkit/components/startup/src/nsTryToClose.js
+++ b/toolkit/components/startup/src/nsTryToClose.js
@@ -62,19 +62,14 @@ TryToClose.prototype = {
           aSubject.data = true;
           break;
         }
       }
       break;
     }
   },
 
-  classDescription: "tryToClose Service",
-  contractID: "@mozilla.org/appshell/trytoclose;1",
   classID: Components.ID("{b69155f4-a8bf-453d-8653-91d1456e1d3d}"),
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
                                          Ci.nsISupportsWeakReference]),
-  _xpcom_categories: [{ category: "app-startup", service: true }]
 };
 
-function NSGetModule(aCompMgr, aFileSpec) {
-  return XPCOMUtils.generateModule([TryToClose]);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([TryToClose]);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/startup/src/nsTryToClose.manifest
@@ -0,0 +1,3 @@
+component {b69155f4-a8bf-453d-8653-91d1456e1d3d} nsTryToClose.js
+contract @mozilla.org/appshell/trytoclose;1 {b69155f4-a8bf-453d-8653-91d1456e1d3d}
+category app-startup nsTryToClose service,@mozilla.org/appshell/trytoclose;1
--- a/toolkit/components/url-classifier/src/Makefile.in
+++ b/toolkit/components/url-classifier/src/Makefile.in
@@ -20,16 +20,17 @@ CPPSRCS = \
           nsUrlClassifierHashCompleter.cpp \
           $(NULL)
 
 LOCAL_INCLUDES = \
                  -I$(srcdir)/../../build \
                  $(SQLITE_CFLAGS) \
                  $(NULL)
 
+EXTRA_COMPONENTS = nsURLClassifier.manifest
 
 # Same as JS components that are run through the pre-processor.
 EXTRA_PP_COMPONENTS = nsUrlClassifierLib.js \
                       nsUrlClassifierListManager.js \
                       $(NULL)
 
 include $(topsrcdir)/config/rules.mk
 
new file mode 100644
--- /dev/null
+++ b/toolkit/components/url-classifier/src/nsURLClassifier.manifest
@@ -0,0 +1,4 @@
+component {26a4a019-2827-4a89-a85c-5931a678823a} nsUrlClassifierLib.js
+contract @mozilla.org/url-classifier/jslib;1 {26a4a019-2827-4a89-a85c-5931a678823a}
+component {ca168834-cc00-48f9-b83c-fd018e58cae3} nsUrlClassifierListManager.js
+contract @mozilla.org/url-classifier/listmanager;1 {ca168834-cc00-48f9-b83c-fd018e58cae3}
--- a/toolkit/components/url-classifier/src/nsUrlClassifierLib.js
+++ b/toolkit/components/url-classifier/src/nsUrlClassifierLib.js
@@ -38,16 +38,18 @@
 // We wastefully reload the same JS files across components.  This puts all
 // the common JS files used by safebrowsing and url-classifier into a
 // single component.
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 const G_GDEBUG = false;
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
 #include ../content/moz/lang.js
 #include ../content/moz/preferences.js
 #include ../content/moz/debug.js
 #include ../content/moz/alarm.js
 #include ../content/moz/cryptohasher.js
 #include ../content/moz/observer.js
 #include ../content/moz/protocol4.js
 
@@ -56,56 +58,12 @@ const G_GDEBUG = false;
 #include ../content/xml-fetcher.js
 
 // Expose this whole component.
 var lib = this;
 
 function UrlClassifierLib() {
   this.wrappedJSObject = lib;
 }
-
-// Module object
-function UrlClassifierLibMod() {
-  this.firstTime = true;
-  this.cid = Components.ID("{26a4a019-2827-4a89-a85c-5931a678823a}");
-  this.progid = "@mozilla.org/url-classifier/jslib;1";
-}
-
-UrlClassifierLibMod.prototype.registerSelf = function(compMgr, fileSpec, loc, type) {
-  if (this.firstTime) {
-    this.firstTime = false;
-    throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
-  }
-  compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
-  compMgr.registerFactoryLocation(this.cid,
-                                  "UrlClassifier JS Lib",
-                                  this.progid,
-                                  fileSpec,
-                                  loc,
-                                  type);
-};
+UrlClassifierLib.prototype.classID = Components.ID("{26a4a019-2827-4a89-a85c-5931a678823a}");
+UrlClassifierLib.prototype.QueryInterface = XPCOMUtils.generateQI([]);
 
-UrlClassifierLibMod.prototype.getClassObject = function(compMgr, cid, iid) {  
-  if (!cid.equals(this.cid))
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  if (!iid.equals(Ci.nsIFactory))
-    throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-
-  return this.factory;
-}
-
-UrlClassifierLibMod.prototype.canUnload = function(compMgr) {
-  return true;
-}
-
-UrlClassifierLibMod.prototype.factory = {
-  createInstance: function(outer, iid) {
-    if (outer != null)
-      throw Components.results.NS_ERROR_NO_AGGREGATION;
-    return new UrlClassifierLib();
-  }
-};
-
-var LibModInst = new UrlClassifierLibMod();
-
-function NSGetModule(compMgr, fileSpec) {
-  return LibModInst;
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([UrlClassifierLib]);
--- a/toolkit/components/url-classifier/src/nsUrlClassifierListManager.js
+++ b/toolkit/components/url-classifier/src/nsUrlClassifierListManager.js
@@ -33,16 +33,18 @@
 # the provisions above, a recipient may use your version of this file under
 # the terms of any one of the MPL, the GPL or the LGPL.
 #
 # ***** END LICENSE BLOCK *****
 
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
+
 #include ../content/listmanager.js
 
 var modScope = this;
 function Init() {
   // Pull the library in.
   var jslib = Cc["@mozilla.org/url-classifier/jslib;1"]
               .getService().wrappedJSObject;
   Function.prototype.inherits = jslib.Function.prototype.inherits;
@@ -57,56 +59,24 @@ function Init() {
   modScope.PROT_XMLFetcher = jslib.PROT_XMLFetcher;
   modScope.PROT_UrlCryptoKeyManager = jslib.PROT_UrlCryptoKeyManager;
   modScope.RequestBackoff = jslib.RequestBackoff;
 
   // We only need to call Init once.
   modScope.Init = function() {};
 }
 
-// Module object
-function UrlClassifierListManagerMod() {
-  this.firstTime = true;
-  this.cid = Components.ID("{ca168834-cc00-48f9-b83c-fd018e58cae3}");
-  this.progid = "@mozilla.org/url-classifier/listmanager;1";
+function RegistrationData()
+{
 }
-
-UrlClassifierListManagerMod.prototype.registerSelf = function(compMgr, fileSpec, loc, type) {
-  if (this.firstTime) {
-    this.firstTime = false;
-    throw Components.results.NS_ERROR_FACTORY_REGISTER_AGAIN;
-  }
-  compMgr = compMgr.QueryInterface(Ci.nsIComponentRegistrar);
-  compMgr.registerFactoryLocation(this.cid,
-                                  "UrlClassifier List Manager Module",
-                                  this.progid,
-                                  fileSpec,
-                                  loc,
-                                  type);
+RegistrationData.prototype = {
+    classID: Components.ID("{ca168834-cc00-48f9-b83c-fd018e58cae3}"),
+    _xpcom_factory: {
+        createInstance: function(outer, iid) {
+            if (outer != null)
+                throw Components.results.NS_ERROR_NO_AGGREGATION;
+            Init();
+            return (new PROT_ListManager()).QueryInterface(iid);
+        }
+    },
 };
 
-UrlClassifierListManagerMod.prototype.getClassObject = function(compMgr, cid, iid) {  
-  if (!cid.equals(this.cid))
-    throw Components.results.NS_ERROR_NO_INTERFACE;
-  if (!iid.equals(Ci.nsIFactory))
-    throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-
-  return this.factory;
-}
-
-UrlClassifierListManagerMod.prototype.canUnload = function(compMgr) {
-  return true;
-}
-
-UrlClassifierListManagerMod.prototype.factory = {
-  createInstance: function(outer, iid) {
-    if (outer != null)
-      throw Components.results.NS_ERROR_NO_AGGREGATION;
-    Init();
-    return (new PROT_ListManager()).QueryInterface(iid);
-  }
-};
-
-var ListManagerModInst = new UrlClassifierListManagerMod();
-
-function NSGetModule(compMgr, fileSpec) {
-  return ListManagerModInst;
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([RegistrationData]);
--- a/toolkit/components/urlformatter/src/Makefile.in
+++ b/toolkit/components/urlformatter/src/Makefile.in
@@ -37,14 +37,18 @@
 
 DEPTH = ../../../..
 topsrcdir = @top_srcdir@
 srcdir = @srcdir@
 VPATH = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
+EXTRA_COMPONENTS = \
+	nsURLFormatter.manifest \
+	$(NULL)
+
 EXTRA_PP_COMPONENTS = \
 	nsURLFormatter.js \
 	$(NULL)
 
 include $(topsrcdir)/config/rules.mk
 
--- a/toolkit/components/urlformatter/src/nsURLFormatter.js
+++ b/toolkit/components/urlformatter/src/nsURLFormatter.js
@@ -48,18 +48,16 @@
 const Cc = Components.classes;
 const Ci = Components.interfaces;
 const Cu = Components.utils;
 
 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
 function nsURLFormatterService() {}
 nsURLFormatterService.prototype = {
-  classDescription: "Application URL Formatter Service",
-  contractID: "@mozilla.org/toolkit/URLFormatterService;1",
   classID: Components.ID("{e6156350-2be8-11db-a98b-0800200c9a66}"),
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIURLFormatter]),
 
   _defaults: {
     get appInfo() {
       if (!this._appInfo)
         this._appInfo = Cc["@mozilla.org/xre/app-info;1"].
                         getService(Ci.nsIXULAppInfo).
@@ -111,10 +109,9 @@ nsURLFormatterService.prototype = {
         format = PS.getComplexValue(aPref, Ci.nsIPrefLocalizedString).data;
       } catch(ex) {}
     }
 
     return this.formatURL(format);
   }
 };
 
-function NSGetModule(aCompMgr, aFileSpec)
-  XPCOMUtils.generateModule([nsURLFormatterService]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([nsURLFormatterService]);
new file mode 100644
--- /dev/null
+++ b/toolkit/components/urlformatter/src/nsURLFormatter.manifest
@@ -0,0 +1,2 @@
+component {e6156350-2be8-11db-a98b-0800200c9a66} nsURLFormatter.js
+contract @mozilla.org/toolkit/URLFormatterService;1 {e6156350-2be8-11db-a98b-0800200c9a66}
--- a/toolkit/mozapps/downloads/Makefile.in
+++ b/toolkit/mozapps/downloads/Makefile.in
@@ -39,16 +39,17 @@ DEPTH     = ../../..
 topsrcdir = @top_srcdir@
 srcdir    = @srcdir@
 VPATH     = @srcdir@
 
 include $(topsrcdir)/config/config.mk
 
 MODULE = helperAppDlg
 
+EXTRA_COMPONENTS = nsHelperAppDlg.manifest
 EXTRA_PP_COMPONENTS = nsHelperAppDlg.js
 
 EXTRA_JS_MODULES = \
   DownloadLastDir.jsm \
   DownloadPaths.jsm \
   DownloadUtils.jsm \
   $(NULL)
 
--- a/toolkit/mozapps/downloads/nsHelperAppDlg.js
+++ b/toolkit/mozapps/downloads/nsHelperAppDlg.js
@@ -73,16 +73,17 @@ function isUsableDirectory(aDirectory)
  *
  * In addition, this file implements an nsIModule object that registers the
  * nsUnknownContentTypeDialog component.
  */
 
 const PREF_BD_USEDOWNLOADDIR = "browser.download.useDownloadDir";
 const nsITimer = Components.interfaces.nsITimer;
 
+Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
 Components.utils.import("resource://gre/modules/DownloadLastDir.jsm");
 Components.utils.import("resource://gre/modules/DownloadPaths.jsm");
 
 /* ctor
  */
 function nsUnknownContentTypeDialog() {
   // Initialize data properties.
   this.mLauncher = null;
@@ -90,16 +91,18 @@ function nsUnknownContentTypeDialog() {
   this.mSourcePath = null;
   this.chosenApp = null;
   this.givenDefaultApp = false;
   this.updateSelf = true;
   this.mTitle    = "";
 }
 
 nsUnknownContentTypeDialog.prototype = {
+  classID: Components.ID("{F68578EB-6EC2-4169-AE19-8C6243F0ABE1}"),
+
   nsIMIMEInfo  : Components.interfaces.nsIMIMEInfo,
 
   QueryInterface: function (iid) {
     if (!iid.equals(Components.interfaces.nsIHelperAppLauncherDialog) &&
         !iid.equals(Components.interfaces.nsITimerCallback) &&
         !iid.equals(Components.interfaces.nsISupports)) {
       throw Components.results.NS_ERROR_NO_INTERFACE;
     }
@@ -1093,63 +1096,9 @@ nsUnknownContentTypeDialog.prototype = {
         val = obj[ prop ];
       } catch ( exception ) {
       }
       this.dump( val + "\n" );
     }
   }
 }
 
-// This Component's module implementation.  All the code below is used to get this
-// component registered and accessible via XPCOM.
-var module = {
-  // registerSelf: Register this component.
-  registerSelf: function (compMgr, fileSpec, location, type) {
-    compMgr = compMgr.QueryInterface(Components.interfaces.nsIComponentRegistrar);
-
-    compMgr.registerFactoryLocation( this.cid,
-                                     "Unknown Content Type Dialog",
-                                     this.contractId,
-                                     fileSpec,
-                                     location,
-                                     type );
-  },
-
-  // getClassObject: Return this component's factory object.
-  getClassObject: function (compMgr, cid, iid) {
-    if (!cid.equals(this.cid)) {
-      throw Components.results.NS_ERROR_NO_INTERFACE;
-    }
-
-    if (!iid.equals(Components.interfaces.nsIFactory)) {
-      throw Components.results.NS_ERROR_NOT_IMPLEMENTED;
-    }
-
-    return this.factory;
-  },
-
-  /* CID for this class */
-  cid: Components.ID("{F68578EB-6EC2-4169-AE19-8C6243F0ABE1}"),
-
-  /* Contract ID for this class */
-  contractId: "@mozilla.org/helperapplauncherdialog;1",
-
-  /* factory object */
-  factory: {
-    // createInstance: Return a new nsProgressDialog object.
-    createInstance: function (outer, iid) {
-      if (outer != null)
-        throw Components.results.NS_ERROR_NO_AGGREGATION;
-
-      return (new nsUnknownContentTypeDialog()).QueryInterface(iid);
-    }
-  },
-
-  // canUnload: n/a (returns true)
-  canUnload: function(compMgr) {
-    return true;
-  }
-};
-
-// NSGetModule: Return the nsIModule object.
-function NSGetModule(compMgr, fileSpec) {
-  return module;
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([nsUnknownContentTypeDialog]);
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/downloads/nsHelperAppDlg.manifest
@@ -0,0 +1,2 @@
+component {F68578EB-6EC2-4169-AE19-8C6243F0ABE1} nsHelperAppDlg.js
+contract @mozilla.org/helperapplauncherdialog;1 {F68578EB-6EC2-4169-AE19-8C6243F0ABE1}
--- a/toolkit/mozapps/extensions/Makefile.in
+++ b/toolkit/mozapps/extensions/Makefile.in
@@ -55,16 +55,17 @@ XPIDLSRCS = \
   amIWebInstaller.idl \
   $(NULL)
 
 CPPSRCS		= \
   amInstallTrigger.cpp \
   $(NULL)
 
 EXTRA_PP_COMPONENTS = \
+  extensions.manifest \
   nsBlocklistService.js \
   addonManager.js \
   amContentHandler.js \
   amWebInstallListener.js \
   $(NULL)
 
 EXTRA_PP_JS_MODULES = \
   AddonManager.jsm \
--- a/toolkit/mozapps/extensions/addonManager.js
+++ b/toolkit/mozapps/extensions/addonManager.js
@@ -162,32 +162,25 @@ amManager.prototype = {
 
     return retval;
   },
 
   notify: function AMC_notify(aTimer) {
     AddonManagerPrivate.backgroundUpdateCheck();
   },
 
-  classDescription: "Addons Manager",
-  contractID: "@mozilla.org/addons/integration;1",
   classID: Components.ID("{4399533d-08d1-458c-a87a-235f74451cfa}"),
-  _xpcom_categories: [{ category: "update-timer",
-                        value: "@mozilla.org/addons/integration;1," +
-                               "getService,addon-background-update-timer," +
-                               PREF_EM_UPDATE_INTERVAL + ",86400" }],
   _xpcom_factory: {
     createInstance: function(aOuter, aIid) {
       if (aOuter != null)
         throw Cr.NS_ERROR_NO_AGGREGATION;
   
       if (!gSingleton)
         gSingleton = new amManager();
       return gSingleton.QueryInterface(aIid);
     }
   },
   QueryInterface: XPCOMUtils.generateQI([Ci.amIWebInstaller,
                                          Ci.nsITimerCallback,
                                          Ci.nsIObserver])
 };
 
-function NSGetModule(aCompMgr, aFileSpec)
-  XPCOMUtils.generateModule([amManager]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([amManager]);
--- a/toolkit/mozapps/extensions/amContentHandler.js
+++ b/toolkit/mozapps/extensions/amContentHandler.js
@@ -84,16 +84,13 @@ amContentHandler.prototype = {
     aRequest.cancel(Cr.NS_BINDING_ABORTED);
 
     let manager = Cc["@mozilla.org/addons/integration;1"].
                   getService(Ci.amIWebInstaller);
     manager.installAddonsFromWebpage(aMimetype, window, referer, [uri.spec],
                                      [null], [null], [null], null, 1);
   },
 
-  classDescription: "XPI Content Handler",
-  contractID: "@mozilla.org/uriloader/content-handler;1?type=" + XPI_CONTENT_TYPE,
   classID: Components.ID("{7beb3ba8-6ec3-41b4-b67c-da89b8518922}"),
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentHandler])
 };
 
-function NSGetModule(compMgr, fileSpec)
-  XPCOMUtils.generateModule([amContentHandler]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([amContentHandler]);
--- a/toolkit/mozapps/extensions/amWebInstallListener.js
+++ b/toolkit/mozapps/extensions/amWebInstallListener.js
@@ -223,10 +223,9 @@ extWebInstallListener.prototype = {
   },
 
   classDescription: "XPI Install Handler",
   contractID: "@mozilla.org/addons/web-install-listener;1",
   classID: Components.ID("{0f38e086-89a3-40a5-8ffc-9b694de1d04a}"),
   QueryInterface: XPCOMUtils.generateQI([Ci.amIWebInstallListener])
 };
 
-function NSGetModule(aCompMgr, aFileSpec)
-  XPCOMUtils.generateModule([extWebInstallListener]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([extWebInstallListener]);
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/extensions/extensions.manifest
@@ -0,0 +1,10 @@
+component {66354bc9-7ed1-4692-ae1d-8da97d6b205e} nsBlocklistService.js
+contract @mozilla.org/extensions/blocklist;1 {66354bc9-7ed1-4692-ae1d-8da97d6b205e}
+category update-timer nsBlocklistService @mozilla.org/extensions/blocklist;1,getService,blocklist-background-update-timer,extensions.blocklist.interval,86400
+component {4399533d-08d1-458c-a87a-235f74451cfa} addonManager.js
+contract @mozilla.org/addons/integration;1 {4399533d-08d1-458c-a87a-235f74451cfa}
+category update-timer addonManager @mozilla.org/addons/integration;1,getService,addon-background-update-timer,extensions.update.interval,86400
+component {7beb3ba8-6ec3-41b4-b67c-da89b8518922} amContentHandler.js
+contract @mozilla.org/uriloader/content-handler;1?type=application/x-xpinstall {7beb3ba8-6ec3-41b4-b67c-da89b8518922}
+component {0f38e086-89a3-40a5-8ffc-9b694de1d04a} amWebInstallListener.js
+contract @mozilla.org/addons/web-install-listener;1 {0f38e086-89a3-40a5-8ffc-9b694de1d04a}
--- a/toolkit/mozapps/extensions/nsBlocklistService.js
+++ b/toolkit/mozapps/extensions/nsBlocklistService.js
@@ -888,26 +888,20 @@ Blocklist.prototype = {
           addonList[i].item.userDisabled = true;
       }
 
       if (args.restart)
         restartApp();
     });
   },
 
-  classDescription: "Blocklist Service",
-  contractID: "@mozilla.org/extensions/blocklist;1",
   classID: Components.ID("{66354bc9-7ed1-4692-ae1d-8da97d6b205e}"),
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIObserver,
                                          Ci.nsIBlocklistService,
                                          Ci.nsITimerCallback]),
-  _xpcom_categories: [{ category: "update-timer",
-                        value: "@mozilla.org/extensions/blocklist;1," +
-                               "getService,blocklist-background-update-timer," +
-                               PREF_BLOCKLIST_INTERVAL + ",86400" }]
 };
 
 /**
  * Helper for constructing a blocklist.
  */
 function BlocklistItemData(versionRangeElement) {
   var versionRange = this.getBlocklistVersionRange(versionRangeElement);
   this.minVersion = versionRange.minVersion;
@@ -1058,11 +1052,9 @@ BlocklistItemData.prototype = {
       minVersion = versionRangeElement.getAttribute("minVersion");
     if (versionRangeElement.hasAttribute("maxVersion"))
       maxVersion = versionRangeElement.getAttribute("maxVersion");
 
     return { minVersion: minVersion, maxVersion: maxVersion };
   }
 };
 
-function NSGetModule(aCompMgr, aFileSpec) {
-  return XPCOMUtils.generateModule([Blocklist]);
-}
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([Blocklist]);
--- a/toolkit/mozapps/handling/Makefile.in
+++ b/toolkit/mozapps/handling/Makefile.in
@@ -39,11 +39,11 @@ DEPTH     = ../../..
 topsrcdir = @top_srcdir@
 srcdir    = @srcdir@
 VPATH     = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE = contentDispatchChooser
 
-EXTRA_COMPONENTS = nsContentDispatchChooser.js
+EXTRA_COMPONENTS = nsContentDispatchChooser.js nsContentDispatchChooser.manifest
 
 include $(topsrcdir)/config/rules.mk
--- a/toolkit/mozapps/handling/nsContentDispatchChooser.js
+++ b/toolkit/mozapps/handling/nsContentDispatchChooser.js
@@ -52,19 +52,17 @@ const STRINGBUNDLE_URL = "chrome://mozap
 //// nsContentDispatchChooser class
 
 function nsContentDispatchChooser()
 {
 }
 
 nsContentDispatchChooser.prototype =
 {
-  classDescription: "Used to handle different types of content",
   classID: Components.ID("e35d5067-95bc-4029-8432-e8f1e431148d"),
-  contractID: "@mozilla.org/content-dispatch-chooser;1",
 
   //////////////////////////////////////////////////////////////////////////////
   //// nsIContentDispatchChooser
 
   ask: function ask(aHandler, aWindowContext, aURI, aReason)
   {
     var window = null;
     try {
@@ -118,13 +116,9 @@ nsContentDispatchChooser.prototype =
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIContentDispatchChooser])
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 //// Module
 
 let components = [nsContentDispatchChooser];
 
-function NSGetModule(compMgr, fileSpec)
-{
-  return XPCOMUtils.generateModule(components);
-}
-
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/handling/nsContentDispatchChooser.manifest
@@ -0,0 +1,2 @@
+component {e35d5067-95bc-4029-8432-e8f1e431148d} nsContentDispatchChooser.js
+contract @mozilla.org/content-dispatch-chooser;1 {e35d5067-95bc-4029-8432-e8f1e431148d}
--- a/toolkit/mozapps/plugins/Makefile.in
+++ b/toolkit/mozapps/plugins/Makefile.in
@@ -37,15 +37,15 @@
 
 DEPTH   = ../../..
 topsrcdir = @top_srcdir@
 srcdir    = @srcdir@
 VPATH   = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
-EXTRA_COMPONENTS = pluginGlue.js
+EXTRA_COMPONENTS = pluginGlue.manifest
 
 ifdef ENABLE_TESTS
 DIRS += tests
 endif
 
 include $(topsrcdir)/config/rules.mk
deleted file mode 100644
--- a/toolkit/mozapps/plugins/pluginGlue.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: MPL 1.1/GPL 2.0/LGPL 2.1
- *
- * The contents of this file are subject to the Mozilla Public License Version
- * 1.1 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.mozilla.org/MPL/
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * The Original Code is mozilla pluginfinder style sheet registration code.
- *
- * The Initial Developer of the Original Code is
- * Christian Biesinger <cbiesinger@web.de>.
- * Portions created by the Initial Developer are Copyright (C) 2005
- * the Initial Developer. All Rights Reserved.
- *
- * Contributor(s):
- *
- *  Justin Dolske <dolske@mozilla.com>
- *
- * Alternatively, the contents of this file may be used under the terms of
- * either the GNU General Public License Version 2 or later (the "GPL"), or
- * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
- * in which case the provisions of the GPL or the LGPL are applicable instead
- * of those above. If you wish to allow use of your version of this file only
- * under the terms of either the GPL or the LGPL, and not to allow others to
- * use your version of this file under the terms of the MPL, indicate your
- * decision by deleting the provisions above and replace them with the notice
- * and other provisions required by the GPL or the LGPL. If you do not delete
- * the provisions above, a recipient may use your version of this file under
- * the terms of any one of the MPL, the GPL or the LGPL.
- *
- * ***** END LICENSE BLOCK ***** */
-
-Components.utils.import("resource://gre/modules/XPCOMUtils.jsm");
-
-function pluginBindings() { }
-
-pluginBindings.prototype = {
-    // This isn't a real component, we're just using categories to
-    // automatically add our stylesheets during module registration.
-    classDescription: "plugin bindings",
-    classID:          Components.ID("12663f3a-a311-4606-83eb-b6b9108dcc36"),
-    contractID:       "@mozilla.org/plugin-bindings;1",
-    QueryInterface: XPCOMUtils.generateQI([]),
-
-    _xpcom_categories: [{ category: "agent-style-sheets",
-                          entry:    "pluginfinder xbl binding",
-                          value:    "chrome://mozapps/content/plugins/pluginFinderBinding.css"},
-                        { category: "agent-style-sheets",
-                          entry:    "pluginproblem xbl binding",
-                          value:    "chrome://mozapps/content/plugins/pluginProblemBinding.css"}]
-};
-
-var NSGetModule = XPCOMUtils.generateNSGetModule([pluginBindings]);
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/plugins/pluginGlue.manifest
@@ -0,0 +1,2 @@
+category agent-style-sheets pluginGlue-pluginFinder chrome://mozapps/content/plugins/pluginFinderBinding.css
+category agent-style-sheets pluginGlue-pluginProblem chrome://mozapps/content/plugins/pluginProblemBinding.css
--- a/toolkit/mozapps/update/Makefile.in
+++ b/toolkit/mozapps/update/Makefile.in
@@ -41,28 +41,29 @@ srcdir    = @srcdir@
 VPATH     = @srcdir@
 
 include $(DEPTH)/config/autoconf.mk
 
 MODULE = update
 
 XPIDLSRCS = nsIUpdateTimerManager.idl
 
-EXTRA_PP_COMPONENTS = nsUpdateTimerManager.js
+EXTRA_PP_COMPONENTS = nsUpdateTimerManager.js nsUpdateTimerManager.manifest
 
 ifdef MOZ_UPDATER
 DIRS = ../readstrings \
   updater \
   $(NULL)
 
 XPIDLSRCS += nsIUpdateService.idl
 
 EXTRA_PP_COMPONENTS += \
   nsUpdateService.js \
   nsUpdateServiceStub.js \
+  nsUpdateService.manifest \
   $(NULL)
 endif
 
 ifdef ENABLE_TESTS
 DIRS += test_timermanager
 # Update tests require the updater binary
 ifdef MOZ_UPDATER
 DIRS += test
--- a/toolkit/mozapps/update/nsUpdateService.js
+++ b/toolkit/mozapps/update/nsUpdateService.js
@@ -1688,23 +1688,17 @@ UpdateService.prototype = {
   getInterfaces: function AUS_getInterfaces(count) {
     var interfaces = [Ci.nsIApplicationUpdateService,
                       Ci.nsITimerCallback,
                       Ci.nsIObserver];
     count.value = interfaces.length;
     return interfaces;
   },
 
-  classDescription: "Update Service",
-  contractID: "@mozilla.org/updates/update-service;1",
   classID: Components.ID("{B3C290A6-3943-4B89-8BBE-C01EB7B3B311}"),
-  _xpcom_categories: [{ category: CATEGORY_UPDATE_TIMER,
-                        value: "@mozilla.org/updates/update-service;1," +
-                               "getService,background-update-timer," +
-                                PREF_APP_UPDATE_INTERVAL + ",86400" }],
   _xpcom_factory: UpdateServiceFactory,
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIApplicationUpdateService,
                                          Ci.nsIAddonUpdateCheckListener,
                                          Ci.nsITimerCallback,
                                          Ci.nsIObserver])
 };
 
 /**
@@ -1944,18 +1938,16 @@ UpdateManager.prototype = {
         }
       }
 
       this._writeUpdatesToXMLFile(updates.slice(0, 10),
                                   getUpdateFile([FILE_UPDATES_DB]));
     }
   },
 
-  classDescription: "Update Manager",
-  contractID: "@mozilla.org/updates/update-manager;1",
   classID: Components.ID("{093C2356-4843-4C65-8709-D7DBCBBE7DFB}"),
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIUpdateManager, Ci.nsIObserver])
 };
 
 /**
  * Checker
  * Checks for new Updates
  * @constructor
@@ -2187,18 +2179,16 @@ Checker.prototype = {
       break;
     case Ci.nsIUpdateChecker.ANY_CHECKS:
       this._enabled = false;
       gPref.setBoolPref(PREF_APP_UPDATE_ENABLED, this._enabled);
       break;
     }
   },
 
-  classDescription: "Update Checker",
-  contractID: "@mozilla.org/updates/update-checker;1",
   classID: Components.ID("{898CDC9B-E43F-422F-9CC4-2F6291B415A3}"),
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIUpdateChecker])
 };
 
 /**
  * Manages the download of updates
  * @param   background
  *          Whether or not this downloader is operating in background
@@ -3018,18 +3008,18 @@ UpdatePrompt.prototype = {
   },
 
   classDescription: "Update Prompt",
   contractID: "@mozilla.org/updates/update-prompt;1",
   classID: Components.ID("{27ABA825-35B5-4018-9FDD-F99250A0E722}"),
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIUpdatePrompt])
 };
 
-function NSGetModule(compMgr, fileSpec)
-  XPCOMUtils.generateModule([UpdateService, Checker, UpdatePrompt, UpdateManager]);
+var components = [UpdateService, Checker, UpdatePrompt, UpdateManager];
+var NSGetFactory = XPCOMUtils.generateNSGetFactory(components);
 
 #if 0
 /**
  * Logs a message and stack trace to the console.
  * @param   string
  *          The string to write to the console.
  */
 function STACK(string) {
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/update/nsUpdateService.manifest
@@ -0,0 +1,12 @@
+component {B3C290A6-3943-4B89-8BBE-C01EB7B3B311} nsUpdateService.js
+contract @mozilla.org/updates/update-service;1 {B3C290A6-3943-4B89-8BBE-C01EB7B3B311}
+category update-timer nsUpdateService @mozilla.org/updates/update-service;1,getService,background-update-timer,app.update.interval,86400
+component {093C2356-4843-4C65-8709-D7DBCBBE7DFB} nsUpdateService.js
+contract @mozilla.org/updates/update-manager;1 {093C2356-4843-4C65-8709-D7DBCBBE7DFB}
+component {898CDC9B-E43F-422F-9CC4-2F6291B415A3} nsUpdateService.js
+contract @mozilla.org/updates/update-checker;1 {898CDC9B-E43F-422F-9CC4-2F6291B415A3}
+component {27ABA825-35B5-4018-9FDD-F99250A0E722} nsUpdateService.js
+contract @mozilla.org/updates/update-prompt;1 {27ABA825-35B5-4018-9FDD-F99250A0E722}
+component {e43b0010-04ba-4da6-b523-1f92580bc150} nsUpdateServiceStub.js
+contract @mozilla.org/updates/update-service-stub;1 {e43b0010-04ba-4da6-b523-1f92580bc150}
+category profile-after-change nsUpdateServiceStub @mozilla.org/updates/update-service-stub;1
--- a/toolkit/mozapps/update/nsUpdateServiceStub.js
+++ b/toolkit/mozapps/update/nsUpdateServiceStub.js
@@ -79,17 +79,13 @@ function UpdateServiceStub() {
   if (statusFile.exists()) {
     let aus = Components.classes["@mozilla.org/updates/update-service;1"].
               getService(Ci.nsIApplicationUpdateService).
               QueryInterface(Ci.nsIObserver);
     aus.observe(null, "post-update-processing", "");
   }
 }
 UpdateServiceStub.prototype = {
-  classDescription: "Update Service Stub",
-  contractID: "@mozilla.org/updates/update-service-stub;1",
   classID: Components.ID("{e43b0010-04ba-4da6-b523-1f92580bc150}"),
-  _xpcom_categories: [{ category: "profile-after-change" }],
   QueryInterface: XPCOMUtils.generateQI([])
 };
 
-function NSGetModule(compMgr, fileSpec)
-  XPCOMUtils.generateModule([UpdateServiceStub]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([UpdateServiceStub]);
--- a/toolkit/mozapps/update/nsUpdateTimerManager.js
+++ b/toolkit/mozapps/update/nsUpdateTimerManager.js
@@ -264,19 +264,15 @@ TimerManager.prototype = {
       lastUpdateTime = Math.round(Date.now() / 1000) + this._fudge;
       gPref.setIntPref(prefLastUpdate, lastUpdateTime);
     }
     this._timers[id] = { callback       : callback,
                          interval       : interval,
                          lastUpdateTime : lastUpdateTime };
   },
 
-  classDescription: "Timer Manager",
-  contractID: "@mozilla.org/updates/timer-manager;1",
   classID: Components.ID("{B322A5C0-A419-484E-96BA-D7182163899F}"),
-  _xpcom_categories: [{ category: "profile-after-change" }],
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIUpdateTimerManager,
                                          Ci.nsITimerCallback,
                                          Ci.nsIObserver])
 };
 
-function NSGetModule(compMgr, fileSpec)
-  XPCOMUtils.generateModule([TimerManager]);
+var NSGetFactory = XPCOMUtils.generateNSGetFactory([TimerManager]);
new file mode 100644
--- /dev/null
+++ b/toolkit/mozapps/update/nsUpdateTimerManager.manifest
@@ -0,0 +1,3 @@
+component {B322A5C0-A419-484E-96BA-D7182163899F} nsUpdateTimerManager.js
+contract @mozilla.org/updates/timer-manager;1 {B322A5C0-A419-484E-96BA-D7182163899F}
+category profile-after-change nsUpdateTimerManager @mozilla.org/updates/timer-manager;1
--- a/uriloader/exthandler/Makefile.in
+++ b/uriloader/exthandler/Makefile.in
@@ -158,17 +158,19 @@ endif
 ifeq ($(OS_ARCH),WINNT WINCE)
 OS_LIBS		+= shell32.lib
 GARBAGE		+= nsOSHelperAppService.cpp $(srcdir)/nsOSHelperAppService.cpp \
              nsMIMEInfoWin.cpp $(srcdir)/nsMIMEInfoWin.cpp
 endif
 
 EXTRA_COMPONENTS = \
   nsHandlerService.js \
+  nsHandlerService.manifest \
   nsWebHandlerApp.js \
+  nsWebHandlerApp.manifest \
   $(NULL)
 
 # we don't want the shared lib, but we want to force the creation of a static lib.
 FORCE_STATIC_LIB = 1
 SRCS_IN_OBJDIR	= 1
 include $(topsrcdir)/config/rules.mk
 
 ifneq (,$(filter qt gtk2, $(MOZ_WIDGET_TOOLKIT)))
--- a/uriloader/exthandler/nsHandlerService.js
+++ b/uriloader/exthandler/nsHandlerService.js
@@ -114,22 +114,19 @@ Cu.import("resource://gre/modules/XPCOMU
 function HandlerService() {
   this._init();
 }
 
 HandlerService.prototype = {
   //**************************************************************************//
   // XPCOM Plumbing
 
-  classDescription: "Handler Service",
   classID:          Components.ID("{32314cc8-22f7-4f7f-a645-1a45453ba6a6}"),
-  contractID:       "@mozilla.org/uriloader/handler-service;1",
   QueryInterface:   XPCOMUtils.generateQI([Ci.nsIHandlerService]),
 
-
   //**************************************************************************//
   // Initialization & Destruction
   
   _init: function HS__init() {
     // Observe profile-before-change so we can switch to the datasource
     // in the new profile when the user changes profiles.
     this._observerSvc.addObserver(this, "profile-before-change", false);
 
@@ -1417,15 +1414,12 @@ HandlerService.prototype = {
         let target = targets.getNext();
         this._ds.Unassert(source, property, target);
       }
     }
   }
 
 };
 
-
 //****************************************************************************//
 // More XPCOM Plumbing
 
-function NSGetModule(compMgr, fileSpec) {
-  return XPCOMUtils.generateModule([HandlerService]);
-}
+NSGetFactory = XPCOMUtils.generateNSGetFactory([HandlerService]);
new file mode 100644
--- /dev/null
+++ b/uriloader/exthandler/nsHandlerService.manifest
@@ -0,0 +1,2 @@
+component {32314cc8-22f7-4f7f-a645-1a45453ba6a6} nsHandlerService.js
+contract @mozilla.org/uriloader/handler-service;1 {32314cc8-22f7-4f7f-a645-1a45453ba6a6}
\ No newline at end of file
--- a/uriloader/exthandler/nsWebHandlerApp.js
+++ b/uriloader/exthandler/nsWebHandlerApp.js
@@ -179,15 +179,10 @@ nsWebHandlerApp.prototype = {
   //// nsISupports
 
   QueryInterface: XPCOMUtils.generateQI([Ci.nsIWebHandlerApp, Ci.nsIHandlerApp])
 };
 
 ////////////////////////////////////////////////////////////////////////////////
 //// Module
 
-let components = [nsWebHandlerApp];
+NSGetFactory = XPCOMUtils.generateNSGetFactory([nsWebHandlerApp]);
 
-function NSGetModule(compMgr, fileSpec)
-{
-  return XPCOMUtils.generateModule(components);
-}
-
new file mode 100644
--- /dev/null
+++ b/uriloader/exthandler/nsWebHandlerApp.manifest
@@ -0,0 +1,2 @@
+component {8b1ae382-51a9-4972-b930-56977a57919d} nsWebHandlerApp.js
+contract @mozilla.org/uriloader/web-handler-app;1 {8b1ae382-51a9-4972-b930-56977a57919d}
--- a/xpcom/ds/Makefile.in
+++ b/xpcom/ds/Makefile.in
@@ -151,16 +151,17 @@ SDK_XPIDLSRCS   = \
 ifneq (,$(filter WINNT WINCE,$(OS_ARCH)))
 CPPSRCS += nsWindowsRegKey.cpp
 XPIDLSRCS += nsIWindowsRegKey.idl
 EXPORTS += nsWindowsRegKey.h
 endif
 
 EXTRA_COMPONENTS = \
   nsINIProcessor.js \
+  nsINIProcessor.manifest \
   $(NULL)
 
 # we don't want the shared lib, but we want to force the creation of a static lib.
 FORCE_STATIC_LIB = 1
 
 # Force use of PIC
 FORCE_USE_PIC	= 1
 
new file mode 100644
--- /dev/null
+++ b/xpcom/ds/nsINIProcessor.manifest
@@ -0,0 +1,2 @@
+component {6ec5f479-8e13-4403-b6ca-fe4c2dca14fd} nsINIProcessor.js
+contract @mozilla.org/xpcom/ini-processor-factory;1 {6ec5f479-8e13-4403-b6ca-fe4c2dca14fd}