Roll back Source Map support for GWT due to breakages seen by various teams

Review by: rdayal@google.com

git-svn-id: https://google-web-toolkit.googlecode.com/svn/trunk@10758 8db76d5a-ed1c-0410-87a9-c151d255dfc7
diff --git a/dev/build.xml b/dev/build.xml
index f586b2a..7318650 100755
--- a/dev/build.xml
+++ b/dev/build.xml
@@ -59,7 +59,6 @@
           <include name="apache/ant-1.6.5.jar" />
           <include name="eclipse/jdt-3.4.2.jar" />
           <include name="guava/guava-r06/guava-r06-rebased-2.jar" />
-          <include name="jscomp/sourcemap-rebased.jar" />
           <include name="jetty/jetty-6.1.11.jar" />
           <include name="icu4j/4.4.2/icu4j.jar" />
           <include name="protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
@@ -112,7 +111,6 @@
           <!-- htmlunit dependencies not already included: END -->
           <include name="sun/swingworker/swing-worker-1.1.jar" />
           <include name="guava/guava-r06/guava-r06-rebased-2.jar" />
-          <include name="jscomp/sourcemap-rebased.jar" />
         </fileset>
         <fileset file="build.xml"/>
       </sourcefiles>
@@ -125,7 +123,6 @@
           <zipfileset src="${gwt.tools.lib}/apache/ant-1.6.5.jar" />
           <zipfileset src="${gwt.tools.lib}/eclipse/jdt-3.4.2.jar" />
           <zipfileset src="${gwt.tools.lib}/guava/guava-r06/guava-r06-rebased-2.jar" />
-          <zipfileset src="${gwt.tools.lib}/jscomp/sourcemap-rebased.jar" />
           <zipfileset src="${gwt.tools.lib}/jetty/jetty-6.1.11.jar" />
           <zipfileset src="${gwt.tools.lib}/icu4j/4.4.2/icu4j.jar" />
           <zipfileset src="${gwt.tools.lib}/protobuf/protobuf-2.2.0/protobuf-java-rebased-2.2.0.jar" />
@@ -178,7 +175,6 @@
           <!-- htmlunit dependencies not already included: END -->
           <zipfileset src="${gwt.tools.lib}/sun/swingworker/swing-worker-1.1.jar" />
           <zipfileset src="${gwt.tools.lib}/guava/guava-r06/guava-r06-rebased-2.jar" />
-          <zipfileset src="${gwt.tools.lib}/jscomp/sourcemap-rebased.jar" />
         </gwt.jar>
       </sequential>
     </outofdate>
@@ -220,7 +216,6 @@
           <pathelement location="${gwt.tools.lib}/eclipse/jdt-3.4.2.jar" />
           <pathelement location="${gwt.tools.lib}/tomcat/commons-collections-3.1.jar" />
           <pathelement location="${gwt.tools.lib}/guava/guava-r06/guava-r06-rebased-2.jar" />
-          <pathelement location="${gwt.tools.lib}/jscomp/sourcemap-rebased.jar" />
       </classpath>
     </gwt.javac>
   </target>
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java b/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java
index 4be3a85..97cd1d7 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/SymbolData.java
@@ -92,11 +92,6 @@
   String getClassName();
 
   /**
-   * Returns the fragment number in which the symbol is declared (for a method).
-   */
-  int getFragmentNumber();
-
-  /**
    * Returns a JSNI-like identifier for the symbol if it a method or field,
    * otherwise <code>null</code>.
    */
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java
index 64fcc55..67d2cdf 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/SelectionScriptLinker.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -27,7 +27,6 @@
 import com.google.gwt.core.ext.linker.SelectionProperty;
 import com.google.gwt.core.ext.linker.SoftPermutation;
 import com.google.gwt.core.ext.linker.StatementRanges;
-import com.google.gwt.core.linker.SymbolMapsLinker;
 import com.google.gwt.dev.util.DefaultTextOutput;
 import com.google.gwt.dev.util.TextOutput;
 import com.google.gwt.dev.util.Util;
@@ -47,12 +46,20 @@
 import java.util.TreeMap;
 
 /**
- * A base class for Linkers that use an external script to boostrap the GWT module. This
- * implementation injects JavaScript Snippets into a JS program defined in an external file.
+ * A base class for Linkers that use an external script to boostrap the GWT
+ * module. This implementation injects JavaScript Snippets into a JS program
+ * defined in an external file.
  */
 public abstract class SelectionScriptLinker extends AbstractLinker {
+  /**
+   * TODO(bobv): Move this class into c.g.g.core.linker when HostedModeLinker
+   * goes away?
+   */
 
-  public static final String USE_SOURCE_MAPS_PROPERTY = "compiler.useSourceMaps";
+  /**
+   * A configuration property indicating how large each script tag should be.
+   */
+  private static final String CHUNK_SIZE_PROPERTY = "iframe.linker.script.chunk.size";
 
   /**
    * File name for computeScriptBase.js.
@@ -80,45 +87,34 @@
   protected static final String PROCESS_METAS_JS = "com/google/gwt/core/ext/linker/impl/processMetasOld.js";
 
   /**
-   * TODO(bobv): Move this class into c.g.g.core.linker when HostedModeLinker
-   * goes away?
-   */
-
-  /**
-   * A configuration property indicating how large each script tag should be.
-   */
-  private static final String CHUNK_SIZE_PROPERTY = "iframe.linker.script.chunk.size";
-
-  /**
-   * A configuration property that can be used to have the linker load from somewhere other than
-   * {@link #FRAGMENT_SUBDIR}.
+   * A configuration property that can be used to have the linker load from
+   * somewhere other than {@link #FRAGMENT_SUBDIR}.
    */
   private static final String PROP_FRAGMENT_SUBDIR_OVERRIDE = "iframe.linker.deferredjs.subdir";
 
+  protected static void replaceAll(StringBuffer buf, String search,
+      String replace) {
+    int len = search.length();
+    for (int pos = buf.indexOf(search); pos >= 0; pos = buf.indexOf(search,
+        pos + 1)) {
+      buf.replace(pos, pos + len, replace);
+    }
+  }
+
   /**
-   * Split a JavaScript string into multiple chunks, at statement boundaries. This method is made
-   * default access for testing.
-   *
-   * @param ranges               Describes where the statements are located within the JavaScript
-   *                             code. If <code>null</code>, then return <code>js</code> unchanged.
-   * @param js                   The JavaScript code to be split up.
-   * @param charsPerChunk        The number of characters to be put in each script tag.
+   * Split a JavaScript string into multiple chunks, at statement boundaries.
+   * This method is made default access for testing.
+   * 
+   * @param ranges Describes where the statements are located within the
+   *          JavaScript code. If <code>null</code>, then return <code>js</code>
+   *          unchanged.
+   * @param js The JavaScript code to be split up.
+   * @param charsPerChunk The number of characters to be put in each script tag.
    * @param scriptChunkSeparator The string to insert between chunks.
-   * @param context
    */
   public static String splitPrimaryJavaScript(StatementRanges ranges, String js,
-      int charsPerChunk, String scriptChunkSeparator, LinkerContext context) {
-    boolean useSourceMaps = false;
-    for (SelectionProperty prop : context.getProperties()) {
-      if (USE_SOURCE_MAPS_PROPERTY.equals(prop.getName())) {
-        String str = prop.tryGetValue();
-        useSourceMaps = str == null ? false : Boolean.parseBoolean(str);
-        break;
-      }
-    }
-
-    // TODO(cromwellian) enable chunking with sourcemaps
-    if (charsPerChunk < 0 || ranges == null || useSourceMaps) {
+      int charsPerChunk, String scriptChunkSeparator) {
+    if (charsPerChunk < 0 || ranges == null) {
       return js;
     }
 
@@ -151,22 +147,13 @@
     return sb.toString();
   }
 
-  protected static void replaceAll(StringBuffer buf, String search,
-      String replace) {
-    int len = search.length();
-    for (int pos = buf.indexOf(search); pos >= 0; pos = buf.indexOf(search,
-        pos + 1)) {
-      buf.replace(pos, pos + len, replace);
-    }
-  }
-
   private static char lastChar(StringBuilder sb) {
     return sb.charAt(sb.length() - 1);
   }
 
   /**
-   * This method is left in place for existing subclasses of SelectionScriptLinker that have not
-   * been upgraded for the sharding API.
+   * This method is left in place for existing subclasses of
+   * SelectionScriptLinker that have not been upgraded for the sharding API.
    */
   @Override
   public ArtifactSet link(TreeLogger logger, LinkerContext context,
@@ -182,26 +169,15 @@
       throws UnableToCompleteException {
     if (onePermutation) {
       ArtifactSet toReturn = new ArtifactSet(artifacts);
-      ArtifactSet writableArtifacts = new ArtifactSet(artifacts);
 
       /*
        * Support having multiple compilation results because this method is also
        * called from the legacy link method.
        */
       for (CompilationResult compilation : toReturn.find(CompilationResult.class)) {
-        // pass a writable set so that other stages can use this set for temporary storage
-        toReturn.addAll(doEmitCompilation(logger, context, compilation, writableArtifacts));
+        toReturn.addAll(doEmitCompilation(logger, context, compilation, artifacts));
         maybeAddHostedModeFile(logger, context, toReturn, compilation);
       }
-      /*
-       * Find edit artifacts added during linking and add them. This is done as a way of returning
-       * arbitrary extra outputs from within the linker methods without having to modify
-       * their return signatures to pass extra return data around.
-       */
-      for (SymbolMapsLinker.ScriptFragmentEditsArtifact ea : writableArtifacts.find(
-          SymbolMapsLinker.ScriptFragmentEditsArtifact.class)) {
-        toReturn.add(ea);
-      }
       return toReturn;
     } else {
       permutationsUtil.setupPermutationsMap(artifacts);
@@ -222,8 +198,8 @@
   }
 
   /**
-   * Extract via {@link #CHUNK_SIZE_PROPERTY} the number of characters to be included in each
-   * chunk.
+   * Extract via {@link #CHUNK_SIZE_PROPERTY} the number of characters to be
+   * included in each chunk.
    */
   protected int charsPerChunk(LinkerContext context, TreeLogger logger) {
     SortedSet<ConfigurationProperty> configProps = context.getConfigurationProperties();
@@ -247,10 +223,9 @@
     String[] js = result.getJavaScript();
     byte[][] bytes = new byte[js.length][];
     bytes[0] = generatePrimaryFragment(logger, context, result, js, artifacts);
-
     for (int i = 1; i < js.length; i++) {
-      bytes[i] = Util.getBytes(generateDeferredFragment(logger, context, i, js[i], artifacts,
-          result));
+      bytes[i] = Util.getBytes(generateDeferredFragment(logger, context, i,
+          js[i]));
     }
 
     Collection<Artifact<?>> toReturn = new ArrayList<Artifact<?>>();
@@ -262,6 +237,7 @@
     }
 
     toReturn.addAll(emitSelectionInformation(result.getStrongName(), result));
+ 
     return toReturn;
   }
 
@@ -284,10 +260,10 @@
     return emitString(logger, ss, context.getModuleName()
         + ".nocache.js", lastModified);
   }
-
+  
   /**
-   * Generate a selection script. The selection information should previously have been scanned
-   * using {@link PermutationsUtil#setupPermutationsMap(ArtifactSet)}.
+   * Generate a selection script. The selection information should previously
+   * have been scanned using {@link PermutationsUtil#setupPermutationsMap(ArtifactSet)}.
    */
   protected String fillSelectionScriptTemplate(StringBuffer selectionScript,
       TreeLogger logger, LinkerContext context, ArtifactSet artifacts,
@@ -305,10 +281,10 @@
     }
     replaceAll(selectionScript, "__COMPUTE_SCRIPT_BASE__", computeScriptBase);
     replaceAll(selectionScript, "__PROCESS_METAS__", processMetas);
-
+    
     selectionScript = ResourceInjectionUtil.injectResources(selectionScript, artifacts);
     permutationsUtil.addPermutationsJs(selectionScript, logger, context);
-
+    
     replaceAll(selectionScript, "__MODULE_FUNC__",
         context.getModuleFunctionName());
     replaceAll(selectionScript, "__MODULE_NAME__", context.getModuleName());
@@ -316,98 +292,71 @@
 
     return selectionScript.toString();
   }
-
+  
   /**
-   * @param logger   a TreeLogger
-   * @param context  a LinkerContext
+   * @param logger a TreeLogger
+   * @param context a LinkerContext
    * @param fragment the fragment number
    */
   protected String generateDeferredFragment(TreeLogger logger,
-      LinkerContext context, int fragment, String js, ArtifactSet artifacts,
-      CompilationResult result)
-      throws UnableToCompleteException {
-    StringBuilder b = new StringBuilder();
-    String strongName = result == null ? "" : result.getStrongName();
-    String prefix = getDeferredFragmentPrefix(logger, context, fragment);
-    b.append(prefix);
-    b.append(js);
-    b.append(getDeferredFragmentSuffix(logger, context, fragment));
-    SymbolMapsLinker.ScriptFragmentEditsArtifact editsArtifact
-        = new SymbolMapsLinker.ScriptFragmentEditsArtifact(strongName, fragment);
-    editsArtifact.prefixLines(prefix);
-    artifacts.add(editsArtifact);
-    return wrapDeferredFragment(logger, context, fragment, b.toString(), artifacts);
+      LinkerContext context, int fragment, String js) {
+    return js;
   }
 
   /**
-   * Generate the primary fragment. The default implementation is based on {@link
-   * #getModulePrefix(TreeLogger, LinkerContext, String, int)} and {@link
-   * #getModuleSuffix(TreeLogger, LinkerContext)}.
+   * Generate the primary fragment. The default implementation is based on
+   * {@link #getModulePrefix(TreeLogger, LinkerContext, String, int)} and
+   * {@link #getModuleSuffix(TreeLogger, LinkerContext)}.
    */
   protected byte[] generatePrimaryFragment(TreeLogger logger,
       LinkerContext context, CompilationResult result, String[] js,
       ArtifactSet artifacts) throws UnableToCompleteException {
     TextOutput to = new DefaultTextOutput(context.isOutputCompact());
     String temp = splitPrimaryJavaScript(result.getStatementRanges()[0], js[0],
-        charsPerChunk(context, logger), getScriptChunkSeparator(logger, context), context);
+        charsPerChunk(context, logger), getScriptChunkSeparator(logger, context));
     to.print(generatePrimaryFragmentString(
         logger, context, result, temp, js.length, artifacts));
     return Util.getBytes(to.toString());
   }
