diff --git a/pkg/compiler/lib/src/io/source_information.dart b/pkg/compiler/lib/src/io/source_information.dart
index c0e6e0a8..5294261 100644
--- a/pkg/compiler/lib/src/io/source_information.dart
+++ b/pkg/compiler/lib/src/io/source_information.dart
@@ -8,13 +8,12 @@
 import '../elements/elements.dart' show AstElement;
 import '../scanner/scannerlib.dart' show Token;
 import '../tree/tree.dart' show Node;
-import '../js/js.dart' show JavaScriptNodeSourceInformation;
 import 'code_output.dart';
 import 'source_file.dart';
 
 /// Interface for passing source information, for instance for use in source
 /// maps, through the backend.
-abstract class SourceInformation extends JavaScriptNodeSourceInformation {
+abstract class SourceInformation {
   SourceSpan get sourceSpan;
   void beginMapping(CodeOutput output);
   void endMapping(CodeOutput output);
diff --git a/pkg/compiler/lib/src/js/builder.dart b/pkg/compiler/lib/src/js/builder.dart
index 72b4507..0fa01cc 100644
--- a/pkg/compiler/lib/src/js/builder.dart
+++ b/pkg/compiler/lib/src/js/builder.dart
@@ -5,7 +5,7 @@
 // Utilities for building JS ASTs at runtime.  Contains a builder class
 // and a parser that parses part of the language.
 
-part of js_ast;
+part of js;
 
 
 /**
diff --git a/pkg/compiler/lib/src/js/characters.dart b/pkg/compiler/lib/src/js/characters.dart
deleted file mode 100644
index ae6740f..0000000
--- a/pkg/compiler/lib/src/js/characters.dart
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library js_character_codes;
-
-const int $EOF = 0;
-const int $STX = 2;
-const int $BS  = 8;
-const int $TAB = 9;
-const int $LF = 10;
-const int $VTAB = 11;
-const int $FF = 12;
-const int $CR = 13;
-const int $SPACE = 32;
-const int $BANG = 33;
-const int $DQ = 34;
-const int $HASH = 35;
-const int $$ = 36;
-const int $PERCENT = 37;
-const int $AMPERSAND = 38;
-const int $SQ = 39;
-const int $OPEN_PAREN = 40;
-const int $CLOSE_PAREN = 41;
-const int $STAR = 42;
-const int $PLUS = 43;
-const int $COMMA = 44;
-const int $MINUS = 45;
-const int $PERIOD = 46;
-const int $SLASH = 47;
-const int $0 = 48;
-const int $1 = 49;
-const int $2 = 50;
-const int $3 = 51;
-const int $4 = 52;
-const int $5 = 53;
-const int $6 = 54;
-const int $7 = 55;
-const int $8 = 56;
-const int $9 = 57;
-const int $COLON = 58;
-const int $SEMICOLON = 59;
-const int $LT = 60;
-const int $EQ = 61;
-const int $GT = 62;
-const int $QUESTION = 63;
-const int $AT = 64;
-const int $A = 65;
-const int $B = 66;
-const int $C = 67;
-const int $D = 68;
-const int $E = 69;
-const int $F = 70;
-const int $G = 71;
-const int $H = 72;
-const int $I = 73;
-const int $J = 74;
-const int $K = 75;
-const int $L = 76;
-const int $M = 77;
-const int $N = 78;
-const int $O = 79;
-const int $P = 80;
-const int $Q = 81;
-const int $R = 82;
-const int $S = 83;
-const int $T = 84;
-const int $U = 85;
-const int $V = 86;
-const int $W = 87;
-const int $X = 88;
-const int $Y = 89;
-const int $Z = 90;
-const int $OPEN_SQUARE_BRACKET = 91;
-const int $BACKSLASH = 92;
-const int $CLOSE_SQUARE_BRACKET = 93;
-const int $CARET = 94;
-const int $_ = 95;
-const int $BACKPING = 96;
-const int $a = 97;
-const int $b = 98;
-const int $c = 99;
-const int $d = 100;
-const int $e = 101;
-const int $f = 102;
-const int $g = 103;
-const int $h = 104;
-const int $i = 105;
-const int $j = 106;
-const int $k = 107;
-const int $l = 108;
-const int $m = 109;
-const int $n = 110;
-const int $o = 111;
-const int $p = 112;
-const int $q = 113;
-const int $r = 114;
-const int $s = 115;
-const int $t = 116;
-const int $u = 117;
-const int $v = 118;
-const int $w = 119;
-const int $x = 120;
-const int $y = 121;
-const int $z = 122;
-const int $OPEN_CURLY_BRACKET = 123;
-const int $BAR = 124;
-const int $CLOSE_CURLY_BRACKET = 125;
-const int $TILDE = 126;
-const int $DEL = 127;
-const int $NBSP = 160;
-const int $LS = 0x2028;
-const int $PS = 0x2029;
-
-const int $FIRST_SURROGATE = 0xd800;
-const int $LAST_SURROGATE = 0xdfff;
-const int $LAST_CODE_POINT = 0x10ffff;
diff --git a/pkg/compiler/lib/src/js/js.dart b/pkg/compiler/lib/src/js/js.dart
index a5bbec4..fac460d 100644
--- a/pkg/compiler/lib/src/js/js.dart
+++ b/pkg/compiler/lib/src/js/js.dart
@@ -1,64 +1,23 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
+// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 library js;
 
-// TODO(sra): This will become a package import.
-import 'js_ast.dart';
-export 'js_ast.dart';
-
+import 'precedence.dart';
+import '../util/characters.dart' as charCodes;
+import '../util/util.dart';
 import '../io/code_output.dart' show CodeBuffer;
 import '../io/source_information.dart' show SourceInformation;
 import '../js_emitter/js_emitter.dart' show USE_NEW_EMITTER;
+
+// TODO(floitsch): remove this dependency (currently necessary for the
+// CodeBuffer).
 import '../dart2jslib.dart' as leg;
-import '../util/util.dart' show NO_LOCATION_SPANNABLE;
-import '../dump_info.dart' show DumpInfoTask;
 
+import '../dump_info.dart';
 
-CodeBuffer prettyPrint(Node node, leg.Compiler compiler,
-                       {DumpInfoTask monitor,
-                        bool allowVariableMinification: true}) {
-  JavaScriptPrintingOptions options = new JavaScriptPrintingOptions(
-      shouldCompressOutput: compiler.enableMinification,
-      minifyLocalVariables: allowVariableMinification,
-      preferSemicolonToNewlineInMinifiedOutput: USE_NEW_EMITTER);
-  Dart2JSJavaScriptPrintingContext context =
-      new Dart2JSJavaScriptPrintingContext(compiler, monitor);
-  Printer printer = new Printer(options, context);
-  printer.visit(node);
-  return context.outBuffer;
-}
-
-class Dart2JSJavaScriptPrintingContext implements JavaScriptPrintingContext {
-  final leg.Compiler compiler;
-  final DumpInfoTask monitor;
-  final CodeBuffer outBuffer = new CodeBuffer();
-
-  Dart2JSJavaScriptPrintingContext(leg.Compiler this.compiler,
-      DumpInfoTask this.monitor);
-
-  void error(String message) {
-    compiler.internalError(NO_LOCATION_SPANNABLE, message);
-  }
-
-  void emit(String string) {
-    outBuffer.add(string);
-  }
-
-  void enterNode(Node node) {
-    SourceInformation sourceInformation = node.sourceInformation;
-    if (sourceInformation != null) {
-      sourceInformation.beginMapping(outBuffer);
-    }
-    if (monitor != null) monitor.enteringAst(node, outBuffer.length);
-  }
-
-  void exitNode(Node node) {
-    if (monitor != null) monitor.exitingAst(node, outBuffer.length);
-    SourceInformation sourceInformation = node.sourceInformation;
-    if (sourceInformation != null) {
-      sourceInformation.endMapping(outBuffer);
-    }
-  }
-}
+part 'nodes.dart';
+part 'builder.dart';
+part 'printer.dart';
+part 'template.dart';
diff --git a/pkg/compiler/lib/src/js/js_ast.dart b/pkg/compiler/lib/src/js/js_ast.dart
deleted file mode 100644
index ee8289e..0000000
--- a/pkg/compiler/lib/src/js/js_ast.dart
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2015, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library js_ast;
-
-import 'precedence.dart';
-import 'characters.dart' as charCodes;
-
-part 'nodes.dart';
-part 'builder.dart';
-part 'printer.dart';
-part 'template.dart';
diff --git a/pkg/compiler/lib/src/js/nodes.dart b/pkg/compiler/lib/src/js/nodes.dart
index 92446fa..60b3a85 100644
--- a/pkg/compiler/lib/src/js/nodes.dart
+++ b/pkg/compiler/lib/src/js/nodes.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of js_ast;
+part of js;
 
 abstract class NodeVisitor<T> {
   T visitProgram(Program node);
@@ -29,6 +29,7 @@
   T visitLiteralStatement(LiteralStatement node);
   T visitDartYield(DartYield node);
 
+  T visitBlob(Blob node);
   T visitLiteralExpression(LiteralExpression node);
   T visitVariableDeclarationList(VariableDeclarationList node);
   T visitAssignment(Assignment node);
@@ -108,6 +109,7 @@
   T visitDefault(Default node) => visitNode(node);
 
   T visitExpression(Expression node) => visitNode(node);
+  T visitBlob(Blob node) => visitExpression(node);
   T visitVariableReference(VariableReference node) => visitExpression(node);
 
   T visitLiteralExpression(LiteralExpression node) => visitExpression(node);
@@ -171,14 +173,10 @@
   T visitDartYield(DartYield node) => visitStatement(node);
 }
 
-/// This tag interface has no behaviour but must be implemented by any class
-/// that is to be stored on a [Node] as source information.
-abstract class JavaScriptNodeSourceInformation {}
-
 abstract class Node {
-  JavaScriptNodeSourceInformation get sourceInformation => _sourceInformation;
+  SourceInformation get sourceInformation => _sourceInformation;
 
-  JavaScriptNodeSourceInformation _sourceInformation;
+  SourceInformation _sourceInformation;
 
   accept(NodeVisitor visitor);
   void visitChildren(NodeVisitor visitor);
@@ -189,8 +187,7 @@
 
   // Returns a node equivalent to [this], but with new source position and end
   // source position.
-  Node withSourceInformation(
-      JavaScriptNodeSourceInformation sourceInformation) {
+  Node withSourceInformation(SourceInformation sourceInformation) {
     if (sourceInformation == _sourceInformation) {
       return this;
     }
@@ -525,8 +522,8 @@
   LiteralStatement _clone() => new LiteralStatement(code);
 }
 
-// Not a real JavaScript node, but represents the yield statement from a dart
-// program translated to JavaScript.
+// Not a real javascript node, but represents the yield statement from a dart
+// program translated to javascript.
 class DartYield extends Statement {
   final Expression expression;
 
@@ -549,6 +546,25 @@
   Statement toStatement() => new ExpressionStatement(this);
 }
 
+/// Wrap a CodeBuffer as an expression.
+class Blob extends Expression {
+  // TODO(ahe): This class is an aid to convert everything to ASTs, remove when
+  // not needed anymore.
+
+  final CodeBuffer buffer;
+
+  Blob(this.buffer);
+
+  accept(NodeVisitor visitor) => visitor.visitBlob(this);
+
+  void visitChildren(NodeVisitor visitor) {}
+
+  Blob _clone() => new Blob(buffer);
+
+  int get precedenceLevel => PRIMARY;
+
+}
+
 class LiteralExpression extends Expression {
   final String template;
   final List<Expression> inputs;
@@ -931,12 +947,9 @@
   /**
    * Constructs a LiteralString from a string value.
    *
-   * The constructor does not add the required quotes.  If [value] is not
-   * surrounded by quotes and property escaped, the resulting object is invalid
-   * as a JS value.
-   *
-   * TODO(sra): Introduce variants for known valid strings that don't allocate a
-   * new string just to add quotes.
+   * The constructor does not add the required quotes.  If [value] is
+   * not surrounded by quotes, the resulting object is invalid as a JS
+   * value.
    */
   LiteralString(this.value);
 
@@ -945,7 +958,7 @@
 }
 
 class LiteralNumber extends Literal {
-  final String value;  // Must be a valid JavaScript number literal.
+  final String value;
 
   LiteralNumber(this.value);
 
@@ -1114,7 +1127,7 @@
 /**
  * An asynchronous await.
  *
- * Not part of JavaScript. We desugar this expression before outputting.
+ * Not part of javascript. We desugar this expression before outputting.
  * Should only occur in a [Fun] with `asyncModifier` async or asyncStar.
  */
 class Await extends Expression {
diff --git a/pkg/compiler/lib/src/js/printer.dart b/pkg/compiler/lib/src/js/printer.dart
index 6ee3f3e..d359a05 100644
--- a/pkg/compiler/lib/src/js/printer.dart
+++ b/pkg/compiler/lib/src/js/printer.dart
@@ -2,77 +2,32 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of js_ast;
+part of js;
 
-
-class JavaScriptPrintingOptions {
+class Printer extends Indentation implements NodeVisitor {
   final bool shouldCompressOutput;
-  final bool minifyLocalVariables;
-  final bool preferSemicolonToNewlineInMinifiedOutput;
-
-  JavaScriptPrintingOptions(
-      {this.shouldCompressOutput: false,
-       this.minifyLocalVariables: false,
-       this.preferSemicolonToNewlineInMinifiedOutput: false});
-}
-
-
-/// An environment in which JavaScript printing is done.  Provides emitting of
-/// text and pre- and post-visit callbacks.
-abstract class JavaScriptPrintingContext {
-  /// Signals an error.  This should happen only for serious internal errors.
-  void error(String message) { throw message; }
-
-  /// Adds [string] to the output.
-  void emit(String string);
-
-  /// Callback immediately before printing [node].  Whitespace may be printed
-  /// after this callback before the first non-whitespace character for [node].
-  void enterNode(Node node) {}
-  /// Callback after printing the last character representing [node].
-  void exitNode(Node node) {}
-}
-
-/// A simple implementation of [JavaScriptPrintingContext] suitable for tests.
-class SimpleJavaScriptPrintingContext extends JavaScriptPrintingContext {
-  final StringBuffer buffer = new StringBuffer();
-
-  void emit(String string) {
-    buffer.write(string);
-  }
-
-  String getText() => buffer.toString();
-}
-
-
-class Printer implements NodeVisitor {
-  final JavaScriptPrintingOptions options;
-  final JavaScriptPrintingContext context;
-  final bool shouldCompressOutput;
-  final DanglingElseVisitor danglingElseVisitor;
-  final LocalNamer localNamer;
-
+  leg.DiagnosticListener diagnosticListener;
+  CodeBuffer outBuffer;
   bool inForInit = false;
   bool atStatementBegin = false;
+  final DanglingElseVisitor danglingElseVisitor;
+  final LocalNamer localNamer;
   bool pendingSemicolon = false;
   bool pendingSpace = false;
-
-  // The current indentation level.
-  int _indentLevel = 0;
-  // A cache of all indentation strings used so far.
-  List<String> _indentList = <String>[""];
+  DumpInfoTask monitor = null;
 
   static final identifierCharacterRegExp = new RegExp(r'^[a-zA-Z_0-9$]');
   static final expressionContinuationRegExp = new RegExp(r'^[-+([]');
 
-  Printer(JavaScriptPrintingOptions options,
-          JavaScriptPrintingContext context)
-      : options = options,
-        context = context,
-        shouldCompressOutput = options.shouldCompressOutput,
-        danglingElseVisitor = new DanglingElseVisitor(context),
-        localNamer = determineRenamer(options.shouldCompressOutput,
-                                      options.minifyLocalVariables);
+  Printer(leg.DiagnosticListener diagnosticListener, DumpInfoTask monitor,
+          { bool enableMinification: false, allowVariableMinification: true })
+      : shouldCompressOutput = enableMinification,
+        monitor = monitor,
+        diagnosticListener = diagnosticListener,
+        outBuffer = new CodeBuffer(),
+        danglingElseVisitor = new DanglingElseVisitor(diagnosticListener),
+        localNamer = determineRenamer(enableMinification,
+                                      allowVariableMinification);
 
   static LocalNamer determineRenamer(bool shouldCompressOutput,
                                      bool allowVariableMinification) {
@@ -80,25 +35,6 @@
         ? new MinifyRenamer() : new IdentityNamer();
   }
 
-
-  // The current indentation string.
-  String get indentation {
-    // Lazily add new indentation strings as required.
-    while (_indentList.length <= _indentLevel) {
-      _indentList.add(_indentList.last + "  ");
-    }
-    return _indentList[_indentLevel];
-  }
-
-  void indentMore() {
-    _indentLevel++;
-  }
-
-  void indentLess() {
-    _indentLevel--;
-  }
-
-
   /// Always emit a newline, even under `enableMinification`.
   void forceLine() {
     out("\n");
@@ -122,7 +58,7 @@
     if (str != "") {
       if (pendingSemicolon) {
         if (!shouldCompressOutput) {
-          context.emit(";");
+          outBuffer.add(";");
         } else if (str != "}") {
           // We want to output newline instead of semicolon because it makes
           // the raw stack traces much easier to read and it also makes line-
@@ -135,21 +71,20 @@
           // If we're using the new emitter where most pretty printed code
           // is escaped in strings, it is a lot easier to deal with semicolons
           // than newlines because the former doesn't need escaping.
-          if (options.preferSemicolonToNewlineInMinifiedOutput ||
-              expressionContinuationRegExp.hasMatch(str)) {
-            context.emit(";");
+          if (USE_NEW_EMITTER || expressionContinuationRegExp.hasMatch(str)) {
+            outBuffer.add(";");
           } else {
-            context.emit("\n");
+            outBuffer.add("\n");
           }
         }
       }
       if (pendingSpace &&
           (!shouldCompressOutput || identifierCharacterRegExp.hasMatch(str))) {
-        context.emit(" ");
+        outBuffer.add(" ");
       }
       pendingSpace = false;
       pendingSemicolon = false;
-      context.emit(str);
+      outBuffer.add(str);
       lastAddedString = str;
     }
   }
@@ -176,10 +111,26 @@
     }
   }
 
+  void beginSourceRange(Node node) {
+    if (node.sourceInformation != null) {
+      node.sourceInformation.beginMapping(outBuffer);
+    }
+  }
+
+  void endSourceRange(Node node) {
+    if (node.sourceInformation != null) {
+      node.sourceInformation.endMapping(outBuffer);
+    }
+  }
+
   visit(Node node) {
-    context.enterNode(node);
+    beginSourceRange(node);
+    if (monitor != null) monitor.enteringAst(node, outBuffer.length);
+
     node.accept(this);
-    context.exitNode(node);
+
+    if (monitor != null) monitor.exitingAst(node, outBuffer.length);
+    endSourceRange(node);
   }
 
   visitCommaSeparated(List<Node> nodes, int hasRequiredType,
@@ -204,6 +155,10 @@
     visitAll(program.body);
   }
 
+  visitBlob(Blob node) {
+    outBuffer.addBuffer(node.buffer);
+  }
+
   bool blockBody(Node body, {bool needsSeparation, bool needsNewline}) {
     if (body is Block) {
       spaceOut();
@@ -217,18 +172,16 @@
     } else {
       lineOut();
     }
-    indentMore();
-    visit(body);
-    indentLess();
+    indentBlock(() => visit(body));
     return false;
   }
 
   void blockOutWithoutBraces(Node node) {
     if (node is Block) {
-      context.enterNode(node);
+      beginSourceRange(node);
       Block block = node;
       block.statements.forEach(blockOutWithoutBraces);
-      context.exitNode(node);
+      endSourceRange(node);
     } else {
       visit(node);
     }
@@ -236,15 +189,13 @@
 
   void blockOut(Block node, bool shouldIndent, bool needsNewline) {
     if (shouldIndent) indent();
-    context.enterNode(node);
+    beginSourceRange(node);
     out("{");
     lineOut();
-    indentMore();
-    node.statements.forEach(blockOutWithoutBraces);
-    indentLess();
+    indentBlock(() => node.statements.forEach(blockOutWithoutBraces));
     indent();
     out("}");
-    context.exitNode(node);
+    endSourceRange(node);
     if (needsNewline) lineOut();
   }
 
@@ -456,9 +407,7 @@
     out(")");
     spaceOut();
     outLn("{");
-    indentMore();
-    visitAll(node.cases);
-    indentLess();
+    indentBlock(() => visitAll(node.cases));
     outIndentLn("}");
   }
 
@@ -469,18 +418,14 @@
                           newInForInit: false, newAtStatementBegin: false);
     outLn(":");
     if (!node.body.statements.isEmpty) {
-      indentMore();
-      blockOutWithoutBraces(node.body);
-      indentLess();
+      indentBlock(() => blockOutWithoutBraces(node.body));
     }
   }
 
   visitDefault(Default node) {
     outIndentLn("default:");
     if (!node.body.statements.isEmpty) {
-      indentMore();
-      blockOutWithoutBraces(node.body);
-      indentLess();
+      indentBlock(() => blockOutWithoutBraces(node.body));
     }
   }
 
@@ -697,7 +642,8 @@
         rightPrecedenceRequirement = UNARY;
         break;
       default:
-        context.error("Forgot operator: $op");
+        diagnosticListener
+            .internalError(NO_LOCATION_SPANNABLE, "Forgot operator: $op");
     }
 
     visitNestedExpression(left, leftPrecedenceRequirement,
@@ -934,7 +880,8 @@
     List<String> parts = template.split('#');
     int inputsLength = inputs == null ? 0 : inputs.length;
     if (parts.length != inputsLength + 1) {
-      context.error('Wrong number of arguments for JS: $template');
+      diagnosticListener.internalError(NO_LOCATION_SPANNABLE,
+          'Wrong number of arguments for JS: $template');
     }
     // Code that uses JS must take care of operator precedences, and
     // put parenthesis if needed.
@@ -1061,14 +1008,15 @@
  * as then-statement in an [If] that has an else branch.
  */
 class DanglingElseVisitor extends BaseVisitor<bool> {
-  JavaScriptPrintingContext context;
+  leg.DiagnosticListener diagnosticListener;
 
-  DanglingElseVisitor(this.context);
+  DanglingElseVisitor(this.diagnosticListener);
 
   bool visitProgram(Program node) => false;
 
   bool visitNode(Statement node) {
-    context.error("Forgot node: $node");
+    diagnosticListener
+        .internalError(NO_LOCATION_SPANNABLE, "Forgot node: $node");
     return null;
   }
 
@@ -1107,6 +1055,18 @@
 }
 
 
+CodeBuffer prettyPrint(Node node, leg.Compiler compiler,
+                       {DumpInfoTask monitor,
+                        bool allowVariableMinification: true}) {
+  Printer printer =
+      new Printer(compiler, monitor,
+                  enableMinification: compiler.enableMinification,
+                  allowVariableMinification: allowVariableMinification);
+  printer.visit(node);
+  return printer.outBuffer;
+}
+
+
 abstract class LocalNamer {
   String getName(String oldName);
   String declareVariable(String oldName);
diff --git a/pkg/compiler/lib/src/js/rewrite_async.dart b/pkg/compiler/lib/src/js/rewrite_async.dart
index 656b1af..3f5bfaa 100644
--- a/pkg/compiler/lib/src/js/rewrite_async.dart
+++ b/pkg/compiler/lib/src/js/rewrite_async.dart
@@ -966,6 +966,11 @@
   }
 
   @override
+  js.Expression visitBlob(js.Blob node) {
+    return node;
+  }
+
+  @override
   void visitBlock(js.Block node) {
     for (js.Statement statement in node.statements) {
       visitStatement(statement);
@@ -1817,6 +1822,11 @@
   }
 
   @override
+  bool visitBlob(js.Blob node) {
+    return false;
+  }
+
+  @override
   bool visitBlock(js.Block node) {
     bool containsAwait = false;
     for (js.Statement statement in node.statements) {
diff --git a/pkg/compiler/lib/src/js/template.dart b/pkg/compiler/lib/src/js/template.dart
index 7740431..f08fe52 100644
--- a/pkg/compiler/lib/src/js/template.dart
+++ b/pkg/compiler/lib/src/js/template.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of js_ast;
+part of js;
 
 class TemplateManager {
   Map<String, Template> expressionTemplates = new Map<String, Template>();
@@ -499,6 +499,8 @@
 
   Instantiator visitLiteralStatement(LiteralStatement node) =>
       TODO('visitLiteralStatement');
+  Instantiator visitBlob(Blob node) =>
+      TODO('visitBlob');
   Instantiator visitLiteralExpression(LiteralExpression node) =>
       TODO('visitLiteralExpression');
 
@@ -707,12 +709,12 @@
 }
 
 /**
- * InterpolatedNodeAnalysis determines which AST trees contain
- * [InterpolatedNode]s, and the names of the named interpolated nodes.
+ * InterpolatedNodeAnalysis extract [InterpolatedNode]s from AST.
  */
 class InterpolatedNodeAnalysis extends BaseVisitor {
-  final Set<Node> containsInterpolatedNode = new Set<Node>();
-  final Set<String> holeNames = new Set<String>();
+  final Setlet<Node> containsInterpolatedNode = new Setlet<Node>();
+  final List<InterpolatedNode> interpolatedNodes = <InterpolatedNode>[];
+  final Setlet<String> holeNames = new Setlet<String>();
   int count = 0;
 
   InterpolatedNodeAnalysis();
@@ -732,6 +734,7 @@
   }
 
   visitInterpolatedNode(InterpolatedNode node) {
+    interpolatedNodes.add(node);
     containsInterpolatedNode.add(node);
     if (node.isNamed) holeNames.add(node.nameOrPosition);
     ++count;
diff --git a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
index a575e1c..8b1bcec 100644
--- a/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
+++ b/pkg/compiler/lib/src/js_emitter/old_emitter/emitter.dart
@@ -868,8 +868,8 @@
         cachedEmittedConstants.add(constantValue);
       }
       jsAst.Expression init = buildConstantInitializer(constantValue);
-      constantOutput.addBuffer(
-          jsAst.prettyPrint(init, compiler, monitor: compiler.dumpInfoTask));
+      constantOutput.addBuffer(jsAst.prettyPrint(init, compiler,
+                                         monitor: compiler.dumpInfoTask));
       constantOutput.add('$N');
     }
     if (compiler.hasIncrementalSupport && isMainFragment) {
diff --git a/pkg/compiler/lib/src/use_unused_api.dart b/pkg/compiler/lib/src/use_unused_api.dart
index 77f0bc9..909b000 100644
--- a/pkg/compiler/lib/src/use_unused_api.dart
+++ b/pkg/compiler/lib/src/use_unused_api.dart
@@ -51,10 +51,10 @@
   useSetlet(null);
   useImmutableEmptySet(null);
   useElementVisitor(new ElementVisitor());
-  useJsNode(new js.Program(null));
-  useJsNode(new js.NamedFunction(null, null));
-  useJsNode(new js.ArrayHole());
-  useJsOther(new js.SimpleJavaScriptPrintingContext());
+  useJs(new js.Program(null));
+  useJs(new js.Blob(null));
+  useJs(new js.NamedFunction(null, null));
+  useJs(new js.ArrayHole());
   useJsBackend(null);
   useConcreteTypesInferrer(null);
   useColor();
@@ -170,14 +170,10 @@
     ..visitWarnOnUseElement(null);
 }
 
-useJsNode(js.Node node) {
+useJs(js.Node node) {
   node.asVariableUse();
 }
 
-useJsOther(js.SimpleJavaScriptPrintingContext context) {
-  context.getText();
-}
-
 useJsBackend(js_backend.JavaScriptBackend backend) {
   backend.assembleCode(null);
   backend.annotations.noInlining(null);
diff --git a/tests/compiler/dart2js/async_await_js_transform_test.dart b/tests/compiler/dart2js/async_await_js_transform_test.dart
index 1006186..bbcec9b 100644
--- a/tests/compiler/dart2js/async_await_js_transform_test.dart
+++ b/tests/compiler/dart2js/async_await_js_transform_test.dart
@@ -18,12 +18,9 @@
       endOfIteration: new VariableUse("endOfIteration"),
       newIterable: new VariableUse("Iterator"),
       safeVariableName: (String name) => "__$name").rewrite(fun);
- 
-  JavaScriptPrintingOptions options = new JavaScriptPrintingOptions();
-  JavaScriptPrintingContext context = new SimpleJavaScriptPrintingContext();
-  Printer printer = new Printer(options, context);
+  Printer printer = new Printer(new PrintDiagnosticListener(), null);
   printer.visit(rewritten);
-  Expect.stringEquals(expected, context.getText());
+  Expect.stringEquals(expected, printer.outBuffer.getText());
 }
 
 main() {
@@ -946,4 +943,4 @@
   }
   return thenHelper(null, __helper, __completer, null);
 }""");
-}
+}
\ No newline at end of file
