diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index e77699f..cab1e4c 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -33,7 +33,6 @@
 import 'package:analyzer/src/generated/utilities_general.dart'
     show PerformanceTag;
 import 'package:analyzer/src/lint/registry.dart';
-import 'package:analyzer/src/services/lint.dart';
 import 'package:analyzer/src/source/source_resource.dart';
 import 'package:analyzer/src/summary/idl.dart';
 import 'package:analyzer/src/summary/package_bundle_reader.dart';
@@ -361,25 +360,30 @@
   /// Decide on the appropriate method for resolving URIs based on the given
   /// [options] and [customUrlMappings] settings, and return a
   /// [SourceFactory] that has been configured accordingly.
+  /// When [includeSdkResolver] is `false`, return a temporary [SourceFactory]
+  /// for the purpose of resolved analysis options file `include:` directives.
+  /// In this situation, [analysisOptions] is ignored and can be `null`.
   SourceFactory _chooseUriResolutionPolicy(
       CommandLineOptions options,
       Map<file_system.Folder, YamlMap> embedderMap,
       _PackageInfo packageInfo,
-      SummaryDataStore summaryDataStore) {
+      SummaryDataStore summaryDataStore,
+      bool includeSdkResolver,
+      AnalysisOptions analysisOptions) {
     // Create a custom package resolver if one has been specified.
     if (packageResolverProvider != null) {
       file_system.Folder folder = resourceProvider.getResource('.');
       UriResolver resolver = packageResolverProvider(folder);
       if (resolver != null) {
-        UriResolver sdkResolver = new DartUriResolver(sdk);
-
         // TODO(brianwilkerson) This doesn't handle sdk extensions.
-        List<UriResolver> resolvers = <UriResolver>[
-          sdkResolver,
-          new InSummaryUriResolver(resourceProvider, summaryDataStore),
-          resolver,
-          new file_system.ResourceUriResolver(resourceProvider)
-        ];
+        List<UriResolver> resolvers = <UriResolver>[];
+        if (includeSdkResolver) {
+          resolvers.add(new DartUriResolver(sdk));
+        }
+        resolvers
+            .add(new InSummaryUriResolver(resourceProvider, summaryDataStore));
+        resolvers.add(resolver);
+        resolvers.add(new file_system.ResourceUriResolver(resourceProvider));
         return new SourceFactory(resolvers);
       }
     }
@@ -421,16 +425,18 @@
     // 'dart:' URIs come first.
 
     // Setup embedding.
-    EmbedderSdk embedderSdk = new EmbedderSdk(resourceProvider, embedderMap);
-    if (embedderSdk.libraryMap.size() == 0) {
-      // The embedder uri resolver has no mappings. Use the default Dart SDK
-      // uri resolver.
-      resolvers.add(new DartUriResolver(sdk));
-    } else {
-      // The embedder uri resolver has mappings, use it instead of the default
-      // Dart SDK uri resolver.
-      embedderSdk.analysisOptions = _context.analysisOptions;
-      resolvers.add(new DartUriResolver(embedderSdk));
+    if (includeSdkResolver) {
+      EmbedderSdk embedderSdk = new EmbedderSdk(resourceProvider, embedderMap);
+      if (embedderSdk.libraryMap.size() == 0) {
+        // The embedder uri resolver has no mappings. Use the default Dart SDK
+        // uri resolver.
+        resolvers.add(new DartUriResolver(sdk));
+      } else {
+        // The embedder uri resolver has mappings, use it instead of the default
+        // Dart SDK uri resolver.
+        embedderSdk.analysisOptions = analysisOptions;
+        resolvers.add(new DartUriResolver(embedderSdk));
+      }
     }
 
     // Next SdkExts.
@@ -506,9 +512,6 @@
       _analyzedFileCount += _context.sources.length;
     }
 
-    // Create a context.
-    _context = AnalysisEngine.instance.createAnalysisContext();
-
     // Find package info.
     _PackageInfo packageInfo = _findPackages(options);
 
@@ -531,8 +534,18 @@
     SummaryDataStore summaryDataStore = new SummaryDataStore(
         useSummaries ? options.buildSummaryInputs : <String>[]);
 
+    // Create a temporary source factory without an SDK resolver
+    // for resolving "include:" directives in analysis options files.
+    SourceFactory tempSourceFactory = _chooseUriResolutionPolicy(
+        options, embedderMap, packageInfo, summaryDataStore, false, null);
+
+    AnalysisOptionsImpl analysisOptions =
+        createAnalysisOptions(resourceProvider, tempSourceFactory, options);
+    analysisOptions.analyzeFunctionBodiesPredicate =
+        _chooseDietParsingPolicy(options);
+
     // Once options and embedders are processed, setup the SDK.
-    _setupSdk(options, useSummaries);
+    _setupSdk(options, useSummaries, analysisOptions);
 
     PackageBundle sdkBundle = sdk.getLinkedBundle();
     if (sdkBundle != null) {
@@ -541,17 +554,12 @@
 
     // Choose a package resolution policy and a diet parsing policy based on
     // the command-line options.
-    SourceFactory sourceFactory = _chooseUriResolutionPolicy(
-        options, embedderMap, packageInfo, summaryDataStore);
+    SourceFactory sourceFactory = _chooseUriResolutionPolicy(options,
+        embedderMap, packageInfo, summaryDataStore, true, analysisOptions);
 
-    AnalyzeFunctionBodiesPredicate dietParsingPolicy =
-        _chooseDietParsingPolicy(options);
-    setAnalysisContextOptions(
-        resourceProvider, sourceFactory, _context, options,
-        (AnalysisOptionsImpl contextOptions) {
-      contextOptions.analyzeFunctionBodiesPredicate = dietParsingPolicy;
-    });
-
+    // Create a context.
+    _context = AnalysisEngine.instance.createAnalysisContext();
+    setupAnalysisContext(_context, options, analysisOptions);
     _context.sourceFactory = sourceFactory;
 
     if (options.enableNewAnalysisDriver) {
@@ -683,7 +691,8 @@
     return errorSeverity;
   }
 
-  void _setupSdk(CommandLineOptions options, bool useSummaries) {
+  void _setupSdk(CommandLineOptions options, bool useSummaries,
+      AnalysisOptions analysisOptions) {
     if (sdk == null) {
       if (options.dartSdkSummaryPath != null) {
         sdk = new SummaryBasedDartSdk(
@@ -698,8 +707,7 @@
               sourcePath = path.normalize(sourcePath);
               return !path.isWithin(dartSdkPath, sourcePath);
             });
-
-        dartSdk.analysisOptions = context.analysisOptions;
+        dartSdk.analysisOptions = analysisOptions;
         sdk = dartSdk;
       }
     }
@@ -722,12 +730,34 @@
     return contextOptions;
   }
 
+  static AnalysisOptionsImpl createAnalysisOptions(
+      file_system.ResourceProvider resourceProvider,
+      SourceFactory sourceFactory,
+      CommandLineOptions options) {
+    // Prepare context options.
+    AnalysisOptionsImpl analysisOptions =
+        createAnalysisOptionsForCommandLineOptions(options);
+
+    // Process analysis options file (and notify all interested parties).
+    _processAnalysisOptions(
+        resourceProvider, sourceFactory, analysisOptions, options);
+    return analysisOptions;
+  }
+
   static void setAnalysisContextOptions(
       file_system.ResourceProvider resourceProvider,
       SourceFactory sourceFactory,
       AnalysisContext context,
       CommandLineOptions options,
       void configureContextOptions(AnalysisOptionsImpl contextOptions)) {
+    AnalysisOptionsImpl analysisOptions =
+        createAnalysisOptions(resourceProvider, sourceFactory, options);
+    configureContextOptions(analysisOptions);
+    setupAnalysisContext(context, options, analysisOptions);
+  }
+
+  static void setupAnalysisContext(AnalysisContext context,
+      CommandLineOptions options, AnalysisOptionsImpl analysisOptions) {
     Map<String, String> definedVariables = options.definedVariables;
     if (definedVariables.isNotEmpty) {
       DeclaredVariables declaredVariables = context.declaredVariables;
@@ -740,16 +770,8 @@
       AnalysisEngine.instance.logger = new StdLogger();
     }
 
-    // Prepare context options.
-    AnalysisOptionsImpl contextOptions =
-        createAnalysisOptionsForCommandLineOptions(options);
-    configureContextOptions(contextOptions);
-
     // Set context options.
-    context.analysisOptions = contextOptions;
-
-    // Process analysis options file (and notify all interested parties).
-    _processAnalysisOptions(resourceProvider, sourceFactory, context, options);
+    context.analysisOptions = analysisOptions;
   }
 
   /// Perform a deep comparison of two string lists.
@@ -807,7 +829,7 @@
   static void _processAnalysisOptions(
       file_system.ResourceProvider resourceProvider,
       SourceFactory sourceFactory,
-      AnalysisContext context,
+      AnalysisOptionsImpl analysisOptions,
       CommandLineOptions options) {
     file_system.File file = _getOptionsFile(resourceProvider, options);
 
@@ -819,12 +841,12 @@
     // Fill in lint rule defaults in case lints are enabled and rules are
     // not specified in an options file.
     if (options.lints && !containsLintRuleEntry(optionMap)) {
-      setLints(context, Registry.ruleRegistry.defaultRules);
+      analysisOptions.lintRules = Registry.ruleRegistry.defaultRules;
     }
 
     // Ask engine to further process options.
     if (optionMap != null) {
-      applyToAnalysisOptions(context.analysisOptions, optionMap);
+      applyToAnalysisOptions(analysisOptions, optionMap);
     }
   }
 }
diff --git a/pkg/analyzer_cli/test/data/strong_sdk/main.dart b/pkg/analyzer_cli/test/data/strong_sdk/main.dart
new file mode 100644
index 0000000..34b0c4c
--- /dev/null
+++ b/pkg/analyzer_cli/test/data/strong_sdk/main.dart
@@ -0,0 +1,7 @@
+import 'dart:js';
+
+typedef dynamic Func(String x, String y);
+
+Func bar(Func f) {
+  return allowInterop(f);
+}
diff --git a/pkg/analyzer_cli/test/driver_test.dart b/pkg/analyzer_cli/test/driver_test.dart
index ca07498..0a379c4 100644
--- a/pkg/analyzer_cli/test/driver_test.dart
+++ b/pkg/analyzer_cli/test/driver_test.dart
@@ -322,6 +322,14 @@
         expect(outSink.toString(), contains('isn\'t defined'));
         expect(outSink.toString(), contains('Avoid empty else statements.'));
       });
+
+      test('test strong SDK', () async {
+        String testDir = path.join(testDirectory, 'data', 'strong_sdk');
+        await drive(path.join(testDir, 'main.dart'), args: ['--strong']);
+        expect(driver.context.analysisOptions.strongMode, isTrue);
+        expect(outSink.toString(), contains('No issues found'));
+        expect(exitCode, 0);
+      });
     });
 
     void createTests(String designator, String optionsFileName) {
diff --git a/pkg/analyzer_cli/test/embedder_test.dart b/pkg/analyzer_cli/test/embedder_test.dart
index eaa790a..37b1d767 100644
--- a/pkg/analyzer_cli/test/embedder_test.dart
+++ b/pkg/analyzer_cli/test/embedder_test.dart
@@ -73,7 +73,7 @@
         print('stderr:');
         print(errorSink);
       }
-      throw e;
+      rethrow;
     }
   };
 }