-
+  
   protected String generatePrimaryFragmentString(TreeLogger logger,
       LinkerContext context, CompilationResult result, String js, int length,
-      ArtifactSet artifacts)
-      throws UnableToCompleteException {
+      ArtifactSet artifacts) 
+  throws UnableToCompleteException {
     StringBuffer b = new StringBuffer();
     String strongName = result == null ? "" : result.getStrongName();
-
-    String modulePrefix = getModulePrefix(logger, context, strongName, length);
-    SymbolMapsLinker.ScriptFragmentEditsArtifact editsArtifact
-        = new SymbolMapsLinker.ScriptFragmentEditsArtifact(strongName, 0);
-    editsArtifact.prefixLines(modulePrefix);
-    artifacts.add(editsArtifact);
-    b.append(modulePrefix);
+    b.append(getModulePrefix(logger, context, strongName, length));
     b.append(js);
     b.append(getModuleSuffix(logger, context));
     return wrapPrimaryFragment(logger, context, b.toString(), artifacts, result);
   }
-
+  
   protected String generateSelectionScript(TreeLogger logger,
       LinkerContext context, ArtifactSet artifacts) throws UnableToCompleteException {
     return generateSelectionScript(logger, context, artifacts, null);
   }
-
+  
   protected String generateSelectionScript(TreeLogger logger,
-      LinkerContext context, ArtifactSet artifacts, CompilationResult result)
-      throws UnableToCompleteException {
+        LinkerContext context, ArtifactSet artifacts, CompilationResult result)
+        throws UnableToCompleteException {
     String selectionScriptText;
     StringBuffer buffer = readFileToStringBuffer(
-        getSelectionScriptTemplate(logger, context), logger);
+        getSelectionScriptTemplate(logger,context), logger);
     selectionScriptText = fillSelectionScriptTemplate(
         buffer, logger, context, artifacts, result);
     selectionScriptText =
-        context.optimizeJavaScript(logger, selectionScriptText);
+      context.optimizeJavaScript(logger, selectionScriptText);
     return selectionScriptText;
   }
-
+  
   protected abstract String getCompilationExtension(TreeLogger logger,
       LinkerContext context) throws UnableToCompleteException;
 
-  protected String getDeferredFragmentPrefix(TreeLogger logger, LinkerContext context,
-      int fragment) {
-    return "";
-  }
-
-  protected String getDeferredFragmentSuffix(TreeLogger logger, LinkerContext context,
-      int fragment) {
-    return "";
-  }
-
   /**
-   * Returns the subdirectory name to be used by getModulPrefix when requesting a runAsync module.
-   * It is specified by {@link #PROP_FRAGMENT_SUBDIR_OVERRIDE} and, aside from test cases, is always
-   * {@link #FRAGMENT_SUBDIR}.
+   * Returns the subdirectory name to be used by getModulPrefix when requesting
+   * a runAsync module. It is specified by
+   * {@link #PROP_FRAGMENT_SUBDIR_OVERRIDE} and, aside from test cases, is
+   * always {@link #FRAGMENT_SUBDIR}.
    */
   protected final String getFragmentSubdir(TreeLogger logger,
       LinkerContext context) throws UnableToCompleteException {
@@ -426,25 +375,27 @@
 
     return subdir;
   }
-
+  
   protected String getHostedFilename() {
     return "";
   }
-
+  
   /**
-   * Compute the beginning of a JavaScript file that will hold the main module implementation.
+   * Compute the beginning of a JavaScript file that will hold the main module
+   * implementation.
    */
   protected abstract String getModulePrefix(TreeLogger logger,
       LinkerContext context, String strongName)
       throws UnableToCompleteException;
