diff --git a/CHANGELOG.md b/CHANGELOG.md
index f52cce3..6f0c931 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+#### 0.10.5
+  * Update `ImportCrawler` with support for pre-parsed initial documents. This
+    allows it to work better with other transformers in the same step (you can
+    pass in a modified document).
+
 #### 0.10.4+2
   * Fix `@CustomElement` test in internet explorer.
 
diff --git a/lib/build/import_crawler.dart b/lib/build/import_crawler.dart
index 5566efb..c655efc 100644
--- a/lib/build/import_crawler.dart
+++ b/lib/build/import_crawler.dart
@@ -30,7 +30,12 @@
   final BuildLogger _logger;
   final AssetId _primaryInputId;
 
-  ImportCrawler(this._transform, this._primaryInputId, this._logger);
+  // Optional parsed document for the primary id if available.
+  final Document _primaryDocument;
+
+  ImportCrawler(this._transform, this._primaryInputId, this._logger,
+      {Document primaryDocument})
+      : _primaryDocument = primaryDocument;
 
   /// Returns a post-ordered map of [AssetId]'s to [ImportData]. The [AssetId]'s
   /// represent an asset which was discovered via an html import, and the
@@ -40,13 +45,11 @@
     var documents = new LinkedHashMap<AssetId, ImportData>();
     var seen = new Set<AssetId>();
 
-    Future doCrawl(AssetId assetId, [Element import]) {
+    Future doCrawl(AssetId assetId, [Element import, Document document]) {
       if (seen.contains(assetId)) return null;
       seen.add(assetId);
 
-      return _transform.readInputAsString(assetId).then((html) {
-        var document = parseHtml(html, assetId.path);
-
+      Future crawlImports(Document document) {
         var imports = document.querySelectorAll('link[rel="import"]');
         var done =
             Future.forEach(imports, (i) => doCrawl(_importId(assetId, i), i));
@@ -55,14 +58,23 @@
         return done.then((_) {
           documents[assetId] = new ImportData(document, import);
         });
-      }).catchError((error) {
-        var span;
-        if (import != null) span = import.sourceSpan;
-        _logger.error(inlineImportFail.create({'error': error}), span: span);
-      });
+      }
+
+      if (document != null) {
+        return crawlImports(document);
+      } else {
+        return _transform.readInputAsString(assetId).then((html) {
+          return crawlImports(parseHtml(html, assetId.path));
+        }).catchError((error) {
+          var span;
+          if (import != null) span = import.sourceSpan;
+          _logger.error(inlineImportFail.create({'error': error}), span: span);
+        });
+      }
     }
 
-    return doCrawl(_primaryInputId).then((_) => documents);
+    return
+      doCrawl(_primaryInputId, null, _primaryDocument).then((_) => documents);
   }
 
   AssetId _importId(AssetId source, Element import) {
diff --git a/pubspec.yaml b/pubspec.yaml
index 3e6cf30..d11d54e 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.10.4+2
+version: 0.10.5
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
diff --git a/test/build/import_crawler_test.dart b/test/build/import_crawler_test.dart
index 776ee1c..c140c09 100644
--- a/test/build/import_crawler_test.dart
+++ b/test/build/import_crawler_test.dart
@@ -3,24 +3,42 @@
 // BSD-style license that can be found in the LICENSE file.
 library web_components.test.build.import_crawler_test;
 
+import 'dart:async';
 import 'package:barback/barback.dart';
 import 'package:code_transformers/tests.dart';
 import 'package:code_transformers/messages/build_logger.dart';
+import 'package:html5lib/dom.dart' show Document;
+import 'package:web_components/build/common.dart';
 import 'package:web_components/build/import_crawler.dart';
 import 'package:unittest/compact_vm_config.dart';
 
 class _TestTransformer extends Transformer {
   final String _entryPoint;
   Map<AssetId, ImportData> documents;
+  final bool _preParseDocument;
 
-  _TestTransformer(this._entryPoint);
+  _TestTransformer(this._entryPoint, [this._preParseDocument = false]);
 
   isPrimary(AssetId id) => id.path == _entryPoint;
 
   apply(Transform transform) {
     var primaryInput = transform.primaryInput;
     var logger = new BuildLogger(transform, primaryId: primaryInput.id);
-    var crawler = new ImportCrawler(transform, primaryInput.id, logger);
+    if (_preParseDocument) {
+      return primaryInput.readAsString().then((html) {
+        var document = parseHtml(html, primaryInput.id.path);
+        return crawlDocument(transform, logger, document);
+      });
+    } else {
+      return crawlDocument(transform, logger);
+    }
+  }
+
+  Future crawlDocument(
+      Transform transform, BuildLogger logger, [Document document]) {
+    var primaryInput = transform.primaryInput;
+    var crawler = new ImportCrawler(
+        transform, primaryInput.id, logger, primaryDocument: document);
     return crawler.crawlImports().then((docs) {
       documents = docs;
       transform.addOutput(new Asset.fromString(
@@ -31,8 +49,13 @@
 
 main() {
   useCompactVMConfiguration();
+  runTests([[new _TestTransformer('web/index.html')]]);
+  // Test with a preparsed original document as well.
+  runTests([[new _TestTransformer('web/index.html', true)]]);
+}
 
-  testPhases('basic', [[new _TestTransformer('web/index.html')]], {
+runTests(List<List<Transformer>> phases) {
+  testPhases('basic', phases, {
     'a|web/index.html': '''
       <link rel="import" href="foo.html">
       <link rel="import" href="packages/a/foo.html">
@@ -53,7 +76,7 @@
       ''',
   }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
 
-  testPhases('cycle', [[new _TestTransformer('web/index.html')]], {
+  testPhases('cycle', phases, {
     'a|web/index.html': '''
       <link rel="import" href="packages/a/foo.html">
       <div>a|web/index.html</div>
@@ -70,7 +93,7 @@
       ''',
   }, [], StringFormatter.noNewlinesOrSurroundingWhitespace);
 
-  testPhases('deep imports', [[new _TestTransformer('web/index.html')]], {
+  testPhases('deep imports', phases, {
     'a|web/index.html': '''
       <link rel="import" href="packages/a/foo.html">
       <div>a|web/index.html</div>
