diff --git a/dev/core/src/com/google/gwt/core/linker/D8ScriptLinker.java b/dev/core/src/com/google/gwt/core/linker/D8ScriptLinker.java
index 7c66a4d..a0611d3 100644
--- a/dev/core/src/com/google/gwt/core/linker/D8ScriptLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/D8ScriptLinker.java
@@ -25,7 +25,6 @@
 import com.google.gwt.core.ext.linker.LinkerOrder;
 import com.google.gwt.core.ext.linker.LinkerOrder.Order;
 import com.google.gwt.core.ext.linker.Shardable;
-import com.google.gwt.core.ext.linker.SyntheticArtifact;
 import com.google.gwt.core.ext.linker.Transferable;
 import com.google.gwt.core.ext.linker.impl.SelectionScriptLinker;
 import com.google.gwt.dev.About;
@@ -46,6 +45,9 @@
 @LinkerOrder(Order.PRIMARY)
 @Shardable
 public class D8ScriptLinker extends SelectionScriptLinker {
+
+  private static final char NEWLINE = '\n';
+
   @Override
   public String getDescription() {
     return "D8 Single Script";
@@ -54,10 +56,12 @@
   @Transferable
   private static class Script extends Artifact<Script> {
     private final String strongName;
+    private final String javaScript;
 
-    public Script(String strongName) {
+    public Script(String strongName, String javaScript) {
       super(D8ScriptLinker.class);
       this.strongName = strongName;
+      this.javaScript = javaScript;
     }
 
     @Override
@@ -83,6 +87,10 @@
     public String toString() {
       return "Script " + strongName;
     }
+
+    public String getJavaScript() {
+      return javaScript;
+    }
   }
 
   @Override
@@ -99,13 +107,9 @@
     }
 
     Collection<Artifact<?>> toReturn = new ArrayList<Artifact<?>>();
-    toReturn.add(new Script(result.getStrongName()));
+    toReturn.add(new Script(result.getStrongName(), js[0]));
     toReturn.addAll(emitSelectionInformation(result.getStrongName(), result));
 
-    SyntheticArtifact artifact = emitString(logger, js[0], result.getStrongName()
-        + ".js");
-    toReturn.add(artifact);
-
     return toReturn;
   }
 
@@ -126,24 +130,31 @@
 
     DefaultTextOutput out = new DefaultTextOutput(true);
 
+    StringBuilder prefixBuilder = new StringBuilder();
+
     // Emit the selection script.
     String bootstrap = generateSelectionScript(logger, context, artifacts);
     bootstrap = context.optimizeJavaScript(logger, bootstrap);
-    out.print(bootstrap);
-    out.newlineOpt();
+    prefixBuilder.append(bootstrap);
+    prefixBuilder.append(NEWLINE);
 
-    out.print("var $gwt_version = \"" + About.getGwtVersionNum() + "\";");
-    out.newlineOpt();
-    out.print("var $wnd = window;");
-    out.newlineOpt();
-    out.print("var $doc = $wnd.document;");
-    out.newlineOpt();
-    out.print("var $moduleName, $moduleBase;");
-    out.newlineOpt();
+    prefixBuilder.append("var $gwt_version = \"" + About.getGwtVersionNum() + "\";");
+    prefixBuilder.append(NEWLINE);
+    prefixBuilder.append("var $wnd = window;");
+    prefixBuilder.append(NEWLINE);
+    prefixBuilder.append("var $doc = $wnd.document;");
+    prefixBuilder.append(NEWLINE);
+    prefixBuilder.append("var $moduleName, $moduleBase;");
+    prefixBuilder.append(NEWLINE);
 
-    out.print("var $strongName = '" + result.getStrongName() + "';");
-    out.newlineOpt();
-    out.print("load($strongName + '.js');");
+    prefixBuilder.append("var $strongName = '" + result.getStrongName() + "';");
+    prefixBuilder.append(NEWLINE);
+
+    String prefix = prefixBuilder.toString();
+    out.print(prefix);
+
+    addSourceMapPrefix(artifacts, prefix);
+    out.print(result.getJavaScript());
 
     // Generate the call to tell the bootstrap code that we're ready to go.
     out.newlineOpt();
@@ -155,6 +166,25 @@
         + ".nocache.js");
   }
 
+  private void addSourceMapPrefix(
+      ArtifactSet artifacts,
+      String prefixLines) {
+    SymbolMapsLinker.ScriptFragmentEditsArtifact edArtifact = null;
+    for (SymbolMapsLinker.ScriptFragmentEditsArtifact editsArtifact :
+        artifacts.find(SymbolMapsLinker.ScriptFragmentEditsArtifact.class)) {
+      if (editsArtifact.getFragment() == 0) {
+        edArtifact = editsArtifact;
+        break;
+      }
+    }
+
+    if (edArtifact == null) {
+      edArtifact = new SymbolMapsLinker.ScriptFragmentEditsArtifact(null, 0);
+      artifacts.add(edArtifact);
+    }
+    edArtifact.prefixLines(prefixLines);
+  }
+
   /**
    * Unimplemented. Normally required by
    * {@link #doEmitCompilation(TreeLogger, LinkerContext, CompilationResult, ArtifactSet)}.
diff --git a/dev/core/src/com/google/gwt/core/linker/D8ScriptTemplate.js b/dev/core/src/com/google/gwt/core/linker/D8ScriptTemplate.js
index 23d3f98..0ce9607 100644
--- a/dev/core/src/com/google/gwt/core/linker/D8ScriptTemplate.js
+++ b/dev/core/src/com/google/gwt/core/linker/D8ScriptTemplate.js
@@ -16,7 +16,7 @@
 
 
 // ---------------- D8 GLOBALS ----------------
-window = {};
+window = this;
 // Alias self as well since it is a magic var sometimes provided
 // by the webworker linker.
 self = window;
@@ -29,11 +29,6 @@
 window.clearTimeout = function() { window.__d8warning("clearTimeout")};
 window.clearInterval = function() { window.__d8warning("clearInterval");};
 window.setInterval = function() { window.__d8warning("setInterval"); };
-window.Object = Object;
-window.Array = Array;
-window.Function = Function;
-window.String = String;
-window.Number = Number;
 navigator = {};
 navigator.userAgent = {};
 navigator.userAgent.toLowerCase = function(){ return "webkit";};