-
+  
   /**
-   * Compute the beginning of a JavaScript file that will hold the main module implementation. By
-   * default, calls {@link #getModulePrefix(TreeLogger, LinkerContext, String)}.
-   *
-   * @param strongName   strong name of the module being emitted
-   * @param numFragments the number of fragments for this module, including the main fragment
-   *                     (fragment 0)
+   * Compute the beginning of a JavaScript file that will hold the main module
+   * implementation. By default, calls
+   * {@link #getModulePrefix(TreeLogger, LinkerContext, String)}.
+   * 
+   * @param strongName strong name of the module being emitted
+   * @param numFragments the number of fragments for this module, including the
+   *          main fragment (fragment 0)
    */
   protected String getModulePrefix(TreeLogger logger, LinkerContext context,
       String strongName, int numFragments) throws UnableToCompleteException {
@@ -455,9 +406,9 @@
       LinkerContext context) throws UnableToCompleteException;
 
   /**
-   * Some subclasses support "chunking" of the primary fragment. If chunking will be supported, this
-   * function should be overridden to return the string which should be inserted between each
-   * chunk.
+   * Some subclasses support "chunking" of the primary fragment. If chunking will
+   * be supported, this function should be overridden to return the string which
+   * should be inserted between each chunk.
    */
   protected String getScriptChunkSeparator(TreeLogger logger, LinkerContext context) {
     return "";
@@ -465,11 +416,11 @@
 
   protected abstract String getSelectionScriptTemplate(TreeLogger logger,
       LinkerContext context) throws UnableToCompleteException;
-
+  
   /**
    * Add the Development Mode file to the artifact set.
    */
-  protected void maybeAddHostedModeFile(TreeLogger logger,
+  protected void maybeAddHostedModeFile(TreeLogger logger, 
       LinkerContext context, ArtifactSet artifacts, CompilationResult result)
       throws UnableToCompleteException {
     String hostedFilename = getHostedFilename();
@@ -528,12 +479,6 @@
     return buffer;
   }
 
-  protected String wrapDeferredFragment(TreeLogger logger,
-      LinkerContext context, int fragment, String script, ArtifactSet artifacts)
-      throws UnableToCompleteException {
-    return script;
-  }
-
   protected String wrapPrimaryFragment(TreeLogger logger,
       LinkerContext context, String script, ArtifactSet artifacts,
       CompilationResult result) throws UnableToCompleteException {
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java
index d1344a6..78cfb0c 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/StandardSymbolData.java
@@ -57,7 +57,6 @@
   }
 
   private String className;
-  private int fragmentNumber = -1;
   private String memberName;
   private String methodSig;
   private int sourceLine;
@@ -92,10 +91,6 @@
     return className;
   }
 
-  public int getFragmentNumber() {
-    return fragmentNumber;
-  }
-
   public String getJsniIdent() {
     if (memberName == null) {
       return null;
@@ -142,10 +137,6 @@
     return methodSig != null;
   }
 
-  public void setFragmentNumber(int fragNum) {
-    fragmentNumber = fragNum;
-  }
-
   public void setSymbolName(String symbolName) {
     this.symbolName = symbolName;
   }
@@ -177,7 +168,6 @@
     queryId = in.readInt();
     castableTypeMap = (CastableTypeMap) in.readObject();
     seedId = in.readInt();
-    fragmentNumber = in.readInt();
   }
 
   /**
@@ -207,7 +197,5 @@
     out.writeInt(queryId);
     out.writeObject(castableTypeMap);
     out.writeInt(seedId);
-    out.writeInt(fragmentNumber);
   }
-
 }
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptAlreadyIncluded.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptAlreadyIncluded.js
index d7e56f0..2417267 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptAlreadyIncluded.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptAlreadyIncluded.js
@@ -8,48 +8,21 @@
   __WAIT_FOR_BODY_LOADED__
 
   function installCode(code) {
-     function removeScript(body, element) {
+    var docbody = getInstallLocation();
+    for (var i = 0; i < code.length; i++) {
+      var script = getInstallLocationDoc().createElement('script');
+      script.language='javascript';
+      script.text = code[i];
+      docbody.appendChild(script);
+
       // Unless we're in pretty mode, remove the tags to shrink the DOM a little.
       // It should have installed its code immediately after being added.
-
       __START_OBFUSCATED_ONLY__
-	  body.removeChild(element);
+      docbody.removeChild(script);
       __END_OBFUSCATED_ONLY__
     }
-
-    var docbody = getInstallLocation();
-    var doc = getInstallLocationDoc();
-    var script;
-    // for sourcemaps, we inject textNodes into the script element on Chrome
-    if (navigator.userAgent.indexOf("Chrome") > -1 && window.JSON) {
-      var scriptFrag = doc.createDocumentFragment()
-      // surround code with eval until crbug #90707 
-      scriptFrag.appendChild(doc.createTextNode("eval(\""));
-      for (var i = 0; i < code.length; i++) {
-        // escape newlines, backslashes, and quotes with JSON.stringify
-        // rather than create multiple script tags which mess up line numbers, we use 1 tag, multiple text nodes
-        var c = window.JSON.stringify(code[i]); 
-        // trim beginning/end quotes
-        scriptFrag.appendChild(doc.createTextNode(c.substring(1, c.length - 1)));
-      }
-      // close the eval
-      scriptFrag.appendChild(doc.createTextNode("\");"));
-      script = doc.createElement('script');
-      script.language='javascript';
-      script.appendChild(scriptFrag);
-      docbody.appendChild(script);
-      removeScript(docbody, script);
-    } else {
-      for (var i = 0; i < code.length; i++) {
-        script = doc.createElement('script');
- 	script.language='javascript';
-	script.text = code[i];
-        docbody.appendChild(script);
-        removeScript(docbody, script);
-      }
-    }
   }
-
+  
   // Set up a script tag to start downloading immediately, as well as a
   // callback to install the code once it is downloaded and the body is loaded.
   __MODULE_FUNC__.onScriptDownloaded = function(code) {
diff --git a/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js b/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js
index 52ad608..9375003 100644
--- a/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js
+++ b/dev/core/src/com/google/gwt/core/ext/linker/impl/installScriptEarlyDownload.js
@@ -7,48 +7,21 @@
   __WAIT_FOR_BODY_LOADED__
 
   function installCode(code) {
-     function removeScript(body, element) {
+    var docbody = getInstallLocation();
+    for (var i = 0; i < code.length; i++) {
+      var script = getInstallLocationDoc().createElement('script');
+      script.language='javascript';
+      script.text = code[i];
+      docbody.appendChild(script);
+
       // Unless we're in pretty mode, remove the tags to shrink the DOM a little.
       // It should have installed its code immediately after being added.
-
       __START_OBFUSCATED_ONLY__
-	  body.removeChild(element);
+      docbody.removeChild(script);
       __END_OBFUSCATED_ONLY__
     }
-
-    var docbody = getInstallLocation();
-    var doc = getInstallLocationDoc();
-    var script;
-    // for sourcemaps, we inject textNodes into the script element on Chrome
-    if (navigator.userAgent.indexOf("Chrome") > -1 && window.JSON) {
-      var scriptFrag = doc.createDocumentFragment()
-      // surround code with eval until crbug #90707 
-      scriptFrag.appendChild(doc.createTextNode("eval(\""));
-      for (var i = 0; i < code.length; i++) {
-        // escape newlines, backslashes, and quotes with JSON.stringify
-        // rather than create multiple script tags which mess up line numbers, we use 1 tag, multiple text nodes
-        var c = window.JSON.stringify(code[i]); 
-        // trim beginning/end quotes
-        scriptFrag.appendChild(doc.createTextNode(c.substring(1, c.length - 1)));
-      }
-      // close the eval
-      scriptFrag.appendChild(doc.createTextNode("\");"));
-      script = doc.createElement('script');
-      script.language='javascript';
-      script.appendChild(scriptFrag);
-      docbody.appendChild(script);
-      removeScript(docbody, script);
-    } else {
-      for (var i = 0; i < code.length; i++) {
-        script = doc.createElement('script');
- 	script.language='javascript';
-	script.text = code[i];
-        docbody.appendChild(script);
-        removeScript(docbody, script);
-      }
-    }
   }
-
+  
   // Set up a script tag to start downloading immediately, as well as a
   // callback to install the code once it is downloaded and the body is loaded.
   __MODULE_FUNC__.onScriptDownloaded = function(code) {
diff --git a/dev/core/src/com/google/gwt/core/ext/soyc/Range.java b/dev/core/src/com/google/gwt/core/ext/soyc/Range.java
index 9239310..f98fe68 100644
--- a/dev/core/src/com/google/gwt/core/ext/soyc/Range.java
+++ b/dev/core/src/com/google/gwt/core/ext/soyc/Range.java
@@ -55,21 +55,7 @@
   };
 
   final int end;
-  final int endLine;
-  final int endColumn;
   final int start;
-  final int startLine;
-  final int startColumn;
-
-  /**
-   * Constructor.
-   *
-   * @param start must be non-negative
-   * @param end must be greater than or equal to <code>start</code>
-   */
-  public Range(int start, int end) {
-    this(start, end, 0, 0, 0, 0);
-  }
 
   /**
    * Constructor.
@@ -77,17 +63,11 @@
    * @param start must be non-negative
    * @param end must be greater than or equal to <code>start</code>
    */
-  public Range(int start, int end, int startLine, int startColumn, int endLine, int endColumn) {
-
+  public Range(int start, int end) {
     assert start >= 0;
     assert start <= end;
-
     this.start = start;
     this.end = end;
-    this.startLine = startLine;
-    this.startColumn = startColumn;
-    this.endLine = endLine;
-    this.endColumn = endColumn;
   }
 
   /**
@@ -110,26 +90,10 @@
     return end;
   }
 
-  public int getEndColumn() {
-    return endColumn;
-  }
-
-  public int getEndLine() {
-    return endLine;
-  }
-
   public int getStart() {
     return start;
   }
 
-  public int getStartColumn() {
-    return startColumn;
-  }
-
-  public int getStartLine() {
-    return startLine;
-  }
-
   @Override
   public int hashCode() {
     return 37 * start + end;
diff --git a/dev/core/src/com/google/gwt/core/ext/soyc/SourceMapRecorder.java b/dev/core/src/com/google/gwt/core/ext/soyc/SourceMapRecorder.java
deleted file mode 100644
index 6251b91..0000000
--- a/dev/core/src/com/google/gwt/core/ext/soyc/SourceMapRecorder.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.core.ext.soyc;
-
-import com.google.debugging.sourcemap.FilePosition;
-import com.google.debugging.sourcemap.SourceMapFormat;
-import com.google.debugging.sourcemap.SourceMapGenerator;
-import com.google.debugging.sourcemap.SourceMapGeneratorFactory;
-import com.google.gwt.core.ext.linker.SyntheticArtifact;
-import com.google.gwt.core.linker.SymbolMapsLinker;
-import com.google.gwt.dev.jjs.InternalCompilerException;
-import com.google.gwt.dev.jjs.SourceInfo;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Creates Closure Compatible SourceMaps.
- */
-public class SourceMapRecorder {
-
-  public static List<SyntheticArtifact> makeSourceMapArtifacts(
-      List<Map<Range, SourceInfo>> sourceInfoMaps,
-      int permutationId) {
-    List<SyntheticArtifact> toReturn = new ArrayList<SyntheticArtifact>();
-    recordSourceMap(sourceInfoMaps, toReturn, permutationId);
-    return toReturn;
-  }
-
-  public static void recordSourceMap(List<Map<Range, SourceInfo>> sourceInfoMaps,
-       List<SyntheticArtifact> artifacts, int permutationId) {
-    ByteArrayOutputStream baos = new ByteArrayOutputStream();
-
-    SourceMapGenerator generator = SourceMapGeneratorFactory.getInstance(SourceMapFormat.V3);
-    OutputStreamWriter out = new OutputStreamWriter(baos);
-    int fragment = 0;
-    if (!sourceInfoMaps.isEmpty()) {
-      for (Map<Range, SourceInfo> sourceMap : sourceInfoMaps) {
-        generator.reset();
-        Set<Range> rangeSet = sourceMap.keySet();
-        Range[] ranges = rangeSet.toArray(new Range[rangeSet.size()]);
-        Arrays.sort(ranges, Range.DEPENDENCY_ORDER_COMPARATOR);
-        for (Range r : ranges) {
-          SourceInfo si = sourceMap.get(r);
-          if (si.getFileName() == null || si.getStartLine() < 0) {
-            // skip over synthetics with no Java source
-            continue;
-          }
-          if (r.getStartLine() == 0 || r.getEndLine() == 0) {
-            // or other bogus entries that appear
-            continue;
-          }
-          generator.addMapping(si.getFileName(), null,
-              new FilePosition(si.getStartLine(), 0),
-              new FilePosition(r.getStartLine(), r.getStartColumn()),
-              new FilePosition(r.getEndLine(), r.getEndColumn()));
-        }
-        try {
-          baos.reset();
-          generator.appendTo(out, "sourceMap" + fragment);
-          out.flush();
-          artifacts.add(new SymbolMapsLinker.SourceMapArtifact(permutationId, fragment,
-              baos.toByteArray()));
-          fragment++;
-        } catch (IOException e) {
-          throw new InternalCompilerException(e.toString(), e);
-        }
-      }
-    }
-  }
-}
diff --git a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
index 1c74cf1..4635518 100644
--- a/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/CrossSiteIframeLinker.java
@@ -61,6 +61,22 @@
   private static final String FAIL_IF_SCRIPT_TAG_PROPERTY = "xsiframe.failIfScriptTag";
 
   @Override
+  protected String generateDeferredFragment(TreeLogger logger,
+      LinkerContext context, int fragment, String js) {
+    // TODO(unnurg): This assumes that the xsiframe linker is using the
+    // ScriptTagLoadingStrategy (since it is also xs compatible).  However,
+    // it should be completely valid to use the XhrLoadingStrategy with this
+    // linker, in which case we would not want to wrap the deferred fragment
+    // in this way.  Ideally, we should make a way for this code to be dependent
+    // on what strategy is being used. Otherwise, we should make a property which
+    // users can set to turn this wrapping off if they override the loading strategy.
+    return String.format("$wnd.%s.runAsyncCallback%d(%s)\n",
+        context.getModuleFunctionName(),
+        fragment,
+        JsToStringGenerationVisitor.javaScriptString(js));
+  }
+  
+  @Override
   public String getDescription() {
     return "Cross-Site-Iframe";
   }
@@ -87,7 +103,7 @@
     // Must do permutations before providers
     includeJs(ss, logger, getJsPermutations(context), "__PERMUTATIONS__");
     includeJs(ss, logger, getJsProperties(context), "__PROPERTIES__");
-
+    
     // Order doesn't matter for the rest
     includeJs(ss, logger, getJsProcessMetas(context), "__PROCESS_METAS__");
     includeJs(ss, logger, getJsInstallLocation(context), "__INSTALL_LOCATION__");
@@ -173,11 +189,6 @@
     return ".cache.js";
   }
 
-   protected String getDeferredFragmentSuffix(TreeLogger logger, LinkerContext context,
-      int fragment) {
-    return "\n//@ sourceURL=" + fragment + ".js\n";
-  }
-
   @Override
   protected String getHostedFilename() {
     return "devmode.js";
@@ -292,7 +303,7 @@
   protected String getJsProperties(LinkerContext context) {
     return "com/google/gwt/core/ext/linker/impl/properties.js";
   }
-
+  
   /**
    * Returns the name of the {@code JsRunAsync} script.  By default,
    * returns {@code "com/google/gwt/core/ext/linker/impl/runAsync.js"}.
@@ -351,7 +362,7 @@
     out.newlineOpt();
     out.print("function __gwtInstallCode(code) {return __gwtModuleFunction.__installRunAsyncCode(code);}");
     out.newlineOpt();
-
+    
     // Even though we call the $sendStats function in the code written in this
     // linker, some of the compilation code still needs the $stats and
     // $sessionId
@@ -375,7 +386,7 @@
         + "__gwtModuleFunction.__computePropValue);");
     out.newlineOpt();
     out.print("$sendStats('moduleStartup', 'end');");
-    out.print("\n//@ sourceURL=0.js\n");
+
     return out.toString();
   }
 
@@ -495,22 +506,6 @@
   }
 
   @Override
-  protected String wrapDeferredFragment(TreeLogger logger,
-      LinkerContext context, int fragment, String js, ArtifactSet artifacts) {
-    // TODO(unnurg): This assumes that the xsiframe linker is using the
-    // ScriptTagLoadingStrategy (since it is also xs compatible).  However,
-    // it should be completely valid to use the XhrLoadingStrategy with this
-    // linker, in which case we would not want to wrap the deferred fragment
-    // in this way.  Ideally, we should make a way for this code to be dependent
-    // on what strategy is being used. Otherwise, we should make a property which
-    // users can set to turn this wrapping off if they override the loading strategy.
-    return String.format("$wnd.%s.runAsyncCallback%d(%s)\n",
-        context.getModuleFunctionName(),
-        fragment,
-        JsToStringGenerationVisitor.javaScriptString(js));
-  }
-
-  @Override
   protected String wrapPrimaryFragment(TreeLogger logger, LinkerContext context, String script,
       ArtifactSet artifacts, CompilationResult result) throws UnableToCompleteException {
     StringBuffer out = new StringBuffer();
@@ -534,4 +529,5 @@
     }
     return out.toString();
   }
+
 }
diff --git a/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java b/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
index fae5c92..ded6042 100644
--- a/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/IFrameLinker.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -18,12 +18,15 @@
 import com.google.gwt.core.ext.LinkerContext;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
+import com.google.gwt.core.ext.linker.ArtifactSet;
+import com.google.gwt.core.ext.linker.CompilationResult;
 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.impl.SelectionScriptLinker;
 import com.google.gwt.dev.About;
 import com.google.gwt.dev.util.DefaultTextOutput;
+import com.google.gwt.dev.util.Util;
 
 /**
  * Implements the canonical GWT bootstrap sequence that loads the GWT module in
@@ -43,6 +46,26 @@
     return "Standard";
   }
 
+  /*
+   * This implementation divides the code of the initial fragment into multiple
+   * script tags. These chunked script tags loads faster on Firefox even when
+   * the data is cached. Additionally, having the script tags separated means
+   * that the early ones can be evaluated before the later ones have finished
+   * downloading. As a result of this parallelism, the overall time to get the
+   * JavaScript downloaded and evaluated can lower.
+   */
+  @Override
+  protected byte[] generatePrimaryFragment(TreeLogger logger,
+      LinkerContext context, CompilationResult result, String[] js,
+      ArtifactSet artifacts) throws UnableToCompleteException {
+    StringBuffer b = new StringBuffer();
+    b.append(getModulePrefix(logger, context, result.getStrongName(), js.length));
+    b.append(splitPrimaryJavaScript(result.getStatementRanges()[0], js[0],
+        charsPerChunk(context, logger), getScriptChunkSeparator(logger, context)));
+    b.append(getModuleSuffix(logger, context));
+    return Util.getBytes(b.toString());
+  }
+  
   @Override
   protected String getCompilationExtension(TreeLogger logger,
       LinkerContext context) {
@@ -95,7 +118,7 @@
   protected String getSelectionScriptTemplate(TreeLogger logger, LinkerContext context) {
     return "com/google/gwt/core/linker/IFrameTemplate.js";
   }
-
+  
   protected String modifyPrimaryJavaScript(String js) {
     return js;
   }
diff --git a/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java b/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
index 1ea76e1..5dc937e 100644
--- a/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/SymbolMapsLinker.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,176 +15,39 @@
  */
 package com.google.gwt.core.linker;
 
-import com.google.debugging.sourcemap.SourceMapGeneratorV3;
 import com.google.gwt.core.ext.LinkerContext;
 import com.google.gwt.core.ext.TreeLogger;
 import com.google.gwt.core.ext.UnableToCompleteException;
 import com.google.gwt.core.ext.linker.AbstractLinker;
-import com.google.gwt.core.ext.linker.Artifact;
 import com.google.gwt.core.ext.linker.ArtifactSet;
 import com.google.gwt.core.ext.linker.CompilationResult;
 import com.google.gwt.core.ext.linker.EmittedArtifact;
 import com.google.gwt.core.ext.linker.EmittedArtifact.Visibility;
 import com.google.gwt.core.ext.linker.LinkerOrder;
-import com.google.gwt.core.ext.linker.LinkerOrder.Order;
 import com.google.gwt.core.ext.linker.SelectionProperty;
 import com.google.gwt.core.ext.linker.Shardable;
 import com.google.gwt.core.ext.linker.SymbolData;
-import com.google.gwt.core.ext.linker.SyntheticArtifact;
-import com.google.gwt.dev.util.Util;
-import com.google.gwt.dev.util.collect.HashMap;
+import com.google.gwt.core.ext.linker.LinkerOrder.Order;
 
 import java.io.ByteArrayOutputStream;
 import java.io.PrintWriter;
 import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
 import java.util.Map;
 import java.util.SortedMap;
 
 /**
- * This Linker exports the symbol maps associated with each compilation result as a private file.
- * The names of the symbol maps files are computed by appending {@value #STRONG_NAME_SUFFIX} to the
- * value returned by {@link CompilationResult#getStrongName()}.
+ * This Linker exports the symbol maps associated with each compilation result
+ * as a private file. The names of the symbol maps files are computed by
+ * appending {@value #STRONG_NAME_SUFFIX} to the value returned by
+ * {@link CompilationResult#getStrongName()}.
  */
 @LinkerOrder(Order.POST)
 @Shardable
 public class SymbolMapsLinker extends AbstractLinker {
 
-
   /**
-   * Artifact to record insertions or deletions made to Javascript fragments.
-   */
-  public static class ScriptFragmentEditsArtifact extends Artifact<ScriptFragmentEditsArtifact> {
-
-    /**
-     * Operation type performed on script.
-     */
-    public enum Edit {
-      PREFIX, INSERT, REMOVE;
-    }
-
-    private static class EditOperation {
-
-      public static EditOperation insert(int lineNumber, String data) {
-        return new EditOperation(Edit.INSERT, lineNumber, data);
-      }
-
-      public static EditOperation prefix(String data) {
-        return new EditOperation(Edit.PREFIX, 0, data);
-      }
-
-      public static EditOperation remove(int lineNumber) {
-        return new EditOperation(Edit.REMOVE, lineNumber, null);
-      }
-
-      Edit op;
-      int lineNumber;
-      int numLines;
-
-      public EditOperation(
-          Edit op, int lineNumber, String data) {
-        this.op = op;
-        this.lineNumber = lineNumber;
-        this.numLines = countNewLines(data);
-      }
-
-      public int getLineNumber() {
-        return lineNumber;
-      }
-
-      public int getNumLines() {
-        return numLines;
-      }
-
-      public Edit getOp() {
-        return op;
-      }
-
-      private int countNewLines(String chunkJs) {
-        int newLineCount = 0;
-        for (int j = 0; j < chunkJs.length(); j++) {
-          if (chunkJs.charAt(j) == '\n') {
-            newLineCount++;
-          }
-        }
-        return newLineCount;
-      }
-    }
-
-    private List<EditOperation> editOperations = new ArrayList<EditOperation>();
-
-    private String strongName;
-    private int fragment;
-
-    public ScriptFragmentEditsArtifact(String strongName,
-        int fragment) {
-      super(SymbolMapsLinker.class);
-      this.strongName = strongName;
-      this.fragment = fragment;
-    }
-
-    public int getFragment() {
-      return fragment;
-    }
-
-    public String getStrongName() {
-      return strongName;
-    }
-
-    @Override
-    public int hashCode() {
-      return (strongName + fragment).hashCode();
-    }
-
-    public void insertLinesBefore(int position, String lines) {
-      editOperations.add(EditOperation.insert(position, lines));
-    }
-
-    public void prefixLines(String lines) {
-      editOperations.add(EditOperation.prefix(lines));
-    }
-
-    @Override
-    protected int compareToComparableArtifact(SymbolMapsLinker.ScriptFragmentEditsArtifact o) {
-      int result = (strongName + fragment).compareTo(strongName + fragment);
-      return result;
-    }
-
-    @Override
-    protected Class<ScriptFragmentEditsArtifact> getComparableArtifactType() {
-      return ScriptFragmentEditsArtifact.class;
-    }
-  }
-
-  /**
-   * Artifact to represent a sourcemap file to be processed by SymbolMapsLinker.
-   */
-  public static class SourceMapArtifact extends SyntheticArtifact {
-
-    private int permutationId;
-    private int fragment;
-    private byte[] js;
-
-    public SourceMapArtifact(int permutationId, int fragment, byte[] js) {
-      super(SymbolMapsLinker.class, permutationId + "/sourceMap" + fragment + ".json", js);
-      this.permutationId = permutationId;
-      this.fragment = fragment;
-      this.js = js;
-    }
-
-    public int getFragment() {
-      return fragment;
-    }
-
-    public int getPermutationId() {
-      return permutationId;
-    }
-  }
-
-  /**
-   * This value is appended to the strong name of the CompilationResult to form the symbol map's
-   * filename.
+   * This value is appended to the strong name of the CompilationResult to form
+   * the symbol map's filename.
    */
   public static final String STRONG_NAME_SUFFIX = ".symbolMap";
 
@@ -235,59 +98,17 @@
       throws UnableToCompleteException {
     if (onePermutation) {
       artifacts = new ArtifactSet(artifacts);
-      Map<Integer, String> permMap = new HashMap<Integer, String>();
+
       ByteArrayOutputStream out = new ByteArrayOutputStream();
       for (CompilationResult result : artifacts.find(CompilationResult.class)) {
         PrintWriter pw = new PrintWriter(out);
-        permMap.put(result.getPermutationId(), result.getStrongName());
+
         doWriteSymbolMap(logger, result, pw);
         pw.close();
 
         doEmitSymbolMap(logger, artifacts, result, out);
         out.reset();
       }
-
-      for (SourceMapArtifact se : artifacts.find(SourceMapArtifact.class)) {
-        // filename is permutation_id/sourceMap<fragmentNumber>.json
-        String sourceMapString = Util.readStreamAsString(se.getContents(logger));
-        String strongName = permMap.get(se.getPermutationId());
-        String partialPath = strongName + "_sourceMap" + se.getFragment() + ".json";
-
-        int fragment = se.getFragment();
-        ScriptFragmentEditsArtifact editArtifact = null;
-        for (ScriptFragmentEditsArtifact mp : artifacts.find(ScriptFragmentEditsArtifact.class)) {
-          if (mp.getStrongName().equals(strongName) && mp.getFragment() == fragment) {
-            editArtifact = mp;
-            artifacts.remove(editArtifact);
-            break;
-          }
-        }
-
-        SyntheticArtifact emArt = null;
-        // no need to adjust source map
-        if (editArtifact == null) {
-          emArt = emitSourceMapString(logger, sourceMapString, partialPath);
-        } else {
-          SourceMapGeneratorV3 sourceMapGenerator = new SourceMapGeneratorV3();
-          try {
-            int totalPrefixLines = 0;
-            for (ScriptFragmentEditsArtifact.EditOperation op : editArtifact.editOperations) {
-              if (op.getOp() == ScriptFragmentEditsArtifact.Edit.PREFIX) {
-                totalPrefixLines += op.getNumLines();
-              }
-            }
-            // TODO(cromwellian): apply insert and remove edits
-            sourceMapGenerator.mergeMapSection(totalPrefixLines, 0, sourceMapString);
-            StringWriter stringWriter = new StringWriter();
-            sourceMapGenerator.appendTo(stringWriter, "sourceMap");
-            emArt = emitSourceMapString(logger, stringWriter.toString(), partialPath);
-          } catch (Exception e) {
-            logger.log(TreeLogger.Type.WARN, "Can't write source map " + partialPath, e);
-          }
-        }
-        artifacts.add(emArt);
-        artifacts.remove(se);
-      }
     }
     return artifacts;
   }
@@ -307,10 +128,11 @@
 
   /**
    * Override to change the format of the symbol map.
-   *
+   * 
    * @param logger the logger to write to
    * @param result the compilation result
-   * @param pw     the output PrintWriter
+   * @param pw the output PrintWriter
+   *
    * @throws UnableToCompleteException if an error occurs
    */
   protected void doWriteSymbolMap(TreeLogger logger, CompilationResult result,
@@ -323,7 +145,7 @@
       pw.println(" }");
     }
 
-    pw.println("# jsName, jsniIdent, className, memberName, sourceUri, sourceLine, fragmentNumber");
+    pw.println("# jsName, jsniIdent, className, memberName, sourceUri, sourceLine");
     StringBuilder sb = new StringBuilder(1024);
     char[] buf = new char[1024];
     for (SymbolData symbol : result.getSymbolMap()) {
@@ -348,8 +170,6 @@
       }
       sb.append(',');
       sb.append(symbol.getSourceLine());
-      sb.append(',');
-      sb.append(symbol.getFragmentNumber());
       sb.append('\n');
 
       int sbLen = sb.length();
@@ -365,11 +185,4 @@
       sb.setLength(0);
     }
   }
-
-  protected SyntheticArtifact emitSourceMapString(TreeLogger logger, String contents,
-      String partialPath) throws UnableToCompleteException {
-    SyntheticArtifact emArt = emitString(logger, contents, partialPath);
-    emArt.setVisibility(Visibility.LegacyDeploy);
-    return emArt;
-  }
 }
diff --git a/dev/core/src/com/google/gwt/core/linker/XSLinker.java b/dev/core/src/com/google/gwt/core/linker/XSLinker.java
index b6b2641..1ffc1f6 100644
--- a/dev/core/src/com/google/gwt/core/linker/XSLinker.java
+++ b/dev/core/src/com/google/gwt/core/linker/XSLinker.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2008 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -17,10 +17,9 @@
 
 import com.google.gwt.core.ext.LinkerContext;
 import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.linker.ArtifactSet;
 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.LinkerOrder.Order;
 import com.google.gwt.core.ext.linker.impl.SelectionScriptLinker;
 import com.google.gwt.dev.About;
 import com.google.gwt.dev.js.JsToStringGenerationVisitor;
@@ -38,6 +37,19 @@
   }
 
   @Override
