Fixed nested message scopes for CommonJS.
diff --git a/js/commonjs/export.js b/js/commonjs/export.js
index 89ded33..2fc2fcb 100644
--- a/js/commonjs/export.js
+++ b/js/commonjs/export.js
@@ -10,5 +10,7 @@
 exports.BinaryWriter = jspb.BinaryWriter;
 exports.ExtensionFieldInfo = jspb.ExtensionFieldInfo;
 
+// These are used by generated code but should not be used directly by clients.
 exports.exportSymbol = goog.exportSymbol;
 exports.inherits = goog.inherits;
+exports.object = {extend: goog.object.extend};
diff --git a/js/commonjs/rewrite_tests_for_commonjs.js b/js/commonjs/rewrite_tests_for_commonjs.js
index d49f8a9..6a655c1 100644
--- a/js/commonjs/rewrite_tests_for_commonjs.js
+++ b/js/commonjs/rewrite_tests_for_commonjs.js
@@ -27,34 +27,38 @@
   output: process.stdout
 });
 
+function tryStripPrefix(str, prefix) {
+  if (str.lastIndexOf(prefix) !== 0) {
+    throw "String: " + str + " didn't start with: " + prefix;
+  }
+  return str.substr(prefix.length);
+}
+
 var module = null;
+var pkg = null;
 lineReader.on('line', function(line) {
-  var is_require = line.match(/goog\.require\('([^']*\.)([^'.]+)'\)/);
-  var is_loadfromfile = line.match(/CommonJS-LoadFromFile: (.*)/);
+  var is_require = line.match(/goog\.require\('([^']*)'\)/);
+  var is_loadfromfile = line.match(/CommonJS-LoadFromFile: ([^ ]*) (.*)/);
   var is_settestonly = line.match(/goog.setTestOnly()/);
   if (is_settestonly) {
     // Remove this line.
   } else if (is_require) {
     if (module) {  // Skip goog.require() lines before the first directive.
-      var pkg = is_require[1];
-      var sym = is_require[2];
-      console.log("google_protobuf.exportSymbol('" + pkg + sym + "', " + module + "." + sym + ', global);');
+      var full_sym = is_require[1];
+      var sym = tryStripPrefix(full_sym, pkg);
+      console.log("google_protobuf.exportSymbol('" + full_sym + "', " + module + sym + ', global);');
     }
   } else if (is_loadfromfile) {
     if (!module) {
+      console.log("var google_protobuf = require('google-protobuf');");
       console.log("var asserts = require('closure_asserts_commonjs');");
       console.log("var global = Function('return this')();");
       console.log("");
       console.log("// Bring asserts into the global namespace.");
-      console.log("for (var key in asserts) {");
-      console.log("  if (asserts.hasOwnProperty(key)) {");
-      console.log("    global[key] = asserts[key];");
-      console.log("  }");
-      console.log("}");
-      console.log("");
-      console.log("var google_protobuf = require('google-protobuf');");
+      console.log("google_protobuf.object.extend(global, asserts);");
     }
     module = is_loadfromfile[1].replace("-", "_");
+    pkg = is_loadfromfile[2];
 
     if (module != "google_protobuf") {  // We unconditionally require this in the header.
       console.log("var " + module + " = require('" + is_loadfromfile[1] + "');");