+  protected String generateDeferredFragment(TreeLogger logger,
+      LinkerContext context, int fragment, String js) {
+    StringBuilder sb = new StringBuilder();
+    sb.append(context.getModuleFunctionName());
+    sb.append(".runAsyncCallback");
+    sb.append(fragment);
+    sb.append("(");
+    sb.append(JsToStringGenerationVisitor.javaScriptString(js));
+    sb.append(");\n");
+    return sb.toString();
+  }
+
+  @Override
   protected String getCompilationExtension(TreeLogger logger,
       LinkerContext context) {
     return ".cache.js";
@@ -82,15 +94,6 @@
     return "com/google/gwt/core/linker/XSTemplate.js";
   }
 
-   @Override
-  protected String wrapDeferredFragment(TreeLogger logger,
-      LinkerContext context, int fragment, String js, ArtifactSet artifacts) {
-    return String.format("%s.runAsyncCallback%d(%s)\n",
-        context.getModuleFunctionName(),
-        fragment,
-        JsToStringGenerationVisitor.javaScriptString(js));
-  }
-
   private String getModulePrefix(LinkerContext context, String strongName,
       boolean supportRunAsync) {
     DefaultTextOutput out = new DefaultTextOutput(context.isOutputCompact());
diff --git a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
index c0bf87c..db7f4f7 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/JavaToJavaScriptCompiler.java
@@ -32,7 +32,6 @@
 import com.google.gwt.core.ext.linker.SyntheticArtifact;
 import com.google.gwt.core.ext.linker.impl.StandardSymbolData;
 import com.google.gwt.core.ext.soyc.Range;
-import com.google.gwt.core.ext.soyc.SourceMapRecorder;
 import com.google.gwt.core.ext.soyc.impl.DependencyRecorder;
 import com.google.gwt.core.ext.soyc.impl.SizeMapRecorder;
 import com.google.gwt.core.ext.soyc.impl.SplitPointRecorder;
@@ -121,11 +120,8 @@
 import com.google.gwt.dev.js.JsVerboseNamer;
 import com.google.gwt.dev.js.SizeBreakdown;
 import com.google.gwt.dev.js.ast.JsBlock;
-import com.google.gwt.dev.js.ast.JsContext;
-import com.google.gwt.dev.js.ast.JsFunction;
 import com.google.gwt.dev.js.ast.JsName;
 import com.google.gwt.dev.js.ast.JsProgram;
-import com.google.gwt.dev.js.ast.JsVisitor;
 import com.google.gwt.dev.util.DefaultTextOutput;
 import com.google.gwt.dev.util.Empty;
 import com.google.gwt.dev.util.Memory;
@@ -148,7 +144,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -356,11 +351,21 @@
       }
 
       // detect if browser is ie6 or not known
-      boolean isIE6orUnknown = findBooleanProperty(propertyOracles, logger, "user.agent", "ie6",
-          true, false, true);
+      boolean isIE6orUnknown = false;
+      for (PropertyOracle oracle : propertyOracles) {
+        try {
+          SelectionProperty userAgentProperty = oracle.getSelectionProperty(logger, "user.agent");
+          if ("ie6".equals(userAgentProperty.getCurrentValue())) {
+            isIE6orUnknown = true;
+            break;
+          }
+        } catch (BadPropertyValueException e) {
+          // user agent unknown; play it safe
+          isIE6orUnknown = true;
+          break;
+        }
+      }
 
-      boolean isSourceMapsEnabled = findBooleanProperty(propertyOracles, logger,
-          "compiler.useSourceMaps", "true", true, false, false);
       // (10.5) Obfuscate
       Map<JsName, String> obfuscateMap = Maps.create();
       switch (options.getOutput()) {
@@ -381,7 +386,7 @@
           }
           break;
         case PRETTY:
-          // We don't intern strings in pretty mode to imprmakeSouove readability
+          // We don't intern strings in pretty mode to improve readability
           JsPrettyNamer.exec(jsProgram);
           break;
         case DETAILED:
@@ -416,12 +421,13 @@
       SizeBreakdown[] sizeBreakdowns =
           options.isSoycEnabled() || options.isCompilerMetricsEnabled()
               ? new SizeBreakdown[js.length] : null;
-      List<Map<Range, SourceInfo>> sourceInfoMaps = new ArrayList<Map<Range, SourceInfo>>();
+      List<Map<Range, SourceInfo>> sourceInfoMaps =
+          options.isSoycExtra() ? new ArrayList<Map<Range, SourceInfo>>() : null;
       generateJavaScriptCode(options, jsProgram, jjsmap, js, ranges, sizeBreakdowns,
-          sourceInfoMaps, splitBlocks, isSourceMapsEnabled);
+          sourceInfoMaps, splitBlocks);
 
       PermutationResult toReturn =
-          new PermutationResultImpl(js, permutation, makeSymbolMap(symbolTable, jsProgram), ranges);
+          new PermutationResultImpl(js, permutation, makeSymbolMap(symbolTable), ranges);
       CompilationMetricsArtifact compilationMetrics = null;
       if (options.isCompilerMetricsEnabled()) {
         compilationMetrics = new CompilationMetricsArtifact(permutation.getId());
@@ -435,15 +441,8 @@
             .getPrecompilationMetrics(), compilationMetrics));
       }
       toReturn.addArtifacts(makeSoycArtifacts(logger, permutationId, jprogram, js, sizeBreakdowns,
-          options.isSoycExtra() ? sourceInfoMaps : null, dependencies, jjsmap, obfuscateMap,
-          unifiedAst.getModuleMetrics(), unifiedAst.getPrecompilationMetrics(), compilationMetrics,
-          options.isSoycHtmlDisabled()));
-
-      if (isSourceMapsEnabled) {
-        logger.log(TreeLogger.INFO, "Source Maps Enabled");
-        toReturn.addArtifacts(SourceMapRecorder.makeSourceMapArtifacts(sourceInfoMaps,
-            permutationId));
-      }
+          sourceInfoMaps, dependencies, jjsmap, obfuscateMap, unifiedAst.getModuleMetrics(),
+          unifiedAst.getPrecompilationMetrics(), compilationMetrics, options.isSoycHtmlDisabled()));
 
       logTrackingStats(logger);
       if (logger.isLoggable(TreeLogger.TRACE)) {
@@ -458,29 +457,6 @@
     }
   }
 
-  /**
-   * Look for a selection property in all property oracles.
-   */
-  public static boolean findBooleanProperty(PropertyOracle[] propertyOracles, TreeLogger logger,
-      String name, String valueToFind, boolean valueIfFound, boolean valueIfNotFound,
-      boolean valueIfError) {
-    boolean toReturn = valueIfNotFound;
-    for (PropertyOracle oracle : propertyOracles) {
-      try {
-        SelectionProperty property = oracle.getSelectionProperty(logger, name);
-        if (valueToFind.equals(property.getCurrentValue())) {
-          toReturn = valueIfFound;
-          break;
-        }
-      } catch (BadPropertyValueException e) {
-        // unknown value play it safe
-        toReturn = valueIfError;
-        break;
-      }
-    }
-    return toReturn;
-  }
-
   public static UnifiedAst precompile(TreeLogger logger, ModuleDef module,
       RebindPermutationOracle rpo, String[] declEntryPts, String[] additionalRootTypes,
       JJSOptions options, boolean singlePermutation) throws UnableToCompleteException {
@@ -960,22 +936,19 @@
    * @param options The options this compiler instance is running with
    * @param jsProgram The AST to convert to source code
    * @param jjsMap A map between the JavaScript AST and the Java AST it came
-*          from
+   *          from
    * @param js An array to hold the output JavaScript
    * @param ranges An array to hold the statement ranges for that JavaScript
    * @param sizeBreakdowns An array to hold the size breakdowns for that
-*          JavaScript
+   *          JavaScript
    * @param sourceInfoMaps An array to hold the source info maps for that
-*          JavaScript
+   *          JavaScript
    * @param splitBlocks true if current permutation is for IE6 or unknown
-   * @param sourceMapsEnabled
    */
-  private static void generateJavaScriptCode(JJSOptions options,
-      JsProgram jsProgram,
+  private static void generateJavaScriptCode(JJSOptions options, JsProgram jsProgram,
       JavaToJavaScriptMap jjsMap, String[] js, StatementRanges[] ranges,
-      SizeBreakdown[] sizeBreakdowns,
-      List<Map<Range, SourceInfo>> sourceInfoMaps,
-      boolean splitBlocks, boolean sourceMapsEnabled) {
+      SizeBreakdown[] sizeBreakdowns, List<Map<Range, SourceInfo>> sourceInfoMaps,
+      boolean splitBlocks) {
     for (int i = 0; i < js.length; i++) {
       DefaultTextOutput out = new DefaultTextOutput(options.getOutput().shouldMinimize());
       JsSourceGenerationVisitorWithSizeBreakdown v;
@@ -1007,18 +980,15 @@
        * the top level blocks into sub-blocks if they exceed 32767 statements.
        */
       Event functionClusterEvent = SpeedTracerLogger.start(CompilerEventType.FUNCTION_CLUSTER);
-      // TODO(cromwellian) move to the Js AST, re-enable sourcemaps + clustering
-      if (!sourceMapsEnabled
-          && options.isAggressivelyOptimize()
-          // only cluster for obfuscated mode
-          && options.getOutput() == JsOutputOption.OBFUSCATED) {
+      // only cluster for obfuscated mode
+      if (options.isAggressivelyOptimize() && options.getOutput() == JsOutputOption.OBFUSCATED) {
         transformer = new JsFunctionClusterer(transformer);
         transformer.exec();
       }
       functionClusterEvent.end();
 
       // rewrite top-level blocks to limit the number of statements
-      if (!sourceMapsEnabled && splitBlocks) {
+      if (splitBlocks) {
         transformer = new JsIEBlockTextTransformer(transformer);
         transformer.exec();
       }
@@ -1185,31 +1155,13 @@
     return amp.makeStatement();
   }
 
-  private static SymbolData[] makeSymbolMap(Map<StandardSymbolData, JsName> symbolTable,
-      JsProgram jsProgram) {
-
-    final Map<JsName, Integer> nameToFragment = new HashMap<JsName, Integer>();
-    for (int i = 0; i < jsProgram.getFragmentCount(); i++) {
-      final Integer fragId = i;
-      new JsVisitor() {
-        @Override
-        public void endVisit(JsFunction x, JsContext ctx) {
-            if (x.getName() != null) {
-              nameToFragment.put(x.getName(), fragId);
-            }
-        }
-      }.accept(jsProgram.getFragmentBlock(i));
-    }
+  private static SymbolData[] makeSymbolMap(Map<StandardSymbolData, JsName> symbolTable) {
 
     SymbolData[] result = new SymbolData[symbolTable.size()];
     int i = 0;
     for (Map.Entry<StandardSymbolData, JsName> entry : symbolTable.entrySet()) {
       StandardSymbolData symbolData = entry.getKey();
       symbolData.setSymbolName(entry.getValue().getShortIdent());
-      Integer fragNum = nameToFragment.get(entry.getValue());
-      if (fragNum != null) {
-        symbolData.setFragmentNumber(fragNum);
-      }
       result[i++] = symbolData;
     }
     return result;
diff --git a/dev/core/src/com/google/gwt/dev/jjs/impl/TextOutputVisitor.java b/dev/core/src/com/google/gwt/dev/jjs/impl/TextOutputVisitor.java
index d2798ac..0a6f013 100644
--- a/dev/core/src/com/google/gwt/dev/jjs/impl/TextOutputVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/jjs/impl/TextOutputVisitor.java
@@ -30,16 +30,6 @@
     this.textOutput = textOutput;
   }
 
-  @Override
-  public int getColumn() {
-    return textOutput.getColumn();
-  }
-
-  @Override
-  public int getLine() {
-    return textOutput.getLine();
-  }
-
   public int getPosition() {
     return textOutput.getPosition();
   }
diff --git a/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java b/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java
index 5d4441b..58812b1 100644
--- a/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java
+++ b/dev/core/src/com/google/gwt/dev/js/JsReportGenerationVisitor.java
@@ -50,13 +50,10 @@
   protected <T extends JsVisitable> T doAccept(T node) {
     boolean addEntry = node instanceof HasSourceInfo;
     int start = addEntry ? out.getPosition() : 0;
-    int sLine = out.getLine();
-    int sCol = out.getColumn();
     T toReturn = super.doAccept(node);
     if (addEntry) {
       SourceInfo info = ((HasSourceInfo) node).getSourceInfo();
-      sourceInfoMap.put(new Range(start, out.getPosition(),
-          sLine, sCol, out.getLine(), out.getColumn()), info);
+      sourceInfoMap.put(new Range(start, out.getPosition()), info);
     }
     return toReturn;
   }
diff --git a/dev/core/src/com/google/gwt/dev/util/AbstractTextOutput.java b/dev/core/src/com/google/gwt/dev/util/AbstractTextOutput.java
index a284d7d..8e9e8b3 100644
--- a/dev/core/src/com/google/gwt/dev/util/AbstractTextOutput.java
+++ b/dev/core/src/com/google/gwt/dev/util/AbstractTextOutput.java
@@ -29,21 +29,11 @@
   private boolean justNewlined;
   private PrintWriter out;
   private int position = 0;
-  private int line = 0;
-  private int column = 0;
 
   protected AbstractTextOutput(boolean compact) {
     this.compact = compact;
   }
 
-  public int getColumn() {
-    return column;
-  }
-
-  public int getLine() {
-    return line;
-  }
-
   public int getPosition() {
     return position;
   }
@@ -73,8 +63,6 @@
       out.print('\n');
     }
     position++;
-    line++;
-    column = 0;
     justNewlined = true;
   }
 
@@ -82,8 +70,6 @@
     if (!compact) {
       out.print('\n');
       position++;
-      line++;
-      column = 0;
       justNewlined = true;
     }
   }
@@ -92,7 +78,6 @@
     maybeIndent();
     out.print(c);
     position++;
-    column++;
     justNewlined = false;
   }
 
@@ -113,7 +98,6 @@
       maybeIndent();
       out.print(c);
       position += 1;
-      column++;
     }
   }
 
@@ -144,7 +128,6 @@
 
   private void printAndCount(char[] chars) {
     position += chars.length;
-    column += chars.length;
     out.print(chars);
   }
 }
diff --git a/dev/core/src/com/google/gwt/dev/util/TextOutput.java b/dev/core/src/com/google/gwt/dev/util/TextOutput.java
index f98536b..ecbf9d0 100644
--- a/dev/core/src/com/google/gwt/dev/util/TextOutput.java
+++ b/dev/core/src/com/google/gwt/dev/util/TextOutput.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2006 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -19,11 +19,6 @@
  * Interface used for printing text output.
  */
 public interface TextOutput {
-
-  int getColumn();
-
-  int getLine();
-
   int getPosition();
 
   void indentIn();
diff --git a/dev/core/test/com/google/gwt/core/linker/ScriptChunkingTest.java b/dev/core/test/com/google/gwt/core/linker/ScriptChunkingTest.java
index f5e0e6b..266935d 100644
--- a/dev/core/test/com/google/gwt/core/linker/ScriptChunkingTest.java
+++ b/dev/core/test/com/google/gwt/core/linker/ScriptChunkingTest.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -15,11 +15,6 @@
  */
 package com.google.gwt.core.linker;
 
-import com.google.gwt.core.ext.LinkerContext;
-import com.google.gwt.core.ext.TreeLogger;
-import com.google.gwt.core.ext.UnableToCompleteException;
-import com.google.gwt.core.ext.linker.ConfigurationProperty;
-import com.google.gwt.core.ext.linker.SelectionProperty;
 import com.google.gwt.core.ext.linker.StatementRanges;
 import com.google.gwt.core.ext.linker.impl.SelectionScriptLinker;
 import com.google.gwt.core.ext.linker.impl.StandardStatementRanges;
@@ -27,92 +22,16 @@
 import junit.framework.TestCase;
 
 import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.SortedSet;
-import java.util.TreeSet;
 
 /**
  * Tests the script chunking in the {@link SelectionScriptLinker}.
  */
 public class ScriptChunkingTest extends TestCase {
-
-  private static class MockLinkerContext implements LinkerContext {
-
-    @Override
-    public SortedSet<ConfigurationProperty> getConfigurationProperties() {
-      return new TreeSet<ConfigurationProperty>();
-    }
-
-    @Override
-    public String getModuleFunctionName() {
-      return "mockFunc";
-    }
-
-    @Override
-    public long getModuleLastModified() {
-      return 0;
-    }
-
-    @Override
-    public String getModuleName() {
-      return "mock";
-    }
-
-    @Override
-    public SortedSet<SelectionProperty> getProperties() {
-      SelectionProperty mockSourceMapProperty = new SelectionProperty() {
-
-        @Override
-        public String getName() {
-          return SelectionScriptLinker.USE_SOURCE_MAPS_PROPERTY;
-        }
-
-        @Override
-        public String getFallbackValue() {
-          return "";
-        }
-
-        @Override
-        public SortedSet<String> getPossibleValues() {
-          return new TreeSet<String>(Arrays.asList("true", "false"));
-        }
-
-        @Override
-        public String getPropertyProvider(TreeLogger logger,
-            SortedSet<ConfigurationProperty> configProperties) throws UnableToCompleteException {
-          return null;
-        }
-
-        @Override
-        public boolean isDerived() {
-          return false;
-        }
-
-        @Override
-        public String tryGetValue() {
-          return "false";
-        }
-      };
-      return new TreeSet<SelectionProperty>(Arrays.asList(mockSourceMapProperty));
-    }
-
-    @Override
-    public boolean isOutputCompact() {
-      return false;
-    }
-
-    @Override
-    public String optimizeJavaScript(TreeLogger logger, String jsProgram)
-        throws UnableToCompleteException {
-      return "";
-    }
-  }
-
   /**
-   * A class for building up JavaScript that has statements and non-statement code interleaved.
+   * A class for building up JavaScript that has statements and non-statement
+   * code interleaved.
    */
   private static class ScriptWithRangesBuilder {
-
     private final ArrayList<Integer> ends = new ArrayList<Integer>();
     private final StringBuffer script = new StringBuffer();
     private final ArrayList<Integer> starts = new ArrayList<Integer>();
@@ -155,12 +74,12 @@
 
     String split = SelectionScriptLinker.splitPrimaryJavaScript(builder.getRanges(),
         builder.getJavaScript(), stmt1.length() + stmt2.length(),
-        IFrameLinker.SCRIPT_CHUNK_SEPARATOR, new MockLinkerContext());
+        IFrameLinker.SCRIPT_CHUNK_SEPARATOR);
     assertEquals(stmt1 + stmt2 + IFrameLinker.SCRIPT_CHUNK_SEPARATOR + stmt3
         + ';' + stmt4, split);
   }
 
-
+  
   /**
    * Test that with the default chunk separator (""), splitting is a no-op.
    */
@@ -180,10 +99,10 @@
     builder.addNonStatement("}");
 
     String split = SelectionScriptLinker.splitPrimaryJavaScript(builder.getRanges(),
-        builder.getJavaScript(), stmt1.length() + stmt2.length(), "", new MockLinkerContext());
+        builder.getJavaScript(), stmt1.length() + stmt2.length(), "");
     assertEquals(stmt1 + stmt2 + stmt3 + ';' + stmt4, split);
   }
-
+  
   /**
    * Test a chunk size large enough that no splitting happens.
    */
@@ -203,8 +122,7 @@
     builder.addNonStatement("}");
 
     String split = SelectionScriptLinker.splitPrimaryJavaScript(builder.getRanges(),
-        builder.getJavaScript(), 10000, IFrameLinker.SCRIPT_CHUNK_SEPARATOR,
-        new MockLinkerContext());
+        builder.getJavaScript(), 10000, IFrameLinker.SCRIPT_CHUNK_SEPARATOR);
     assertEquals(stmt1 + stmt2 + stmt3 + ';' + stmt4, split);
   }
 
@@ -223,7 +141,7 @@
     builder.addNonStatement("}");
 
     String split = SelectionScriptLinker.splitPrimaryJavaScript(builder.getRanges(),
-        builder.getJavaScript(), -1, IFrameLinker.SCRIPT_CHUNK_SEPARATOR, new MockLinkerContext());
+        builder.getJavaScript(), -1, IFrameLinker.SCRIPT_CHUNK_SEPARATOR);
     assertEquals(builder.getJavaScript(), split);
   }
 
@@ -242,7 +160,7 @@
     builder.addNonStatement("}");
 
     String split = SelectionScriptLinker.splitPrimaryJavaScript(null,
-        builder.getJavaScript(), 5, IFrameLinker.SCRIPT_CHUNK_SEPARATOR, new MockLinkerContext());
+        builder.getJavaScript(), 5, IFrameLinker.SCRIPT_CHUNK_SEPARATOR);
     assertEquals(builder.getJavaScript(), split);
   }
 }
diff --git a/servlet/build.xml b/servlet/build.xml
index 21a57be..f274e05 100755
--- a/servlet/build.xml
+++ b/servlet/build.xml
@@ -52,7 +52,6 @@
       <!-- The following two jars satisfy RequestFactory dependencies. -->
       <zipfileset src="${gwt.tools.redist}/json/r2_20080312/json-1.5.jar" />
       <zipfileset src="${gwt.tools.lib}/javax/validation/validation-api-1.0.0.GA.jar" />
-      <zipfileset src="${gwt.tools.lib}/jscomp/sourcemap-rebased.jar" />
     </gwt.jar>
   </target>
 </project>
diff --git a/user/src/com/google/gwt/core/CompilerParameters.gwt.xml b/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
index a3b11ef..b811b41 100644
--- a/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
+++ b/user/src/com/google/gwt/core/CompilerParameters.gwt.xml
@@ -75,10 +75,4 @@
     is-multi-valued="false" />
   <set-configuration-property name="iframe.linker.deferredjs.subdir"
     value="deferredjs" />
-
-  <!--
-     Specifies whether a given permutation has source map support enabled.
-  -->
-  <define-property name="compiler.useSourceMaps" values="true,false"/>
-  <set-property name="compiler.useSourceMaps" value="false"/>
 </module>
diff --git a/user/src/com/google/gwt/core/CoreWithUserAgent.gwt.xml b/user/src/com/google/gwt/core/CoreWithUserAgent.gwt.xml
index a829874..c4cbd6c 100644
--- a/user/src/com/google/gwt/core/CoreWithUserAgent.gwt.xml
+++ b/user/src/com/google/gwt/core/CoreWithUserAgent.gwt.xml
@@ -43,26 +43,4 @@
     <when-type-is class="com.google.gwt.core.client.impl.StackTraceCreator.Collector" />
     <when-property-is name="compiler.stackMode" value="strip" />
   </replace-with>
-
-  <!-- Disable source maps for non-Chrome browsers -->
-  <set-property name="compiler.useSourceMaps" value="false">
-    <none> 
-      <when-property-is name="user.agent" value="safari"/>
-    </none> 
-  </set-property>
-
-<set-property name="compiler.useSourceMaps" value="false"/>
-
-  <!-- Utility class to query if source maps are enabled, mainly for testing -->
-  <replace-with class="com.google.gwt.core.client.impl.SourceMapProperty.SourceMapEnabled">
-    <when-type-is class="com.google.gwt.core.client.impl.SourceMapProperty.SourceMapImpl"/>
-    <when-property-is name="compiler.useSourceMaps" value="true"/>
-  </replace-with>
-
-  <!-- If stack trace emulation is on, we can still get accurate stack traces even if sourcemaps are off -->
-  <replace-with class="com.google.gwt.core.client.impl.SourceMapProperty.SourceMapEnabled">
-    <when-type-is class="com.google.gwt.core.client.impl.SourceMapProperty.SourceMapImpl"/>
-    <when-property-is name="compiler.useSourceMaps" value="false"/>
-    <when-property-is name="compiler.stackMode" value="emulated"/>
-  </replace-with>
 </module>
diff --git a/user/src/com/google/gwt/core/client/impl/SourceMapProperty.java b/user/src/com/google/gwt/core/client/impl/SourceMapProperty.java
deleted file mode 100644
index 6e79367..0000000
--- a/user/src/com/google/gwt/core/client/impl/SourceMapProperty.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-
-package com.google.gwt.core.client.impl;
-
-import com.google.gwt.core.client.GWT;
-
-/**
- * Helper class to query if SourceMaps are enabled and capable of working on the current user
- * agent.
- */
-public class SourceMapProperty {
-
-  static class SourceMapEnabled extends SourceMapImpl {
-
-    public native boolean doesBrowserSupportSourceMaps() /*-{
-      // Chrome only for now, future Firefoxes have promised support
-      return navigator.userAgent.indexOf('Chrome') > -1;
-    }-*/;
-
-    public boolean isSourceMapGenerationOn() {
-      return true;
-    }
-  }
-
-  static class SourceMapEmulated extends SourceMapEnabled {
-
-    public boolean shouldUseSourceMaps() {
-      // pretend emulated stack is a sourcemap
-      return true;
-    }
-  }
-
-  /**
-   * Interface to provide both the compile time and runtime <code>user.agent</code> selection
-   * property value.
-   */
-  static class SourceMapImpl {
-
-    public boolean doesBrowserSupportSourceMaps() {
-      return false;
-    }
-
-    public boolean isSourceMapGenerationOn() {
-      return false;
-    }
-
-    public boolean shouldUseSourceMaps() {
-      return isSourceMapGenerationOn() && doesBrowserSupportSourceMaps();
-    }
-  }
-
-  private static final SourceMapImpl IMPL = GWT.create(SourceMapImpl.class);
-
-  public static boolean doesBrowserSupportSourceMaps() {
-    return IMPL.doesBrowserSupportSourceMaps();
-  }
-
-  /**
-   * True if fully accurate stack traces are possible. True for DevMode, emulated stack traces, and
-   * cases where sourceMaps can work with detailed browser stack trace support.
-   */
-  public static boolean isDetailedDeobfuscatedStackTraceSupported() {
-    return !GWT.isScript() || shouldUseSourceMaps();
-  }
-
-  public static boolean isSourceMapGenerationOn() {
-    return IMPL.isSourceMapGenerationOn();
-  }
-
-  public static boolean shouldUseSourceMaps() {
-    return IMPL.shouldUseSourceMaps();
-  }
-}
diff --git a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
index d6f93b2..3aa6182 100644
--- a/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
+++ b/user/src/com/google/gwt/core/client/impl/StackTraceCreator.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2009 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -26,19 +26,6 @@
  * Production Mode.
  */
 public class StackTraceCreator {
-
-  /**
-   * Line number used in a stack trace when it is unknown.
-   */
-  public static final int LINE_NUMBER_UNKNOWN = -1;
-
-  /**
-   * Used to encode a (column, line) pair into a line number (since LogRecord only stores line
-   * numbers). We store line, col as line + col * max_line, and use division and modulus to
-   * recover on the server side.
-   */
-  public static final int MAX_LINE_NUMBER = 100000;
-
   /**
    * This class acts as a deferred-binding hook point to allow more optimal
    * versions to be substituted. This base version simply crawls
@@ -120,7 +107,7 @@
     /**
      * Attempt to infer the stack from an unknown JavaScriptObject that had been
      * thrown. The default implementation just returns an empty array.
-     *
+     * 
      * @param e a JavaScriptObject
      */
     public JsArrayString inferFrom(JavaScriptObject e) {
@@ -258,12 +245,12 @@
 
   /**
    * Chrome uses a slightly different format to Mozilla.
-   *
+   * 
    * See http://code.google.com/p/v8/source/browse/branches/bleeding_edge/src/
    * messages.js?r=2340#712 for formatting code.
-   *
+   * 
    * Function calls can be of the four following forms:
-   *
+   * 
    * <pre>
    * at file.js:1:2
    * at functionName (file.js:1:2)
@@ -272,7 +259,6 @@
    * </pre>
    */
   static class CollectorChrome extends CollectorMoz {
-
     @Override
     public JsArrayString collect() {
       JsArrayString res = super.collect();
@@ -287,18 +273,6 @@
     }
 
     @Override
-    public void createStackTrace(JavaScriptException e) {
-      JsArrayString stack = inferFrom(e.getException());
-      parseStackTrace(e, stack);
-    }
-
-    @Override
-    public void fillInStackTrace(Throwable t) {
-      JsArrayString stack = StackTraceCreator.createStackTrace();
-      parseStackTrace(t, stack);
-    }
-
-    @Override
     public JsArrayString inferFrom(JavaScriptObject e) {
       JsArrayString stack = super.inferFrom(e);
       if (stack.length() == 0) {
@@ -312,11 +286,8 @@
 
     @Override
     protected String extractName(String fnToString) {
-      String extractedName = "anonymous";
-      String location = "";
-
       if (fnToString.length() == 0) {
-        return extractedName;
+        return "anonymous";
       }
 
       String toReturn = fnToString.trim();
@@ -326,70 +297,34 @@
         toReturn = toReturn.substring(3);
       }
 
-      // Strip square bracketed items from the end:
+      // Strip bracketed items from the end:
       int index = toReturn.indexOf("[");
-      if (index != -1) {
-        toReturn = toReturn.substring(0, index).trim() +
-            toReturn.substring(toReturn.indexOf("]", index) + 1).trim();
-      }
-
-      index = toReturn.indexOf("(");
       if (index == -1) {
-        // No bracketed items found, hence no function name available
-        location = toReturn;
-        toReturn = "";
+        index = toReturn.indexOf("(");
+      }
+      if (index == -1) {
+        // No bracketed items found, hence no function name available:
+        return "anonymous";
       } else {
-        // Bracketed items found: strip them off, parse location info
-        int closeParen = toReturn.indexOf(")", index);
-        location = toReturn.substring(index + 1, closeParen);
+        // Bracketed items found: strip them off.
         toReturn = toReturn.substring(0, index).trim();
       }
 
-      // Strip the Type off t
+      // Strip the Type off to leave just the functionName:
       index = toReturn.indexOf('.');
       if (index != -1) {
         toReturn = toReturn.substring(index + 1);
       }
-      return (toReturn.length() > 0 ? toReturn : "anonymous") + "@@" + location;
+
+      return toReturn.length() > 0 ? toReturn : "anonymous";
     }
 
     @Override
     protected int toSplice() {
       return 3;
     }
-
-    private void parseStackTrace(Throwable e, JsArrayString stack) {
-      StackTraceElement[] stackTrace = new StackTraceElement[stack.length()];
-      for (int i = 0, j = stackTrace.length; i < j; i++) {
-        String stackElements[] = stack.get(i).split("@@");
-
-        int line = LINE_NUMBER_UNKNOWN;
-        int col = -1;
-        String fileName = "Unknown";
-        if (stackElements.length == 2 && stackElements[1] != null) {
-          String location = stackElements[1];
-          // colon between line and column
-          int lastColon = location.lastIndexOf(':');
-          // colon between file url and line number
-          int endFileUrl = location.lastIndexOf(':', lastColon - 1);
-          fileName = location.substring(0, endFileUrl);
-
-          if (lastColon != -1 && endFileUrl != -1) {
-              line = parseInt(location.substring(endFileUrl + 1, lastColon));
-              col = parseInt(location.substring(lastColon + 1));
-          }
-        }
-        stackTrace[i] = new StackTraceElement("Unknown", stackElements[0], fileName,
-            line < 0 ? -1 : col * MAX_LINE_NUMBER + line);
-      }
-      e.setStackTrace(stackTrace);
-    }
   }
 
-  private static native int parseInt(String number) /*-{
-    return parseInt(number) || -1;
-  }-*/;
-
   /**
    * Opera encodes stack trace information in the error's message.
    */
@@ -457,6 +392,8 @@
       // empty, since Throwable.getStackTrace() properly handles null
     }
   }
+  
+  private static final int LINE_NUMBER_UNKNOWN = -1;
 
   /**
    * Create a stack trace based on a JavaScriptException. This method should
@@ -524,6 +461,7 @@
   }
 
   private static native JsArrayString splice(JsArrayString arr, int length) /*-{
+    (arr.length >= length) && arr.splice(0, length);
     return arr;
   }-*/;
 }
diff --git a/user/src/com/google/gwt/junit/JUnit.gwt.xml b/user/src/com/google/gwt/junit/JUnit.gwt.xml
index 0e30089..29cdbc4 100644
--- a/user/src/com/google/gwt/junit/JUnit.gwt.xml
+++ b/user/src/com/google/gwt/junit/JUnit.gwt.xml
@@ -34,12 +34,7 @@
 
   <!-- We want to provide consistent stack traces across all browsers. -->
   <set-configuration-property name="compiler.emulatedStack.recordFileNames" value="true" />
-  <set-property name="compiler.stackMode" value="emulated">
-    <none>
-      <!-- Don't use stack trace emulation if source maps enabled -->
-      <when-property-is name="compiler.useSourceMaps" value="true"/>
-    </none>
-  </set-property>
+  <set-property name="compiler.stackMode" value="emulated" />
 
   <!-- Override the regular symbolMaps linker to put the data somewhere we can find it -->
   <define-linker name="symbolMaps" class="com.google.gwt.junit.linker.JUnitSymbolMapsLinker" />
diff --git a/user/src/com/google/gwt/junit/linker/JUnitSymbolMapsLinker.java b/user/src/com/google/gwt/junit/linker/JUnitSymbolMapsLinker.java
index 4638ec0..723654c 100644
--- a/user/src/com/google/gwt/junit/linker/JUnitSymbolMapsLinker.java
+++ b/user/src/com/google/gwt/junit/linker/JUnitSymbolMapsLinker.java
@@ -21,7 +21,6 @@
 import com.google.gwt.core.ext.linker.CompilationResult;
 import com.google.gwt.core.ext.linker.EmittedArtifact;
 import com.google.gwt.core.ext.linker.Shardable;
-import com.google.gwt.core.ext.linker.SyntheticArtifact;
 import com.google.gwt.core.linker.SymbolMapsLinker;
 
 import java.io.ByteArrayOutputStream;
@@ -32,15 +31,12 @@
  */
 @Shardable
 public class JUnitSymbolMapsLinker extends SymbolMapsLinker {
-
-  public static final String SYMBOL_MAP_DIR = ".junit_symbolMaps/";
-
   @Override
   protected void doEmitSymbolMap(TreeLogger logger, ArtifactSet artifacts,
       CompilationResult result, ByteArrayOutputStream out)
       throws UnableToCompleteException {
     // Collaborate with JUnitHostImpl.loadSymbolMap
-    String partialPath = SYMBOL_MAP_DIR + result.getStrongName()
+    String partialPath = ".junit_symbolMaps/" + result.getStrongName()
         + STRONG_NAME_SUFFIX;
 
     EmittedArtifact symbolMapArtifact = emitBytes(logger, out.toByteArray(),
@@ -49,9 +45,4 @@
     artifacts.add(symbolMapArtifact);
   }
 
-  @Override
-  protected SyntheticArtifact emitSourceMapString(TreeLogger logger, String contents,
-      String partialPath) throws UnableToCompleteException {
-    return emitString(logger, contents, SYMBOL_MAP_DIR + partialPath);
-  }
 }
diff --git a/user/src/com/google/gwt/junit/server/JUnitHostImpl.java b/user/src/com/google/gwt/junit/server/JUnitHostImpl.java
index ef26877..9f79b68 100644
--- a/user/src/com/google/gwt/junit/server/JUnitHostImpl.java
+++ b/user/src/com/google/gwt/junit/server/JUnitHostImpl.java
@@ -233,7 +233,7 @@
       if (symbolData != null) {
         // jsniIdent, className, memberName, sourceUri, sourceLine
         String[] parts = symbolData.split(",");
-        assert parts.length == 6 : "Expected 6, have " + parts.length;
+        assert parts.length == 5 : "Expected 5, have " + parts.length;
 
         JsniRef ref = JsniRef.parse(parts[0].substring(0,
             parts[0].lastIndexOf(')') + 1));
diff --git a/user/src/com/google/gwt/logging/server/JsonLogRecordServerUtil.java b/user/src/com/google/gwt/logging/server/JsonLogRecordServerUtil.java
index adb20bc..b8f7dfd 100644
--- a/user/src/com/google/gwt/logging/server/JsonLogRecordServerUtil.java
+++ b/user/src/com/google/gwt/logging/server/JsonLogRecordServerUtil.java
@@ -71,16 +71,12 @@
     Throwable cause =
       throwableFromJson(t.getString("cause"));
     StackTraceElement[] stackTrace = null;
-    if (t.has("stackTrace")) {
-      JSONArray st = t.getJSONArray("stackTrace");
-      if (st.length() > 0) {
-        stackTrace = new StackTraceElement[st.length()];
-        for (int i = 0; i < st.length(); i++) {
-          stackTrace[i] = stackTraceElementFromJson(st.getString(i));
-        }
+    JSONArray st = t.getJSONArray("stackTrace");
+    if (st.length() > 0) {
+      stackTrace = new StackTraceElement[st.length()];
+      for (int i = 0; i < st.length(); i++) {
+        stackTrace[i] = stackTraceElementFromJson(st.getString(i));
       }
-    } else {
-      stackTrace = new StackTraceElement[0];
     }
     Throwable thrown = new Throwable(message, cause);
     thrown.setStackTrace(stackTrace);
diff --git a/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java b/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
index d5b9e6c..472afaf 100644
--- a/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
+++ b/user/src/com/google/gwt/logging/server/StackTraceDeobfuscator.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2010 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -16,14 +16,6 @@
 
 package com.google.gwt.logging.server;
 
-import com.google.debugging.sourcemap.SourceMapConsumerFactory;
-import com.google.debugging.sourcemap.SourceMapConsumerV3;
-import com.google.debugging.sourcemap.SourceMapping;
-import com.google.debugging.sourcemap.proto.Mapping;
-import com.google.gwt.core.client.impl.StackTraceCreator;
-
-import org.json.JSONObject;
-
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.FileInputStream;
@@ -32,70 +24,62 @@
 import java.io.InputStreamReader;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Scanner;
 import java.util.logging.LogRecord;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 /**
- * Deobfuscates stack traces on the server side. This class requires that you have turned on
- * emulated stack traces, via <code>&lt;set-property name="compiler.stackMode" value="emulated"
- * /&gt;</code> in your <code>.gwt.xml</code> module file for non-Chrome browsers or
- * <code>&lt;set-property name="compiler.useSourceMaps" value="true"/&gt;</code> for Chrome, and
- * moved your symbol map files to a location accessible by your server sever side code. You can use
- * the GWT compiler <code>-deploy</code> command line argument to specify the location of the folder
- * into which the generated <code>symbolMaps</code> directory is written. By default, the final
- * <code>symbolMaps</code> directory is <code>war/WEB-INF/deploy/<i>yourmodulename</i>/symbolMaps/</code>.
- * Pass the resulting directory location into this class' {@link StackTraceDeobfuscator#symbolMapsDirectory}
- * constructor or {@link #setSymbolMapsDirectory(String)} setter method.
- *
+ * Deobfuscates stack traces on the server side. This class requires that you
+ * have turned on emulated stack traces, via
+ * <code>&lt;set-property name="compiler.stackMode" value="emulated" /&gt;</code>
+ * in your <code>.gwt.xml</code> module file, and moved your symbol map files to
+ * a location accessible by your server sever side code. You can use the GWT
+ * compiler <code>-deploy</code> command line argument to specify the location
+ * of the folder into which the generated <code>symbolMaps</code> directory is
+ * written. By default, the final <code>symbolMaps</code> directory is
+ * <code>war/WEB-INF/deploy/<i>yourmodulename</i>/symbolMaps/</code>. Pass the
+ * resulting directory location into this class'
+ * {@link StackTraceDeobfuscator#symbolMapsDirectory} constructor or
+ * {@link #setSymbolMapsDirectory(String)} setter method.
+ * 
  * TODO(unnurg): Combine this code with similar code in JUnitHostImpl
  */
 public class StackTraceDeobfuscator {
-
-  private static class SymbolMap extends HashMap<String, String> {
-  }
-
+  
+  private static class SymbolMap extends HashMap<String, String> { }
+  
   // From JsniRef class, which is in gwt-dev and so can't be accessed here
   // TODO(unnurg) once there is a place for shared code, move this to there.
   private static Pattern JsniRefPattern =
-      Pattern.compile("@?([^:]+)::([^(]+)(\\((.*)\\))?");
-
-  // The javadoc for StackTraceElement.getLineNumber() says it returns -1 when
+    Pattern.compile("@?([^:]+)::([^(]+)(\\((.*)\\))?");
+  
+  // The javadoc for StackTraceElement.getLineNumber() says it returns -1 when 
   // the line number is unavailable
   private static final int LINE_NUMBER_UNKNOWN = -1;
-
-  Pattern fragmentIdPattern = Pattern.compile(".*(\\d+)\\.js");
-
-  protected File symbolMapsDirectory;
-
-  // Map of strongName + fragmentId to sourceMap
-  private Map<String, SourceMapping> sourceMaps =
-      new HashMap<String, SourceMapping>();
-
-  private Map<String, Integer> sourceMapPrefixes = new HashMap<String, Integer>();
-
+  
+  private File symbolMapsDirectory;
+  
   private Map<String, SymbolMap> symbolMaps =
-      new HashMap<String, SymbolMap>();
+    new HashMap<String, SymbolMap>();
 
   /**
-   * Constructor, which takes a <code>symbolMaps</code> directory as its argument. Symbol maps are
-   * generated into the location specified by the GWT compiler <code>-deploy</code> command line
-   * argument.
-   *
-   * @param symbolMapsDirectory the <code>symbolMaps</code> directory with, or without trailing
-   *                            directory separator character
+   * Constructor, which takes a <code>symbolMaps</code> directory as its
+   * argument. Symbol maps are generated into the location specified by the
+   * GWT compiler <code>-deploy</code> command line argument.
+   * 
+   * @param symbolMapsDirectory the <code>symbolMaps</code> directory with, or
+   *          without trailing directory separator character
    */
   public StackTraceDeobfuscator(String symbolMapsDirectory) {
     setSymbolMapsDirectory(symbolMapsDirectory);
   }
-
+  
   /**
    * Best effort resymbolization of a log record's stack trace.
-   *
-   * @param lr         the log record to resymbolize
+   * 
+   * @param lr the log record to resymbolize
    * @param strongName the GWT permutation strong name
-   * @return the best effort resymbolized log record                                   JJSO
+   * @return the best effort resymbolized log record
    */
   public LogRecord deobfuscateLogRecord(LogRecord lr, String strongName) {
     if (lr.getThrown() != null && strongName != null) {
@@ -103,11 +87,12 @@
     }
     return lr;
   }
-
+  
   /**
-   * Convenience method which resymbolizes an entire stack trace to extent possible.
+   * Convenience method which resymbolizes an entire stack trace to extent
+   * possible.
    *
-   * @param st         the stack trace to resymbolize
+   * @param st the stack trace to resymbolize
    * @param strongName the GWT permutation strong name
    * @return a best effort resymbolized stack trace
    */
@@ -119,34 +104,28 @@
     }
     return newSt;
   }
-
+  
   /**
    * Best effort resymbolization of a a single stack trace element.
    *
-   * @param ste        the stack trace element to resymbolize
+   * @param ste the stack trace element to resymbolize
    * @param strongName the GWT permutation strong name
    * @return the best effort resymbolized stack trace element
    */
   public StackTraceElement resymbolize(StackTraceElement ste,
       String strongName) {
-    String declaringClass = null;
-    String methodName = null;
-    String filename = null;
-    int lineNumber = -1;
-    int fragmentId = -1;
-
-    String steFilename = ste.getFileName();
     SymbolMap map = loadSymbolMap(strongName);
     String symbolData = map == null ? null : map.get(ste.getMethodName());
 
-    // first use symbolMap, then refine via sourceMap if possible
     if (symbolData != null) {
-      // jsniIdent, className, memberName, sourceUri, sourceLine, fragmentId
+      // jsniIdent, className, memberName, sourceUri, sourceLine
       String[] parts = symbolData.split(",");
-      if (parts.length == 6) {
+      if (parts.length == 5) {
         String[] ref = parse(
             parts[0].substring(0, parts[0].lastIndexOf(')') + 1));
 
+        String declaringClass;
+        String methodName;
         if (ref != null) {
           declaringClass = ref[0];
           methodName = ref[1];
@@ -154,13 +133,12 @@
           declaringClass = ste.getClassName();
           methodName = ste.getMethodName();
         }
-
+        
         // parts[3] contains the source file URI or "Unknown"
-        filename = "Unknown".equals(parts[3]) ? null
+        String filename = "Unknown".equals(parts[3]) ? null
             : parts[3].substring(parts[3].lastIndexOf('/') + 1);
-
-        lineNumber = ste.getLineNumber();
-
+        
+        int lineNumber = ste.getLineNumber();
         /*
          * When lineNumber is LINE_NUMBER_UNKNOWN, either because
          * compiler.stackMode is not emulated or
@@ -170,78 +148,30 @@
         if (lineNumber == LINE_NUMBER_UNKNOWN) {
           lineNumber = Integer.parseInt(parts[4]);
         }
-
-        fragmentId = Integer.parseInt(parts[5]);
+        
+        return new StackTraceElement(
+            declaringClass, methodName, filename, lineNumber);
       }
     }
-
-    // anonymous function, try to use <fragmentNum>.js:line:col to lookup function
-    if (fragmentId == -1 && steFilename != null) {
-      // fragment identifier encoded in filename
-      Matcher matcher = fragmentIdPattern.matcher(steFilename);
-      if (matcher.matches()) {
-        String fragment = matcher.group(1);
-        try {
-          fragmentId = Integer.parseInt(fragment);
-        } catch (Exception e) {
-        }
-      } else if (steFilename.contains(strongName)) {
-        // else it's <strongName>.cache.js which is the 0th fragment
-        fragmentId = 0;
-      }
-    }
-
-    // try to refine location via sourcemap
-    if (fragmentId != -1) {
-      SourceMapping sourceMapping = loadSourceMap(strongName, fragmentId);
-      if (sourceMapping != null && ste.getLineNumber() > -1) {
-        int column = 1;
-        int jsLineNumber = ste.getLineNumber();
-        if (jsLineNumber > StackTraceCreator.MAX_LINE_NUMBER) {
-          column = jsLineNumber / StackTraceCreator.MAX_LINE_NUMBER;
-          jsLineNumber = jsLineNumber % StackTraceCreator.MAX_LINE_NUMBER;
-        }
-        Mapping.OriginalMapping mappingForLine = sourceMapping
-            .getMappingForLine(jsLineNumber, column);
-        if (mappingForLine != null) {
-
-          if (declaringClass == null || declaringClass.equals(ste.getClassName())) {
-            declaringClass = mappingForLine.getOriginalFile();
-            methodName = mappingForLine.getIdentifier();
-          }
-          filename = mappingForLine.getOriginalFile();
-          lineNumber = mappingForLine.getLineNumber() - 1;
-        }
-      }
-    }
-
-    if (declaringClass != null) {
-      return new StackTraceElement(declaringClass, methodName, filename, lineNumber);
-    }
-
     // If anything goes wrong, just return the unobfuscated element
     return ste;
   }
-
+  
   public void setSymbolMapsDirectory(String symbolMapsDirectory) {
     // permutations are unique, no need to clear the symbolMaps hash map
     this.symbolMapsDirectory = new File(symbolMapsDirectory);
   }
 
-  protected InputStream getSourceMapInputStream(String permutationStrongName, int fragmentNumber)
-      throws IOException {
-    String filename = symbolMapsDirectory.getCanonicalPath()
-        + File.separatorChar + permutationStrongName + "_sourceMap" + fragmentNumber + ".json";
-    return new FileInputStream(filename);
-  }
-
   /**
-   * Retrieves a new {@link InputStream} for the given permutation strong name. This implementation,
-   * which subclasses may override, returns a {@link InputStream} for the <code>
-   * <i>permutation-strong-name</i>.symbolMap</code> file in the <code>symbolMaps</code> directory.
+   * Retrieves a new {@link InputStream} for the given permutation strong name.
+   * This implementation, which subclasses may override, returns a
+   * {@link InputStream} for the <code>
+   * <i>permutation-strong-name</i>.symbolMap</code> file in the
+   * <code>symbolMaps</code> directory.
    *
    * @param permutationStrongName the GWT permutation strong name
    * @return a new {@link InputStream}
+   * @throws IOException
    */
   protected InputStream getSymbolMapInputStream(String permutationStrongName)
       throws IOException {
@@ -249,7 +179,7 @@
         + File.separatorChar + permutationStrongName + ".symbolMap";
     return new FileInputStream(filename);
   }
-
+  
   private Throwable deobfuscateThrowable(Throwable old, String strongName) {
     Throwable t = new Throwable(old.getMessage());
     if (old.getStackTrace() != null) {
@@ -262,27 +192,7 @@
     }
     return t;
   }
-
-  private SourceMapping loadSourceMap(String permutationStrongName, int fragmentId) {
-    SourceMapping toReturn = sourceMaps.get(permutationStrongName + fragmentId);
-    if (toReturn == null) {
-      try {
-        SourceMapConsumerV3 consumer = new SourceMapConsumerV3();
-        String sourceMapString = loadStreamAsString(
-            getSourceMapInputStream(permutationStrongName, fragmentId));
-        JSONObject obj = new JSONObject(sourceMapString);
-        toReturn = SourceMapConsumerFactory.parse(sourceMapString);
-        sourceMaps.put(permutationStrongName + fragmentId, toReturn);
-      } catch (Exception e) {
-      }
-    }
-    return toReturn;
-  }
-
-  private String loadStreamAsString(InputStream stream) {
-    return new Scanner(stream).useDelimiter("\\A").next();
-  }
-
+  
   private SymbolMap loadSymbolMap(
       String strongName) {
     SymbolMap toReturn = symbolMaps.get(strongName);
@@ -302,7 +212,7 @@
           }
           int idx = line.indexOf(',');
           toReturn.put(new String(line.substring(0, idx)),
-              line.substring(idx + 1));
+                       line.substring(idx + 1));
         }
       } finally {
         bin.close();
@@ -317,13 +227,13 @@
   }
 
   /**
-   * Extracts the declaring class and method name from a JSNI ref, or null if the information cannot
-   * be extracted.
+   * Extracts the declaring class and method name from a JSNI ref, or null if
+   * the information cannot be extracted.
    *
-   * @param refString symbol map reference string
-   * @return a string array contains the declaring class and method name, or null when the regex
-   *         match fails
    * @see com.google.gwt.dev.util.JsniRef
+   * @param refString symbol map reference string
+   * @return a string array contains the declaring class and method name, or
+   *         null when the regex match fails
    */
   private String[] parse(String refString) {
     Matcher matcher = JsniRefPattern.matcher(refString);
@@ -332,7 +242,7 @@
     }
     String className = matcher.group(1);
     String memberName = matcher.group(2);
-    String[] toReturn = new String[]{className, memberName};
+    String[] toReturn = new String[] {className, memberName};
     return toReturn;
   }
 }
diff --git a/user/src/com/google/gwt/user/tools/QuerySourceMap.java b/user/src/com/google/gwt/user/tools/QuerySourceMap.java
deleted file mode 100644
index 5c271e5..0000000
--- a/user/src/com/google/gwt/user/tools/QuerySourceMap.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright 2009 Google Inc.
- *
- * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
- * License for the specific language governing permissions and limitations under
- * the License.
- */
-package com.google.gwt.user.tools;
-
-import com.google.debugging.sourcemap.SourceMapConsumerFactory;
-import com.google.debugging.sourcemap.SourceMapping;
-import com.google.gwt.dev.util.Util;
-
-import java.io.File;
-
-/**
- * Command-line utility for querying source maps.
- */
-public class QuerySourceMap {
-
-  public static void main(String[] args) throws Exception {
-    String filename = args[0];
-    int line = Integer.valueOf(args[1]);
-    int col = Integer.valueOf(args[2]);
-
-    SourceMapping consumer = SourceMapConsumerFactory.parse(Util.readFileAsString(new File(filename)));
-    System.out.println(consumer.getMappingForLine(line, col));
-  }
-}
diff --git a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
index cd7e41d..e57776a 100644
--- a/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
+++ b/user/test/com/google/gwt/core/client/impl/StackTraceCreatorTest.java
@@ -185,12 +185,12 @@
   public void testChromeExtractName() {
     CollectorChrome c = new CollectorChrome();
 
-    assertEquals("anonymous@@file.js:1:2", c.extractName(" at file.js:1:2"));
-    assertEquals("functionName@@file.js:1:2",
+    assertEquals("anonymous", c.extractName(" at file.js:1:2"));
+    assertEquals("functionName",
         c.extractName(" at functionName (file.js:1:2)"));
-    assertEquals("functionName@@file.js:1:2",
+    assertEquals("functionName",
         c.extractName(" at Type.functionName (file.js:1:2)"));
-    assertEquals("functionName@@file.js:1:2",
+    assertEquals("functionName",
         c.extractName(" at Type.functionName [as methodName] (file.js:1:2)"));
   }
 }
diff --git a/user/test/com/google/gwt/user/LoggingRPCSuite.gwt.xml b/user/test/com/google/gwt/user/LoggingRPCSuite.gwt.xml
index d8f2109..6f589f6 100644
--- a/user/test/com/google/gwt/user/LoggingRPCSuite.gwt.xml
+++ b/user/test/com/google/gwt/user/LoggingRPCSuite.gwt.xml
@@ -21,32 +21,5 @@
 
   <servlet path='/loggingrpc'
     class='com.google.gwt.user.server.rpc.LoggingRPCTestServiceImpl' />
-  <servlet path="/remote_logging" class="com.google.gwt.logging.server.RemoteLoggingServiceImpl"/>
-
-  <set-property name="gwt.logging.logLevel" value="WARNING"/>
-  <set-property name="gwt.logging.enabled" value="TRUE"/>
-  <set-property name="gwt.logging.consoleHandler" value="ENABLED"/>
-  <set-property name="gwt.logging.simpleRemoteHandler" value="ENABLED" />
-
-
-  <set-property name="compiler.useSourceMaps" value="true"/>
-
-
-  <!-- Turn off emulation to test non-sourcemap mode -->
-  <set-property name="compiler.stackMode" value="native"/> 
-  <!-- when Chrome is enabled, turn off stack trace emulation -->
-  <set-property name="compiler.stackMode" value="strip"> 
-    <when-property-is name="user.agent" value="safari"/>
-  </set-property>
-
-  <!-- when stack trace stripping is enabled, we need to replace the Null collector 
-       with one that does something for Chrome -->
-  <replace-with class="com.google.gwt.core.client.impl.StackTraceCreator.CollectorChrome">
-    <when-type-is class="com.google.gwt.core.client.impl.StackTraceCreator.Collector" />
-    <!-- For now, only Chrome provides Error.stack support, so we hijack the
-         entire WebKit permutation -->
-    <when-property-is name="user.agent" value="safari" />
-    <when-property-is name="compiler.useSourceMaps" value="true" />
-  </replace-with>
 
 </module>
diff --git a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java
index 8991ffa..365ce4a 100644
--- a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java
+++ b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTest.java
@@ -18,34 +18,21 @@
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.junit.client.GWTTestCase;
-import com.google.gwt.core.client.impl.SourceMapProperty;
 
 import java.util.logging.Level;
 import java.util.logging.LogRecord;
 
 /**
  * Test cases for Generic Collections in GWT RPC.
+ * 
  */
 public class LoggingRPCTest extends GWTTestCase {
 
-  /**
-   * WARNING! WARNING! If you edit this method or insert any lines of code above this method,you
-   * must re-edit the line number constants below;
-   */
-  private static final int METHOD_START_LINE = 39;
-
-  private static final int METHOD_EXCEPTION_LINE = 41;
-
-  private void throwException(String arg) {
-    // prevent inlining by double referencing arg
-    throw new RuntimeException(arg.charAt(0) + arg.substring(1));
-  }
-
   @Override
   public String getModuleName() {
     return "com.google.gwt.user.LoggingRPCSuite";
   }
-
+  
   private static final LogRecord expectedLogRecord = createLogRecord();
 
   public static boolean isValid(LogRecord value) {
@@ -77,7 +64,7 @@
       }
 
       // Do not compare trace as it is not stable across RPC.
-
+      
       expectedCause = expectedCause.getCause();
       valueCause = valueCause.getCause();
     }
@@ -103,18 +90,6 @@
     return result;
   }
 
-  private static LogRecord createLogRealRecord(Throwable thrown) {
-    LogRecord result = new LogRecord(Level.INFO, "Test Log Record");
-
-    // Only set serialized fields.
-    result.setLoggerName("Test Logger Name");
-    result.setMillis(1234567);
-
-    result.setThrown(thrown);
-
-    return result;
-  }
-
   private LoggingRPCTestServiceAsync loggingRPCTestService;
 
   public void testLogRecord() {
@@ -134,65 +109,10 @@
     });
   }
 
-  public void testStackMapDeobfuscation() {
-    final LoggingRPCTestServiceAsync service = getServiceAsync();
-    delayTestFinish(500000);
-    GWT.runAsync(LoggingRPCTest.class, new com.google.gwt.core.client.RunAsyncCallback() {
-
-      @Override
-      public void onFailure(Throwable reason) {
-      }
-
-      @Override
-      public void onSuccess() {
-        try {
-          throwException("Runtime Exception");
-        } catch (Exception e) {
-          service.deobfuscateLogRecord(createLogRealRecord(e), new AsyncCallback<LogRecord>() {
-
-            public void onFailure(Throwable caught) {
-              assertTrue(false);
-              TestSetValidator.rethrowException(caught);
-            }
-
-            public void onSuccess(LogRecord record) {
-              Throwable thrown = record.getThrown();
-              boolean found = false;
-              for (StackTraceElement e : thrown.getStackTrace()) {
-                if (e.getFileName().contains("LoggingRPCTest")) {
-                  // if DevMode or SourceMaps enabled and Chrome is the browser, check for exact line
-                  if (SourceMapProperty.isDetailedDeobfuscatedStackTraceSupported()) {
-                    assertEquals(METHOD_EXCEPTION_LINE, e.getLineNumber());
-                  } else {
-                    // else fallback to line number of method itself
-                    assertEquals(METHOD_START_LINE, e.getLineNumber());
-                  }
-                  String methodName = "throwException";
-                  assertTrue("Method name mismatch, expected = " + methodName
-                      + " vs actual = " + e.getMethodName(),
-                      e.getMethodName().contains(methodName));
-                  String className = "com.google.gwt.user.client.rpc.LoggingRPCTest";
-                  assertTrue("Class name mismatch, expected = " + className
-                      + " actual = " + e.getClassName(), className.contains(e.getClassName()));
-                  found = true;
-                  break;
-                }
-              }
-              assertTrue(found);
-              finishTest();
-            }
-          });
-        }
-      }
-    });
-  }
-
   private LoggingRPCTestServiceAsync getServiceAsync() {
     if (loggingRPCTestService == null) {
       loggingRPCTestService = (LoggingRPCTestServiceAsync) GWT.create(LoggingRPCTestService.class);
     }
     return loggingRPCTestService;
   }
-
-
 }
diff --git a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestService.java b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestService.java
index 1cc4842..f597cd2 100644
--- a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestService.java
+++ b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestService.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2011 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -34,7 +34,6 @@
       super(msg);
     }
   }
-  LogRecord deobfuscateLogRecord(LogRecord value) throws LoggingRPCTestServiceException;
 
   LogRecord echoLogRecord(LogRecord value) throws LoggingRPCTestServiceException;
 }
diff --git a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestServiceAsync.java b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestServiceAsync.java
index 0460667..6e680a0 100644
--- a/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestServiceAsync.java
+++ b/user/test/com/google/gwt/user/client/rpc/LoggingRPCTestServiceAsync.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2011 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -23,8 +23,6 @@
  * Async interface for serialization of GWT core.java emulations.
  */
 public interface LoggingRPCTestServiceAsync {
-  void deobfuscateLogRecord(LogRecord value, AsyncCallback<LogRecord> callback);
 
   void echoLogRecord(LogRecord value, AsyncCallback<LogRecord> callback);
-
 }
diff --git a/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java b/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java
index 691139a..cb61242 100644
--- a/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java
+++ b/user/test/com/google/gwt/user/server/rpc/LoggingRPCTestServiceImpl.java
@@ -1,12 +1,12 @@
 /*
  * Copyright 2011 Google Inc.
- *
+ * 
  * Licensed under the Apache License, Version 2.0 (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.apache.org/licenses/LICENSE-2.0
- *
+ * 
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
@@ -16,80 +16,18 @@
 
 package com.google.gwt.user.server.rpc;
 
-import static com.google.gwt.user.client.rpc.RpcRequestBuilder.MODULE_BASE_HEADER;
-
-import com.google.gwt.junit.linker.JUnitSymbolMapsLinker;
-import com.google.gwt.logging.server.StackTraceDeobfuscator;
 import com.google.gwt.user.client.rpc.LoggingRPCTest;
 import com.google.gwt.user.client.rpc.LoggingRPCTestService;
-import com.google.gwt.user.client.rpc.RpcRequestBuilder;
 
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
 import java.util.logging.LogRecord;
-import java.util.logging.Logger;
-
-import javax.servlet.http.HttpServletRequest;
 
 /**
- * Remote service implementation for serialization of GWT core.java.util.logging emulations.
+ * Remote service implementation for serialization of GWT core.java.util.logging
+ * emulations.
  */
 public class LoggingRPCTestServiceImpl extends HybridServiceServlet implements
     LoggingRPCTestService {
 
-  @Override
-  public LogRecord deobfuscateLogRecord(LogRecord value)
-      throws LoggingRPCTestServiceException {
-    // don't deobfuscate DevMode, there's no symbol map
-    if ("HostedMode".equals(getPermutationStrongName())) {
-      return value;
-    }
-
-    StackTraceDeobfuscator deobf = new StackTraceDeobfuscator(getSymbolMapsDir()) {
-      @Override
-      protected InputStream getSourceMapInputStream(String permutationStrongName,
-          int fragmentNumber)
-          throws IOException {
-        if (symbolMapsDirectory.exists()) {
-          return super.getSourceMapInputStream(permutationStrongName,
-              fragmentNumber);
-        } else {
-          return getServletContext().getResourceAsStream(
-              getModule() + File.separatorChar + JUnitSymbolMapsLinker.SYMBOL_MAP_DIR
-                  + permutationStrongName
-                  + "_sourceMap" + fragmentNumber + ".json");
-        }
-      }
-
-      @Override
-      protected InputStream getSymbolMapInputStream(String permutationStrongName)
-          throws IOException {
-        if (symbolMapsDirectory.exists()) {
-          return super.getSymbolMapInputStream(permutationStrongName);
-        } else {
-          String name =
-              getModule() + File.separatorChar + JUnitSymbolMapsLinker.SYMBOL_MAP_DIR
-                  + permutationStrongName
-                  + ".symbolMap";
-          return getServletContext().getResourceAsStream(name);
-        }
-      }
-    };
-
-    HttpServletRequest threadLocalRequest = getThreadLocalRequest();
-    String strongName = null;
-    if (threadLocalRequest != null) {
-      // can be null during tests
-      strongName = threadLocalRequest.getHeader(RpcRequestBuilder.STRONG_NAME_HEADER);
-    }
-    LogRecord newRecord = deobf.deobfuscateLogRecord(value, strongName);
-    Logger.getLogger(value.getLoggerName()).log(newRecord);
-    return newRecord;
-  }
-
   public LogRecord echoLogRecord(LogRecord value) throws LoggingRPCTestServiceException {
     /*
      * Don't check the stack trace on the server side, because the expected
@@ -103,34 +41,4 @@
 
     return value;
   }
-
-  private String getModule() {
-    try {
-      String header = getThreadLocalRequest().getHeader(MODULE_BASE_HEADER);
-      if (header == null) {
-        return null;
-      }
-      String path = new URL(header).getPath();
-      String contextPath = getThreadLocalRequest().getContextPath();
-      if (!path.startsWith(contextPath)) {
-        return null;
-      }
-      path = path.substring(contextPath.length());
-      if (path.endsWith("/")) {
-        path = path.substring(0, path.length() - 1);
-      }
-      return path;
-    } catch (MalformedURLException e) {
-      return null;
-    }
-  }
-
-  private String getSymbolMapsDir() {
-    String path = getModule();
-    if (path == null) {
-      return null;
-    }
-    return "war" + File.separatorChar + getModule() + File.separatorChar
-        + JUnitSymbolMapsLinker.SYMBOL_MAP_DIR;
-  }
 }