diff --git a/BUILD b/BUILD
index 99282bc..5e26650 100644
--- a/BUILD
+++ b/BUILD
@@ -4,6 +4,13 @@
 
 licenses(["notice"])  # Apache 2.0
 
+# Changelog file
+filegroup(
+    name = "changelog",
+    srcs = ["CHANGELOG"],
+    visibility = ["//:__subpackages__"],
+)
+
 # IJwB tests, run with an IntelliJ plugin SDK
 test_suite(
     name = "ijwb_tests",
@@ -16,6 +23,10 @@
         "//java:integration_tests",
         "//java:unit_tests",
         "//plugin_dev:integration_tests",
+        "//python:integration_tests",
+        "//python:unit_tests",
+        "//scala:integration_tests",
+        "//scala:unit_tests",
     ],
 )
 
@@ -38,5 +49,6 @@
     tests = [
         "//base:unit_tests",
         "//cpp:unit_tests",
+        "//python:unit_tests",
     ],
 )
diff --git a/CHANGELOG b/CHANGELOG
new file mode 100644
index 0000000..32034b6
--- /dev/null
+++ b/CHANGELOG
@@ -0,0 +1,101 @@
+v2017.05.08
+===========
+* Add Python support to CLion
+* Fix some bazel targets not being linkified in the run configuration console
+  output
+* Add an action to open a workspace file outside your project (File > Open
+  Workspace File...)
+* Add an action to add a source directory to your bazel project (Bazel >
+  Project > Add Directory To Project...)
+* CLion: fix project directories being cleared when reopening a project
+
+v2017.04.17
+===========
+* Add support for IntelliJ 2017.1
+* Support bazel build sharding for large projects
+* Detect out-of-memory errors during sync, and suggest enabling sharding
+* Add documentation links for .bazelproject items
+
+v2017.04.03
+===========
+* Add python support for IntelliJ
+* Prefetch project files on project open, prior to initial indexing
+* Handle nested junit test classes
+
+v2017.03.15
+===========
+* Bazel: WORKSPACE file language integration (syntax highlighting, navigation,
+  etc.)
+* Bazel: Find usages, navigation support for external workspace labels
+* Expand macros in run configuration build flags
+
+v2017.02.27
+===========
+* Add CLion support
+* Run configuration support for abstract test classes/methods
+* Support running all test classes in a directory
+* BUILD support: don't suggest private symbols in 'load' statement autocomplete
+
+v2017.02.13
+===========
+* Test UI support for parameterized tests
+* Test UI support for sharded tests, run locally
+* BUILD: Fix navigation for overridden built-in symbols
+* BUILD: Add auto-complete for fully-qualified class names
+
+v2017.01.30
+============
+* Integrate bazel test results with the IDE's test runner UI.
+* Add support for sharing run configurations
+* Restructure Bazel menu items
+
+v2017.01.09
+===========
+* Create source roots for all directories matching 'test_sources'.
+* When viewing source files for supported but inactive languages, suggest
+  enabling support for that language.
+* BUILD: Add syntax highlight/autocomplete support for more built-in functions.
+* Fix java debugger connection timeout
+* Basic support for Go-lang projects
+
+v2016.12.5
+==========
+* BUILD files: add syntax hightlighting for built-in names
+* BUILD files: support aliased load statements
+* ASwB: enable NDK support
+
+v1.12
+=====
+* Add autocomplete in run configuration target editor.
+* Fix debugging of java_binary targets with args
+
+v1.11
+=====
+* Completely suppress JUnit for Bazel projects, removing a common source of
+  confusion.
+* Improve sync working set / partial sync to include more targets that
+  users might expect should be included.
+* Add more history to import wizard.
+
+v1.10
+=====
+* Compatibility with 2016.2.4
+* Improve create run configuration from scratch experience
+
+v1.9
+==========
+* Better tolerance of broken BUILD files during sync
+* Sync working set action -- sync only the files you're
+  working on.
+* BUILD file support: performance improvements.
+* Unified run configurations -- there is only one type,
+  the Bazel Command Run Configuration.
+* Add test rule chooser heuristics, to support some common
+  test genrules.
+
+v1.8
+==========
+* Add local jar cache to improve performance and robustness.
+* Support filtered gen jars to allow mixed generated/non-
+  generated rules (requires bazel release to activate).
+* Abbreviate generated run configuration names.
diff --git a/README.md b/README.md
index a6ba730..439b85e 100644
--- a/README.md
+++ b/README.md
@@ -13,8 +13,8 @@
 ## Installation
 
 You can find our plugin in the Jetbrains plugin repository by going to
-`Settings -> Browse Repositories`, and searching for `IntelliJ with Bazel`
-or `Android Studio with Bazel`.
+`Settings -> Browse Repositories`, and searching for `IntelliJ with Bazel`,
+`Android Studio with Bazel`, or `CLion with Bazel`.
 
 ## Usage
 
@@ -25,6 +25,6 @@
 
 ## Building the plugin
 
-Install Bazel, then run 'bazel build //ijwb:ijwb_bazel --define=ij_product=intellij-latest'
+Install Bazel, then run `bazel build //ijwb:ijwb_bazel --define=ij_product=intellij-latest`
 from the project root. This will create a plugin jar in
-'bazel-genfiles/ijwb/ijwb_bazel.jar'.
+`bazel-genfiles/ijwb/ijwb_bazel.jar`.
diff --git a/WORKSPACE b/WORKSPACE
index bffcb5e..9a4eaff 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -2,6 +2,14 @@
 
 # Long-lived download links available at: https://www.jetbrains.com/intellij-repository/releases
 
+# The plugin api for IntelliJ 2017.1.1. This is required to build IJwB,
+# and run integration tests.
+new_http_archive(
+    name = "intellij_ce_2017_1_1",
+    build_file = "intellij_platform_sdk/BUILD.idea",
+    url = "https://www.jetbrains.com/intellij-repository/releases/com/jetbrains/intellij/idea/ideaIC/2017.1.1/ideaIC-2017.1.1.zip",
+)
+
 # The plugin api for IntelliJ 2016.3.1. This is required to build IJwB,
 # and run integration tests.
 new_http_archive(
@@ -34,36 +42,62 @@
     url = "https://download.jetbrains.com/cpp/CLion-2016.3.2.tar.gz",
 )
 
-# The plugin api for Android Studio 2.3 Beta 1. This is required to build ASwB,
+# The plugin api for CLion 2017.1.1. This is required to build CLwB,
 # and run integration tests.
 new_http_archive(
-    name = "android_studio_2_3_0_3",
-    build_file = "intellij_platform_sdk/BUILD.android_studio",
-    url = "https://dl.google.com/dl/android/studio/ide-zips/2.3.0.3/android-studio-ide-162.3573574-linux.zip",
+    name = "clion_2017_1_1",
+    build_file = "intellij_platform_sdk/BUILD.clion",
+    url = "https://download.jetbrains.com/cpp/CLion-2017.1.1.tar.gz",
 )
 
-# The plugin api for Android Studio 2.3 Beta 2. This is required to build ASwB,
+# The plugin api for Android Studio 2.3.1. This is required to build ASwB,
 # and run integration tests.
 new_http_archive(
-    name = "android_studio_2_3_0_4",
+    name = "android_studio_2_3_1_0",
     build_file = "intellij_platform_sdk/BUILD.android_studio",
-    url = "https://dl.google.com/dl/android/studio/ide-zips/2.3.0.4/android-studio-ide-162.3616766-linux.zip",
+    url = "https://dl.google.com/dl/android/studio/ide-zips/2.3.1.0/android-studio-ide-162.3871768-linux.zip",
 )
 
-# The plugin api for Android Studio 2.3 Beta 4. This is required to build ASwB,
-# and run integration tests.
+# Python plugin for IntelliJ CE 2016.3. Required at compile-time for python-specific features.
 new_http_archive(
-    name = "android_studio_2_3_0_6",
-    build_file = "intellij_platform_sdk/BUILD.android_studio",
-    url = "https://dl.google.com/dl/android/studio/ide-zips/2.3.0.6/android-studio-ide-162.3715353-linux.zip",
+    name = "python_2016_3",
+    build_file_content = "\n".join([
+        "java_import(",
+        "    name = 'python',",
+        "    jars = ['python/lib/python.jar'],",
+        "    visibility = ['//visibility:public'],",
+        ")"]),
+    url = "https://plugins.jetbrains.com/files/7322/32326/python-community-163.298.zip",
 )
 
-# The plugin api for Android Studio 2.2 stable. This is required to build ASwB,
-# and run integration tests.
+# Python plugin for IntelliJ CE 2017.1. Required at compile-time for python-specific features.
 new_http_archive(
-    name = "AI_145_1617_8",
-    build_file = "intellij_platform_sdk/BUILD.android_studio",
-    url = "https://dl.google.com/dl/android/studio/ide-zips/2.2.0.12/android-studio-ide-145.3276617-linux.zip",
+    name = "python_2017_1",
+    build_file_content = "\n".join([
+        "java_import(",
+        "    name = 'python',",
+        "    jars = ['python-ce/lib/python-ce.jar'],",
+        "    visibility = ['//visibility:public'],",
+        ")"]),
+    url = "https://plugins.jetbrains.com/files/7322/33704/python-ce-2017.1.171.3780.116.zip",
+)
+
+# Scala plugin for IntelliJ CE 2017.1. Required at compile-time for scala-specific features.
+new_http_archive(
+    name = "scala_2017_1",
+    build_file_content = "\n".join([
+        "java_import(",
+        "    name = 'scala-library',",
+        "    jars = ['Scala/lib/scala-library.jar'],",
+        ")",
+        "",
+        "java_import(",
+        "    name = 'scala',",
+        "    jars = ['Scala/lib/scala-plugin.jar'],",
+        "    runtime_deps = [':scala-library'],",
+        "    visibility = ['//visibility:public'],",
+        ")"]),
+    url = "https://plugins.jetbrains.com/files/1347/33637/scala-intellij-bin-2017.1.15.zip",
 )
 
 # LICENSE: Common Public License 1.0
diff --git a/aswb/2.2/src/com/google/idea/blaze/android/compatibility/Compatibility.java b/aswb/2.2/src/com/google/idea/blaze/android/compatibility/Compatibility.java
deleted file mode 100644
index d65d9f2..0000000
--- a/aswb/2.2/src/com/google/idea/blaze/android/compatibility/Compatibility.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.android.compatibility;
-
-import com.android.sdklib.AndroidVersion;
-import com.android.tools.idea.run.ConsolePrinter;
-import com.android.tools.idea.run.editor.AndroidDebugger;
-import com.android.tools.idea.run.editor.AndroidDebuggerState;
-import com.android.tools.idea.run.tasks.DebugConnectorTask;
-import com.android.tools.idea.run.util.LaunchStatus;
-import com.intellij.execution.Executor;
-import com.intellij.execution.configurations.ConfigurationFactory;
-import com.intellij.execution.configurations.RunConfiguration;
-import com.intellij.execution.runners.ExecutionEnvironment;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.projectRoots.Sdk;
-import java.io.File;
-import java.util.List;
-import java.util.Set;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.sdk.AndroidSdkAdditionalData;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jps.android.model.impl.JpsAndroidModuleProperties;
-
-/** Compatibility facades for Android Studio 2.2. */
-public class Compatibility {
-  private Compatibility() {}
-  /**
-   * Facade for {@link org.jetbrains.android.sdk.AndroidSdkUtils} and {@link
-   * com.android.tools.idea.sdk.AndroidSdks#getInstance()}.
-   */
-  public static class AndroidSdkUtils {
-    private AndroidSdkUtils() {}
-
-    public static Sdk findSuitableAndroidSdk(String targetHash) {
-      return org.jetbrains.android.sdk.AndroidSdkUtils.findSuitableAndroidSdk(targetHash);
-    }
-
-    public static List<Sdk> getAllAndroidSdks() {
-      return org.jetbrains.android.sdk.AndroidSdkUtils.getAllAndroidSdks();
-    }
-
-    public static AndroidSdkAdditionalData getAndroidSdkAdditionalData(Sdk sdk) {
-      return org.jetbrains.android.sdk.AndroidSdkUtils.getAndroidSdkAdditionalData(sdk);
-    }
-  }
-
-  /**
-   * Facade for {@link com.android.tools.idea.sdk.IdeSdks} and {@link
-   * com.android.tools.idea.sdk.IdeSdks#getInstance()}.
-   */
-  public static class IdeSdks {
-    private IdeSdks() {}
-
-    public static File getAndroidSdkPath() {
-      return com.android.tools.idea.sdk.IdeSdks.getAndroidSdkPath();
-    }
-
-    public static List<Sdk> createAndroidSdkPerAndroidTarget(File androidSdkPath) {
-      return com.android.tools.idea.sdk.IdeSdks.createAndroidSdkPerAndroidTarget(androidSdkPath);
-    }
-  }
-
-  /**
-   * Facade for {@link com.android.tools.idea.run.testing.AndroidTestListener} and {@link
-   * com.android.tools.idea.testartifacts.instrumented.AndroidTestListener}
-   */
-  public static class AndroidTestListener
-      extends com.android.tools.idea.run.testing.AndroidTestListener {
-    public AndroidTestListener(LaunchStatus launchStatus, ConsolePrinter consolePrinter) {
-      super(launchStatus, consolePrinter);
-    }
-  }
-
-  /**
-   * Facade for {@link com.android.tools.idea.run.testing.AndroidTestConsoleProperties} and {@link
-   * com.android.tools.idea.testartifacts.instrumented.AndroidTestConsoleProperties}
-   */
-  public static class AndroidTestConsoleProperties
-      extends com.android.tools.idea.run.testing.AndroidTestConsoleProperties {
-    public AndroidTestConsoleProperties(RunConfiguration runConfiguration, Executor executor) {
-      super(runConfiguration, executor);
-    }
-  }
-
-  /**
-   * Facade for {@link com.android.tools.idea.run.testing.AndroidTestRunConfiguration} and {@link
-   * com.android.tools.idea.testartifacts.instrumented.AndroidTestRunConfiguration}
-   */
-  public static class AndroidTestRunConfiguration
-      extends com.android.tools.idea.run.testing.AndroidTestRunConfiguration {
-    public AndroidTestRunConfiguration(Project project, ConfigurationFactory configurationFactory) {
-      super(project, configurationFactory);
-    }
-  }
-
-  /** Facade for {@link com.android.tools.idea.run.tasks.ConnectDebuggerTask}. */
-  public abstract static class ConnectDebuggerTask
-      extends com.android.tools.idea.run.tasks.ConnectDebuggerTask {
-    protected ConnectDebuggerTask(
-        Set<String> applicationIds,
-        AndroidDebugger<?> debugger,
-        Project project,
-        boolean monitorRemoteProcess) {
-      super(applicationIds, debugger, project);
-    }
-  }
-
-  public static <S extends AndroidDebuggerState> DebugConnectorTask getConnectDebuggerTask(
-      AndroidDebugger<S> androidDebugger,
-      ExecutionEnvironment env,
-      @Nullable AndroidVersion version,
-      Set<String> applicationIds,
-      AndroidFacet facet,
-      S state,
-      String runConfigTypeId,
-      boolean monitorRemoteProcess) {
-    return androidDebugger.getConnectDebuggerTask(
-        env, version, applicationIds, facet, state, runConfigTypeId);
-  }
-
-  public static void setFacetStateIsLibraryProject(JpsAndroidModuleProperties facetState) {
-    facetState.LIBRARY_PROJECT = true;
-  }
-}
diff --git a/aswb/2.2/src/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProvider.java b/aswb/2.2/src/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProvider.java
deleted file mode 100644
index 20c2c22..0000000
--- a/aswb/2.2/src/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProvider.java
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.android.sync.model.idea;
-
-import com.android.tools.idea.model.ClassJarProvider;
-import com.google.common.collect.ImmutableList;
-import com.intellij.openapi.module.Module;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.vfs.VirtualFile;
-import java.util.List;
-import org.jetbrains.annotations.Nullable;
-
-/** Returns no class jars. Used to disable the layout editor loading jars. */
-public class BlazeClassJarProvider extends ClassJarProvider {
-  public BlazeClassJarProvider(Project project) {}
-
-  @Nullable
-  @Override
-  public VirtualFile findModuleClassFile(String className, Module module) {
-    return null;
-  }
-
-  @Override
-  public List<VirtualFile> getModuleExternalLibraries(Module module) {
-    return ImmutableList.of();
-  }
-}
diff --git a/aswb/2.2/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestCleanupHelper.java b/aswb/2.2/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestCleanupHelper.java
deleted file mode 100644
index d1b4a07..0000000
--- a/aswb/2.2/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestCleanupHelper.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.android;
-
-import com.intellij.codeInsight.CodeInsightSettings;
-import com.intellij.openapi.project.Project;
-import com.intellij.psi.codeStyle.CodeStyleSchemes;
-import com.intellij.psi.codeStyle.CodeStyleSettings;
-import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
-import com.intellij.psi.impl.source.codeStyle.CodeStyleSchemeImpl;
-import com.intellij.util.xmlb.XmlSerializer;
-import org.jdom.Element;
-
-/**
- * Helper class for cleaning up after Android Studio initialization. Android Studio changes code
- * insight and style settings on initialization, so we need to revert these before tearing down the
- * integration test fixture to avoid failing because of changed settings.<br>
- * TODO: Remove once we build for a version where post-initialization insight and style settings are
- * used in the settings check.
- */
-public final class AndroidIntegrationTestCleanupHelper {
-
-  public static void cleanUp(Project project) {
-    resetCodeInsightSettings();
-    resetCodeStyleSettings(project);
-  }
-
-  private static void resetCodeInsightSettings() {
-    // We can't just use CodeInsightSettings.getState(), because it excludes fields
-    // matching the default values, and thus wouldn't change anything when loaded.
-    Element codeInsightElement = new Element("state");
-    XmlSerializer.serializeInto(new CodeInsightSettings(), codeInsightElement);
-    CodeInsightSettings.getInstance().loadState(codeInsightElement);
-  }
-
-  private static void resetCodeStyleSettings(Project project) {
-    CodeStyleSettingsManager settingsManager = CodeStyleSettingsManager.getInstance(project);
-    if (settingsManager.USE_PER_PROJECT_SETTINGS && settingsManager.PER_PROJECT_SETTINGS != null) {
-      settingsManager.PER_PROJECT_SETTINGS = new CodeStyleSettings();
-    } else {
-      ((CodeStyleSchemeImpl)
-              CodeStyleSchemes.getInstance()
-                  .findPreferredScheme(settingsManager.PREFERRED_PROJECT_CODE_STYLE))
-          .setCodeStyleSettings(new CodeStyleSettings());
-    }
-  }
-}
diff --git a/aswb/2.2/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestSetupRule.java b/aswb/2.2/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestSetupRule.java
deleted file mode 100644
index 293643f..0000000
--- a/aswb/2.2/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestSetupRule.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.android;
-
-import com.intellij.testFramework.PlatformTestCase;
-import com.intellij.util.PlatformUtils;
-import org.junit.rules.ExternalResource;
-
-/**
- * Runs before Android Studio integration tests, to ensure the AndroidStudio platform prefix is
- * honored.
- */
-public class AndroidIntegrationTestSetupRule extends ExternalResource {
-
-  @Override
-  protected void before() throws Throwable {
-    // We require idea.platform.prefix to be defined before running tests.
-    // If we don't call this before setting up the test fixture, IntelliJ ignores
-    // the existing value and tries a limited set of candidate prefixes until it finds
-    // a matching descriptor for one of them. Notably, "AndroidStudio" is not a candidate.
-    // The first parameter doesn't matter in our case, so we pass a nonexistent class name.
-    PlatformTestCase.initPlatformPrefix("", System.getProperty(PlatformUtils.PLATFORM_PREFIX_KEY));
-    System.setProperty("android.studio.sdk.manager.disabled", "true");
-    // TODO: Remove the above once we build for a version where "AndroidStudio" is a candidate.
-  }
-}
diff --git a/aswb/2.3/src/META-INF/aswb_beta.xml b/aswb/2.3/src/META-INF/aswb_beta.xml
deleted file mode 100644
index 8df2945..0000000
--- a/aswb/2.3/src/META-INF/aswb_beta.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<!--
-  ~ Copyright 2016 The Bazel Authors. All rights reserved.
-  ~
-  ~ 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.
-  -->
-<idea-plugin>
-  <depends>com.google.gct.test.recorder</depends>
-
-  <extensions defaultExtensionNs="com.google.idea.blaze">
-    <BlazeUserSettingsContributor implementation="com.google.idea.blaze.android.settings.BlazeAndroidUserSettingsContributor$BlazeAndroidUserSettingsProvider"/>
-  </extensions>
-
-  <extensions defaultExtensionNs="com.android.project">
-    <buildSystemService implementation="com.google.idea.blaze.android.project.BlazeBuildSystemService"/>
-    <featureEnableService implementation="com.google.idea.blaze.android.project.BlazeFeatureEnableService"/>
-  </extensions>
-
-  <extensions defaultExtensionNs="com.android.rendering">
-    <renderErrorContributor implementation="com.google.idea.blaze.android.rendering.BlazeRenderErrorContributor$BlazeProvider"/>
-  </extensions>
-
-  <extensions defaultExtensionNs="com.google.gct.testrecorder.run">
-    <testRecorderRunConfigurationProxyProvider implementation="com.google.idea.blaze.android.run.testrecorder.TestRecorderBlazeCommandRunConfigurationProxyProvider" />
-  </extensions>
-</idea-plugin>
diff --git a/aswb/2.3/src/com/google/idea/blaze/android/compatibility/Compatibility.java b/aswb/2.3/src/com/google/idea/blaze/android/compatibility/Compatibility.java
deleted file mode 100644
index e614959..0000000
--- a/aswb/2.3/src/com/google/idea/blaze/android/compatibility/Compatibility.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.android.compatibility;
-
-import com.android.sdklib.AndroidVersion;
-import com.android.tools.idea.run.ConsolePrinter;
-import com.android.tools.idea.run.editor.AndroidDebugger;
-import com.android.tools.idea.run.editor.AndroidDebuggerState;
-import com.android.tools.idea.run.tasks.DebugConnectorTask;
-import com.android.tools.idea.run.util.LaunchStatus;
-import com.intellij.execution.Executor;
-import com.intellij.execution.configurations.ConfigurationFactory;
-import com.intellij.execution.configurations.RunConfiguration;
-import com.intellij.execution.runners.ExecutionEnvironment;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.projectRoots.Sdk;
-import java.io.File;
-import java.util.List;
-import java.util.Set;
-import org.jetbrains.android.facet.AndroidFacet;
-import org.jetbrains.android.sdk.AndroidSdkAdditionalData;
-import org.jetbrains.annotations.Nullable;
-import org.jetbrains.jps.android.model.impl.JpsAndroidModuleProperties;
-
-/** Compatibility facades for Android Studio 2.3. */
-public class Compatibility {
-  private Compatibility() {}
-
-  /**
-   * Facade for {@link org.jetbrains.android.sdk.AndroidSdkUtils} and {@link
-   * com.android.tools.idea.sdk.AndroidSdks#getInstance()}.
-   */
-  public static class AndroidSdkUtils {
-    private AndroidSdkUtils() {}
-
-    public static Sdk findSuitableAndroidSdk(String targetHash) {
-      return com.android.tools.idea.sdk.AndroidSdks.getInstance()
-          .findSuitableAndroidSdk(targetHash);
-    }
-
-    public static List<Sdk> getAllAndroidSdks() {
-      return com.android.tools.idea.sdk.AndroidSdks.getInstance().getAllAndroidSdks();
-    }
-
-    public static AndroidSdkAdditionalData getAndroidSdkAdditionalData(Sdk sdk) {
-      return com.android.tools.idea.sdk.AndroidSdks.getInstance().getAndroidSdkAdditionalData(sdk);
-    }
-  }
-
-  /**
-   * Facade for {@link com.android.tools.idea.sdk.IdeSdks} and {@link
-   * com.android.tools.idea.sdk.IdeSdks#getInstance()}.
-   */
-  public static class IdeSdks {
-    private IdeSdks() {}
-
-    public static File getAndroidSdkPath() {
-      return com.android.tools.idea.sdk.IdeSdks.getInstance().getAndroidSdkPath();
-    }
-
-    public static List<Sdk> createAndroidSdkPerAndroidTarget(File androidSdkPath) {
-      return com.android.tools.idea.sdk.IdeSdks.getInstance()
-          .createAndroidSdkPerAndroidTarget(androidSdkPath);
-    }
-  }
-
-  /**
-   * Facade for {@link com.android.tools.idea.run.testing.AndroidTestListener} and {@link
-   * com.android.tools.idea.testartifacts.instrumented.AndroidTestListener}
-   */
-  public static class AndroidTestListener
-      extends com.android.tools.idea.testartifacts.instrumented.AndroidTestListener {
-    public AndroidTestListener(LaunchStatus launchStatus, ConsolePrinter consolePrinter) {
-      super(launchStatus, consolePrinter);
-    }
-  }
-
-  /**
-   * Facade for {@link com.android.tools.idea.run.testing.AndroidTestConsoleProperties} and {@link
-   * com.android.tools.idea.testartifacts.instrumented.AndroidTestConsoleProperties}
-   */
-  public static class AndroidTestConsoleProperties
-      extends com.android.tools.idea.testartifacts.instrumented.AndroidTestConsoleProperties {
-    public AndroidTestConsoleProperties(RunConfiguration runConfiguration, Executor executor) {
-      super(runConfiguration, executor);
-    }
-  }
-
-  /**
-   * Facade for {@link com.android.tools.idea.run.testing.AndroidTestRunConfiguration} and {@link
-   * com.android.tools.idea.testartifacts.instrumented.AndroidTestRunConfiguration}
-   */
-  public static class AndroidTestRunConfiguration
-      extends com.android.tools.idea.testartifacts.instrumented.AndroidTestRunConfiguration {
-    public AndroidTestRunConfiguration(Project project, ConfigurationFactory configurationFactory) {
-      super(project, configurationFactory);
-    }
-  }
-
-  /** Facade for {@link com.android.tools.idea.run.tasks.ConnectDebuggerTask}. */
-  public abstract static class ConnectDebuggerTask
-      extends com.android.tools.idea.run.tasks.ConnectDebuggerTask {
-    protected ConnectDebuggerTask(
-        Set<String> applicationIds,
-        AndroidDebugger<?> debugger,
-        Project project,
-        boolean monitorRemoteProcess) {
-      super(applicationIds, debugger, project, monitorRemoteProcess);
-    }
-  }
-
-  public static <S extends AndroidDebuggerState> DebugConnectorTask getConnectDebuggerTask(
-      AndroidDebugger<S> androidDebugger,
-      ExecutionEnvironment env,
-      @Nullable AndroidVersion version,
-      Set<String> applicationIds,
-      AndroidFacet facet,
-      S state,
-      String runConfigTypeId,
-      boolean monitorRemoteProcess) {
-    return androidDebugger.getConnectDebuggerTask(
-        env, version, applicationIds, facet, state, runConfigTypeId, monitorRemoteProcess);
-  }
-
-  public static void setFacetStateIsLibraryProject(JpsAndroidModuleProperties facetState) {
-    facetState.PROJECT_TYPE = com.android.builder.model.AndroidProject.PROJECT_TYPE_LIBRARY;
-  }
-}
diff --git a/aswb/2.3/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestCleanupHelper.java b/aswb/2.3/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestCleanupHelper.java
deleted file mode 100644
index 5f425ca..0000000
--- a/aswb/2.3/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestCleanupHelper.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.android;
-
-import com.intellij.openapi.project.Project;
-
-/**
- * Helper class for cleaning up after Android Studio initialization.
- *
- * <p>This class exists only for 2.2 compatibility and can be removed once 2.2 support is removed.
- */
-public final class AndroidIntegrationTestCleanupHelper {
-
-  @SuppressWarnings("unused")
-  public static void cleanUp(Project project) {}
-}
diff --git a/aswb/BUILD b/aswb/BUILD
index 7fe4a00..7772ebc 100644
--- a/aswb/BUILD
+++ b/aswb/BUILD
@@ -11,7 +11,6 @@
     "stamped_plugin_xml",
 )
 load("//:version.bzl", "VERSION")
-load("//intellij_platform_sdk:build_defs.bzl", "select_for_plugin_api")
 
 merged_plugin_xml(
     name = "merged_plugin_xml_common",
@@ -20,15 +19,6 @@
         "//base:plugin_xml",
         "//cpp:plugin_xml",
         "//java:plugin_xml",
-    ] + select_for_plugin_api({
-        # TODO(chaorenl): remove when 2.2 is obsolete
-        "android-studio-145.1617.8": [],
-        "android-studio-2.3.0.3": ["2.3/src/META-INF/aswb_beta.xml"],
-        "android-studio-2.3.0.4": ["2.3/src/META-INF/aswb_beta.xml"],
-        "android-studio-2.3.0.6": ["2.3/src/META-INF/aswb_beta.xml"],
-    }),
-    visibility = [
-        "//visibility:public",
     ],
 )
 
@@ -42,6 +32,7 @@
 
 stamped_plugin_xml(
     name = "stamped_plugin_xml",
+    changelog_file = "//:changelog",
     include_product_code_in_stamp = True,
     plugin_id = "com.google.idea.bazel.aswb",
     plugin_name = "Android Studio with Bazel",
@@ -52,21 +43,14 @@
 
 java_library(
     name = "aswb_lib",
-    srcs = glob(["src/**/*.java"]) + select_for_plugin_api({
-        # TODO(chaorenl): remove when 2.2 is obsolete
-        "android-studio-145.1617.8": glob(["2.2/src/**/*.java"]),
-        "android-studio-2.3.0.3": glob(["2.3/src/**/*.java"]),
-        "android-studio-2.3.0.4": glob(["2.3/src/**/*.java"]),
-        "android-studio-2.3.0.6": glob(["2.3/src/**/*.java"]),
-    }),
+    srcs = glob(["src/**/*.java"]),
     resources = glob(["resources/**/*"]),
-    visibility = [
-        "//visibility:public",
+    runtime_deps = [
+        "//cpp",
     ],
     deps = [
         "//base",
         "//common/experiments",
-        "//cpp",
         "//intellij_platform_sdk:plugin_api",
         "//java",
         "//proto:proto_deps",
@@ -74,21 +58,11 @@
     ],
 )
 
-# TODO(chaorenl): remove when 2.2 is obsolete
 java_library(
     name = "integration_test_utils",
     testonly = 1,
-    srcs = select_for_plugin_api({
-        "android-studio-145.1617.8": glob(["2.2/tests/utils/integration/**/*.java"]),
-        "android-studio-2.3.0.3": glob(["2.3/tests/utils/integration/**/*.java"]),
-        "android-studio-2.3.0.4": glob(["2.3/tests/utils/integration/**/*.java"]),
-        "android-studio-2.3.0.6": glob(["2.3/tests/utils/integration/**/*.java"]),
-    }),
+    srcs = glob(["tests/utils/integration/**/*.java"]),
     deps = [
-        "//base",
-        "//base:integration_test_utils",
-        "//base:unit_test_utils",
-        "//intellij_platform_sdk:plugin_api_for_tests",
         "@jsr305_annotations//jar",
         "@junit//jar",
     ],
@@ -102,13 +76,7 @@
 
 intellij_unit_test_suite(
     name = "unit_tests",
-    srcs = glob(["tests/unittests/**/*.java"]) + select_for_plugin_api({
-        # TODO(chaorenl): remove when 2.2 is obsolete
-        "android-studio-145.1617.8": [],
-        "android-studio-2.3.0.3": glob(["2.3/tests/unittests/**/*.java"]),
-        "android-studio-2.3.0.4": glob(["2.3/tests/unittests/**/*.java"]),
-        "android-studio-2.3.0.6": glob(["2.3/tests/unittests/**/*.java"]),
-    }),
+    srcs = glob(["tests/unittests/**/*.java"]),
     test_package_root = "com.google.idea.blaze.android",
     deps = [
         ":aswb_lib",
@@ -126,13 +94,7 @@
 
 intellij_integration_test_suite(
     name = "integration_tests",
-    srcs = glob(["tests/integrationtests/**/*.java"]) + select_for_plugin_api({
-        # TODO(chaorenl): remove when 2.2 is obsolete
-        "android-studio-145.1617.8": [],
-        "android-studio-2.3.0.3": glob(["2.3/tests/integrationtests/**/*.java"]),
-        "android-studio-2.3.0.4": glob(["2.3/tests/integrationtests/**/*.java"]),
-        "android-studio-2.3.0.6": glob(["2.3/tests/integrationtests/**/*.java"]),
-    }),
+    srcs = glob(["tests/integrationtests/**/*.java"]),
     platform_prefix = "AndroidStudio",
     required_plugins = "com.google.idea.bazel.aswb",
     test_package_root = "com.google.idea.blaze.android",
@@ -147,6 +109,7 @@
         "//base:unit_test_utils",
         "//common/experiments",
         "//common/experiments:unit_test_utils",
+        "//cpp",
         "//intellij_platform_sdk:plugin_api_for_tests",
         "//java",
         "//proto:proto_deps",
diff --git a/aswb/aswb.bazelproject b/aswb/aswb.bazelproject
index c2f7d36..5700471 100644
--- a/aswb/aswb.bazelproject
+++ b/aswb/aswb.bazelproject
@@ -3,9 +3,6 @@
   -ijwb
   -plugin_dev
   -clwb
-  -cpp/src/com/google/idea/blaze/cpp/versioned/v162
-  # TODO(chaorenl): remove when 2.2 is obsolete.
-  -aswb/2.3
 
 targets:
   //aswb:aswb_bazel
diff --git a/aswb/src/META-INF/aswb.xml b/aswb/src/META-INF/aswb.xml
index b4b61ab..4bf7584 100644
--- a/aswb/src/META-INF/aswb.xml
+++ b/aswb/src/META-INF/aswb.xml
@@ -18,8 +18,7 @@
 
   <depends>com.intellij.modules.androidstudio</depends>
   <depends>org.jetbrains.android</depends>
-  <!-- TODO(chaorenl): remove when 2.2 is obsolete -->
-  <depends optional="true">com.android.tools.idea.updater</depends>
+  <depends>com.google.gct.test.recorder</depends>
 
   <extensions defaultExtensionNs="com.intellij">
     <java.elementFinder implementation="com.google.idea.blaze.android.resources.AndroidResourceClassFinder"
@@ -60,12 +59,13 @@
     <SyncListener implementation="com.google.idea.blaze.android.cppimpl.BlazeNdkSupportEnabler"/>
     <SyncListener implementation="com.google.idea.blaze.android.manifest.ManifestParser$ClearManifestParser"/>
     <RunConfigurationFactory implementation="com.google.idea.blaze.android.run.BlazeAndroidRunConfigurationFactory"/>
-    <java.JavaSyncAugmenter implementation="com.google.idea.blaze.android.sync.BlazeAndroidJavaSyncAugmenter"/>
+    <JavaSyncAugmenter implementation="com.google.idea.blaze.android.sync.BlazeAndroidJavaSyncAugmenter"/>
     <PrefetchFileSource implementation="com.google.idea.blaze.android.sync.AndroidPrefetchFileSource"/>
     <BlazeCommandRunConfigurationHandlerProvider implementation="com.google.idea.blaze.android.run.binary.BlazeAndroidBinaryRunConfigurationHandlerProvider"/>
     <BlazeCommandRunConfigurationHandlerProvider implementation="com.google.idea.blaze.android.run.test.BlazeAndroidTestRunConfigurationHandlerProvider"/>
     <BuildSystemAndroidJdkProvider implementation="com.google.idea.blaze.android.sync.BazelAndroidJdkProvider"/>
     <BlazeTestEventsHandler implementation="com.google.idea.blaze.android.run.test.smrunner.BlazeAndroidTestEventsHandler"/>
+    <ProjectViewDefaultValueProvider implementation="com.google.idea.blaze.android.projectview.AndroidSdkPlatformSection$AndroidSdkPlatformProjectViewDefaultValueProvider"/>
   </extensions>
 
   <extensions defaultExtensionNs="com.android.ide">
@@ -87,6 +87,23 @@
   </extensions>
   <!-- END NDK SUPPORT -->
 
+  <extensions defaultExtensionNs="com.google.idea.blaze">
+    <BlazeUserSettingsContributor implementation="com.google.idea.blaze.android.settings.BlazeAndroidUserSettingsContributor$BlazeAndroidUserSettingsProvider"/>
+  </extensions>
+
+  <extensions defaultExtensionNs="com.android.project">
+    <buildSystemService implementation="com.google.idea.blaze.android.project.BlazeBuildSystemService"/>
+    <featureEnableService implementation="com.google.idea.blaze.android.project.BlazeFeatureEnableService"/>
+  </extensions>
+
+  <extensions defaultExtensionNs="com.android.rendering">
+    <renderErrorContributor implementation="com.google.idea.blaze.android.rendering.BlazeRenderErrorContributor$BlazeProvider"/>
+  </extensions>
+
+  <extensions defaultExtensionNs="com.google.gct.testrecorder.run">
+    <testRecorderRunConfigurationProxyProvider implementation="com.google.idea.blaze.android.run.testrecorder.TestRecorderBlazeCommandRunConfigurationProxyProvider" />
+  </extensions>
+
   <application-components>
     <component>
       <implementation-class>com.google.idea.blaze.android.plugin.PluginCompatibilityEnforcer</implementation-class>
diff --git a/aswb/2.3/src/com/google/idea/blaze/android/project/BlazeBuildSystemService.java b/aswb/src/com/google/idea/blaze/android/project/BlazeBuildSystemService.java
similarity index 100%
rename from aswb/2.3/src/com/google/idea/blaze/android/project/BlazeBuildSystemService.java
rename to aswb/src/com/google/idea/blaze/android/project/BlazeBuildSystemService.java
diff --git a/aswb/2.3/src/com/google/idea/blaze/android/project/BlazeFeatureEnableService.java b/aswb/src/com/google/idea/blaze/android/project/BlazeFeatureEnableService.java
similarity index 94%
rename from aswb/2.3/src/com/google/idea/blaze/android/project/BlazeFeatureEnableService.java
rename to aswb/src/com/google/idea/blaze/android/project/BlazeFeatureEnableService.java
index 2ec4852..a43374f 100644
--- a/aswb/2.3/src/com/google/idea/blaze/android/project/BlazeFeatureEnableService.java
+++ b/aswb/src/com/google/idea/blaze/android/project/BlazeFeatureEnableService.java
@@ -42,7 +42,8 @@
         isLayoutEditorExperimentEnabled()
             && BlazeAndroidUserSettings.getInstance().getUseLayoutEditor();
     boolean isReady = BlazeProjectDataManager.getInstance(project).getBlazeProjectData() != null;
-    logger.log("layout_editor", ImmutableMap.of("enabled", Boolean.toString(isEnabled)));
+    logger.log(
+        getClass(), "layout_editor", ImmutableMap.of("enabled", Boolean.toString(isEnabled)));
     return isEnabled && isReady;
   }
 
diff --git a/aswb/src/com/google/idea/blaze/android/projectview/AndroidSdkPlatformSection.java b/aswb/src/com/google/idea/blaze/android/projectview/AndroidSdkPlatformSection.java
index a9cbded..917da87 100644
--- a/aswb/src/com/google/idea/blaze/android/projectview/AndroidSdkPlatformSection.java
+++ b/aswb/src/com/google/idea/blaze/android/projectview/AndroidSdkPlatformSection.java
@@ -21,14 +21,17 @@
 import com.google.idea.blaze.android.sdk.BlazeSdkProvider;
 import com.google.idea.blaze.android.sync.sdk.AndroidSdkFromProjectView;
 import com.google.idea.blaze.base.projectview.ProjectView;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.projectview.parser.ParseContext;
 import com.google.idea.blaze.base.projectview.parser.ProjectViewParser;
+import com.google.idea.blaze.base.projectview.section.ProjectViewDefaultValueProvider;
 import com.google.idea.blaze.base.projectview.section.ScalarSection;
 import com.google.idea.blaze.base.projectview.section.ScalarSectionParser;
 import com.google.idea.blaze.base.projectview.section.SectionKey;
 import com.google.idea.blaze.base.projectview.section.SectionParser;
 import com.google.idea.blaze.base.projectview.section.sections.TextBlock;
 import com.google.idea.blaze.base.projectview.section.sections.TextBlockSection;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
 import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.openapi.util.text.StringUtil;
 import java.util.List;
@@ -60,15 +63,19 @@
     public ItemType getItemType() {
       return ItemType.Other;
     }
+  }
 
+  static class AndroidSdkPlatformProjectViewDefaultValueProvider
+      implements ProjectViewDefaultValueProvider {
     @Override
-    public ProjectView addProjectViewDefaultValue(ProjectView projectView) {
-      if (!projectView.getSectionsOfType(KEY).isEmpty()) {
-        return projectView;
+    public ProjectView addProjectViewDefaultValue(
+        BuildSystem buildSystem, ProjectViewSet projectViewSet, ProjectView topLevelProjectView) {
+      if (!topLevelProjectView.getSectionsOfType(KEY).isEmpty()) {
+        return topLevelProjectView;
       }
       List<Sdk> sdks = BlazeSdkProvider.getInstance().getAllAndroidSdks();
       ProjectView.Builder builder =
-          ProjectView.builder(projectView).add(TextBlockSection.of(TextBlock.newLine()));
+          ProjectView.builder(topLevelProjectView).add(TextBlockSection.of(TextBlock.newLine()));
 
       if (sdks.isEmpty()) {
         builder
@@ -95,5 +102,10 @@
       }
       return builder.build();
     }
+
+    @Override
+    public SectionKey<?, ?> getSectionKey() {
+      return KEY;
+    }
   }
 }
diff --git a/aswb/2.3/src/com/google/idea/blaze/android/rendering/BlazeRenderErrorContributor.java b/aswb/src/com/google/idea/blaze/android/rendering/BlazeRenderErrorContributor.java
similarity index 100%
rename from aswb/2.3/src/com/google/idea/blaze/android/rendering/BlazeRenderErrorContributor.java
rename to aswb/src/com/google/idea/blaze/android/rendering/BlazeRenderErrorContributor.java
diff --git a/aswb/src/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonState.java b/aswb/src/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonState.java
index 6926023..eaff918 100644
--- a/aswb/src/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonState.java
+++ b/aswb/src/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonState.java
@@ -18,7 +18,6 @@
 import static com.google.idea.blaze.android.cppapi.NdkSupport.NDK_SUPPORT;
 
 import com.android.tools.idea.run.ValidationError;
-import com.android.tools.idea.run.editor.AndroidDebugger;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.idea.blaze.android.cppapi.NdkSupport;
@@ -76,12 +75,8 @@
     return debuggerManager;
   }
 
-  public List<String> getUserFlags() {
-    return userFlags.getFlags();
-  }
-
-  public void setUserFlags(List<String> userFlags) {
-    this.userFlags.setFlags(userFlags);
+  public RunConfigurationFlagsState getBlazeFlagsState() {
+    return userFlags;
   }
 
   public boolean isNativeDebuggingEnabled() {
@@ -92,10 +87,11 @@
     this.nativeDebuggingEnabled = nativeDebuggingEnabled;
   }
 
-  public ImmutableList<String> getBuildFlags(Project project, ProjectViewSet projectViewSet) {
+  public ImmutableList<String> getExpandedBuildFlags(
+      Project project, ProjectViewSet projectViewSet) {
     return ImmutableList.<String>builder()
         .addAll(BlazeFlags.buildFlags(project, projectViewSet))
-        .addAll(getUserFlags())
+        .addAll(getBlazeFlagsState().getExpandedFlags())
         .addAll(getNativeDebuggerFlags())
         .build();
   }
@@ -127,19 +123,11 @@
     Element deployTargetStatesElement = element.getChild(DEPLOY_TARGET_STATES_TAG);
     if (deployTargetStatesElement != null) {
       deployTargetManager.readExternal(deployTargetStatesElement);
-    } else {
-      // TODO Introduced in 1.12, remove in 1.14.
-      // This was for migrating the state to a child element.
-      deployTargetManager.readExternal(element);
     }
 
     Element debuggerStatesElement = element.getChild(DEBUGGER_STATES_TAG);
     if (debuggerStatesElement != null) {
       debuggerManager.readExternal(debuggerStatesElement);
-    } else {
-      // TODO Introduced in 1.12, remove in 1.14.
-      // This was for migrating the state to a child element.
-      debuggerManager.readExternal(element);
     }
   }
 
@@ -148,8 +136,6 @@
     userFlags.writeExternal(element);
     element.setAttribute(NATIVE_DEBUG_ATTR, Boolean.toString(nativeDebuggingEnabled));
 
-    removeOldManagerState(element);
-
     element.removeChildren(DEPLOY_TARGET_STATES_TAG);
     Element deployTargetStatesElement = new Element(DEPLOY_TARGET_STATES_TAG);
     deployTargetManager.writeExternal(deployTargetStatesElement);
@@ -161,19 +147,6 @@
     element.addContent(debuggerStatesElement);
   }
 
-  // TODO Introduced in 1.12, remove in 1.14. This was for migrating state
-  // and cleaning up mass amounts of duplicate state caused by never removing these elements before.
-  private void removeOldManagerState(Element element) {
-    // This is safe because we know only BlazeAndroidRunConfigurationDeployTargetManager
-    // directly wrote option elements (via DefaultJDOMExternalizer.writeExternal) to our root.
-    element.removeChildren("option");
-    // BlazeAndroidRunConfigurationDebuggerManager, meanwhile, nested its state in
-    // child elements named after the AndroidDebugger extension IDs.
-    for (AndroidDebugger<?> debugger : AndroidDebugger.EP_NAME.getExtensions()) {
-      element.removeChildren(debugger.getId());
-    }
-  }
-
   @Override
   public RunConfigurationStateEditor getEditor(Project project) {
     return new BlazeAndroidRunConfigurationCommonStateEditor(this, project);
diff --git a/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryNormalBuildRunContext.java b/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryNormalBuildRunContext.java
index 5351213..cb6b23c 100644
--- a/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryNormalBuildRunContext.java
+++ b/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryNormalBuildRunContext.java
@@ -33,7 +33,6 @@
 import com.android.tools.idea.run.util.ProcessHandlerLaunchStatus;
 import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.Futures;
-import com.google.idea.blaze.android.compatibility.Compatibility;
 import com.google.idea.blaze.android.run.deployinfo.BlazeAndroidDeployInfo;
 import com.google.idea.blaze.android.run.deployinfo.BlazeApkProvider;
 import com.google.idea.blaze.android.run.runner.BlazeAndroidDeviceSelector;
@@ -175,8 +174,7 @@
       Set<String> packageIds,
       boolean monitorRemoteProcess)
       throws ExecutionException {
-    return Compatibility.getConnectDebuggerTask(
-        androidDebugger,
+    return androidDebugger.getConnectDebuggerTask(
         env,
         null,
         packageIds,
diff --git a/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationHandler.java b/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationHandler.java
index 3b222f7..f57d51f 100644
--- a/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationHandler.java
+++ b/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationHandler.java
@@ -104,7 +104,8 @@
     ProjectViewSet projectViewSet = ProjectViewManager.getInstance(project).getProjectViewSet();
     BlazeAndroidRunConfigurationValidationUtil.validateExecution(module, facet, projectViewSet);
 
-    ImmutableList<String> buildFlags = configState.getBuildFlags(project, projectViewSet);
+    ImmutableList<String> buildFlags =
+        configState.getCommonState().getExpandedBuildFlags(project, projectViewSet);
     BlazeAndroidRunContext runContext = createRunContext(project, facet, environment, buildFlags);
 
     return new BlazeAndroidRunConfigurationRunner(
diff --git a/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationState.java b/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationState.java
index cb368d4..8bc2076 100644
--- a/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationState.java
+++ b/aswb/src/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationState.java
@@ -18,10 +18,8 @@
 import com.android.tools.idea.run.ValidationError;
 import com.android.tools.idea.run.util.LaunchUtils;
 import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.idea.blaze.android.run.BlazeAndroidRunConfigurationCommonState;
-import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.run.state.RunConfigurationState;
 import com.google.idea.blaze.base.run.state.RunConfigurationStateEditor;
 import com.intellij.openapi.project.Project;
@@ -123,10 +121,6 @@
     this.mode = mode;
   }
 
-  public ImmutableList<String> getBuildFlags(Project project, ProjectViewSet projectViewSet) {
-    return commonState.getBuildFlags(project, projectViewSet);
-  }
-
   /**
    * We collect errors rather than throwing to avoid missing fatal errors by exiting early for a
    * warning.
diff --git a/aswb/src/com/google/idea/blaze/android/run/binary/mobileinstall/BlazeAndroidBinaryMobileInstallRunContext.java b/aswb/src/com/google/idea/blaze/android/run/binary/mobileinstall/BlazeAndroidBinaryMobileInstallRunContext.java
index 2ea7ebc..da33631 100644
--- a/aswb/src/com/google/idea/blaze/android/run/binary/mobileinstall/BlazeAndroidBinaryMobileInstallRunContext.java
+++ b/aswb/src/com/google/idea/blaze/android/run/binary/mobileinstall/BlazeAndroidBinaryMobileInstallRunContext.java
@@ -30,7 +30,6 @@
 import com.android.tools.idea.run.util.ProcessHandlerLaunchStatus;
 import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.Futures;
-import com.google.idea.blaze.android.compatibility.Compatibility;
 import com.google.idea.blaze.android.run.binary.BlazeAndroidBinaryApplicationIdProvider;
 import com.google.idea.blaze.android.run.binary.BlazeAndroidBinaryApplicationLaunchTaskProvider;
 import com.google.idea.blaze.android.run.binary.BlazeAndroidBinaryConsoleProvider;
@@ -167,8 +166,7 @@
       Set<String> packageIds,
       boolean monitorRemoteProcess)
       throws ExecutionException {
-    return Compatibility.getConnectDebuggerTask(
-        androidDebugger,
+    return androidDebugger.getConnectDebuggerTask(
         env,
         null,
         packageIds,
diff --git a/aswb/src/com/google/idea/blaze/android/run/binary/mobileinstall/BlazeApkBuildStepMobileInstall.java b/aswb/src/com/google/idea/blaze/android/run/binary/mobileinstall/BlazeApkBuildStepMobileInstall.java
index 2e69c17..582afea 100644
--- a/aswb/src/com/google/idea/blaze/android/run/binary/mobileinstall/BlazeApkBuildStepMobileInstall.java
+++ b/aswb/src/com/google/idea/blaze/android/run/binary/mobileinstall/BlazeApkBuildStepMobileInstall.java
@@ -27,9 +27,6 @@
 import com.google.idea.blaze.android.run.deployinfo.BlazeApkDeployInfoProtoHelper;
 import com.google.idea.blaze.android.run.runner.BlazeAndroidDeviceSelector;
 import com.google.idea.blaze.android.run.runner.BlazeApkBuildStep;
-import com.google.idea.blaze.android.sdk.BlazeSdkProvider;
-import com.google.idea.blaze.android.sync.model.AndroidSdkPlatform;
-import com.google.idea.blaze.android.sync.model.BlazeAndroidSyncData;
 import com.google.idea.blaze.base.async.executor.BlazeExecutor;
 import com.google.idea.blaze.base.async.process.ExternalTask;
 import com.google.idea.blaze.base.command.BlazeCommand;
@@ -38,7 +35,6 @@
 import com.google.idea.blaze.base.command.buildresult.BuildResultHelper;
 import com.google.idea.blaze.base.filecache.FileCaches;
 import com.google.idea.blaze.base.issueparser.IssueOutputLineProcessor;
-import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.model.primitives.Label;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.scope.BlazeContext;
@@ -46,17 +42,15 @@
 import com.google.idea.blaze.base.scope.output.IssueOutput;
 import com.google.idea.blaze.base.scope.output.StatusOutput;
 import com.google.idea.blaze.base.settings.Blaze;
-import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
 import com.google.idea.blaze.base.util.SaveUtil;
 import com.google.idea.common.experiments.BoolExperiment;
 import com.intellij.execution.ExecutionException;
 import com.intellij.execution.runners.ExecutionEnvironment;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.projectRoots.Sdk;
 import java.io.File;
-import java.nio.file.Paths;
 import java.util.concurrent.CancellationException;
 import javax.annotation.Nullable;
+import org.jetbrains.android.sdk.AndroidSdkUtils;
 
 /** Builds and installs the APK using mobile-install. */
 public class BlazeApkBuildStepMobileInstall implements BlazeApkBuildStep {
@@ -104,7 +98,7 @@
             command.addBlazeFlags(BlazeFlags.adbSerialFlags(device.getSerialNumber()));
 
             if (USE_SDK_ADB.getValue()) {
-              File adb = getSdkAdb(project);
+              File adb = AndroidSdkUtils.getAdb(project);
               if (adb != null) {
                 command.addBlazeFlags(ImmutableList.of("--adb", adb.toString()));
               }
@@ -173,35 +167,6 @@
     return deployInfoFuture;
   }
 
-  private static File getSdkAdb(Project project) {
-    BlazeProjectData projectData =
-        BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
-    if (projectData == null) {
-      return null;
-    }
-    BlazeAndroidSyncData syncData = projectData.syncState.get(BlazeAndroidSyncData.class);
-    if (syncData == null) {
-      return null;
-    }
-    AndroidSdkPlatform androidSdkPlatform = syncData.androidSdkPlatform;
-    if (androidSdkPlatform == null) {
-      return null;
-    }
-    Sdk sdk = BlazeSdkProvider.getInstance().findSdk(androidSdkPlatform.androidSdk);
-    if (sdk == null) {
-      return null;
-    }
-    String homePath = sdk.getHomePath();
-    if (homePath == null) {
-      return null;
-    }
-    File adb = Paths.get(homePath, "platform-tools", "adb").toFile();
-    if (!adb.exists()) {
-      return null;
-    }
-    return adb;
-  }
-
   @Nullable
   private static IDevice resolveDevice(BlazeContext context, DeviceFutures deviceFutures) {
     if (deviceFutures.get().size() != 1) {
diff --git a/aswb/src/com/google/idea/blaze/android/run/deployinfo/BlazeApkDeployInfoProtoHelper.java b/aswb/src/com/google/idea/blaze/android/run/deployinfo/BlazeApkDeployInfoProtoHelper.java
index 4de0387..98e2e87 100644
--- a/aswb/src/com/google/idea/blaze/android/run/deployinfo/BlazeApkDeployInfoProtoHelper.java
+++ b/aswb/src/com/google/idea/blaze/android/run/deployinfo/BlazeApkDeployInfoProtoHelper.java
@@ -21,6 +21,7 @@
 import com.google.idea.blaze.android.manifest.ManifestParser;
 import com.google.idea.blaze.base.command.buildresult.BuildResultHelper;
 import com.google.idea.blaze.base.command.info.BlazeInfo;
+import com.google.idea.blaze.base.command.info.BlazeInfoRunner;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.settings.Blaze;
@@ -85,7 +86,7 @@
   @Nullable
   private String getExecutionRoot(BlazeContext context) {
     ListenableFuture<String> execRootFuture =
-        BlazeInfo.getInstance()
+        BlazeInfoRunner.getInstance()
             .runBlazeInfo(
                 context,
                 Blaze.getBuildSystemProvider(project).getBinaryPath(),
diff --git a/aswb/src/com/google/idea/blaze/android/run/test/AndroidTestConsoleProvider.java b/aswb/src/com/google/idea/blaze/android/run/test/AndroidTestConsoleProvider.java
index c0cbb24..92311c4 100644
--- a/aswb/src/com/google/idea/blaze/android/run/test/AndroidTestConsoleProvider.java
+++ b/aswb/src/com/google/idea/blaze/android/run/test/AndroidTestConsoleProvider.java
@@ -16,7 +16,7 @@
 package com.google.idea.blaze.android.run.test;
 
 import com.android.tools.idea.run.ConsoleProvider;
-import com.google.idea.blaze.android.compatibility.Compatibility.AndroidTestConsoleProperties;
+import com.android.tools.idea.testartifacts.instrumented.AndroidTestConsoleProperties;
 import com.google.idea.blaze.base.run.smrunner.BlazeTestEventsHandler;
 import com.google.idea.blaze.base.run.smrunner.SmRunnerUtils;
 import com.intellij.execution.ExecutionException;
diff --git a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestClassRunConfigurationProducer.java b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestClassRunConfigurationProducer.java
index bbafcc0..b898e42 100644
--- a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestClassRunConfigurationProducer.java
+++ b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestClassRunConfigurationProducer.java
@@ -15,8 +15,8 @@
  */
 package com.google.idea.blaze.android.run.test;
 
+import com.android.tools.idea.testartifacts.instrumented.AndroidTestRunConfiguration;
 import com.google.common.base.Strings;
-import com.google.idea.blaze.android.compatibility.Compatibility.AndroidTestRunConfiguration;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
 import com.google.idea.blaze.base.model.primitives.Kind;
 import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
diff --git a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestFilter.java b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestFilter.java
index e5f2b1d..9002f30 100644
--- a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestFilter.java
+++ b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestFilter.java
@@ -15,8 +15,8 @@
  */
 package com.google.idea.blaze.android.run.test;
 
+import com.android.tools.idea.testartifacts.instrumented.AndroidTestRunConfiguration;
 import com.google.common.collect.ImmutableList;
-import com.google.idea.blaze.android.compatibility.Compatibility.AndroidTestRunConfiguration;
 import com.google.idea.blaze.base.command.BlazeFlags;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
diff --git a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestMethodRunConfigurationProducer.java b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestMethodRunConfigurationProducer.java
index d3cbc78..db2cca6 100644
--- a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestMethodRunConfigurationProducer.java
+++ b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestMethodRunConfigurationProducer.java
@@ -15,8 +15,8 @@
  */
 package com.google.idea.blaze.android.run.test;
 
+import com.android.tools.idea.testartifacts.instrumented.AndroidTestRunConfiguration;
 import com.google.common.base.Strings;
-import com.google.idea.blaze.android.compatibility.Compatibility.AndroidTestRunConfiguration;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
 import com.google.idea.blaze.base.model.primitives.Kind;
 import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
diff --git a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationHandler.java b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationHandler.java
index d63ea0c..4b94b3c 100644
--- a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationHandler.java
+++ b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationHandler.java
@@ -102,7 +102,8 @@
     ProjectViewSet projectViewSet = ProjectViewManager.getInstance(project).getProjectViewSet();
     BlazeAndroidRunConfigurationValidationUtil.validateExecution(module, facet, projectViewSet);
 
-    ImmutableList<String> buildFlags = configState.getBuildFlags(project, projectViewSet);
+    ImmutableList<String> buildFlags =
+        configState.getCommonState().getExpandedBuildFlags(project, projectViewSet);
     BlazeAndroidRunContext runContext = createRunContext(project, facet, environment, buildFlags);
 
     return new BlazeAndroidRunConfigurationRunner(
diff --git a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationState.java b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationState.java
index 62fcbb3..074b17b 100644
--- a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationState.java
+++ b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationState.java
@@ -17,10 +17,8 @@
 
 import com.android.tools.idea.run.ValidationError;
 import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Maps;
 import com.google.idea.blaze.android.run.BlazeAndroidRunConfigurationCommonState;
-import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.run.state.RunConfigurationState;
 import com.google.idea.blaze.base.run.state.RunConfigurationStateEditor;
 import com.intellij.openapi.project.Project;
@@ -132,10 +130,6 @@
     this.extraOptions = extraOptions;
   }
 
-  public ImmutableList<String> getBuildFlags(Project project, ProjectViewSet projectViewSet) {
-    return commonState.getBuildFlags(project, projectViewSet);
-  }
-
   /**
    * We collect errors rather than throwing to avoid missing fatal errors by exiting early for a
    * warning.
diff --git a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationStateEditor.java b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationStateEditor.java
index 5df4512..5e5e6c8 100644
--- a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationStateEditor.java
+++ b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationStateEditor.java
@@ -16,10 +16,10 @@
 
 package com.google.idea.blaze.android.run.test;
 
-import static com.google.idea.blaze.android.compatibility.Compatibility.AndroidTestRunConfiguration.TEST_ALL_IN_MODULE;
-import static com.google.idea.blaze.android.compatibility.Compatibility.AndroidTestRunConfiguration.TEST_ALL_IN_PACKAGE;
-import static com.google.idea.blaze.android.compatibility.Compatibility.AndroidTestRunConfiguration.TEST_CLASS;
-import static com.google.idea.blaze.android.compatibility.Compatibility.AndroidTestRunConfiguration.TEST_METHOD;
+import static com.android.tools.idea.testartifacts.instrumented.AndroidTestRunConfiguration.TEST_ALL_IN_MODULE;
+import static com.android.tools.idea.testartifacts.instrumented.AndroidTestRunConfiguration.TEST_ALL_IN_PACKAGE;
+import static com.android.tools.idea.testartifacts.instrumented.AndroidTestRunConfiguration.TEST_CLASS;
+import static com.android.tools.idea.testartifacts.instrumented.AndroidTestRunConfiguration.TEST_METHOD;
 
 import com.google.idea.blaze.base.run.state.RunConfigurationState;
 import com.google.idea.blaze.base.run.state.RunConfigurationStateEditor;
diff --git a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunContext.java b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunContext.java
index fd99489..9962acf 100644
--- a/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunContext.java
+++ b/aswb/src/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunContext.java
@@ -33,7 +33,6 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.Futures;
-import com.google.idea.blaze.android.compatibility.Compatibility;
 import com.google.idea.blaze.android.run.deployinfo.BlazeAndroidDeployInfo;
 import com.google.idea.blaze.android.run.deployinfo.BlazeApkProvider;
 import com.google.idea.blaze.android.run.runner.BlazeAndroidDeviceSelector;
@@ -226,8 +225,7 @@
       return new ConnectBlazeTestDebuggerTask(
           env.getProject(), androidDebugger, packageIds, applicationIdProvider, this);
     }
-    return Compatibility.getConnectDebuggerTask(
-        androidDebugger,
+    return androidDebugger.getConnectDebuggerTask(
         env,
         null,
         packageIds,
diff --git a/aswb/src/com/google/idea/blaze/android/run/test/ConnectBlazeTestDebuggerTask.java b/aswb/src/com/google/idea/blaze/android/run/test/ConnectBlazeTestDebuggerTask.java
index 8e2328e..8cdeedf 100644
--- a/aswb/src/com/google/idea/blaze/android/run/test/ConnectBlazeTestDebuggerTask.java
+++ b/aswb/src/com/google/idea/blaze/android/run/test/ConnectBlazeTestDebuggerTask.java
@@ -28,9 +28,9 @@
 import com.android.tools.idea.run.LaunchInfo;
 import com.android.tools.idea.run.ProcessHandlerConsolePrinter;
 import com.android.tools.idea.run.editor.AndroidDebugger;
+import com.android.tools.idea.run.tasks.ConnectDebuggerTask;
 import com.android.tools.idea.run.tasks.ConnectJavaDebuggerTask;
 import com.android.tools.idea.run.util.ProcessHandlerLaunchStatus;
-import com.google.idea.blaze.android.compatibility.Compatibility.ConnectDebuggerTask;
 import com.intellij.debugger.engine.RemoteDebugProcessHandler;
 import com.intellij.debugger.ui.DebuggerPanelsManager;
 import com.intellij.execution.ExecutionException;
diff --git a/aswb/src/com/google/idea/blaze/android/run/test/StockAndroidTestLaunchTask.java b/aswb/src/com/google/idea/blaze/android/run/test/StockAndroidTestLaunchTask.java
index 2430f3c..a10773e 100644
--- a/aswb/src/com/google/idea/blaze/android/run/test/StockAndroidTestLaunchTask.java
+++ b/aswb/src/com/google/idea/blaze/android/run/test/StockAndroidTestLaunchTask.java
@@ -22,8 +22,8 @@
 import com.android.tools.idea.run.ConsolePrinter;
 import com.android.tools.idea.run.tasks.LaunchTask;
 import com.android.tools.idea.run.util.LaunchStatus;
+import com.android.tools.idea.testartifacts.instrumented.AndroidTestListener;
 import com.google.common.collect.ImmutableList;
-import com.google.idea.blaze.android.compatibility.Compatibility.AndroidTestListener;
 import com.google.idea.blaze.android.run.deployinfo.BlazeAndroidDeployInfo;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.diagnostic.Logger;
@@ -158,6 +158,7 @@
   }
 
   @Override
+  @SuppressWarnings("FutureReturnValueIgnored")
   public boolean perform(
       IDevice device, final LaunchStatus launchStatus, final ConsolePrinter printer) {
     printer.stdout("Running tests\n");
@@ -165,6 +166,8 @@
     final RemoteAndroidTestRunner runner =
         new RemoteAndroidTestRunner(testApplicationId, instrumentationTestRunner, device);
     switch (configState.getTestingType()) {
+      case BlazeAndroidTestRunConfigurationState.TEST_ALL_IN_MODULE:
+        break;
       case BlazeAndroidTestRunConfigurationState.TEST_ALL_IN_PACKAGE:
         runner.setTestPackageName(configState.getPackageName());
         break;
@@ -183,15 +186,12 @@
     // run in a separate thread as this will block until the tests complete
     ApplicationManager.getApplication()
         .executeOnPooledThread(
-            new Runnable() {
-              @Override
-              public void run() {
-                try {
-                  runner.run(new AndroidTestListener(launchStatus, printer));
-                } catch (Exception e) {
-                  LOG.info(e);
-                  printer.stderr("Error: Unexpected exception while running tests: " + e);
-                }
+            () -> {
+              try {
+                runner.run(new AndroidTestListener(launchStatus, printer));
+              } catch (Exception e) {
+                LOG.info(e);
+                printer.stderr("Error: Unexpected exception while running tests: " + e);
               }
             });
 
diff --git a/aswb/2.3/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfiguration.java b/aswb/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfiguration.java
similarity index 100%
rename from aswb/2.3/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfiguration.java
rename to aswb/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfiguration.java
diff --git a/aswb/2.3/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfigurationProxy.java b/aswb/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfigurationProxy.java
similarity index 100%
rename from aswb/2.3/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfigurationProxy.java
rename to aswb/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfigurationProxy.java
diff --git a/aswb/2.3/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfigurationProxyProvider.java b/aswb/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfigurationProxyProvider.java
similarity index 100%
rename from aswb/2.3/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfigurationProxyProvider.java
rename to aswb/src/com/google/idea/blaze/android/run/testrecorder/TestRecorderBlazeCommandRunConfigurationProxyProvider.java
diff --git a/aswb/src/com/google/idea/blaze/android/sdk/BlazeSdkProviderImpl.java b/aswb/src/com/google/idea/blaze/android/sdk/BlazeSdkProviderImpl.java
index d4c81ee..1d1a43b 100644
--- a/aswb/src/com/google/idea/blaze/android/sdk/BlazeSdkProviderImpl.java
+++ b/aswb/src/com/google/idea/blaze/android/sdk/BlazeSdkProviderImpl.java
@@ -15,7 +15,7 @@
  */
 package com.google.idea.blaze.android.sdk;
 
-import com.google.idea.blaze.android.compatibility.Compatibility.AndroidSdkUtils;
+import com.android.tools.idea.sdk.AndroidSdks;
 import com.intellij.openapi.projectRoots.Sdk;
 import java.util.List;
 import javax.annotation.Nullable;
@@ -25,18 +25,19 @@
 public class BlazeSdkProviderImpl implements BlazeSdkProvider {
   @Override
   public List<Sdk> getAllAndroidSdks() {
-    return AndroidSdkUtils.getAllAndroidSdks();
+    return AndroidSdks.getInstance().getAllAndroidSdks();
   }
 
   @Override
   public Sdk findSdk(String targetHash) {
-    return AndroidSdkUtils.findSuitableAndroidSdk(targetHash);
+    return AndroidSdks.getInstance().findSuitableAndroidSdk(targetHash);
   }
 
   @Override
   @Nullable
   public String getSdkTargetHash(Sdk sdk) {
-    AndroidSdkAdditionalData additionalData = AndroidSdkUtils.getAndroidSdkAdditionalData(sdk);
+    AndroidSdkAdditionalData additionalData =
+        AndroidSdks.getInstance().getAndroidSdkAdditionalData(sdk);
     if (additionalData == null) {
       return null;
     }
diff --git a/aswb/2.3/src/com/google/idea/blaze/android/settings/BlazeAndroidUserSettingsContributor.java b/aswb/src/com/google/idea/blaze/android/settings/BlazeAndroidUserSettingsContributor.java
similarity index 100%
rename from aswb/2.3/src/com/google/idea/blaze/android/settings/BlazeAndroidUserSettingsContributor.java
rename to aswb/src/com/google/idea/blaze/android/settings/BlazeAndroidUserSettingsContributor.java
diff --git a/aswb/src/com/google/idea/blaze/android/sync/AndroidPrefetchFileSource.java b/aswb/src/com/google/idea/blaze/android/sync/AndroidPrefetchFileSource.java
index 162f693..821f098 100644
--- a/aswb/src/com/google/idea/blaze/android/sync/AndroidPrefetchFileSource.java
+++ b/aswb/src/com/google/idea/blaze/android/sync/AndroidPrefetchFileSource.java
@@ -19,6 +19,7 @@
 import com.google.idea.blaze.android.sync.model.BlazeAndroidSyncData;
 import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.prefetch.PrefetchFileSource;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.intellij.openapi.project.Project;
 import java.io.File;
@@ -29,7 +30,10 @@
 public class AndroidPrefetchFileSource implements PrefetchFileSource {
   @Override
   public void addFilesToPrefetch(
-      Project project, BlazeProjectData blazeProjectData, Collection<File> files) {
+      Project project,
+      ProjectViewSet projectViewSet,
+      BlazeProjectData blazeProjectData,
+      Collection<File> files) {
     BlazeAndroidSyncData syncData = blazeProjectData.syncState.get(BlazeAndroidSyncData.class);
     if (syncData == null) {
       return;
diff --git a/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidJavaSyncAugmenter.java b/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidJavaSyncAugmenter.java
index 084aec6..16afc3f 100644
--- a/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidJavaSyncAugmenter.java
+++ b/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidJavaSyncAugmenter.java
@@ -48,7 +48,7 @@
     }
     LibraryArtifact idlJar = androidIdeInfo.idlJar;
     if (idlJar != null) {
-      genJars.add(new BlazeJarLibrary(idlJar, target.key));
+      genJars.add(new BlazeJarLibrary(idlJar));
     }
     Set<String> whitelistedGenResourcePaths =
         projectViewSet
@@ -66,7 +66,7 @@
       if (!discardResourceJar) {
         LibraryArtifact resourceJar = androidIdeInfo.resourceJar;
         if (resourceJar != null) {
-          jars.add(new BlazeJarLibrary(resourceJar, target.key));
+          jars.add(new BlazeJarLibrary(resourceJar));
         }
       }
     }
diff --git a/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidLibrarySource.java b/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidLibrarySource.java
index bfff837..73bb993 100644
--- a/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidLibrarySource.java
+++ b/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidLibrarySource.java
@@ -19,13 +19,8 @@
 import com.google.idea.blaze.android.sync.model.BlazeAndroidSyncData;
 import com.google.idea.blaze.base.model.BlazeLibrary;
 import com.google.idea.blaze.base.model.BlazeProjectData;
-import com.google.idea.blaze.base.projectview.section.Glob;
-import com.google.idea.blaze.base.projectview.section.Glob.GlobSet;
 import com.google.idea.blaze.base.sync.libraries.LibrarySource;
-import com.google.idea.blaze.java.sync.LibraryGlobFilter;
 import java.util.Collection;
-import java.util.function.Predicate;
-import javax.annotation.Nullable;
 
 class BlazeAndroidLibrarySource extends LibrarySource.Adapter {
   private final BlazeProjectData blazeProjectData;
@@ -46,12 +41,4 @@
     }
     return libraries.build();
   }
-
-  @Nullable
-  @Override
-  public Predicate<BlazeLibrary> getLibraryFilter() {
-    // This is supplied via the SDK
-    GlobSet globSet = new GlobSet(ImmutableList.of(new Glob("*/android_blaze.jar")));
-    return new LibraryGlobFilter(globSet);
-  }
 }
diff --git a/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidSyncPlugin.java b/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidSyncPlugin.java
index 07db0d0..f21d144 100644
--- a/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidSyncPlugin.java
+++ b/aswb/src/com/google/idea/blaze/android/sync/BlazeAndroidSyncPlugin.java
@@ -15,9 +15,9 @@
  */
 package com.google.idea.blaze.android.sync;
 
+import com.android.tools.idea.sdk.IdeSdks;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
-import com.google.idea.blaze.android.compatibility.Compatibility.IdeSdks;
 import com.google.idea.blaze.android.cppapi.NdkSupport;
 import com.google.idea.blaze.android.projectview.AndroidMinSdkSection;
 import com.google.idea.blaze.android.projectview.AndroidSdkPlatformSection;
@@ -29,6 +29,7 @@
 import com.google.idea.blaze.android.sync.model.BlazeAndroidSyncData;
 import com.google.idea.blaze.android.sync.projectstructure.BlazeAndroidProjectStructureSyncer;
 import com.google.idea.blaze.android.sync.sdk.AndroidSdkFromProjectView;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.model.BlazeVersionData;
@@ -49,7 +50,6 @@
 import com.google.idea.blaze.base.sync.libraries.LibrarySource;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
-import com.google.idea.blaze.base.sync.workspace.BlazeRoots;
 import com.google.idea.blaze.base.sync.workspace.WorkingSet;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import com.google.idea.blaze.java.projectview.JavaLanguageLevelSection;
@@ -115,13 +115,13 @@
       return;
     }
 
-    File path = IdeSdks.getAndroidSdkPath();
+    File path = IdeSdks.getInstance().getAndroidSdkPath();
     if (path != null) {
       context.output(new StatusOutput("Installing SDK platforms..."));
       ApplicationManager.getApplication()
           .invokeAndWait(
               () -> {
-                IdeSdks.createAndroidSdkPerAndroidTarget(path);
+                IdeSdks.getInstance().createAndroidSdkPerAndroidTarget(path);
               },
               ModalityState.defaultModalityState());
     }
@@ -134,7 +134,7 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings,
-      BlazeRoots blazeRoots,
+      BlazeInfo blazeInfo,
       @Nullable WorkingSet workingSet,
       WorkspacePathResolver workspacePathResolver,
       ArtifactLocationDecoder artifactLocationDecoder,
@@ -264,6 +264,7 @@
 
   @Override
   public boolean validateProjectView(
+      @Nullable Project project,
       BlazeContext context,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings) {
@@ -310,7 +311,8 @@
 
   @Nullable
   @Override
-  public LibrarySource getLibrarySource(BlazeProjectData blazeProjectData) {
+  public LibrarySource getLibrarySource(
+      ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
     if (!isAndroidWorkspace(blazeProjectData.workspaceLanguageSettings)) {
       return null;
     }
diff --git a/aswb/src/com/google/idea/blaze/android/sync/model/AndroidResourceModule.java b/aswb/src/com/google/idea/blaze/android/sync/model/AndroidResourceModule.java
index 73d76f5..8a2cca5 100644
--- a/aswb/src/com/google/idea/blaze/android/sync/model/AndroidResourceModule.java
+++ b/aswb/src/com/google/idea/blaze/android/sync/model/AndroidResourceModule.java
@@ -145,7 +145,7 @@
     }
 
     public Builder addTransitiveResourceDependency(String dependency) {
-      return addTransitiveResourceDependency(new Label(dependency));
+      return addTransitiveResourceDependency(Label.create(dependency));
     }
 
     @NotNull
diff --git a/aswb/2.3/src/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProvider.java b/aswb/src/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProvider.java
similarity index 100%
rename from aswb/2.3/src/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProvider.java
rename to aswb/src/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProvider.java
diff --git a/aswb/src/com/google/idea/blaze/android/sync/projectstructure/AndroidFacetModuleCustomizer.java b/aswb/src/com/google/idea/blaze/android/sync/projectstructure/AndroidFacetModuleCustomizer.java
index 541be52..7f04fe2 100755
--- a/aswb/src/com/google/idea/blaze/android/sync/projectstructure/AndroidFacetModuleCustomizer.java
+++ b/aswb/src/com/google/idea/blaze/android/sync/projectstructure/AndroidFacetModuleCustomizer.java
@@ -16,7 +16,6 @@
 package com.google.idea.blaze.android.sync.projectstructure;
 
 import com.android.builder.model.AndroidProject;
-import com.google.idea.blaze.android.compatibility.Compatibility;
 import com.intellij.facet.FacetManager;
 import com.intellij.facet.ModifiableFacetModel;
 import com.intellij.openapi.module.Module;
@@ -56,7 +55,7 @@
   private static void configureFacet(AndroidFacet facet) {
     JpsAndroidModuleProperties facetState = facet.getProperties();
     facetState.ALLOW_USER_CONFIGURATION = false;
-    Compatibility.setFacetStateIsLibraryProject(facetState);
+    facetState.PROJECT_TYPE = AndroidProject.PROJECT_TYPE_LIBRARY;
     facetState.MANIFEST_FILE_RELATIVE_PATH = "";
     facetState.RES_FOLDER_RELATIVE_PATH = "";
     facetState.ASSETS_FOLDER_RELATIVE_PATH = "";
diff --git a/aswb/src/com/google/idea/blaze/android/sync/projectstructure/BlazeAndroidProjectStructureSyncer.java b/aswb/src/com/google/idea/blaze/android/sync/projectstructure/BlazeAndroidProjectStructureSyncer.java
index 66b020f..29a20a6 100644
--- a/aswb/src/com/google/idea/blaze/android/sync/projectstructure/BlazeAndroidProjectStructureSyncer.java
+++ b/aswb/src/com/google/idea/blaze/android/sync/projectstructure/BlazeAndroidProjectStructureSyncer.java
@@ -49,12 +49,13 @@
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
 import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
 import com.google.idea.blaze.base.sync.projectstructure.ModuleEditorProvider;
+import com.google.idea.blaze.base.sync.projectstructure.ModuleFinder;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.intellij.execution.RunManager;
 import com.intellij.execution.configurations.RunConfiguration;
 import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
 import com.intellij.openapi.module.StdModuleTypes;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.ModifiableRootModel;
@@ -69,6 +70,8 @@
 /** Updates the IDE's project structure. */
 public class BlazeAndroidProjectStructureSyncer {
 
+  private static final Logger logger = Logger.getInstance(BlazeAndroidProjectStructureSyncer.class);
+
   public static void updateProjectStructure(
       Project project,
       BlazeContext context,
@@ -214,7 +217,7 @@
   public static Module ensureRunConfigurationModule(Project project, Label label) {
     TargetKey targetKey = TargetKey.forPlainTarget(label);
     String moduleName = moduleNameForAndroidModule(targetKey);
-    Module module = ModuleManager.getInstance(project).findModuleByName(moduleName);
+    Module module = ModuleFinder.getInstance(project).findModuleByName(moduleName);
     if (module != null) {
       return module;
     }
@@ -308,12 +311,16 @@
         project, workspaceRoot, workspaceModule, androidSdkPlatform);
 
     ArtifactLocationDecoder artifactLocationDecoder = blazeProjectData.artifactLocationDecoder;
-    ModuleManager moduleManager = ModuleManager.getInstance(project);
+    ModuleFinder moduleFinder = ModuleFinder.getInstance(project);
     for (AndroidResourceModule androidResourceModule :
         syncData.importResult.androidResourceModules) {
       TargetIdeInfo target = blazeProjectData.targetMap.get(androidResourceModule.targetKey);
       String moduleName = moduleNameForAndroidModule(target.key);
-      Module module = moduleManager.findModuleByName(moduleName);
+      Module module = moduleFinder.findModuleByName(moduleName);
+      if (module == null) {
+        logger.warn("No module found for resource target: " + target.key);
+        continue;
+      }
       registry.put(module, androidResourceModule);
 
       AndroidIdeInfo androidIdeInfo = target.androidIdeInfo;
@@ -345,7 +352,11 @@
             project, projectViewSet, blazeProjectData, androidResourceModules);
     for (TargetIdeInfo target : runConfigurationTargets) {
       String moduleName = moduleNameForAndroidModule(target.key);
-      Module module = moduleManager.findModuleByName(moduleName);
+      Module module = moduleFinder.findModuleByName(moduleName);
+      if (module == null) {
+        logger.warn("No module found for run configuration target: " + target.key);
+        continue;
+      }
       AndroidIdeInfo androidIdeInfo = target.androidIdeInfo;
       assert androidIdeInfo != null;
       updateModuleFacetInMemoryState(
diff --git a/aswb/tests/integrationtests/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonStateMigrationTest.java b/aswb/tests/integrationtests/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonStateMigrationTest.java
deleted file mode 100644
index 50786f9..0000000
--- a/aswb/tests/integrationtests/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonStateMigrationTest.java
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.android.run;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import com.google.idea.blaze.android.AndroidIntegrationTestCleanupHelper;
-import com.google.idea.blaze.android.AndroidIntegrationTestSetupRule;
-import com.google.idea.blaze.base.BlazeIntegrationTestCase;
-import java.io.StringReader;
-import java.util.List;
-import org.jdom.Element;
-import org.jdom.input.SAXBuilder;
-import org.jdom.output.Format;
-import org.jdom.output.XMLOutputter;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-/**
- * Tests for migrating the storage of deploy target state and debugger state in {@link
- * BlazeAndroidRunConfigurationCommonState} TODO Introduced in 1.12, remove in 1.14 when the
- * migration code in BlazeAndroidRunConfigurationCommonState is removed.
- */
-@RunWith(JUnit4.class)
-public class BlazeAndroidRunConfigurationCommonStateMigrationTest extends BlazeIntegrationTestCase {
-
-  private static final String DEPLOY_TARGET_STATES_RAW_XML =
-      "<android-deploy-target-states>"
-          + "  <option name=\"USE_LAST_SELECTED_DEVICE\" value=\"true\" />"
-          + "  <option name=\"PREFERRED_AVD\" value=\"some avd\" />"
-          + "</android-deploy-target-states>";
-  private static final String DEBUGGER_STATE_AUTO_RAW_XML =
-      "<Auto>"
-          + "  <option name=\"USE_JAVA_AWARE_DEBUGGER\" value=\"true\" />"
-          + "  <option name=\"WORKING_DIR\" value=\"/some/directory\" />"
-          + "  <option name=\"TARGET_LOGGING_CHANNELS\" value=\"some channels\" />"
-          + "</Auto>";
-  private static final String DEBUGGER_STATE_NATIVE_RAW_XML =
-      "<Native>"
-          + "  <option name=\"USE_JAVA_AWARE_DEBUGGER\" value=\"false\" />"
-          + "  <option name=\"WORKING_DIR\" value=\"\" />"
-          + "  <option name=\"TARGET_LOGGING_CHANNELS\""
-          + "          value=\"lldb process:gdb-remote packets\" />"
-          + "</Native>";
-  private static final String DEBUGGER_STATE_JAVA_RAW_XML = "<Java />";
-  private static final String DEBUGGER_STATE_HYBRID_RAW_XML =
-      "<Hybrid>"
-          + "  <option name=\"USE_JAVA_AWARE_DEBUGGER\" value=\"true\" />"
-          + "  <option name=\"WORKING_DIR\" value=\"\" />"
-          + "  <option name=\"TARGET_LOGGING_CHANNELS\""
-          + "          value=\"lldb process:gdb-remote packets\" />"
-          + "</Hybrid>";
-  private static final String DEBUGGER_STATE_BLAZE_AUTO_RAW_XML =
-      "<BlazeAuto>"
-          + "  <option name=\"USE_JAVA_AWARE_DEBUGGER\" value=\"false\" />"
-          + "  <option name=\"WORKING_DIR\" value=\"/some/other/directory\" />"
-          + "  <option name=\"TARGET_LOGGING_CHANNELS\" value=\"some other channels\" />"
-          + "</BlazeAuto>";
-  @Rule
-  public final AndroidIntegrationTestSetupRule androidSetupRule =
-      new AndroidIntegrationTestSetupRule();
-
-  private BlazeAndroidRunConfigurationCommonState state;
-  private SAXBuilder saxBuilder;
-  private XMLOutputter xmlOutputter;
-
-  @Before
-  public final void doSetup() throws Exception {
-    state = new BlazeAndroidRunConfigurationCommonState(buildSystem().getName(), false);
-    saxBuilder = new SAXBuilder();
-    xmlOutputter = new XMLOutputter(Format.getCompactFormat());
-  }
-
-  @After
-  public final void doTeardown() {
-    AndroidIntegrationTestCleanupHelper.cleanUp(getProject());
-  }
-
-  private String formatRawXml(String rawXml) throws Exception {
-    Element element =
-        saxBuilder.build(new StringReader("<?xml version=\"1.0\"?>" + rawXml)).getRootElement();
-    return xmlOutputter.outputString(element);
-  }
-
-  @Test
-  public void readAndWriteShouldRemoveExtraElements() throws Exception {
-    String oldXml =
-        "<?xml version=\"1.0\"?>"
-            + "<configuration blaze-native-debug=\"true\">"
-            + "  <blaze-user-flag>--flag1</blaze-user-flag>"
-            + "  <blaze-user-flag>--flag2</blaze-user-flag>"
-            + "  <option name=\"USE_LAST_SELECTED_DEVICE\" value=\"true\" />"
-            + "  <option name=\"PREFERRED_AVD\" value=\"some avd\" />"
-            + DEBUGGER_STATE_AUTO_RAW_XML
-            + DEBUGGER_STATE_NATIVE_RAW_XML
-            + DEBUGGER_STATE_JAVA_RAW_XML
-            + DEBUGGER_STATE_HYBRID_RAW_XML
-            + DEBUGGER_STATE_BLAZE_AUTO_RAW_XML
-            + "  <option name=\"USE_LAST_SELECTED_DEVICE\" value=\"true\" />"
-            + "  <option name=\"PREFERRED_AVD\" value=\"some avd\" />"
-            + DEBUGGER_STATE_AUTO_RAW_XML
-            + DEBUGGER_STATE_NATIVE_RAW_XML
-            + DEBUGGER_STATE_JAVA_RAW_XML
-            + DEBUGGER_STATE_HYBRID_RAW_XML
-            + DEBUGGER_STATE_BLAZE_AUTO_RAW_XML
-            + "</configuration>";
-    Element oldElement = saxBuilder.build(new StringReader(oldXml)).getRootElement();
-
-    state.readExternal(oldElement);
-    Element migratedElement = new Element("configuration");
-    state.writeExternal(migratedElement);
-
-    assertThat(migratedElement.getChildren()).hasSize(4);
-    List<Element> flagElements = migratedElement.getChildren("blaze-user-flag");
-    assertThat(flagElements).hasSize(2);
-
-    Element deployTargetStatesElement = migratedElement.getChild("android-deploy-target-states");
-    assertThat(xmlOutputter.outputString(deployTargetStatesElement))
-        .isEqualTo(formatRawXml(DEPLOY_TARGET_STATES_RAW_XML));
-
-    Element debuggerStatesElement = migratedElement.getChild("android-debugger-states");
-    assertThat(debuggerStatesElement.getChildren()).hasSize(5);
-  }
-}
diff --git a/aswb/tests/integrationtests/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonStateTest.java b/aswb/tests/integrationtests/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonStateTest.java
index 8844355..0d9cba6 100644
--- a/aswb/tests/integrationtests/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonStateTest.java
+++ b/aswb/tests/integrationtests/com/google/idea/blaze/android/run/BlazeAndroidRunConfigurationCommonStateTest.java
@@ -19,7 +19,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
-import com.google.idea.blaze.android.AndroidIntegrationTestCleanupHelper;
 import com.google.idea.blaze.android.AndroidIntegrationTestSetupRule;
 import com.google.idea.blaze.android.cppapi.NdkSupport;
 import com.google.idea.blaze.base.BlazeIntegrationTestCase;
@@ -30,7 +29,6 @@
 import org.jdom.Element;
 import org.jdom.output.Format;
 import org.jdom.output.XMLOutputter;
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -57,14 +55,9 @@
     state = new BlazeAndroidRunConfigurationCommonState(buildSystem().getName(), false);
   }
 
-  @After
-  public final void doTeardown() {
-    AndroidIntegrationTestCleanupHelper.cleanUp(getProject());
-  }
-
   @Test
   public void readAndWriteShouldMatch() throws InvalidDataException, WriteExternalException {
-    state.setUserFlags(ImmutableList.of("--flag1", "--flag2"));
+    state.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
     state.setNativeDebuggingEnabled(true);
 
     Element element = new Element("test");
@@ -73,7 +66,9 @@
         new BlazeAndroidRunConfigurationCommonState(buildSystem().getName(), false);
     readState.readExternal(element);
 
-    assertThat(readState.getUserFlags()).containsExactly("--flag1", "--flag2").inOrder();
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .containsExactly("--flag1", "--flag2")
+        .inOrder();
     assertThat(readState.isNativeDebuggingEnabled()).isTrue();
   }
 
@@ -85,13 +80,16 @@
         new BlazeAndroidRunConfigurationCommonState(buildSystem().getName(), false);
     readState.readExternal(element);
 
-    assertThat(readState.getUserFlags()).isEqualTo(state.getUserFlags());
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(state.getBlazeFlagsState().getRawFlags());
     assertThat(readState.isNativeDebuggingEnabled()).isEqualTo(state.isNativeDebuggingEnabled());
   }
 
   @Test
   public void readShouldOmitEmptyFlags() throws InvalidDataException, WriteExternalException {
-    state.setUserFlags(ImmutableList.of("hi ", "", "I'm", " ", "\t", "Josh\r\n", "\n"));
+    state
+        .getBlazeFlagsState()
+        .setRawFlags(ImmutableList.of("hi ", "", "I'm", " ", "\t", "Josh\r\n", "\n"));
 
     Element element = new Element("test");
     state.writeExternal(element);
@@ -99,14 +97,16 @@
         new BlazeAndroidRunConfigurationCommonState(buildSystem().getName(), false);
     readState.readExternal(element);
 
-    assertThat(readState.getUserFlags()).containsExactly("hi", "I'm", "Josh").inOrder();
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .containsExactly("hi", "I'm", "Josh")
+        .inOrder();
   }
 
   @Test
   public void repeatedWriteShouldNotChangeElement() throws WriteExternalException {
     final XMLOutputter xmlOutputter = new XMLOutputter(Format.getCompactFormat());
 
-    state.setUserFlags(ImmutableList.of("--flag1", "--flag2"));
+    state.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
     state.setNativeDebuggingEnabled(true);
 
     Element firstWrite = new Element("test");
diff --git a/aswb/tests/integrationtests/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationStateTest.java b/aswb/tests/integrationtests/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationStateTest.java
index 1e55ac2..e72c5de 100644
--- a/aswb/tests/integrationtests/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationStateTest.java
+++ b/aswb/tests/integrationtests/com/google/idea/blaze/android/run/binary/BlazeAndroidBinaryRunConfigurationStateTest.java
@@ -19,7 +19,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
-import com.google.idea.blaze.android.AndroidIntegrationTestCleanupHelper;
 import com.google.idea.blaze.android.AndroidIntegrationTestSetupRule;
 import com.google.idea.blaze.android.cppapi.NdkSupport;
 import com.google.idea.blaze.android.run.BlazeAndroidRunConfigurationCommonState;
@@ -33,7 +32,6 @@
 import org.jdom.Element;
 import org.jdom.output.Format;
 import org.jdom.output.XMLOutputter;
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -60,15 +58,10 @@
     state = new BlazeAndroidBinaryRunConfigurationState(buildSystem().getName());
   }
 
-  @After
-  public final void doTeardown() {
-    AndroidIntegrationTestCleanupHelper.cleanUp(getProject());
-  }
-
   @Test
   public void readAndWriteShouldMatch() throws InvalidDataException, WriteExternalException {
     BlazeAndroidRunConfigurationCommonState commonState = state.getCommonState();
-    commonState.setUserFlags(ImmutableList.of("--flag1", "--flag2"));
+    commonState.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
     commonState.setNativeDebuggingEnabled(true);
 
     state.setActivityClass("com.example.TestActivity");
@@ -86,7 +79,9 @@
     readState.readExternal(element);
 
     BlazeAndroidRunConfigurationCommonState readCommonState = readState.getCommonState();
-    assertThat(readCommonState.getUserFlags()).containsExactly("--flag1", "--flag2").inOrder();
+    assertThat(readCommonState.getBlazeFlagsState().getRawFlags())
+        .containsExactly("--flag1", "--flag2")
+        .inOrder();
     assertThat(readCommonState.isNativeDebuggingEnabled()).isTrue();
 
     assertThat(readState.getActivityClass()).isEqualTo("com.example.TestActivity");
@@ -109,7 +104,8 @@
 
     BlazeAndroidRunConfigurationCommonState commonState = state.getCommonState();
     BlazeAndroidRunConfigurationCommonState readCommonState = readState.getCommonState();
-    assertThat(readCommonState.getUserFlags()).isEqualTo(commonState.getUserFlags());
+    assertThat(readCommonState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(commonState.getBlazeFlagsState().getRawFlags());
     assertThat(readCommonState.isNativeDebuggingEnabled())
         .isEqualTo(commonState.isNativeDebuggingEnabled());
 
@@ -127,7 +123,7 @@
     final XMLOutputter xmlOutputter = new XMLOutputter(Format.getCompactFormat());
 
     BlazeAndroidRunConfigurationCommonState commonState = state.getCommonState();
-    commonState.setUserFlags(ImmutableList.of("--flag1", "--flag2"));
+    commonState.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
     commonState.setNativeDebuggingEnabled(true);
 
     state.setActivityClass("com.example.TestActivity");
@@ -152,7 +148,7 @@
     RunConfigurationStateEditor editor = state.getEditor(getProject());
 
     BlazeAndroidRunConfigurationCommonState commonState = state.getCommonState();
-    commonState.setUserFlags(ImmutableList.of("--flag1", "--flag2"));
+    commonState.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
     commonState.setNativeDebuggingEnabled(true);
 
     state.setActivityClass("com.example.TestActivity");
@@ -170,7 +166,8 @@
     editor.applyEditorTo(readState);
 
     BlazeAndroidRunConfigurationCommonState readCommonState = readState.getCommonState();
-    assertThat(readCommonState.getUserFlags()).isEqualTo(commonState.getUserFlags());
+    assertThat(readCommonState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(commonState.getBlazeFlagsState().getRawFlags());
     assertThat(readCommonState.isNativeDebuggingEnabled())
         .isEqualTo(commonState.isNativeDebuggingEnabled());
 
@@ -195,7 +192,8 @@
 
     BlazeAndroidRunConfigurationCommonState commonState = state.getCommonState();
     BlazeAndroidRunConfigurationCommonState readCommonState = readState.getCommonState();
-    assertThat(readCommonState.getUserFlags()).isEqualTo(commonState.getUserFlags());
+    assertThat(readCommonState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(commonState.getBlazeFlagsState().getRawFlags());
     assertThat(readCommonState.isNativeDebuggingEnabled())
         .isEqualTo(commonState.isNativeDebuggingEnabled());
 
diff --git a/aswb/tests/integrationtests/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationStateTest.java b/aswb/tests/integrationtests/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationStateTest.java
index 1085d2b..4944264 100644
--- a/aswb/tests/integrationtests/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationStateTest.java
+++ b/aswb/tests/integrationtests/com/google/idea/blaze/android/run/test/BlazeAndroidTestRunConfigurationStateTest.java
@@ -18,7 +18,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
-import com.google.idea.blaze.android.AndroidIntegrationTestCleanupHelper;
 import com.google.idea.blaze.android.AndroidIntegrationTestSetupRule;
 import com.google.idea.blaze.android.cppapi.NdkSupport;
 import com.google.idea.blaze.android.run.BlazeAndroidRunConfigurationCommonState;
@@ -32,7 +31,6 @@
 import org.jdom.Element;
 import org.jdom.output.Format;
 import org.jdom.output.XMLOutputter;
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -59,15 +57,10 @@
     state = new BlazeAndroidTestRunConfigurationState(buildSystem().getName());
   }
 
-  @After
-  public final void doTeardown() {
-    AndroidIntegrationTestCleanupHelper.cleanUp(getProject());
-  }
-
   @Test
   public void readAndWriteShouldMatch() throws InvalidDataException, WriteExternalException {
     BlazeAndroidRunConfigurationCommonState commonState = state.getCommonState();
-    commonState.setUserFlags(ImmutableList.of("--flag1", "--flag2"));
+    commonState.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
     commonState.setNativeDebuggingEnabled(true);
 
     state.setTestingType(BlazeAndroidTestRunConfigurationState.TEST_METHOD);
@@ -85,7 +78,9 @@
     readState.readExternal(element);
 
     BlazeAndroidRunConfigurationCommonState readCommonState = readState.getCommonState();
-    assertThat(readCommonState.getUserFlags()).containsExactly("--flag1", "--flag2").inOrder();
+    assertThat(readCommonState.getBlazeFlagsState().getRawFlags())
+        .containsExactly("--flag1", "--flag2")
+        .inOrder();
     assertThat(readCommonState.isNativeDebuggingEnabled()).isTrue();
 
     assertThat(readState.getTestingType())
@@ -108,7 +103,8 @@
 
     BlazeAndroidRunConfigurationCommonState commonState = state.getCommonState();
     BlazeAndroidRunConfigurationCommonState readCommonState = readState.getCommonState();
-    assertThat(readCommonState.getUserFlags()).isEqualTo(commonState.getUserFlags());
+    assertThat(readCommonState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(commonState.getBlazeFlagsState().getRawFlags());
     assertThat(readCommonState.isNativeDebuggingEnabled())
         .isEqualTo(commonState.isNativeDebuggingEnabled());
 
@@ -127,7 +123,7 @@
     final XMLOutputter xmlOutputter = new XMLOutputter(Format.getCompactFormat());
 
     BlazeAndroidRunConfigurationCommonState commonState = state.getCommonState();
-    commonState.setUserFlags(ImmutableList.of("--flag1", "--flag2"));
+    commonState.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
     commonState.setNativeDebuggingEnabled(true);
 
     state.setTestingType(BlazeAndroidTestRunConfigurationState.TEST_METHOD);
@@ -152,7 +148,7 @@
     RunConfigurationStateEditor editor = state.getEditor(getProject());
 
     BlazeAndroidRunConfigurationCommonState commonState = state.getCommonState();
-    commonState.setUserFlags(ImmutableList.of("--flag1", "--flag2"));
+    commonState.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
     commonState.setNativeDebuggingEnabled(true);
 
     state.setTestingType(BlazeAndroidTestRunConfigurationState.TEST_METHOD);
@@ -170,7 +166,8 @@
     editor.applyEditorTo(readState);
 
     BlazeAndroidRunConfigurationCommonState readCommonState = readState.getCommonState();
-    assertThat(readCommonState.getUserFlags()).isEqualTo(commonState.getUserFlags());
+    assertThat(readCommonState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(commonState.getBlazeFlagsState().getRawFlags());
     assertThat(readCommonState.isNativeDebuggingEnabled())
         .isEqualTo(commonState.isNativeDebuggingEnabled());
 
@@ -196,7 +193,8 @@
 
     BlazeAndroidRunConfigurationCommonState commonState = state.getCommonState();
     BlazeAndroidRunConfigurationCommonState readCommonState = readState.getCommonState();
-    assertThat(readCommonState.getUserFlags()).isEqualTo(commonState.getUserFlags());
+    assertThat(readCommonState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(commonState.getBlazeFlagsState().getRawFlags());
     assertThat(readCommonState.isNativeDebuggingEnabled())
         .isEqualTo(commonState.isNativeDebuggingEnabled());
 
diff --git a/aswb/tests/integrationtests/com/google/idea/blaze/android/run/test/smrunner/BlazeAndroidTestEventsHandlerTest.java b/aswb/tests/integrationtests/com/google/idea/blaze/android/run/test/smrunner/BlazeAndroidTestEventsHandlerTest.java
index 2a4bf02..e888374 100644
--- a/aswb/tests/integrationtests/com/google/idea/blaze/android/run/test/smrunner/BlazeAndroidTestEventsHandlerTest.java
+++ b/aswb/tests/integrationtests/com/google/idea/blaze/android/run/test/smrunner/BlazeAndroidTestEventsHandlerTest.java
@@ -18,7 +18,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.Iterables;
-import com.google.idea.blaze.android.AndroidIntegrationTestCleanupHelper;
 import com.google.idea.blaze.android.AndroidIntegrationTestSetupRule;
 import com.google.idea.blaze.base.BlazeIntegrationTestCase;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
@@ -30,7 +29,6 @@
 import com.intellij.psi.PsiMethod;
 import com.intellij.psi.search.GlobalSearchScope;
 import javax.annotation.Nullable;
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -63,11 +61,6 @@
         "public class JUnit4 {}");
   }
 
-  @After
-  public final void doTeardown() {
-    AndroidIntegrationTestCleanupHelper.cleanUp(getProject());
-  }
-
   @Test
   public void testSuiteLocationResolves() {
     PsiFile javaFile =
diff --git a/aswb/tests/integrationtests/com/google/idea/blaze/android/sync/AndroidSyncTest.java b/aswb/tests/integrationtests/com/google/idea/blaze/android/sync/AndroidSyncTest.java
index 6e5a68d..a712648 100644
--- a/aswb/tests/integrationtests/com/google/idea/blaze/android/sync/AndroidSyncTest.java
+++ b/aswb/tests/integrationtests/com/google/idea/blaze/android/sync/AndroidSyncTest.java
@@ -20,15 +20,19 @@
 import static org.mockito.Mockito.when;
 
 import com.google.common.collect.ImmutableList;
-import com.google.idea.blaze.android.AndroidIntegrationTestCleanupHelper;
 import com.google.idea.blaze.android.AndroidIntegrationTestSetupRule;
 import com.google.idea.blaze.android.sdk.BlazeSdkProvider;
 import com.google.idea.blaze.android.sdk.MockBlazeSdkProvider;
 import com.google.idea.blaze.base.ideinfo.AndroidIdeInfo;
+import com.google.idea.blaze.base.ideinfo.CIdeInfo;
+import com.google.idea.blaze.base.ideinfo.CToolchainIdeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.ideinfo.TargetMapBuilder;
 import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
+import com.google.idea.blaze.base.model.primitives.Kind;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
 import com.google.idea.blaze.base.sync.BlazeSyncIntegrationTestCase;
@@ -36,13 +40,22 @@
 import com.google.idea.blaze.base.sync.BlazeSyncParams.SyncMode;
 import com.google.idea.blaze.base.sync.data.BlazeDataStorage;
 import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.sync.projectstructure.ModuleFinder;
+import com.google.idea.blaze.cpp.BlazeCWorkspace;
+import com.google.idea.blaze.java.sync.BlazeJavaSyncAugmenter;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.openapi.projectRoots.SdkTypeId;
 import com.intellij.openapi.roots.ContentEntry;
 import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.cidr.lang.OCLanguageKind;
+import com.jetbrains.cidr.lang.workspace.OCResolveConfiguration;
+import com.jetbrains.cidr.lang.workspace.OCWorkspace;
+import com.jetbrains.cidr.lang.workspace.OCWorkspaceManager;
+import com.jetbrains.cidr.lang.workspace.compiler.OCCompilerSettings;
+import java.util.Arrays;
+import java.util.List;
 import org.jetbrains.android.facet.AndroidFacet;
-import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -60,11 +73,7 @@
   @Before
   public void setup() {
     mockSdk("android-25", "Android 25 SDK");
-  }
-
-  @After
-  public final void doTeardown() {
-    AndroidIntegrationTestCleanupHelper.cleanUp(getProject());
+    registerProjectService(OCWorkspaceManager.class, new MockOCWorkspaceManager());
   }
 
   private void mockSdk(String targetHash, String sdkName) {
@@ -78,6 +87,14 @@
   }
 
   @Test
+  public void testAndroidSyncAugmenterPresent() {
+    assertThat(
+            Arrays.stream(BlazeJavaSyncAugmenter.EP_NAME.getExtensions())
+                .anyMatch(e -> e instanceof BlazeAndroidJavaSyncAugmenter))
+        .isTrue();
+  }
+
+  @Test
   public void testSimpleSync() throws Exception {
     setProjectView(
         "directories:",
@@ -109,6 +126,7 @@
                         AndroidIdeInfo.builder()
                             .setManifestFile(sourceRoot("java/com/google/AndroidManifest.xml"))
                             .addResource(sourceRoot("java/com/google/res/values/strings.xml"))
+                            .setResourceJavaPackage("com.google")
                             .setGenerateResourceClass(true))
                     .addSource(sourceRoot("java/com/google/Source.java"))
                     .addSource(sourceRoot("java/com/google/Other.java")))
@@ -136,13 +154,245 @@
     assertThat(findContentEntry(javaRoot).getSourceFolders()).hasLength(1);
 
     // Check that the workspace is set to android
-    Module workspaceModule = getModuleCreatedDuringSync(BlazeDataStorage.WORKSPACE_MODULE_NAME);
+    Module workspaceModule =
+        ModuleFinder.getInstance(getProject())
+            .findModuleByName(BlazeDataStorage.WORKSPACE_MODULE_NAME);
     assertThat(workspaceModule).isNotNull();
     assertThat(AndroidFacet.getInstance(workspaceModule)).isNotNull();
 
     // Check that a resource module was created
-    Module resourceModule = getModuleCreatedDuringSync("java.com.google.lib");
+    Module resourceModule =
+        ModuleFinder.getInstance(getProject()).findModuleByName("java.com.google.lib");
     assertThat(resourceModule).isNotNull();
     assertThat(AndroidFacet.getInstance(resourceModule)).isNotNull();
   }
+
+  @Test
+  public void testMultipleToolchainsNoIssue() {
+    // Test what happens if there are multiple toolchains in the target map
+    // (e.g., from --fat_apk_cpu)
+    setProjectView(
+        "directories:",
+        "  java/com/google",
+        "targets:",
+        "  //java/com/google:app",
+        "additional_languages:",
+        "  c",
+        "android_sdk_platform: android-25");
+    workspace.createDirectory(new WorkspacePath("java/com/google"));
+    workspace.createFile(
+        new WorkspacePath("java/com/google/Source.java"),
+        "package com.google;",
+        "public class Source {}");
+
+    workspace.createFile(
+        new WorkspacePath("java/com/google/Other.java"),
+        "package com.google;",
+        "public class Other {}");
+
+    workspace.createFile(new WorkspacePath("java/com/google/jni/native.cc"), "void foo() {}");
+    workspace.createFile(new WorkspacePath("java/com/google/jni/native2.cc"), "void bar() {}");
+
+    TargetMap targetMap =
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setBuildFile(sourceRoot("android_ndk_linux/toolchains/BUILD"))
+                    .setLabel("//android_ndk_linux/toolchains:armv7a")
+                    .setKind(Kind.CC_TOOLCHAIN)
+                    .setCToolchainInfo(
+                        CToolchainIdeInfo.builder()
+                            .setTargetName("arm-linux-androideabi")
+                            .setCppExecutable(
+                                new ExecutionRootPath("bin/arm-linux-androideabi-gcc"))
+                            .setPreprocessorExecutable(
+                                new ExecutionRootPath("bin/arm-linux-androideabi-cpp"))
+                            .addBaseCompilerOptions(
+                                ImmutableList.of(
+                                    "-DOS_ANDROID",
+                                    "-mbionic",
+                                    "-ffunction-sections",
+                                    "-march=armv7-a",
+                                    "-mfpu=vfpv3-d16"))
+                            .addCppCompilerOptions(ImmutableList.of("-std=gnu++11"))
+                            .addBuiltInIncludeDirectories(
+                                ImmutableList.of(
+                                    new ExecutionRootPath(
+                                        "lib/gcc/arm-linux-androideabi/4.8/include")))
+                            .addLinkOptions(
+                                ImmutableList.of(
+                                    "--sysroot=android_ndk_linux/platforms/android-18/arch-arm"))
+                            .addUnfilteredCompilerOptions(
+                                ImmutableList.of(
+                                    "--sysroot=android_ndk_linux/platforms/android-18/arch-arm"))
+                            .addUnfilteredToolchainSystemIncludes(
+                                ImmutableList.of(
+                                    new ExecutionRootPath(
+                                        "android_ndk_linux/sources/llvm-libc++/libcxx/include")))))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setBuildFile(sourceRoot("android_ndk_linux/toolchains/BUILD"))
+                    .setLabel("//android_ndk_linux/toolchains:aarch64")
+                    .setKind(Kind.CC_TOOLCHAIN)
+                    .setCToolchainInfo(
+                        CToolchainIdeInfo.builder()
+                            .setTargetName("aarch64-linux-android")
+                            .setCppExecutable(
+                                new ExecutionRootPath("prebuilt/bin/aarch64-linux-android-gcc"))
+                            .setPreprocessorExecutable(
+                                new ExecutionRootPath("prebuilt/bin/aarch64-linux-android-cpp"))
+                            .addBaseCompilerOptions(
+                                ImmutableList.of("-DOS_ANDROID", "-mbionic", "-ffunction-sections"))
+                            .addCppCompilerOptions(ImmutableList.of("-std=gnu++11"))
+                            .addBuiltInIncludeDirectories(
+                                ImmutableList.of(
+                                    new ExecutionRootPath(
+                                        "lib/gcc/aarch64-linux-android/4.9/include")))
+                            .addLinkOptions(
+                                ImmutableList.of(
+                                    "--sysroot=android_ndk_linux/platforms/android-21/arch-arm64"))
+                            .addUnfilteredCompilerOptions(
+                                ImmutableList.of(
+                                    "--sysroot=android_ndk_linux/platforms/android-21/arch-arm64"))
+                            .addUnfilteredToolchainSystemIncludes(
+                                ImmutableList.of(
+                                    new ExecutionRootPath(
+                                        "android_ndk_linux/sources/llvm-libc++/libcxx/include")))))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setBuildFile(sourceRoot("java/com/google/BUILD"))
+                    .setLabel("//java/com/google:lib")
+                    .setKind("android_library")
+                    .setAndroidInfo(
+                        AndroidIdeInfo.builder()
+                            .setManifestFile(sourceRoot("java/com/google/AndroidManifest.xml"))
+                            .addResource(sourceRoot("java/com/google/res/values/strings.xml"))
+                            .setResourceJavaPackage("com.google")
+                            .setGenerateResourceClass(true))
+                    .addSource(sourceRoot("java/com/google/Other.java")))
+            // Technically, blaze returns multiple instances of native libs (one for each CPU from
+            // fat APK). However, we just pick the first instance we run into for the target map.
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setBuildFile(sourceRoot("java/com/google/BUILD"))
+                    .setLabel("//java/com/google:native_lib")
+                    .setKind("cc_library")
+                    .setCInfo(
+                        CIdeInfo.builder()
+                            .addTransitiveQuoteIncludeDirectories(
+                                ImmutableList.of(
+                                    new ExecutionRootPath("."),
+                                    new ExecutionRootPath("blaze-out/android-aarch64-etc/genfiles"),
+                                    new ExecutionRootPath(
+                                        "blaze-out/android-aarch64-etc/genfiles/third_party/java")))
+                            .addTransitiveSystemIncludeDirectories(
+                                ImmutableList.of(
+                                    new ExecutionRootPath("third_party/stl/gcc3"),
+                                    new ExecutionRootPath("third_party/java/jdk/include"))))
+                    .addSource(sourceRoot("java/com/google/jni/native.cc"))
+                    .addDependency("//android_ndk_linux/toolchains:aarch64"))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setBuildFile(sourceRoot("java/com/google/BUILD"))
+                    .setLabel("//java/com/google:native_lib2")
+                    .setKind("cc_library")
+                    .setCInfo(
+                        CIdeInfo.builder()
+                            .addTransitiveQuoteIncludeDirectories(
+                                ImmutableList.of(
+                                    new ExecutionRootPath("."),
+                                    new ExecutionRootPath("blaze-out/android-aarch64-etc/genfiles"),
+                                    new ExecutionRootPath(
+                                        "blaze-out/android-aarch64-etc/genfiles/third_party/java")))
+                            .addTransitiveSystemIncludeDirectories(
+                                ImmutableList.of(
+                                    new ExecutionRootPath("third_party/stl/gcc3"),
+                                    new ExecutionRootPath("third_party/java/jdk/include"))))
+                    .addSource(sourceRoot("java/com/google/jni/native2.cc"))
+                    .addDependency("//java/com/google:native_lib")
+                    .addDependency("//android_ndk_linux/toolchains:armv7a"))
+            // Other targets like android_binary and android_test might also depend on
+            // a cc_toolchain.
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setBuildFile(sourceRoot("java/com/google/BUILD"))
+                    .setLabel("//java/com/google:app")
+                    .setKind("android_binary")
+                    .setAndroidInfo(
+                        AndroidIdeInfo.builder()
+                            .setManifestFile(sourceRoot("java/com/google/AndroidManifest.xml"))
+                            .setResourceJavaPackage("com.google")
+                            .setGenerateResourceClass(true))
+                    .addSource(sourceRoot("java/com/google/Source.java"))
+                    .addDependency("//tools/jdk:toolchain")
+                    .addDependency("//android_ndk_linux/toolchains:armv7a")
+                    .addDependency("//java/com/google:lib")
+                    .addDependency("//java/com/google:native_lib")
+                    .addDependency("//java/com/google:native_lib2"))
+            .build();
+
+    setTargetMap(targetMap);
+
+    runBlazeSync(
+        new BlazeSyncParams.Builder("Sync", SyncMode.INCREMENTAL)
+            .addProjectViewTargets(true)
+            .build());
+
+    errorCollector.assertNoIssues();
+
+    BlazeProjectData blazeProjectData =
+        BlazeProjectDataManager.getInstance(getProject()).getBlazeProjectData();
+    assertThat(blazeProjectData).isNotNull();
+    assertThat(blazeProjectData.targetMap).isEqualTo(targetMap);
+    assertThat(blazeProjectData.workspaceLanguageSettings.getWorkspaceType())
+        .isEqualTo(WorkspaceType.ANDROID);
+    assertThat(blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.C))
+        .isTrue();
+
+    // Check that the workspace is set to android
+    Module workspaceModule =
+        ModuleFinder.getInstance(getProject())
+            .findModuleByName(BlazeDataStorage.WORKSPACE_MODULE_NAME);
+    assertThat(workspaceModule).isNotNull();
+    assertThat(AndroidFacet.getInstance(workspaceModule)).isNotNull();
+
+    // Check resolve configurations for the native code match the toolchain that was in
+    // the library's deps (not switched for some reason).
+    VirtualFile nativeCc =
+        fileSystem.findFile(
+            workspaceRoot
+                .fileForPath(new WorkspacePath("java/com/google/jni/native.cc"))
+                .getPath());
+    VirtualFile nativeCc2 =
+        fileSystem.findFile(
+            workspaceRoot
+                .fileForPath(new WorkspacePath("java/com/google/jni/native2.cc"))
+                .getPath());
+
+    List<? extends OCResolveConfiguration> resolveConfigurations =
+        OCWorkspaceManager.getWorkspace(getProject()).getConfigurationsForFile(nativeCc);
+    assertThat(resolveConfigurations).hasSize(1);
+    OCCompilerSettings compilerSettings = resolveConfigurations.get(0).getCompilerSettings();
+    List<String> compilerSwitches =
+        compilerSettings.getCompilerSwitches(OCLanguageKind.CPP, nativeCc).getCommandLineArgs();
+    assertThat(compilerSwitches)
+        .contains("--sysroot=android_ndk_linux/platforms/android-21/arch-arm64");
+
+    resolveConfigurations =
+        OCWorkspaceManager.getWorkspace(getProject()).getConfigurationsForFile(nativeCc2);
+    assertThat(resolveConfigurations).hasSize(1);
+    compilerSettings = resolveConfigurations.get(0).getCompilerSettings();
+    compilerSwitches =
+        compilerSettings.getCompilerSwitches(OCLanguageKind.CPP, nativeCc).getCommandLineArgs();
+    assertThat(compilerSwitches)
+        .contains("--sysroot=android_ndk_linux/platforms/android-18/arch-arm");
+  }
+
+  private class MockOCWorkspaceManager extends OCWorkspaceManager {
+
+    @Override
+    public OCWorkspace getWorkspace() {
+      return BlazeCWorkspace.getInstance(getProject());
+    }
+  }
 }
diff --git a/aswb/2.3/tests/integrationtests/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProviderIntegrationTest.java b/aswb/tests/integrationtests/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProviderIntegrationTest.java
similarity index 94%
rename from aswb/2.3/tests/integrationtests/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProviderIntegrationTest.java
rename to aswb/tests/integrationtests/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProviderIntegrationTest.java
index 0be0dc0..e784f6a 100644
--- a/aswb/2.3/tests/integrationtests/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProviderIntegrationTest.java
+++ b/aswb/tests/integrationtests/com/google/idea/blaze/android/sync/model/idea/BlazeClassJarProviderIntegrationTest.java
@@ -283,20 +283,21 @@
   }
 
   private TargetMap buildTargetMap() {
-    Label mainResourceLibrary = new Label("//com/google/example:main");
-    Label androidLibraryDependency = new Label("//com/google/example:android_lib");
-    Label androidResourceDependency = new Label("//com/google/example:android_res");
-    Label androidResourceDependency2 = new Label("//com/google/example:android_res2");
-    Label transitiveResourceDependency = new Label("//com/google/example/transitive:android_res");
-    Label javaDependency = new Label("//com/google/example:java");
-    Label transitiveJavaDependency = new Label("//com/google/example/transitive:java");
-    Label sharedJavaDependency = new Label("//com/google/example/shared:java");
-    Label sharedJavaDependency2 = new Label("//com/google/example/shared2:java");
-    Label importDependency = new Label("//com/google/example:import");
-    Label transitiveImportDependency = new Label("//com/google/example/transitive:import");
-    Label unrelatedJava = new Label("//com/google/unrelated:java");
-    Label unrelatedAndroidLibrary = new Label("//com/google/unrelated:android_lib");
-    Label unrelatedAndroidResource = new Label("//com/google/unrelated:android_res");
+    Label mainResourceLibrary = Label.create("//com/google/example:main");
+    Label androidLibraryDependency = Label.create("//com/google/example:android_lib");
+    Label androidResourceDependency = Label.create("//com/google/example:android_res");
+    Label androidResourceDependency2 = Label.create("//com/google/example:android_res2");
+    Label transitiveResourceDependency =
+        Label.create("//com/google/example/transitive:android_res");
+    Label javaDependency = Label.create("//com/google/example:java");
+    Label transitiveJavaDependency = Label.create("//com/google/example/transitive:java");
+    Label sharedJavaDependency = Label.create("//com/google/example/shared:java");
+    Label sharedJavaDependency2 = Label.create("//com/google/example/shared2:java");
+    Label importDependency = Label.create("//com/google/example:import");
+    Label transitiveImportDependency = Label.create("//com/google/example/transitive:import");
+    Label unrelatedJava = Label.create("//com/google/unrelated:java");
+    Label unrelatedAndroidLibrary = Label.create("//com/google/unrelated:android_lib");
+    Label unrelatedAndroidResource = Label.create("//com/google/unrelated:android_res");
 
     AndroidResourceModuleRegistry registry = new AndroidResourceModuleRegistry();
     registry.put(
diff --git a/aswb/2.3/tests/unittests/com/google/idea/blaze/android/project/BlazeBuildSystemServiceTest.java b/aswb/tests/unittests/com/google/idea/blaze/android/project/BlazeBuildSystemServiceTest.java
similarity index 96%
rename from aswb/2.3/tests/unittests/com/google/idea/blaze/android/project/BlazeBuildSystemServiceTest.java
rename to aswb/tests/unittests/com/google/idea/blaze/android/project/BlazeBuildSystemServiceTest.java
index ce41514..283773a 100755
--- a/aswb/2.3/tests/unittests/com/google/idea/blaze/android/project/BlazeBuildSystemServiceTest.java
+++ b/aswb/tests/unittests/com/google/idea/blaze/android/project/BlazeBuildSystemServiceTest.java
@@ -122,7 +122,7 @@
     PsiFile psiFile = mock(PsiFile.class);
 
     BuildReferenceManager buildReferenceManager = BuildReferenceManager.getInstance(project);
-    when(buildReferenceManager.resolveLabel(new Label("//foo:bar"))).thenReturn(buildTargetPsi);
+    when(buildReferenceManager.resolveLabel(Label.create("//foo:bar"))).thenReturn(buildTargetPsi);
     when(buildTargetPsi.getContainingFile()).thenReturn(psiFile);
     when(buildTargetPsi.getTextOffset()).thenReturn(1337);
 
@@ -149,7 +149,7 @@
   @Test
   public void testAddDependencyWithoutBuildTargetPsi() throws Exception {
     // Can't find PSI for the target.
-    when(BuildReferenceManager.getInstance(project).resolveLabel(new Label("//foo:bar")))
+    when(BuildReferenceManager.getInstance(project).resolveLabel(Label.create("//foo:bar")))
         .thenReturn(null);
 
     VirtualFile buildFile =
@@ -167,7 +167,7 @@
   private void mockBlazeImportSettings(Container projectServices) {
     BlazeImportSettingsManager importSettingsManager = new BlazeImportSettingsManager();
     importSettingsManager.setImportSettings(
-        new BlazeImportSettings("", "", "", "", "", Blaze.BuildSystem.Blaze));
+        new BlazeImportSettings("", "", "", "", Blaze.BuildSystem.Blaze));
     projectServices.register(BlazeImportSettingsManager.class, importSettingsManager);
   }
 
@@ -195,7 +195,7 @@
     AndroidResourceModuleRegistry moduleRegistry = new AndroidResourceModuleRegistry();
     moduleRegistry.put(
         module,
-        AndroidResourceModule.builder(TargetKey.forPlainTarget(new Label("//foo:bar"))).build());
+        AndroidResourceModule.builder(TargetKey.forPlainTarget(Label.create("//foo:bar"))).build());
     projectServices.register(AndroidResourceModuleRegistry.class, moduleRegistry);
   }
 
@@ -204,7 +204,7 @@
         TargetMapBuilder.builder()
             .addTarget(
                 TargetIdeInfo.builder()
-                    .setLabel(new Label("//foo:bar"))
+                    .setLabel(Label.create("//foo:bar"))
                     .setBuildFile(ArtifactLocation.builder().setRelativePath("foo/BUILD").build())
                     .build())
             .build();
diff --git a/aswb/2.3/tests/unittests/com/google/idea/blaze/android/project/BlazeFeatureEnabledServiceTest.java b/aswb/tests/unittests/com/google/idea/blaze/android/project/BlazeFeatureEnabledServiceTest.java
similarity index 98%
rename from aswb/2.3/tests/unittests/com/google/idea/blaze/android/project/BlazeFeatureEnabledServiceTest.java
rename to aswb/tests/unittests/com/google/idea/blaze/android/project/BlazeFeatureEnabledServiceTest.java
index 8c9ccc7..18e44ee 100644
--- a/aswb/2.3/tests/unittests/com/google/idea/blaze/android/project/BlazeFeatureEnabledServiceTest.java
+++ b/aswb/tests/unittests/com/google/idea/blaze/android/project/BlazeFeatureEnabledServiceTest.java
@@ -61,7 +61,7 @@
 
     BlazeImportSettingsManager importSettingsManager = new BlazeImportSettingsManager();
     importSettingsManager.setImportSettings(
-        new BlazeImportSettings(null, null, null, null, null, BuildSystem.Blaze));
+        new BlazeImportSettings("", "", "", "", BuildSystem.Blaze));
     projectServices.register(BlazeImportSettingsManager.class, importSettingsManager);
 
     registerExtensionPoint(
diff --git a/aswb/2.3/tests/unittests/com/google/idea/blaze/android/rendering/BlazeRenderErrorContributorTest.java b/aswb/tests/unittests/com/google/idea/blaze/android/rendering/BlazeRenderErrorContributorTest.java
similarity index 94%
rename from aswb/2.3/tests/unittests/com/google/idea/blaze/android/rendering/BlazeRenderErrorContributorTest.java
rename to aswb/tests/unittests/com/google/idea/blaze/android/rendering/BlazeRenderErrorContributorTest.java
index ee48a99..2b49d8c 100644
--- a/aswb/2.3/tests/unittests/com/google/idea/blaze/android/rendering/BlazeRenderErrorContributorTest.java
+++ b/aswb/tests/unittests/com/google/idea/blaze/android/rendering/BlazeRenderErrorContributorTest.java
@@ -103,7 +103,7 @@
         AndroidResourceModuleRegistry.class, new AndroidResourceModuleRegistry());
 
     BlazeImportSettingsManager importSettingsManager = new BlazeImportSettingsManager();
-    BlazeImportSettings settings = new BlazeImportSettings("", "", "", "", "", BuildSystem.Blaze);
+    BlazeImportSettings settings = new BlazeImportSettings("", "", "", "", BuildSystem.Blaze);
     importSettingsManager.setImportSettings(settings);
     projectServices.register(BlazeImportSettingsManager.class, importSettingsManager);
 
@@ -342,14 +342,14 @@
   }
 
   private void createTargetMapWithGeneratedResources() {
-    Label mainResourcesTarget = new Label("//com/google/example:main");
-    Label dependencyGeneratedResourceTarget = new Label("//com/google/example:generated");
-    Label dependencySourceResourceTarget = new Label("//com/google/example:source");
+    Label mainResourcesTarget = Label.create("//com/google/example:main");
+    Label dependencyGeneratedResourceTarget = Label.create("//com/google/example:generated");
+    Label dependencySourceResourceTarget = Label.create("//com/google/example:source");
     Label transitiveGeneratedResourcesTarget =
-        new Label("//com/google/example/transitive:generated");
-    Label transitiveSourceResourceTarget = new Label("//com/google/example/transitive:source");
-    Label unrelatedGeneratedResourceTarget = new Label("//com/google/unrelated:generated");
-    Label unrelatedSourceResourceTarget = new Label("//com/google/unrelated:source");
+        Label.create("//com/google/example/transitive:generated");
+    Label transitiveSourceResourceTarget = Label.create("//com/google/example/transitive:source");
+    Label unrelatedGeneratedResourceTarget = Label.create("//com/google/unrelated:generated");
+    Label unrelatedSourceResourceTarget = Label.create("//com/google/unrelated:source");
 
     ArtifactLocation mainGeneratedResource =
         artifact("com/google/example/main/generated/res", false);
@@ -497,7 +497,7 @@
   }
 
   private void createTargetMapWithNonStandardAndroidManifestName() {
-    Label mainResourceTarget = new Label("//com/google/example:main");
+    Label mainResourceTarget = Label.create("//com/google/example:main");
 
     ArtifactLocation mainManifest = artifact("com/google/example/main/WeirdManifest.xml", true);
     ArtifactLocation mainResource = artifact("com/google/example/main/res", true);
@@ -527,8 +527,8 @@
   }
 
   private void createTargetMapWithNonStandardAndroidManifestNameInDependency() {
-    Label mainResourceTarget = new Label("//com/google/example:main");
-    Label dependencyResourceTarget = new Label("//com/google/example:dependency");
+    Label mainResourceTarget = Label.create("//com/google/example:main");
+    Label dependencyResourceTarget = Label.create("//com/google/example:dependency");
 
     ArtifactLocation mainManifest = artifact("com/google/example/main/AndroidManifest.xml", true);
     ArtifactLocation mainResource = artifact("com/google/example/main/res", true);
@@ -579,11 +579,11 @@
   }
 
   private void createTargetMapWithMissingClassDependency() {
-    Label parentTarget = new Label("//com/google/example:app");
-    Label independentLibraryTarget = new Label("//com/google/example/independent:library");
-    Label independentLibrary2Target = new Label("//com/google/example/independent:library2");
-    Label dependentLibraryTarget = new Label("//com/google/example/dependent:library");
-    Label resourcesTarget = new Label("//com/google/example:resources");
+    Label parentTarget = Label.create("//com/google/example:app");
+    Label independentLibraryTarget = Label.create("//com/google/example/independent:library");
+    Label independentLibrary2Target = Label.create("//com/google/example/independent:library2");
+    Label dependentLibraryTarget = Label.create("//com/google/example/dependent:library");
+    Label resourcesTarget = Label.create("//com/google/example:resources");
 
     ArtifactLocation manifest = artifact("com/google/example/AndroidManifest.xml", true);
     ArtifactLocation resources = artifact("com/google/example/res", true);
@@ -664,15 +664,15 @@
     ImmutableMap<File, TargetKey> sourceToTarget =
         ImmutableMap.of(
             VfsUtilCore.virtualToIoFile(independentLibraryView),
-            TargetKey.forPlainTarget(new Label("//com/google/example/independent:library")),
+            TargetKey.forPlainTarget(Label.create("//com/google/example/independent:library")),
             VfsUtilCore.virtualToIoFile(independentLibraryView2),
-            TargetKey.forPlainTarget(new Label("//com/google/example/independent:library")),
+            TargetKey.forPlainTarget(Label.create("//com/google/example/independent:library")),
             VfsUtilCore.virtualToIoFile(independentLibrary2View),
-            TargetKey.forPlainTarget(new Label("//com/google/example/independent:library2")),
+            TargetKey.forPlainTarget(Label.create("//com/google/example/independent:library2")),
             VfsUtilCore.virtualToIoFile(dependentLibraryView),
-            TargetKey.forPlainTarget(new Label("//com/google/example/dependent:library")),
+            TargetKey.forPlainTarget(Label.create("//com/google/example/dependent:library")),
             VfsUtilCore.virtualToIoFile(resourceView),
-            TargetKey.forPlainTarget(new Label("//com/google/example:resources")));
+            TargetKey.forPlainTarget(Label.create("//com/google/example:resources")));
 
     projectServices.register(
         JavaPsiFacade.class, new MockJavaPsiFacade(project, psiManager, classes));
diff --git a/aswb/2.3/tests/unittests/com/google/idea/blaze/android/run/testrecorder/BlazeConfigurationsTest.java b/aswb/tests/unittests/com/google/idea/blaze/android/run/testrecorder/BlazeConfigurationsTest.java
similarity index 92%
rename from aswb/2.3/tests/unittests/com/google/idea/blaze/android/run/testrecorder/BlazeConfigurationsTest.java
rename to aswb/tests/unittests/com/google/idea/blaze/android/run/testrecorder/BlazeConfigurationsTest.java
index e5a828d..b48fe02 100644
--- a/aswb/2.3/tests/unittests/com/google/idea/blaze/android/run/testrecorder/BlazeConfigurationsTest.java
+++ b/aswb/tests/unittests/com/google/idea/blaze/android/run/testrecorder/BlazeConfigurationsTest.java
@@ -23,7 +23,6 @@
 import com.android.tools.idea.run.editor.ShowChooserTargetProvider;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
 import com.google.gct.testrecorder.run.TestRecorderRunConfigurationProxy;
 import com.google.gct.testrecorder.run.TestRecorderRunConfigurationProxyProvider;
 import com.google.gct.testrecorder.ui.TestRecorderAction;
@@ -33,6 +32,7 @@
 import com.google.idea.blaze.base.BlazeTestCase;
 import com.google.idea.blaze.base.bazel.BuildSystemProvider;
 import com.google.idea.blaze.base.bazel.WorkspaceRootProvider;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
 import com.google.idea.blaze.base.lang.buildfile.language.semantics.RuleDefinition;
 import com.google.idea.blaze.base.model.BlazeVersionData;
@@ -151,7 +151,7 @@
         BlazeCommandRunConfigurationType.getInstance()
             .getFactory()
             .createTemplateConfiguration(project);
-    blazeConfiguration.setTarget(new Label("//label:android_binary_rule"));
+    blazeConfiguration.setTarget(Label.create("//label:android_binary_rule"));
     BlazeAndroidBinaryRunConfigurationState configurationState =
         ((BlazeAndroidBinaryRunConfigurationHandler) blazeConfiguration.getHandler()).getState();
     configurationState.setMode(BlazeAndroidBinaryRunConfigurationState.LAUNCH_SPECIFIC_ACTIVITY);
@@ -166,7 +166,7 @@
   private void mockBlazeImportSettings(Container projectServices) {
     BlazeImportSettingsManager importSettingsManager = new BlazeImportSettingsManager();
     importSettingsManager.setImportSettings(
-        new BlazeImportSettings("", "", "", "", "", Blaze.BuildSystem.Blaze));
+        new BlazeImportSettings("", "", "", "", Blaze.BuildSystem.Blaze));
     projectServices.register(BlazeImportSettingsManager.class, importSettingsManager);
   }
 
@@ -178,12 +178,12 @@
     BlazeCommandRunConfiguration blazeAndroidBinaryConfiguration =
         configurationFactory.createTemplateConfiguration(project);
     blazeAndroidBinaryConfiguration.setName("AndroidBinaryConfiguration");
-    blazeAndroidBinaryConfiguration.setTarget(new Label("//label:android_binary_rule"));
+    blazeAndroidBinaryConfiguration.setTarget(Label.create("//label:android_binary_rule"));
 
     BlazeCommandRunConfiguration blazeAndroidTestConfiguration =
         configurationFactory.createTemplateConfiguration(project);
     blazeAndroidTestConfiguration.setName("AndroidTestConfiguration");
-    blazeAndroidTestConfiguration.setTarget(new Label("//label:android_test_rule"));
+    blazeAndroidTestConfiguration.setTarget(Label.create("//label:android_test_rule"));
 
     runManager.addConfiguration(
         runManager.createConfiguration(blazeAndroidBinaryConfiguration, configurationFactory),
@@ -192,7 +192,7 @@
         runManager.createConfiguration(blazeAndroidTestConfiguration, configurationFactory), true);
   }
 
-  private class MockTargetFinder extends TargetFinder {
+  private static class MockTargetFinder extends TargetFinder {
     @Override
     public List<TargetIdeInfo> findTargets(Project project, Predicate<TargetIdeInfo> predicate) {
       return null;
@@ -201,9 +201,9 @@
     @Override
     public TargetIdeInfo targetForLabel(Project project, final Label label) {
       TargetIdeInfo.Builder builder = TargetIdeInfo.builder().setLabel(label);
-      if (label.equals(new Label("//label:android_binary_rule"))) {
+      if (label.equals(Label.create("//label:android_binary_rule"))) {
         builder.setKind(Kind.ANDROID_BINARY);
-      } else if (label.equals(new Label("//label:android_test_rule"))) {
+      } else if (label.equals(Label.create("//label:android_test_rule"))) {
         builder.setKind(Kind.ANDROID_TEST);
       }
       return builder.build();
@@ -236,7 +236,7 @@
     @Override
     public Module getModule() {
       Label label = getLabel();
-      if (label != null && label.equals(new Label("//label:android_binary_rule"))) {
+      if (label != null && label.equals(Label.create("//label:android_binary_rule"))) {
         return mockModule;
       }
 
@@ -244,7 +244,7 @@
     }
   }
 
-  private class MockBuildSystemProvider implements BuildSystemProvider {
+  private static class MockBuildSystemProvider implements BuildSystemProvider {
     @Override
     public Blaze.BuildSystem buildSystem() {
       return Blaze.BuildSystem.Blaze;
@@ -271,6 +271,12 @@
       return null;
     }
 
+    @Nullable
+    @Override
+    public String getProjectViewDocumentationUrl() {
+      return null;
+    }
+
     @Override
     public boolean isBuildFile(String fileName) {
       return false;
@@ -283,7 +289,7 @@
     }
 
     @Override
-    public ImmutableList<FileNameMatcher> buildFileMatchers() {
+    public ImmutableList<FileNameMatcher> buildLanguageFileTypeMatchers() {
       return ImmutableList.of();
     }
 
@@ -291,7 +297,7 @@
     public void populateBlazeVersionData(
         BuildSystem buildSystem,
         WorkspaceRoot workspaceRoot,
-        ImmutableMap<String, String> blazeInfo,
+        BlazeInfo blazeInfo,
         BlazeVersionData.Builder builder) {}
   }
 }
diff --git a/aswb/tests/unittests/com/google/idea/blaze/android/sync/importer/BlazeAndroidWorkspaceImporterTest.java b/aswb/tests/unittests/com/google/idea/blaze/android/sync/importer/BlazeAndroidWorkspaceImporterTest.java
index 2301f3a..e720a87 100644
--- a/aswb/tests/unittests/com/google/idea/blaze/android/sync/importer/BlazeAndroidWorkspaceImporterTest.java
+++ b/aswb/tests/unittests/com/google/idea/blaze/android/sync/importer/BlazeAndroidWorkspaceImporterTest.java
@@ -81,7 +81,7 @@
           artifactLocation -> new File("/", artifactLocation.getRelativePath());
 
   private static final BlazeImportSettings DUMMY_IMPORT_SETTINGS =
-      new BlazeImportSettings("", "", "", "", "", BuildSystem.Blaze);
+      new BlazeImportSettings("", "", "", "", BuildSystem.Blaze);
 
   private BlazeContext context;
   private ErrorCollector errorCollector = new ErrorCollector();
@@ -220,7 +220,7 @@
     assertThat(result.androidResourceModules)
         .containsExactly(
             AndroidResourceModule.builder(
-                    TargetKey.forPlainTarget(new Label("//java/apps/example:example_debug")))
+                    TargetKey.forPlainTarget(Label.create("//java/apps/example:example_debug")))
                 .addResourceAndTransitiveResource(source("java/apps/example/res"))
                 .addTransitiveResource(source("java/apps/example/lib0/res"))
                 .addTransitiveResource(source("java/apps/example/lib1/res"))
@@ -230,7 +230,7 @@
                 .addTransitiveResourceDependency("//java/libraries/shared:shared")
                 .build(),
             AndroidResourceModule.builder(
-                    TargetKey.forPlainTarget(new Label("//java/apps/example/lib0:lib0")))
+                    TargetKey.forPlainTarget(Label.create("//java/apps/example/lib0:lib0")))
                 .addResourceAndTransitiveResource(source("java/apps/example/lib0/res"))
                 .addTransitiveResource(source("java/apps/example/lib1/res"))
                 .addTransitiveResource(source("java/libraries/shared/res"))
@@ -238,7 +238,7 @@
                 .addTransitiveResourceDependency("//java/libraries/shared:shared")
                 .build(),
             AndroidResourceModule.builder(
-                    TargetKey.forPlainTarget(new Label("//java/apps/example/lib1:lib1")))
+                    TargetKey.forPlainTarget(Label.create("//java/apps/example/lib1:lib1")))
                 .addResourceAndTransitiveResource(source("java/apps/example/lib1/res"))
                 .addTransitiveResource(source("java/libraries/shared/res"))
                 .addTransitiveResourceDependency("//java/libraries/shared:shared")
@@ -467,7 +467,7 @@
                     .setKind("android_library")
                     .setAndroidInfo(
                         AndroidIdeInfo.builder()
-                            .setLegacyResources(new Label("//java/example:resources"))
+                            .setLegacyResources(Label.create("//java/example:resources"))
                             .setManifestFile(source("java/example/AndroidManifest.xml"))
                             .addResource(source("java/example/res"))
                             .setGenerateResourceClass(true)
@@ -491,7 +491,7 @@
     assertThat(result.androidResourceModules)
         .containsExactly(
             AndroidResourceModule.builder(
-                    TargetKey.forPlainTarget(new Label("//java/example:resources")))
+                    TargetKey.forPlainTarget(Label.create("//java/example:resources")))
                 .addResourceAndTransitiveResource(source("java/example/res"))
                 .build());
   }
@@ -587,7 +587,8 @@
 
     assertThat(result.androidResourceModules)
         .containsExactly(
-            AndroidResourceModule.builder(TargetKey.forPlainTarget(new Label("//java/example:lib")))
+            AndroidResourceModule.builder(
+                    TargetKey.forPlainTarget(Label.create("//java/example:lib")))
                 .addResourceAndTransitiveResource(source("java/example/res"))
                 .build());
   }
@@ -653,7 +654,8 @@
     errorCollector.assertNoIssues();
     assertThat(result.androidResourceModules)
         .containsExactly(
-            AndroidResourceModule.builder(TargetKey.forPlainTarget(new Label("//java/example:lib")))
+            AndroidResourceModule.builder(
+                    TargetKey.forPlainTarget(Label.create("//java/example:lib")))
                 .addResourceAndTransitiveResource(source("java/example/res"))
                 .addResourceAndTransitiveResource(gen("java/example/res"))
                 .build());
@@ -758,7 +760,7 @@
     assertThat(result.androidResourceModules)
         .containsExactly(
             AndroidResourceModule.builder(
-                    TargetKey.forPlainTarget(new Label("//java/uninterestingdir:lib")))
+                    TargetKey.forPlainTarget(Label.create("//java/uninterestingdir:lib")))
                 .addResourceAndTransitiveResource(source("java/uninterestingdir/res"))
                 .build());
   }
diff --git a/aswb/tests/unittests/com/google/idea/blaze/android/sync/importer/model/idea/AndroidResourceModuleRegistryTest.java b/aswb/tests/unittests/com/google/idea/blaze/android/sync/importer/model/idea/AndroidResourceModuleRegistryTest.java
index 9a8e66c..f21c480 100644
--- a/aswb/tests/unittests/com/google/idea/blaze/android/sync/importer/model/idea/AndroidResourceModuleRegistryTest.java
+++ b/aswb/tests/unittests/com/google/idea/blaze/android/sync/importer/model/idea/AndroidResourceModuleRegistryTest.java
@@ -51,11 +51,13 @@
     Module moduleTwo = mock(Module.class);
     Module moduleThree = mock(Module.class);
     AndroidResourceModule resourceModuleOne =
-        AndroidResourceModule.builder(TargetKey.forPlainTarget(new Label("//foo/bar:one"))).build();
+        AndroidResourceModule.builder(TargetKey.forPlainTarget(Label.create("//foo/bar:one")))
+            .build();
     AndroidResourceModule resourceModuleTwo =
-        AndroidResourceModule.builder(TargetKey.forPlainTarget(new Label("//foo/bar:two"))).build();
+        AndroidResourceModule.builder(TargetKey.forPlainTarget(Label.create("//foo/bar:two")))
+            .build();
     AndroidResourceModule resourceModuleThree =
-        AndroidResourceModule.builder(TargetKey.forPlainTarget(new Label("//foo/bar:three")))
+        AndroidResourceModule.builder(TargetKey.forPlainTarget(Label.create("//foo/bar:three")))
             .build();
     registry.put(moduleOne, resourceModuleOne);
     registry.put(moduleTwo, resourceModuleTwo);
@@ -76,9 +78,11 @@
   public void testPutSameKeyDifferentValues() {
     Module module = mock(Module.class);
     AndroidResourceModule resourceModuleOne =
-        AndroidResourceModule.builder(TargetKey.forPlainTarget(new Label("//foo/bar:one"))).build();
+        AndroidResourceModule.builder(TargetKey.forPlainTarget(Label.create("//foo/bar:one")))
+            .build();
     AndroidResourceModule resourceModuleTwo =
-        AndroidResourceModule.builder(TargetKey.forPlainTarget(new Label("//foo/bar:two"))).build();
+        AndroidResourceModule.builder(TargetKey.forPlainTarget(Label.create("//foo/bar:two")))
+            .build();
     registry.put(module, resourceModuleOne);
     registry.put(module, resourceModuleTwo);
     assertThat(registry.get(module)).isEqualTo(resourceModuleTwo);
@@ -89,7 +93,8 @@
     Module moduleOne = mock(Module.class);
     Module moduleTwo = mock(Module.class);
     AndroidResourceModule resourceModule =
-        AndroidResourceModule.builder(TargetKey.forPlainTarget(new Label("//foo/bar:one"))).build();
+        AndroidResourceModule.builder(TargetKey.forPlainTarget(Label.create("//foo/bar:one")))
+            .build();
     registry.put(moduleOne, resourceModule);
     try {
       registry.put(moduleTwo, resourceModule);
diff --git a/aswb/2.3/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestSetupRule.java b/aswb/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestSetupRule.java
similarity index 100%
rename from aswb/2.3/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestSetupRule.java
rename to aswb/tests/utils/integration/com/google/idea/blaze/android/AndroidIntegrationTestSetupRule.java
diff --git a/base/resources/binaries/bazel-buildifier b/base/resources/binaries/bazel-buildifier
index c7347bb..9b5f6b0 100755
--- a/base/resources/binaries/bazel-buildifier
+++ b/base/resources/binaries/bazel-buildifier
Binary files differ
diff --git a/base/src/META-INF/blaze-base.xml b/base/src/META-INF/blaze-base.xml
index ed49eb9..f472193 100644
--- a/base/src/META-INF/blaze-base.xml
+++ b/base/src/META-INF/blaze-base.xml
@@ -56,12 +56,20 @@
       class="com.google.idea.blaze.base.settings.ui.OpenLocalProjectViewAction"
       text="Open Local Project View File">
     </action>
-    <action class="com.google.idea.blaze.base.buildmap.OpenCorrespondingBuildFile"
-      id="Blaze.OpenCorrespondingBuildFile"
+    <action id="Blaze.AddDirectoryToProjectView"
+      class="com.google.idea.blaze.base.settings.ui.AddDirectoryToProjectAction"
+      text="Add Directory To Project...">
+    </action>
+    <action id="Blaze.OpenCorrespondingBuildFile"
+      class="com.google.idea.blaze.base.buildmap.OpenCorrespondingBuildFile"
       text="Open Corresponding BUILD File">
     </action>
-    <action class="com.google.idea.blaze.base.sync.actions.PartialSyncAction"
-      id="Blaze.PartialSync"
+    <action id="Blaze.CopyBlazeTargetPathAction"
+      class="com.google.idea.blaze.base.actions.CopyBlazeTargetPathAction"
+      text="Copy BUILD target string">
+    </action>
+    <action id="Blaze.PartialSync"
+      class="com.google.idea.blaze.base.sync.actions.PartialSyncAction"
       text="Partially Sync File"
       icon="BlazeIcons.Blaze">
     </action>
@@ -77,12 +85,15 @@
       class="com.google.idea.blaze.base.ide.NewBlazeRuleAction"
       text="New Rule"
       popup="true"/>
+    <action id="Blaze.OpenWorkspaceFile"
+      class="com.google.idea.blaze.base.ide.OpenBlazeWorkspaceFileAction"
+      text="Open Workspace File..."
+      icon="BlazeIcons.Blaze">
+      <add-to-group group-id="FileOpenGroup" relative-to-action="OpenFile" anchor="after"/>
+    </action>
 
     <group id="Blaze.MainMenuActionGroup" class="com.google.idea.blaze.base.actions.BlazeMenuGroup">
       <add-to-group group-id="MainMenu" anchor="before" relative-to-action="HelpMenu"/>
-      <reference id="Blaze.EditLocalProjectView"/>
-      <reference id="Blaze.EditProjectView"/>
-      <separator/>
       <group id ="Blaze.SyncMenuGroup" text="Sync" popup="true">
         <reference id="Blaze.IncrementalSyncProject"/>
         <reference id="Blaze.FullSyncProject"/>
@@ -95,6 +106,11 @@
         <reference id="MakeBlazeProject"/>
         <reference id="MakeBlazeModule"/>
       </group>
+      <group id="Blaze.Project" text="Project" popup="true">
+        <reference id="Blaze.EditLocalProjectView"/>
+        <reference id="Blaze.EditProjectView"/>
+        <reference id="Blaze.AddDirectoryToProjectView"/>
+      </group>
       <!--Add popup groups anchored after this bookmark-->
       <group id="Blaze.MenuGroupsBookmark"/>
       <separator/>
@@ -123,6 +139,7 @@
       <separator/>
       <reference ref="Blaze.PartialSync"/>
       <reference ref="Blaze.OpenCorrespondingBuildFile"/>
+      <reference ref="Blaze.CopyBlazeTargetPathAction"/>
     </group>
   </actions>
 
@@ -162,8 +179,8 @@
                     serviceImplementation="com.google.idea.blaze.base.buildmodifier.FileSystemModifierImpl"/>
     <applicationService serviceInterface="com.google.idea.blaze.base.run.targetfinder.TargetFinder"
                         serviceImplementation="com.google.idea.blaze.base.run.targetfinder.TargetFinderImpl"/>
-    <applicationService serviceInterface="com.google.idea.blaze.base.command.info.BlazeInfo"
-                        serviceImplementation="com.google.idea.blaze.base.command.info.BlazeInfoImpl"/>
+    <applicationService serviceInterface="com.google.idea.blaze.base.command.info.BlazeInfoRunner"
+                        serviceImplementation="com.google.idea.blaze.base.command.info.BlazeInfoRunnerImpl"/>
 
     <treeStructureProvider implementation="com.google.idea.blaze.base.treeview.BlazeTreeStructureProvider" id="blaze"/>
 
@@ -188,6 +205,9 @@
                         serviceImplementation="com.google.idea.blaze.base.lang.buildfile.language.semantics.BuildLanguageSpecProviderImpl"/>
     <applicationService serviceInterface="com.google.idea.blaze.base.sync.projectstructure.ModuleEditorProvider"
                         serviceImplementation="com.google.idea.blaze.base.sync.projectstructure.ModuleEditorProviderImpl"/>
+    <projectService serviceInterface="com.google.idea.blaze.base.sync.projectstructure.ModuleFinder"
+                    serviceImplementation="com.google.idea.blaze.base.sync.projectstructure.ModuleFinderImpl"/>
+    <applicationService serviceImplementation="com.google.idea.blaze.base.sync.projectview.RelatedWorkspacePathFinder"/>
     <applicationService serviceInterface="com.google.idea.blaze.base.prefetch.PrefetchService"
                         serviceImplementation="com.google.idea.blaze.base.prefetch.PrefetchServiceImpl"/>
     <applicationService serviceImplementation="com.google.idea.blaze.base.wizard2.BlazeWizardUserSettingsStorage"/>
@@ -224,6 +244,9 @@
     <completion.contributor language="projectview" implementationClass="com.google.idea.blaze.base.lang.projectview.completion.WorkspaceTypeCompletionContributor"/>
     <completion.contributor language="projectview" implementationClass="com.google.idea.blaze.base.lang.projectview.completion.AdditionalLanguagesCompletionContributor"/>
     <enterHandlerDelegate implementation="com.google.idea.blaze.base.lang.projectview.formatting.ProjectViewEnterHandler"/>
+    <filetype.stubBuilder filetype="projectview" implementationClass="com.google.idea.blaze.base.lang.projectview.stubs.ProjectViewFileStubBuilder"/>
+    <lang.documentationProvider language="projectview" implementationClass="com.google.idea.blaze.base.lang.projectview.documentation.ProjectViewDocumentationProvider"/>
+    <langCodeStyleSettingsProvider implementation="com.google.idea.blaze.base.lang.projectview.formatting.ProjectViewCodeStyleSettingsProvider"/>
   </extensions>
 
   <extensions defaultExtensionNs="com.intellij">
@@ -257,6 +280,7 @@
     <filetype.stubBuilder filetype="BUILD" implementationClass="com.google.idea.blaze.base.lang.buildfile.stubs.BuildFileStubBuilder"/>
     <editorNotificationProvider implementation="com.google.idea.blaze.base.lang.AdditionalLanguagesHelper"/>
     <usageTypeProvider implementation="com.google.idea.blaze.base.lang.buildfile.findusages.BuildUsageTypeProvider"/>
+    <renameInputValidator implementation="com.google.idea.blaze.base.lang.buildfile.refactor.TargetRenameValidator"/>
   </extensions>
 
   <extensions defaultExtensionNs="com.intellij.lang">
@@ -289,6 +313,9 @@
       <interface-class>com.google.idea.common.experiments.ExperimentService</interface-class>
       <implementation-class>com.google.idea.blaze.base.experiments.BlazeExperimentService</implementation-class>
     </component>
+    <component>
+      <implementation-class>com.google.idea.blaze.base.prefetch.PrefetchProjectInitializer</implementation-class>
+    </component>
   </application-components>
 
   <project-components>
@@ -323,10 +350,11 @@
     <extensionPoint qualifiedName="com.google.idea.blaze.AspectStrategyProvider" interface="com.google.idea.blaze.base.sync.aspects.strategy.AspectStrategyProvider"/>
     <extensionPoint qualifiedName="com.google.idea.blaze.DistributedExecutorSupport" interface="com.google.idea.blaze.base.run.DistributedExecutorSupport"/>
     <extensionPoint qualifiedName="com.google.idea.blaze.FileStringParser" interface="com.google.idea.blaze.base.run.filter.FileResolver"/>
-    <extensionPoint qualifiedName="com.google.idea.blaze.BlazeTestXmlFinderStrategy" interface="com.google.idea.blaze.base.run.testlogs.BlazeTestXmlFinderStrategy"/>
+    <extensionPoint qualifiedName="com.google.idea.blaze.BlazeTestXmlFinderStrategy" interface="com.google.idea.blaze.base.run.testlogs.BlazeTestResultFinderStrategy"/>
     <extensionPoint qualifiedName="com.google.idea.blaze.BlazeTestEventsHandler" interface="com.google.idea.blaze.base.run.smrunner.BlazeTestEventsHandler"/>
     <extensionPoint qualifiedName="com.google.idea.blaze.AttributeSpecificStringLiteralReferenceProvider" interface="com.google.idea.blaze.base.lang.buildfile.references.AttributeSpecificStringLiteralReferenceProvider"/>
     <extensionPoint qualifiedName="com.google.idea.blaze.EventLogger" interface="com.google.idea.blaze.base.logging.EventLogger"/>
+    <extensionPoint qualifiedName="com.google.idea.blaze.ProjectViewDefaultValueProvider" interface="com.google.idea.blaze.base.projectview.section.ProjectViewDefaultValueProvider"/>
   </extensionPoints>
 
   <extensions defaultExtensionNs="com.google.idea.blaze">
@@ -340,14 +368,17 @@
     <BuildSystemProvider implementation="com.google.idea.blaze.base.bazel.BazelBuildSystemProvider" order="last"/>
     <BuildifierBinaryProvider implementation="com.google.idea.blaze.base.buildmodifier.BazelBuildifierBinaryProvider"/>
     <BlazeCommandRunConfigurationHandlerProvider implementation="com.google.idea.blaze.base.run.confighandler.BlazeCommandGenericRunConfigurationHandlerProvider" order="last"/>
-    <TestTargetHeuristic implementation="com.google.idea.blaze.base.run.TargetNameHeuristic" order="first"/>
-    <TestTargetHeuristic implementation="com.google.idea.blaze.base.run.TestTargetSourcesHeuristic" order="before TestSizeHeuristic" id="TestSourcesHeuristic"/>
+    <TestTargetHeuristic implementation="com.google.idea.blaze.base.run.TargetNameHeuristic" order="first" id="TargetNameHeuristic"/>
+    <TestTargetHeuristic implementation="com.google.idea.blaze.base.run.TestTargetSourcesHeuristic"/>
     <TestTargetHeuristic implementation="com.google.idea.blaze.base.run.TestSizeHeuristic" order="last" id="TestSizeHeuristic"/>
     <RunConfigurationFactory implementation="com.google.idea.blaze.base.run.BlazeBuildTargetRunConfigurationFactory" order="last"/>
     <AspectStrategyProvider implementation="com.google.idea.blaze.base.sync.aspects.strategy.AspectStrategyProviderBazel" order="last"/>
     <FileStringParser implementation="com.google.idea.blaze.base.run.filter.StandardFileResolver" order="last"/>
-    <BlazeTestXmlFinderStrategy implementation="com.google.idea.blaze.base.run.testlogs.TargetPathTestXmlFinderStrategy"/>
+    <BlazeTestXmlFinderStrategy implementation="com.google.idea.blaze.base.run.testlogs.TargetPathTestResultFinderStrategy"/>
     <BlazeTestEventsHandler implementation="com.google.idea.blaze.base.run.smrunner.BlazeCompositeTestEventsHandler" order="last"/>
+    <ProjectViewDefaultValueProvider implementation="com.google.idea.blaze.base.projectview.section.sections.DirectorySection$DirectoriesProjectViewDefaultValueProvider"/>
+    <ProjectViewDefaultValueProvider implementation="com.google.idea.blaze.base.projectview.section.sections.TargetSection$TargetsProjectViewDefaultValueProvider"/>
+    <ProjectViewDefaultValueProvider implementation="com.google.idea.blaze.base.projectview.section.sections.AdditionalLanguagesSection$AdditionalLanguagesDefaultValueProvider"/>
   </extensions>
 
 </idea-plugin>
diff --git a/base/src/com/google/idea/blaze/base/actions/BlazeBuildService.java b/base/src/com/google/idea/blaze/base/actions/BlazeBuildService.java
index 6b9e095..36a23e9 100644
--- a/base/src/com/google/idea/blaze/base/actions/BlazeBuildService.java
+++ b/base/src/com/google/idea/blaze/base/actions/BlazeBuildService.java
@@ -37,7 +37,10 @@
 import com.google.idea.blaze.base.scope.scopes.TimingScope;
 import com.google.idea.blaze.base.settings.Blaze;
 import com.google.idea.blaze.base.sync.aspects.BlazeIdeInterface;
+import com.google.idea.blaze.base.sync.aspects.BuildResult;
 import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.sync.sharding.BlazeBuildTargetSharder;
+import com.google.idea.blaze.base.sync.sharding.BlazeBuildTargetSharder.ShardedTargetsResult;
 import com.google.idea.blaze.base.util.SaveUtil;
 import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.project.Project;
@@ -113,20 +116,31 @@
                 .push(notificationScope);
 
             WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project);
-            BlazeIdeInterface blazeIdeInterface = BlazeIdeInterface.getInstance();
 
             SaveUtil.saveAllFiles();
-            BlazeIdeInterface.BuildResult buildResult =
-                blazeIdeInterface.compileIdeArtifacts(
+            ShardedTargetsResult shardedTargets =
+                BlazeBuildTargetSharder.expandAndShardTargets(
                     project,
                     context,
                     workspaceRoot,
                     projectViewSet,
-                    blazeProjectData.blazeVersionData,
+                    blazeProjectData.workspacePathResolver,
                     targets);
+            if (shardedTargets.buildResult.status == BuildResult.Status.FATAL_ERROR) {
+              return;
+            }
+            BuildResult buildResult =
+                BlazeIdeInterface.getInstance()
+                    .compileIdeArtifacts(
+                        project,
+                        context,
+                        workspaceRoot,
+                        projectViewSet,
+                        blazeProjectData.blazeVersionData,
+                        shardedTargets.shardedTargets);
             FileCaches.refresh(project);
 
-            if (buildResult != BlazeIdeInterface.BuildResult.SUCCESS) {
+            if (buildResult.status != BuildResult.Status.SUCCESS) {
               context.setHasError();
             }
           }
diff --git a/base/src/com/google/idea/blaze/base/actions/BlazeMakeProjectAction.java b/base/src/com/google/idea/blaze/base/actions/BlazeMakeProjectAction.java
index a124759..b049dee 100644
--- a/base/src/com/google/idea/blaze/base/actions/BlazeMakeProjectAction.java
+++ b/base/src/com/google/idea/blaze/base/actions/BlazeMakeProjectAction.java
@@ -15,6 +15,8 @@
  */
 package com.google.idea.blaze.base.actions;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.idea.blaze.base.logging.EventLogger;
 import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.project.Project;
 
@@ -22,6 +24,7 @@
 
   @Override
   protected void actionPerformedInBlazeProject(Project project, AnActionEvent e) {
+    EventLogger.getInstance().log(getClass(), "make", ImmutableMap.of());
     BlazeBuildService.getInstance().buildProject(project);
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/actions/CopyBlazeTargetPathAction.java b/base/src/com/google/idea/blaze/base/actions/CopyBlazeTargetPathAction.java
new file mode 100644
index 0000000..ffb49e9
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/actions/CopyBlazeTargetPathAction.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.actions;
+
+import com.google.idea.blaze.base.lang.buildfile.psi.FuncallExpression;
+import com.google.idea.blaze.base.model.primitives.Label;
+import com.google.idea.common.actionhelper.ActionPresentationHelper;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.CommonDataKeys;
+import com.intellij.openapi.ide.CopyPasteManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import java.awt.datatransfer.StringSelection;
+import javax.annotation.Nullable;
+
+/** Copies a blaze target path into the clipboard */
+public class CopyBlazeTargetPathAction extends BlazeProjectAction {
+
+  @Override
+  protected void actionPerformedInBlazeProject(Project project, AnActionEvent e) {
+    Label label = getSelectedTarget(e);
+    if (label != null) {
+      CopyPasteManager.getInstance().setContents(new StringSelection(label.toString()));
+    }
+  }
+
+  @Override
+  protected void updateForBlazeProject(Project project, AnActionEvent e) {
+    Label label = getSelectedTarget(e);
+    ActionPresentationHelper.of(e).hideIf(label == null).commit();
+  }
+
+  @Nullable
+  private static Label getSelectedTarget(AnActionEvent e) {
+    PsiElement psiElement = e.getData(CommonDataKeys.PSI_ELEMENT);
+    if (!(psiElement instanceof FuncallExpression)) {
+      return null;
+    }
+    return ((FuncallExpression) psiElement).resolveBuildLabel();
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/bazel/BazelBuildSystemProvider.java b/base/src/com/google/idea/blaze/base/bazel/BazelBuildSystemProvider.java
index efb75be..85296be 100644
--- a/base/src/com/google/idea/blaze/base/bazel/BazelBuildSystemProvider.java
+++ b/base/src/com/google/idea/blaze/base/bazel/BazelBuildSystemProvider.java
@@ -16,7 +16,7 @@
 package com.google.idea.blaze.base.bazel;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.io.FileAttributeProvider;
 import com.google.idea.blaze.base.lang.buildfile.language.semantics.RuleDefinition;
 import com.google.idea.blaze.base.model.BlazeVersionData;
@@ -24,6 +24,7 @@
 import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
 import com.google.idea.blaze.base.settings.BlazeUserSettings;
 import com.intellij.openapi.fileTypes.ExactFileNameMatcher;
+import com.intellij.openapi.fileTypes.ExtensionFileNameMatcher;
 import com.intellij.openapi.fileTypes.FileNameMatcher;
 import java.io.File;
 import javax.annotation.Nullable;
@@ -55,17 +56,20 @@
         "bazel-bin", "bazel-genfiles", "bazel-out", "bazel-testlogs", "bazel-" + rootDir);
   }
 
-  @Nullable
   @Override
   public String getRuleDocumentationUrl(RuleDefinition rule) {
     // TODO: URL pointing to specific BUILD rule.
     return "http://www.bazel.build/docs/be/overview.html";
   }
 
-  // TODO: Update the methods below when https://github.com/bazelbuild/bazel/issues/552 lands.
+  @Override
+  public String getProjectViewDocumentationUrl() {
+    return "https://ij.bazel.build/docs/project-views.html";
+  }
+
   @Override
   public boolean isBuildFile(String fileName) {
-    return fileName.equals("BUILD");
+    return fileName.equals("BUILD") || fileName.equals("BUILD.bazel");
   }
 
   @Nullable
@@ -84,16 +88,17 @@
   }
 
   @Override
-  public ImmutableList<FileNameMatcher> buildFileMatchers() {
+  public ImmutableList<FileNameMatcher> buildLanguageFileTypeMatchers() {
     return ImmutableList.of(
-        new ExactFileNameMatcher("BUILD"), new ExactFileNameMatcher("BUILD.bazel"));
+        new ExactFileNameMatcher("BUILD"), new ExactFileNameMatcher("BUILD.bazel"),
+        new ExtensionFileNameMatcher("bzl"), new ExactFileNameMatcher("WORKSPACE"));
   }
 
   @Override
   public void populateBlazeVersionData(
       BuildSystem buildSystem,
       WorkspaceRoot workspaceRoot,
-      ImmutableMap<String, String> blazeInfo,
+      BlazeInfo blazeInfo,
       BlazeVersionData.Builder builder) {
     if (buildSystem != BuildSystem.Bazel) {
       return;
diff --git a/base/src/com/google/idea/blaze/base/bazel/BazelVersion.java b/base/src/com/google/idea/blaze/base/bazel/BazelVersion.java
index 44582cb..19be022 100644
--- a/base/src/com/google/idea/blaze/base/bazel/BazelVersion.java
+++ b/base/src/com/google/idea/blaze/base/bazel/BazelVersion.java
@@ -21,7 +21,6 @@
 import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.intellij.openapi.util.text.StringUtil;
 import java.io.Serializable;
-import java.util.Map;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
@@ -77,7 +76,7 @@
     return new BazelVersion(major, minor, bugfix);
   }
 
-  public static BazelVersion parseVersion(Map<String, String> blazeInfo) {
+  public static BazelVersion parseVersion(BlazeInfo blazeInfo) {
     return parseVersion(blazeInfo.get(BlazeInfo.RELEASE));
   }
 
diff --git a/base/src/com/google/idea/blaze/base/bazel/BuildSystemProvider.java b/base/src/com/google/idea/blaze/base/bazel/BuildSystemProvider.java
index eb20772..22392d4 100644
--- a/base/src/com/google/idea/blaze/base/bazel/BuildSystemProvider.java
+++ b/base/src/com/google/idea/blaze/base/bazel/BuildSystemProvider.java
@@ -16,7 +16,7 @@
 package com.google.idea.blaze.base.bazel;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.lang.buildfile.language.semantics.RuleDefinition;
 import com.google.idea.blaze.base.model.BlazeVersionData;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
@@ -90,6 +90,10 @@
   @Nullable
   String getRuleDocumentationUrl(RuleDefinition rule);
 
+  /** The URL providing documentation for project view files, if one can be found. */
+  @Nullable
+  String getProjectViewDocumentationUrl();
+
   /** Check if the given filename is a valid BUILD file name. */
   boolean isBuildFile(String fileName);
 
@@ -111,12 +115,13 @@
     return buildFile != null ? directory.getFileSystem().findFileByPath(buildFile.getPath()) : null;
   }
 
-  ImmutableList<FileNameMatcher> buildFileMatchers();
+  /** Returns the list of file types recognized as build system files. */
+  ImmutableList<FileNameMatcher> buildLanguageFileTypeMatchers();
 
   /** Populates the passed builder with version data. */
   void populateBlazeVersionData(
       BuildSystem buildSystem,
       WorkspaceRoot workspaceRoot,
-      ImmutableMap<String, String> blazeInfo,
+      BlazeInfo blazeInfo,
       BlazeVersionData.Builder builder);
 }
diff --git a/base/src/com/google/idea/blaze/base/buildmodifier/BuildifierDelegatingCodeStyleManager.java b/base/src/com/google/idea/blaze/base/buildmodifier/BuildifierDelegatingCodeStyleManager.java
index cf4574a..ca0827d 100644
--- a/base/src/com/google/idea/blaze/base/buildmodifier/BuildifierDelegatingCodeStyleManager.java
+++ b/base/src/com/google/idea/blaze/base/buildmodifier/BuildifierDelegatingCodeStyleManager.java
@@ -78,7 +78,7 @@
   private static boolean overrideFormatterForFile(PsiFile file) {
     // don't format skylark extensions
     return file instanceof BuildFile
-        && ((BuildFile) file).getBlazeFileType() == BlazeFileType.BuildPackage;
+        && ((BuildFile) file).getBlazeFileType() != BlazeFileType.SkylarkExtension;
   }
 
   private void formatInternal(PsiFile file, Collection<TextRange> ranges) {
diff --git a/base/src/com/google/idea/blaze/base/command/BlazeCommand.java b/base/src/com/google/idea/blaze/base/command/BlazeCommand.java
index 41e40e8..d43aeaa 100644
--- a/base/src/com/google/idea/blaze/base/command/BlazeCommand.java
+++ b/base/src/com/google/idea/blaze/base/command/BlazeCommand.java
@@ -41,10 +41,11 @@
   }
 
   public ImmutableList<String> toList() {
-    ImmutableList.Builder<String> commandLine = ImmutableList.builder();
-    commandLine.add(binaryPath, name.toString());
-    commandLine.addAll(arguments);
-    return commandLine.build();
+    return ImmutableList.<String>builder()
+        .add(binaryPath)
+        .add(name.toString())
+        .addAll(arguments)
+        .build();
   }
 
   @Override
diff --git a/base/src/com/google/idea/blaze/base/command/BlazeFlags.java b/base/src/com/google/idea/blaze/base/command/BlazeFlags.java
index 1f24f62..a44b056 100644
--- a/base/src/com/google/idea/blaze/base/command/BlazeFlags.java
+++ b/base/src/com/google/idea/blaze/base/command/BlazeFlags.java
@@ -21,6 +21,8 @@
 import com.google.idea.blaze.base.projectview.section.sections.BuildFlagsSection;
 import com.google.idea.blaze.base.settings.Blaze;
 import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import com.google.idea.common.experiments.BoolExperiment;
+import com.intellij.execution.configurations.ParametersList;
 import com.intellij.openapi.project.Project;
 import com.intellij.util.PlatformUtils;
 import java.util.List;
@@ -28,6 +30,9 @@
 /** The collection of all the Bazel flag strings we use. */
 public final class BlazeFlags {
 
+  private static final BoolExperiment macroExpandBuildFlags =
+      new BoolExperiment("macro.expand.blaze.flags", true);
+
   // Build the maximum number of possible dependencies of the project and to show all the build
   // errors in single go.
   public static final String KEEP_GOING = "--keep_going";
@@ -39,6 +44,7 @@
   public static final String JAVA_BINARY_DEBUG = "--wrapper_script_flag=--debug";
   // Runs tests locally, in sequence (rather than parallel), and streams their results to stdout.
   public static final String TEST_OUTPUT_STREAMED = "--test_output=streamed";
+  public static final String DISABLE_TEST_SHARDING = "--test_sharding_strategy=disabled";
   // Filters the unit tests that are run (used with regexp for Java/Robolectric tests).
   public static final String TEST_FILTER = "--test_filter";
   // When used with mobile-install, deploys the an app incrementally.
@@ -48,9 +54,6 @@
   public static final String SPLIT_APKS = "--split_apks";
   // Re-run the test even if the results are cached.
   public static final String NO_CACHE_TEST_RESULTS = "--nocache_test_results";
-  // Avoids node GC between ide_build_info and blaze build
-  public static final String VERSION_WINDOW_FOR_DIRTY_NODE_GC =
-      "--version_window_for_dirty_node_gc=-1";
 
   public static final String EXPERIMENTAL_SHOW_ARTIFACTS = "--experimental_show_artifacts";
 
@@ -60,7 +63,7 @@
     for (BuildFlagsProvider buildFlagsProvider : BuildFlagsProvider.EP_NAME.getExtensions()) {
       buildFlagsProvider.addBuildFlags(buildSystem, projectViewSet, flags);
     }
-    flags.addAll(projectViewSet.listItems(BuildFlagsSection.KEY));
+    flags.addAll(expandBuildFlags(projectViewSet.listItems(BuildFlagsSection.KEY)));
     return flags;
   }
 
@@ -90,5 +93,17 @@
     return TOOL_TAG + platformPrefix;
   }
 
+  /** Expands any macros in the passed build flags. */
+  public static List<String> expandBuildFlags(List<String> flags) {
+    if (!macroExpandBuildFlags.getValue()) {
+      return flags;
+    }
+    // This built-in IntelliJ class will do macro expansion using
+    // both your enviroment and your Settings > Behavior > Path Variables
+    ParametersList parametersList = new ParametersList();
+    parametersList.addAll(flags);
+    return parametersList.getList();
+  }
+
   private BlazeFlags() {}
 }
diff --git a/base/src/com/google/idea/blaze/base/command/BuildFlagsProviderImpl.java b/base/src/com/google/idea/blaze/base/command/BuildFlagsProviderImpl.java
index 2e40662..fcdfc70 100644
--- a/base/src/com/google/idea/blaze/base/command/BuildFlagsProviderImpl.java
+++ b/base/src/com/google/idea/blaze/base/command/BuildFlagsProviderImpl.java
@@ -15,26 +15,19 @@
  */
 package com.google.idea.blaze.base.command;
 
-import static com.google.idea.blaze.base.command.BlazeFlags.VERSION_WINDOW_FOR_DIRTY_NODE_GC;
-
 import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
-import com.google.idea.common.experiments.BoolExperiment;
 import java.util.List;
 
 /** Flags added to blaze/bazel build commands. */
 public class BuildFlagsProviderImpl implements BuildFlagsProvider {
 
-  private static final BoolExperiment experimentUseVersionWindowForDirtyNodeGc =
-      new BoolExperiment("ide_build_info.use_version_window_for_dirty_node_gc", false);
-
   @Override
   public void addBuildFlags(
       BuildSystem buildSystem, ProjectViewSet projectViewSet, List<String> flags) {
-    if (experimentUseVersionWindowForDirtyNodeGc.getValue()) {
-      flags.add(VERSION_WINDOW_FOR_DIRTY_NODE_GC);
-    }
     flags.add("--curses=no");
     flags.add("--color=no");
+    flags.add("--noexperimental_ui");
+    flags.add("--noprogress_in_terminal_title");
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/command/info/BlazeInfo.java b/base/src/com/google/idea/blaze/base/command/info/BlazeInfo.java
index a6666e9..bf9d694 100644
--- a/base/src/com/google/idea/blaze/base/command/info/BlazeInfo.java
+++ b/base/src/com/google/idea/blaze/base/command/info/BlazeInfo.java
@@ -15,16 +15,17 @@
  */
 package com.google.idea.blaze.base.command.info;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
-import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
 import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
-import com.intellij.openapi.components.ServiceManager;
-import java.util.List;
+import com.intellij.openapi.diagnostic.Logger;
+import java.io.File;
+import java.io.Serializable;
 
-/** Runs the blaze info command. The results may be cached in the workspace. */
-public abstract class BlazeInfo {
+/** The data output by blaze info. */
+public class BlazeInfo implements Serializable {
+  public static final long serialVersionUID = 2L;
   public static final String EXECUTION_ROOT_KEY = "execution_root";
   public static final String PACKAGE_PATH_KEY = "package_path";
   public static final String BUILD_LANGUAGE = "build-language";
@@ -33,6 +34,8 @@
   public static final String COMMAND_LOG = "command_log";
   public static final String RELEASE = "release";
 
+  private static final Logger logger = Logger.getInstance(BlazeInfo.class);
+
   public static String blazeBinKey(BuildSystem buildSystem) {
     switch (buildSystem) {
       case Blaze:
@@ -66,44 +69,74 @@
     }
   }
 
-  public static BlazeInfo getInstance() {
-    return ServiceManager.getService(BlazeInfo.class);
+  private final ImmutableMap<String, String> blazeInfoMap;
+
+  private final File executionRoot;
+  private final ExecutionRootPath blazeBinExecutionRootPath;
+  private final ExecutionRootPath blazeGenfilesExecutionRootPath;
+  private final File outputBase;
+
+  public BlazeInfo(BuildSystem buildSystem, ImmutableMap<String, String> blazeInfoMap) {
+    this.blazeInfoMap = blazeInfoMap;
+    this.executionRoot = new File(getOrThrow(blazeInfoMap, EXECUTION_ROOT_KEY).trim());
+    this.blazeBinExecutionRootPath =
+        ExecutionRootPath.createAncestorRelativePath(
+            executionRoot, new File(getOrThrow(blazeInfoMap, blazeBinKey(buildSystem))));
+    this.blazeGenfilesExecutionRootPath =
+        ExecutionRootPath.createAncestorRelativePath(
+            executionRoot, new File(getOrThrow(blazeInfoMap, blazeGenfilesKey(buildSystem))));
+    this.outputBase = new File(getOrThrow(blazeInfoMap, OUTPUT_BASE_KEY).trim());
+    logger.assertTrue(blazeBinExecutionRootPath != null);
+    logger.assertTrue(blazeGenfilesExecutionRootPath != null);
   }
 
-  /**
-   * @param blazeFlags The blaze flags that will be passed to Blaze.
-   * @param key The key passed to blaze info
-   * @return The blaze info value associated with the specified key
-   */
-  public abstract ListenableFuture<String> runBlazeInfo(
-      BlazeContext context,
-      String binaryPath,
-      WorkspaceRoot workspaceRoot,
-      List<String> blazeFlags,
-      String key);
+  private static String getOrThrow(ImmutableMap<String, String> map, String key) {
+    String value = map.get(key);
+    if (value == null) {
+      throw new RuntimeException(String.format("Could not locate %s in info map", key));
+    }
+    return value;
+  }
 
-  /**
-   * @param blazeFlags The blaze flags that will be passed to Blaze.
-   * @param key The key passed to blaze info
-   * @return The blaze info value associated with the specified key
-   */
-  public abstract ListenableFuture<byte[]> runBlazeInfoGetBytes(
-      BlazeContext context,
-      String binaryPath,
-      WorkspaceRoot workspaceRoot,
-      List<String> blazeFlags,
-      String key);
+  public String get(String key) {
+    return blazeInfoMap.get(key);
+  }
 
-  /**
-   * This calls blaze info without any specific key so blaze info will return all keys and values
-   * that it has.
-   *
-   * @param blazeFlags The blaze flags that will be passed to Blaze.
-   * @return The blaze info data fields.
-   */
-  public abstract ListenableFuture<ImmutableMap<String, String>> runBlazeInfo(
-      BlazeContext context,
-      String binaryPath,
-      WorkspaceRoot workspaceRoot,
-      List<String> blazeFlags);
+  public File getExecutionRoot() {
+    return executionRoot;
+  }
+
+  public ExecutionRootPath getBlazeBinExecutionRootPath() {
+    return blazeBinExecutionRootPath;
+  }
+
+  public ExecutionRootPath getBlazeGenfilesExecutionRootPath() {
+    return blazeGenfilesExecutionRootPath;
+  }
+
+  public File getGenfilesDirectory() {
+    return blazeGenfilesExecutionRootPath.getFileRootedAt(getExecutionRoot());
+  }
+
+  public File getBlazeBinDirectory() {
+    return blazeBinExecutionRootPath.getFileRootedAt(getExecutionRoot());
+  }
+
+  public File getOutputBase() {
+    return outputBase;
+  }
+
+  /** Creates a mock blaze info with the minimum information required for syncing. */
+  @VisibleForTesting
+  public static BlazeInfo createMockBlazeInfo(
+      String outputBase, String executionRoot, String blazeBin, String blazeGenFiles) {
+    BuildSystem buildSystem = BuildSystem.Bazel;
+    ImmutableMap.Builder<String, String> blazeInfoMap =
+        ImmutableMap.<String, String>builder()
+            .put(OUTPUT_BASE_KEY, outputBase)
+            .put(EXECUTION_ROOT_KEY, executionRoot)
+            .put(blazeBinKey(buildSystem), blazeBin)
+            .put(blazeGenfilesKey(buildSystem), blazeGenFiles);
+    return new BlazeInfo(buildSystem, blazeInfoMap.build());
+  }
 }
diff --git a/base/src/com/google/idea/blaze/base/command/info/BlazeInfoRunner.java b/base/src/com/google/idea/blaze/base/command/info/BlazeInfoRunner.java
new file mode 100644
index 0000000..fb29f7d
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/command/info/BlazeInfoRunner.java
@@ -0,0 +1,69 @@
+/*
+ * Copyright 2016 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.command.info;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import com.intellij.openapi.components.ServiceManager;
+import java.util.List;
+
+/** Runs the blaze info command. The results may be cached in the workspace. */
+public abstract class BlazeInfoRunner {
+
+  public static BlazeInfoRunner getInstance() {
+    return ServiceManager.getService(BlazeInfoRunner.class);
+  }
+
+  /**
+   * @param blazeFlags The blaze flags that will be passed to Blaze.
+   * @param key The key passed to blaze info
+   * @return The blaze info value associated with the specified key
+   */
+  public abstract ListenableFuture<String> runBlazeInfo(
+      BlazeContext context,
+      String binaryPath,
+      WorkspaceRoot workspaceRoot,
+      List<String> blazeFlags,
+      String key);
+
+  /**
+   * @param blazeFlags The blaze flags that will be passed to Blaze.
+   * @param key The key passed to blaze info
+   * @return The blaze info value associated with the specified key
+   */
+  public abstract ListenableFuture<byte[]> runBlazeInfoGetBytes(
+      BlazeContext context,
+      String binaryPath,
+      WorkspaceRoot workspaceRoot,
+      List<String> blazeFlags,
+      String key);
+
+  /**
+   * This calls blaze info without any specific key so blaze info will return all keys and values
+   * that it has.
+   *
+   * @param blazeFlags The blaze flags that will be passed to Blaze.
+   * @return The blaze info data fields.
+   */
+  public abstract ListenableFuture<BlazeInfo> runBlazeInfo(
+      BlazeContext context,
+      BuildSystem buildSystem,
+      String binaryPath,
+      WorkspaceRoot workspaceRoot,
+      List<String> blazeFlags);
+}
diff --git a/base/src/com/google/idea/blaze/base/command/info/BlazeInfoImpl.java b/base/src/com/google/idea/blaze/base/command/info/BlazeInfoRunnerImpl.java
similarity index 91%
rename from base/src/com/google/idea/blaze/base/command/info/BlazeInfoImpl.java
rename to base/src/com/google/idea/blaze/base/command/info/BlazeInfoRunnerImpl.java
index 3410796..892da90 100644
--- a/base/src/com/google/idea/blaze/base/command/info/BlazeInfoImpl.java
+++ b/base/src/com/google/idea/blaze/base/command/info/BlazeInfoRunnerImpl.java
@@ -25,13 +25,14 @@
 import com.google.idea.blaze.base.command.BlazeCommandName;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
 import com.intellij.openapi.diagnostic.Logger;
 import java.io.ByteArrayOutputStream;
 import java.util.List;
 import javax.annotation.Nullable;
 
-class BlazeInfoImpl extends BlazeInfo {
-  private static final Logger logger = Logger.getInstance(BlazeInfoImpl.class);
+class BlazeInfoRunnerImpl extends BlazeInfoRunner {
+  private static final Logger logger = Logger.getInstance(BlazeInfoRunnerImpl.class);
 
   @Override
   public ListenableFuture<String> runBlazeInfo(
@@ -61,8 +62,9 @@
   }
 
   @Override
-  public ListenableFuture<ImmutableMap<String, String>> runBlazeInfo(
+  public ListenableFuture<BlazeInfo> runBlazeInfo(
       BlazeContext context,
+      BuildSystem buildSystem,
       String binaryPath,
       WorkspaceRoot workspaceRoot,
       List<String> blazeFlags) {
@@ -73,7 +75,8 @@
                   runBlazeInfo(binaryPath, workspaceRoot, /* key */ null, blazeFlags, context)
                       .toString()
                       .trim();
-              return parseBlazeInfoResult(blazeInfoString);
+              ImmutableMap<String, String> blazeInfoMap = parseBlazeInfoResult(blazeInfoString);
+              return new BlazeInfo(buildSystem, blazeInfoMap);
             });
   }
 
diff --git a/base/src/com/google/idea/blaze/base/ide/NewBlazePackageDialog.java b/base/src/com/google/idea/blaze/base/ide/NewBlazePackageDialog.java
index 356b284..7317f31 100644
--- a/base/src/com/google/idea/blaze/base/ide/NewBlazePackageDialog.java
+++ b/base/src/com/google/idea/blaze/base/ide/NewBlazePackageDialog.java
@@ -112,7 +112,7 @@
     WorkspacePath newPackagePath = workspaceRoot.workspacePathFor(newPackageDirectory);
 
     TargetName newTargetName = newRuleUI.getRuleName();
-    Label newRule = new Label(newPackagePath, newTargetName);
+    Label newRule = Label.create(newPackagePath, newTargetName);
     Kind ruleKind = newRuleUI.getSelectedRuleKind();
     try {
       parentDirectory.checkCreateSubdirectory(newPackageName);
diff --git a/base/src/com/google/idea/blaze/base/ide/NewBlazeRuleDialog.java b/base/src/com/google/idea/blaze/base/ide/NewBlazeRuleDialog.java
index d77e25c..ae43540 100644
--- a/base/src/com/google/idea/blaze/base/ide/NewBlazeRuleDialog.java
+++ b/base/src/com/google/idea/blaze/base/ide/NewBlazeRuleDialog.java
@@ -24,7 +24,6 @@
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.settings.Blaze;
 import com.google.idea.blaze.base.ui.UiUtil;
-import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.ui.DialogWrapper;
 import com.intellij.openapi.ui.ValidationInfo;
@@ -37,8 +36,6 @@
 import javax.swing.JPanel;
 
 class NewBlazeRuleDialog extends DialogWrapper {
-  private static final Logger logger = Logger.getInstance(NewBlazeRuleDialog.class);
-
   private static final int UI_INDENT = 0;
   private static final int TEXT_BOX_WIDTH = 40;
 
@@ -94,7 +91,7 @@
     WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project);
     WorkspacePath workspacePath =
         workspaceRoot.workspacePathFor(new File(buildFile.getParent().getPath()));
-    Label newRule = new Label(workspacePath, targetName);
+    Label newRule = Label.create(workspacePath, targetName);
     BuildFileModifier buildFileModifier = BuildFileModifier.getInstance();
     boolean success = buildFileModifier.addRule(project, context, newRule, ruleKind);
 
diff --git a/base/src/com/google/idea/blaze/base/ide/OpenBlazeWorkspaceFileAction.java b/base/src/com/google/idea/blaze/base/ide/OpenBlazeWorkspaceFileAction.java
new file mode 100644
index 0000000..68976c8
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/ide/OpenBlazeWorkspaceFileAction.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.ide;
+
+import com.google.idea.blaze.base.actions.BlazeProjectAction;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.google.idea.blaze.base.ui.UiUtil;
+import com.google.idea.blaze.base.ui.WorkspaceFileTextField;
+import com.intellij.ide.actions.OpenFileAction;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.fileChooser.FileChooserDescriptor;
+import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
+import com.intellij.openapi.fileChooser.FileTextField;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.ui.ValidationInfo;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.ui.components.JBLabel;
+import java.awt.GridBagLayout;
+import javax.annotation.Nullable;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+
+final class OpenBlazeWorkspaceFileAction extends BlazeProjectAction {
+
+  @Override
+  protected void actionPerformedInBlazeProject(Project project, AnActionEvent e) {
+    BlazeProjectData blazeProjectData =
+        BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
+    if (blazeProjectData == null) {
+      return;
+    }
+    new OpenBlazeWorkspaceFileActionDialog(project, blazeProjectData.workspacePathResolver).show();
+  }
+
+  private static class OpenBlazeWorkspaceFileActionDialog extends DialogWrapper {
+
+    static final int PATH_FIELD_WIDTH = 40;
+    final Project project;
+
+    final JPanel component;
+    final FileTextField fileTextField;
+
+    OpenBlazeWorkspaceFileActionDialog(
+        Project project, WorkspacePathResolver workspacePathResolver) {
+      super(project, /* canBeParent */ false, IdeModalityType.PROJECT);
+      this.project = project;
+
+      component = new JPanel(new GridBagLayout());
+      FileChooserDescriptor descriptor = FileChooserDescriptorFactory.createSingleFileDescriptor();
+      fileTextField =
+          WorkspaceFileTextField.create(
+              workspacePathResolver, descriptor, PATH_FIELD_WIDTH, myDisposable);
+
+      component.add(new JBLabel("Path:"));
+      component.add(fileTextField.getField(), UiUtil.getFillLineConstraints(0));
+
+      UiUtil.fillBottom(component);
+      init();
+    }
+
+    @Nullable
+    @Override
+    protected JComponent createCenterPanel() {
+      return component;
+    }
+
+    @Nullable
+    @Override
+    public JComponent getPreferredFocusedComponent() {
+      return fileTextField.getField();
+    }
+
+    @Nullable
+    @Override
+    protected ValidationInfo doValidate() {
+      VirtualFile selectedFile = fileTextField.getSelectedFile();
+      if (selectedFile == null || !selectedFile.exists()) {
+        return new ValidationInfo("File does not exist", fileTextField.getField());
+      } else if (selectedFile.isDirectory()) {
+        return new ValidationInfo("Directories can not be opened", fileTextField.getField());
+      } else {
+        return null;
+      }
+    }
+
+    @Override
+    protected void doOKAction() {
+      OpenFileAction.openFile(fileTextField.getSelectedFile(), project);
+      super.doOKAction();
+    }
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/run/testlogs/CompletedTestTarget.java b/base/src/com/google/idea/blaze/base/ideinfo/AndroidSdkIdeInfo.java
similarity index 60%
rename from base/src/com/google/idea/blaze/base/run/testlogs/CompletedTestTarget.java
rename to base/src/com/google/idea/blaze/base/ideinfo/AndroidSdkIdeInfo.java
index bf0b33b..1a07184 100644
--- a/base/src/com/google/idea/blaze/base/run/testlogs/CompletedTestTarget.java
+++ b/base/src/com/google/idea/blaze/base/ideinfo/AndroidSdkIdeInfo.java
@@ -13,19 +13,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package com.google.idea.blaze.base.run.testlogs;
+package com.google.idea.blaze.base.ideinfo;
 
-import com.google.idea.blaze.base.model.primitives.Label;
-import java.io.File;
+import java.io.Serializable;
 
-/** Information relating to a completed test target. */
-public class CompletedTestTarget {
+/** android_sdk ide info */
+public class AndroidSdkIdeInfo implements Serializable {
+  private static final long serialVersionUID = 1L;
 
-  public final File testResultXml;
-  public final Label label;
+  public final ArtifactLocation androidJar;
 
-  public CompletedTestTarget(File testResultXml, Label label) {
-    this.testResultXml = testResultXml;
-    this.label = label;
+  public AndroidSdkIdeInfo(ArtifactLocation androidJar) {
+    this.androidJar = androidJar;
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/ideinfo/ArtifactLocation.java b/base/src/com/google/idea/blaze/base/ideinfo/ArtifactLocation.java
index a23ab9c..72dc07c 100644
--- a/base/src/com/google/idea/blaze/base/ideinfo/ArtifactLocation.java
+++ b/base/src/com/google/idea/blaze/base/ideinfo/ArtifactLocation.java
@@ -22,9 +22,9 @@
 
 /** Represents a blaze-produced artifact. */
 public final class ArtifactLocation implements Serializable, Comparable<ArtifactLocation> {
-  private static final long serialVersionUID = 4L;
+  private static final long serialVersionUID = 5L;
 
-  public final String rootExecutionPathFragment;
+  private final String rootExecutionPathFragment;
   public final String relativePath;
   public final boolean isSource;
   public final boolean isExternal;
@@ -37,7 +37,10 @@
     this.isExternal = isExternal;
   }
 
-  /** Gets the path relative to the root path. */
+  /**
+   * The root-relative path. For external workspace artifacts, this is relative to the external
+   * workspace root.
+   */
   public String getRelativePath() {
     return relativePath;
   }
@@ -50,10 +53,7 @@
     return !isSource;
   }
 
-  /**
-   * Returns rootExecutionPathFragment + relativePath. For source artifacts, this is simply
-   * relativePath
-   */
+  /** For main-workspace source artifacts, this is simply the workspace-relative path. */
   public String getExecutionRootRelativePath() {
     return Paths.get(rootExecutionPathFragment, relativePath).toString();
   }
@@ -124,8 +124,8 @@
     return ComparisonChain.start()
         .compare(rootExecutionPathFragment, o.rootExecutionPathFragment)
         .compare(relativePath, o.relativePath)
-        .compare(isSource, o.isSource)
-        .compare(isExternal, o.isExternal)
+        .compareFalseFirst(isSource, o.isSource)
+        .compareFalseFirst(isExternal, o.isExternal)
         .result();
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/ideinfo/CIdeInfo.java b/base/src/com/google/idea/blaze/base/ideinfo/CIdeInfo.java
index de80f8c..215033d 100644
--- a/base/src/com/google/idea/blaze/base/ideinfo/CIdeInfo.java
+++ b/base/src/com/google/idea/blaze/base/ideinfo/CIdeInfo.java
@@ -21,10 +21,12 @@
 
 /** Sister class to {@link JavaIdeInfo} */
 public class CIdeInfo implements Serializable {
-  private static final long serialVersionUID = 6L;
+  private static final long serialVersionUID = 7L;
 
   public final ImmutableList<ArtifactLocation> sources;
 
+  public final ImmutableList<String> localDefines;
+  public final ImmutableList<ExecutionRootPath> localIncludeDirectories;
   // From the cpp compilation context provider.
   // These should all be for the entire transitive closure.
   public final ImmutableList<ExecutionRootPath> transitiveIncludeDirectories;
@@ -34,11 +36,15 @@
 
   public CIdeInfo(
       ImmutableList<ArtifactLocation> sources,
+      ImmutableList<String> localDefines,
+      ImmutableList<ExecutionRootPath> localIncludeDirectories,
       ImmutableList<ExecutionRootPath> transitiveIncludeDirectories,
       ImmutableList<ExecutionRootPath> transitiveQuoteIncludeDirectories,
       ImmutableList<String> transitiveDefines,
       ImmutableList<ExecutionRootPath> transitiveSystemIncludeDirectories) {
     this.sources = sources;
+    this.localDefines = localDefines;
+    this.localIncludeDirectories = localIncludeDirectories;
     this.transitiveIncludeDirectories = transitiveIncludeDirectories;
     this.transitiveQuoteIncludeDirectories = transitiveQuoteIncludeDirectories;
     this.transitiveDefines = transitiveDefines;
@@ -53,6 +59,9 @@
   public static class Builder {
     private final ImmutableList.Builder<ArtifactLocation> sources = ImmutableList.builder();
 
+    private final ImmutableList.Builder<String> localDefines = ImmutableList.builder();
+    private final ImmutableList.Builder<ExecutionRootPath> localIncludeDirectories =
+        ImmutableList.builder();
     private final ImmutableList.Builder<ExecutionRootPath> transitiveIncludeDirectories =
         ImmutableList.builder();
     private final ImmutableList.Builder<ExecutionRootPath> transitiveQuoteIncludeDirectories =
@@ -66,6 +75,16 @@
       return this;
     }
 
+    public Builder addLocalDefines(Iterable<String> localDefines) {
+      this.localDefines.addAll(localDefines);
+      return this;
+    }
+
+    public Builder addLocalIncludeDirectories(Iterable<ExecutionRootPath> localIncludeDirectories) {
+      this.localIncludeDirectories.addAll(localIncludeDirectories);
+      return this;
+    }
+
     public Builder addTransitiveIncludeDirectories(
         Iterable<ExecutionRootPath> transitiveIncludeDirectories) {
       this.transitiveIncludeDirectories.addAll(transitiveIncludeDirectories);
@@ -92,6 +111,8 @@
     public CIdeInfo build() {
       return new CIdeInfo(
           sources.build(),
+          localDefines.build(),
+          localIncludeDirectories.build(),
           transitiveIncludeDirectories.build(),
           transitiveQuoteIncludeDirectories.build(),
           transitiveDefines.build(),
@@ -106,6 +127,12 @@
         + "  sources="
         + sources
         + "\n"
+        + "  localDefines="
+        + localDefines
+        + "\n"
+        + "  localIncludeDirectories="
+        + localIncludeDirectories
+        + "\n"
         + "  transitiveIncludeDirectories="
         + transitiveIncludeDirectories
         + "\n"
diff --git a/base/src/com/google/idea/blaze/base/ideinfo/CToolchainIdeInfo.java b/base/src/com/google/idea/blaze/base/ideinfo/CToolchainIdeInfo.java
index f1c0174..5224256 100644
--- a/base/src/com/google/idea/blaze/base/ideinfo/CToolchainIdeInfo.java
+++ b/base/src/com/google/idea/blaze/base/ideinfo/CToolchainIdeInfo.java
@@ -20,7 +20,7 @@
 import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
 import java.io.Serializable;
 
-/** Sister class to {@link JavaIdeInfo} */
+/** Represents a cc_toolchain */
 public class CToolchainIdeInfo implements Serializable {
   private static final long serialVersionUID = 3L;
 
diff --git a/base/src/com/google/idea/blaze/base/ideinfo/IntellijPluginDeployInfo.java b/base/src/com/google/idea/blaze/base/ideinfo/IntellijPluginDeployInfo.java
deleted file mode 100644
index 426fa6b..0000000
--- a/base/src/com/google/idea/blaze/base/ideinfo/IntellijPluginDeployInfo.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright 2017 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.base.ideinfo;
-
-import com.google.common.collect.ImmutableList;
-import java.io.Serializable;
-import javax.annotation.concurrent.Immutable;
-
-/** A special rule representing the files that need to be deployed for an IntelliJ plugin */
-@Immutable
-public class IntellijPluginDeployInfo implements Serializable {
-  private static final long serialVersionUID = 1L;
-
-  /** A single file for deployment */
-  @Immutable
-  public static class IntellijPluginDeployFile implements Serializable {
-    private static final long serialVersionUID = 1L;
-
-    /** The source file to deploy. */
-    public final ArtifactLocation src;
-    /** A plugins-directory relative location to deploy to. */
-    public final String deployLocation;
-
-    public IntellijPluginDeployFile(ArtifactLocation src, String deployLocation) {
-      this.src = src;
-      this.deployLocation = deployLocation;
-    }
-  }
-
-  public final ImmutableList<IntellijPluginDeployFile> deployFiles;
-
-  public IntellijPluginDeployInfo(ImmutableList<IntellijPluginDeployFile> deployFiles) {
-    this.deployFiles = deployFiles;
-  }
-}
diff --git a/base/src/com/google/idea/blaze/base/ideinfo/TargetIdeInfo.java b/base/src/com/google/idea/blaze/base/ideinfo/TargetIdeInfo.java
index 34f2bc2..ecd44c5 100644
--- a/base/src/com/google/idea/blaze/base/ideinfo/TargetIdeInfo.java
+++ b/base/src/com/google/idea/blaze/base/ideinfo/TargetIdeInfo.java
@@ -27,7 +27,7 @@
 
 /** Simple implementation of TargetIdeInfo. */
 public final class TargetIdeInfo implements Serializable {
-  private static final long serialVersionUID = 15L;
+  private static final long serialVersionUID = 17L;
 
   public final TargetKey key;
   public final Kind kind;
@@ -39,11 +39,11 @@
   @Nullable public final CToolchainIdeInfo cToolchainIdeInfo;
   @Nullable public final JavaIdeInfo javaIdeInfo;
   @Nullable public final AndroidIdeInfo androidIdeInfo;
+  @Nullable public final AndroidSdkIdeInfo androidSdkIdeInfo;
   @Nullable public final PyIdeInfo pyIdeInfo;
   @Nullable public final TestIdeInfo testIdeInfo;
   @Nullable public final ProtoLibraryLegacyInfo protoLibraryLegacyInfo;
   @Nullable public final JavaToolchainIdeInfo javaToolchainIdeInfo;
-  @Nullable public final IntellijPluginDeployInfo intellijPluginDeployInfo;
 
   public TargetIdeInfo(
       TargetKey key,
@@ -56,11 +56,11 @@
       @Nullable CToolchainIdeInfo cToolchainIdeInfo,
       @Nullable JavaIdeInfo javaIdeInfo,
       @Nullable AndroidIdeInfo androidIdeInfo,
+      @Nullable AndroidSdkIdeInfo androidSdkIdeInfo,
       @Nullable PyIdeInfo pyIdeInfo,
       @Nullable TestIdeInfo testIdeInfo,
       @Nullable ProtoLibraryLegacyInfo protoLibraryLegacyInfo,
-      @Nullable JavaToolchainIdeInfo javaToolchainIdeInfo,
-      @Nullable IntellijPluginDeployInfo intellijPluginDeployInfo) {
+      @Nullable JavaToolchainIdeInfo javaToolchainIdeInfo) {
     this.key = key;
     this.kind = kind;
     this.buildFile = buildFile;
@@ -71,11 +71,11 @@
     this.cToolchainIdeInfo = cToolchainIdeInfo;
     this.javaIdeInfo = javaIdeInfo;
     this.androidIdeInfo = androidIdeInfo;
+    this.androidSdkIdeInfo = androidSdkIdeInfo;
     this.pyIdeInfo = pyIdeInfo;
     this.testIdeInfo = testIdeInfo;
     this.protoLibraryLegacyInfo = protoLibraryLegacyInfo;
     this.javaToolchainIdeInfo = javaToolchainIdeInfo;
-    this.intellijPluginDeployInfo = intellijPluginDeployInfo;
   }
 
   @Override
@@ -89,7 +89,7 @@
   }
 
   /** Returns whether this rule is one of the kinds. */
-  public boolean kindIsOneOf(List<Kind> kinds) {
+  public boolean kindIsOneOf(Collection<Kind> kinds) {
     if (kind != null) {
       return kind.isOneOf(kinds);
     }
@@ -122,7 +122,7 @@
     private JavaToolchainIdeInfo javaToolchainIdeInfo;
 
     public Builder setLabel(String label) {
-      return setLabel(new Label(label));
+      return setLabel(Label.create(label));
     }
 
     public Builder setLabel(Label label) {
@@ -212,7 +212,7 @@
     }
 
     public Builder addDependency(String s) {
-      return addDependency(new Label(s));
+      return addDependency(Label.create(s));
     }
 
     public Builder addDependency(Label label) {
@@ -222,7 +222,7 @@
     }
 
     public Builder addRuntimeDep(String s) {
-      return addRuntimeDep(new Label(s));
+      return addRuntimeDep(Label.create(s));
     }
 
     public Builder addRuntimeDep(Label label) {
@@ -243,11 +243,11 @@
           cToolchainIdeInfo,
           javaIdeInfo,
           androidIdeInfo,
+          null,
           pyIdeInfo,
           testIdeInfo,
           protoLibraryLegacyInfo,
-          javaToolchainIdeInfo,
-          null);
+          javaToolchainIdeInfo);
     }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/issueparser/BlazeIssueParser.java b/base/src/com/google/idea/blaze/base/issueparser/BlazeIssueParser.java
index df8a28b..55755ec 100644
--- a/base/src/com/google/idea/blaze/base/issueparser/BlazeIssueParser.java
+++ b/base/src/com/google/idea/blaze/base/issueparser/BlazeIssueParser.java
@@ -117,9 +117,9 @@
 
   /** Returns the file referenced by the target */
   @Nullable
-  public static File fileFromTarget(WorkspaceRoot workspaceRoot, String targetString) {
+  private static File fileFromTarget(WorkspaceRoot workspaceRoot, String targetString) {
     Label label = Label.createIfValid(targetString);
-    if (label == null) {
+    if (label == null || label.isExternal()) {
       return null;
     }
     try {
@@ -218,6 +218,22 @@
     }
   }
 
+  static class SkylarkErrorParser extends SingleLineParser {
+    SkylarkErrorParser() {
+      super("^ERROR: (/.*?\\.bzl):([0-9]+):([0-9]+): (.*)$");
+    }
+
+    @Override
+    protected IssueOutput createIssue(Matcher matcher) {
+      File file = fileFromAbsolutePath(matcher.group(1));
+      return IssueOutput.error(matcher.group(4))
+          .inFile(file)
+          .onLine(Integer.parseInt(matcher.group(2)))
+          .inColumn(parseOptionalInt(matcher.group(3)))
+          .build();
+    }
+  }
+
   static class LinelessBuildParser extends SingleLineParser {
     LinelessBuildParser() {
       super("^ERROR: (.*?):char offsets [0-9]+--[0-9]+: (.*)$");
diff --git a/base/src/com/google/idea/blaze/base/issueparser/IssueOutputLineProcessor.java b/base/src/com/google/idea/blaze/base/issueparser/IssueOutputLineProcessor.java
index c3c5de2..a5588dc 100644
--- a/base/src/com/google/idea/blaze/base/issueparser/IssueOutputLineProcessor.java
+++ b/base/src/com/google/idea/blaze/base/issueparser/IssueOutputLineProcessor.java
@@ -49,6 +49,7 @@
             new BlazeIssueParser.CompileParser(workspaceRoot),
             new BlazeIssueParser.TracebackParser(),
             new BlazeIssueParser.BuildParser(),
+            new BlazeIssueParser.SkylarkErrorParser(),
             new BlazeIssueParser.LinelessBuildParser(),
             new BlazeIssueParser.ProjectViewLabelParser(projectViewSet),
             new BlazeIssueParser.InvalidTargetProjectViewPackageParser(
diff --git a/base/src/com/google/idea/blaze/base/lang/AdditionalLanguagesHelper.java b/base/src/com/google/idea/blaze/base/lang/AdditionalLanguagesHelper.java
index 384e35b..a55996c 100644
--- a/base/src/com/google/idea/blaze/base/lang/AdditionalLanguagesHelper.java
+++ b/base/src/com/google/idea/blaze/base/lang/AdditionalLanguagesHelper.java
@@ -15,6 +15,7 @@
  */
 package com.google.idea.blaze.base.lang;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
@@ -35,6 +36,7 @@
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.ui.EditorNotificationPanel;
 import com.intellij.ui.EditorNotifications;
+import java.util.List;
 import java.util.Set;
 import javax.annotation.Nullable;
 
@@ -111,12 +113,15 @@
     panel.setText(message);
     panel.createActionLabel(
         String.format("Enable %s support", langName),
-        () -> enableLanguageSupport(project, language));
+        () -> {
+          enableLanguageSupport(project, ImmutableList.of(language));
+          suppressNotifications(language);
+        });
     panel.createActionLabel("Don't show again", () -> suppressNotifications(language));
     return panel;
   }
 
-  private void enableLanguageSupport(Project project, LanguageClass language) {
+  public static void enableLanguageSupport(Project project, List<LanguageClass> languages) {
     ProjectViewEdit edit =
         ProjectViewEdit.editLocalProjectView(
             project,
@@ -126,7 +131,7 @@
               builder.replace(
                   existingSection,
                   ListSection.update(AdditionalLanguagesSection.KEY, existingSection)
-                      .add(language));
+                      .addAll(languages));
               return true;
             });
     if (edit == null) {
@@ -137,8 +142,6 @@
     }
     edit.apply();
 
-    suppressNotifications(language);
-
     BlazeSyncManager.getInstance(project)
         .requestProjectSync(
             new BlazeSyncParams.Builder("Sync", BlazeSyncParams.SyncMode.INCREMENTAL)
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/completion/BuildLookupElement.java b/base/src/com/google/idea/blaze/base/lang/buildfile/completion/BuildLookupElement.java
index cc05ea4..cd01e0d 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/completion/BuildLookupElement.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/completion/BuildLookupElement.java
@@ -16,6 +16,7 @@
 package com.google.idea.blaze.base.lang.buildfile.completion;
 
 import com.google.idea.blaze.base.lang.buildfile.references.QuoteType;
+import com.intellij.codeInsight.CodeInsightSettings;
 import com.intellij.codeInsight.completion.InsertionContext;
 import com.intellij.codeInsight.lookup.LookupElement;
 import com.intellij.codeInsight.lookup.LookupElementPresentation;
@@ -42,9 +43,15 @@
     this.wrapWithQuotes = quoteWrapping != QuoteType.NoQuotes;
   }
 
+  private static boolean insertClosingQuotes() {
+    return CodeInsightSettings.getInstance().AUTOINSERT_PAIR_QUOTE;
+  }
+
   @Override
   public String getLookupString() {
-    return quoteWrapping.wrap(baseName);
+    return insertClosingQuotes()
+        ? quoteWrapping.wrap(baseName)
+        : quoteWrapping.quoteString + baseName;
   }
 
   @Nullable
@@ -75,19 +82,17 @@
   /**
    * If we're wrapping with quotes, handle the (very common) case where we have a closing quote
    * after the caret -- we want to remove this quote.
-   *
-   * @param context
    */
   @Override
   public void handleInsert(InsertionContext context) {
-    if (!wrapWithQuotes) {
+    if (!wrapWithQuotes || !insertClosingQuotes()) {
       super.handleInsert(context);
       return;
     }
     Document document = context.getDocument();
     context.commitDocument();
     PsiElement suffix = context.getFile().findElementAt(context.getTailOffset());
-    if (suffix.getText().startsWith(quoteWrapping.quoteString)) {
+    if (suffix != null && suffix.getText().startsWith(quoteWrapping.quoteString)) {
       int offset = suffix.getTextOffset();
       document.deleteString(offset, offset + 1);
       context.commitDocument();
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/completion/BuiltInFunctionAttributeCompletionContributor.java b/base/src/com/google/idea/blaze/base/lang/buildfile/completion/BuiltInFunctionAttributeCompletionContributor.java
index 1b16003..1d84632 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/completion/BuiltInFunctionAttributeCompletionContributor.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/completion/BuiltInFunctionAttributeCompletionContributor.java
@@ -96,7 +96,7 @@
 
   @Nullable
   private static String getEnclosingFuncallName(PsiElement element) {
-    FuncallExpression funcall = PsiUtils.getParentOfType(element, FuncallExpression.class);
+    FuncallExpression funcall = PsiUtils.getParentOfType(element, FuncallExpression.class, true);
     return funcall != null ? funcall.getFunctionName() : null;
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/completion/FilePathLookupElement.java b/base/src/com/google/idea/blaze/base/lang/buildfile/completion/FilePathLookupElement.java
index 61d40e9..0a5a958 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/completion/FilePathLookupElement.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/completion/FilePathLookupElement.java
@@ -20,7 +20,7 @@
 import javax.annotation.Nullable;
 import javax.swing.Icon;
 
-/** Code completion support for package paths. */
+/** Code completion support for file paths within BUILD file labels. */
 public class FilePathLookupElement extends BuildLookupElement {
 
   private final String itemText;
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/completion/LabelRuleLookupElement.java b/base/src/com/google/idea/blaze/base/lang/buildfile/completion/LabelRuleLookupElement.java
index dc7dc46..0b9af98 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/completion/LabelRuleLookupElement.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/completion/LabelRuleLookupElement.java
@@ -16,8 +16,6 @@
 package com.google.idea.blaze.base.lang.buildfile.completion;
 
 import com.google.common.collect.Lists;
-import com.google.idea.blaze.base.lang.buildfile.language.semantics.BuildLanguageSpec;
-import com.google.idea.blaze.base.lang.buildfile.language.semantics.BuildLanguageSpecProvider;
 import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
 import com.google.idea.blaze.base.lang.buildfile.psi.FuncallExpression;
 import com.google.idea.blaze.base.lang.buildfile.references.LabelUtils;
@@ -45,9 +43,6 @@
 
     String ruleFragment = LabelUtils.getRuleComponent(originalString);
     List<BuildLookupElement> lookups = Lists.newArrayList();
-    // TODO: Handle rules generated via functions? (e.g. via blaze sync)
-    BuildLanguageSpec spec =
-        BuildLanguageSpecProvider.getInstance().getLanguageSpec(file.getProject());
     for (FuncallExpression target : file.findChildrenByClass(FuncallExpression.class)) {
       String targetName = target.getName();
       if (targetName == null
@@ -56,7 +51,7 @@
         continue;
       }
       String ruleType = target.getFunctionName();
-      if (ruleType == null || (spec != null && !spec.hasRule(ruleType))) {
+      if (ruleType == null) {
         continue;
       }
       lookups.add(
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/documentation/BuildDocumentationProvider.java b/base/src/com/google/idea/blaze/base/lang/buildfile/documentation/BuildDocumentationProvider.java
index 8c96eec..6f1b195 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/documentation/BuildDocumentationProvider.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/documentation/BuildDocumentationProvider.java
@@ -24,6 +24,7 @@
 import com.google.idea.blaze.base.lang.buildfile.psi.FunctionStatement;
 import com.google.idea.blaze.base.lang.buildfile.psi.ParameterList;
 import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
+import com.google.idea.blaze.base.model.primitives.Label;
 import com.google.idea.blaze.base.settings.Blaze;
 import com.intellij.codeInsight.documentation.DocumentationManagerProtocol;
 import com.intellij.lang.documentation.AbstractDocumentationProvider;
@@ -77,11 +78,8 @@
       return;
     }
     BuildFile buildFile = (BuildFile) file;
-    String name = buildFile.getBuildLabel();
-    if (name == null) {
-      // fall back to qualitative description
-      name = buildFile.getPresentableText();
-    }
+    Label label = buildFile.getBuildLabel();
+    String name = label != null ? label.toString() : buildFile.getPresentableText();
     if (linkToFile) {
       builder
           .append("<a href=\"")
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/findusages/BuildReadWriteAccessDetector.java b/base/src/com/google/idea/blaze/base/lang/buildfile/findusages/BuildReadWriteAccessDetector.java
index 8f01178..c28b741 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/findusages/BuildReadWriteAccessDetector.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/findusages/BuildReadWriteAccessDetector.java
@@ -46,7 +46,7 @@
       return Access.Write;
     }
     if (expression instanceof ReferenceExpression) {
-      if (PsiUtils.getParentOfType(expression, AugmentedAssignmentStatement.class) != null) {
+      if (PsiUtils.getParentOfType(expression, AugmentedAssignmentStatement.class, true) != null) {
         return Access.ReadWrite;
       }
     }
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/globbing/UnixGlob.java b/base/src/com/google/idea/blaze/base/lang/buildfile/globbing/UnixGlob.java
index b7a44c4..ab7ede4 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/globbing/UnixGlob.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/globbing/UnixGlob.java
@@ -15,7 +15,6 @@
  */
 package com.google.idea.blaze.base.lang.buildfile.globbing;
 
-import com.google.common.base.Preconditions;
 import com.google.common.base.Splitter;
 import com.google.common.base.Throwables;
 import com.google.common.cache.Cache;
@@ -31,17 +30,14 @@
 import com.google.common.util.concurrent.SettableFuture;
 import com.google.idea.blaze.base.io.FileAttributeProvider;
 import com.google.idea.blaze.base.lang.buildfile.validation.GlobPatternValidator;
-import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.progress.ProgressManager;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.openapi.vfs.ex.temp.TempFileSystem;
 import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -49,6 +45,7 @@
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
 import javax.annotation.Nullable;
 
 /**
@@ -63,35 +60,16 @@
 public final class UnixGlob {
   private UnixGlob() {}
 
-  private static List<File> globInternal(
+  private static Set<File> globInternal(
       File base,
       Collection<String> patterns,
-      Collection<String> excludePatterns,
       boolean excludeDirectories,
       Predicate<File> dirPred,
       ThreadPoolExecutor threadPool)
       throws IOException, InterruptedException {
 
     GlobVisitor visitor = (threadPool == null) ? new GlobVisitor() : new GlobVisitor(threadPool);
-    return visitor.glob(base, patterns, excludePatterns, excludeDirectories, dirPred);
-  }
-
-  private static Future<List<File>> globAsyncInternal(
-      File base,
-      Collection<String> patterns,
-      Collection<String> excludePatterns,
-      boolean excludeDirectories,
-      Predicate<File> dirPred,
-      ThreadPoolExecutor threadPool) {
-    Preconditions.checkNotNull(threadPool, "%s %s", base, patterns);
-    try {
-      return new GlobVisitor(threadPool)
-          .globAsync(base, patterns, excludePatterns, excludeDirectories, dirPred);
-    } catch (IOException e) {
-      // We are evaluating asynchronously, so no exceptions should be thrown until the future is
-      // retrieved.
-      throw new IllegalStateException(e);
-    }
+    return visitor.glob(base, patterns, excludeDirectories, dirPred);
   }
 
   /**
@@ -113,58 +91,13 @@
     return list;
   }
 
-  private static boolean excludedOnMatch(
-      File path, List<String[]> excludePatterns, int idx, Cache<String, Pattern> cache) {
-    for (String[] excludePattern : excludePatterns) {
-      String text = path.getName();
-      if (idx == excludePattern.length && matches(excludePattern[idx - 1], text, cache)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  /**
-   * Returns the exclude patterns in {@code excludePatterns} which could apply to the children of
-   * {@code base}
-   *
-   * @param idx index into {@code excludePatterns} for the part of the pattern which might match
-   *     {@code base}
-   */
-  private static List<String[]> getRelevantExcludes(
-      final File base,
-      List<String[]> excludePatterns,
-      final int idx,
-      final Cache<String, Pattern> cache) {
-
-    if (excludePatterns.isEmpty()) {
-      return excludePatterns;
-    }
-    List<String[]> list = new ArrayList<>();
-    for (String[] patterns : excludePatterns) {
-      if (excludePatternMatches(patterns, idx, base, cache)) {
-        list.add(patterns);
-      }
-    }
-    return list;
-  }
-
-  /**
-   * @param patterns a list of patterns
-   * @param idx index into {@code patterns}
-   */
-  private static boolean excludePatternMatches(
-      String[] patterns, int idx, File base, Cache<String, Pattern> cache) {
-    if (idx == 0) {
-      return true;
-    }
-    String text = base.getName();
-    return patterns.length > idx && matches(patterns[idx - 1], text, cache);
-  }
-
   /** Calls {@link #matches(String, String, Cache) matches(pattern, str, null)} */
   public static boolean matches(String pattern, String str) {
-    return matches(pattern, str, null);
+    try {
+      return matches(pattern, str, null);
+    } catch (PatternSyntaxException e) {
+      return false;
+    }
   }
 
   /**
@@ -176,7 +109,7 @@
    * @param patternCache a cache from patterns to compiled Pattern objects, or {@code null} to skip
    *     caching
    */
-  public static boolean matches(String pattern, String str, Cache<String, Pattern> patternCache) {
+  private static boolean matches(String pattern, String str, Cache<String, Pattern> patternCache) {
     if (pattern.length() == 0 || str.length() == 0) {
       return false;
     }
@@ -278,8 +211,8 @@
   /** Builder class for UnixGlob. */
   public static class Builder {
     private File base;
-    private List<String> patterns;
-    private List<String> excludes;
+    private final List<String> patterns = new ArrayList<>();
+    private final List<String> excludes = new ArrayList<>();
     private boolean excludeDirectories;
     private Predicate<File> pathFilter;
     private ThreadPoolExecutor threadPool;
@@ -287,8 +220,6 @@
     /** Creates a glob builder with the given base path. */
     public Builder(File base) {
       this.base = base;
-      this.patterns = Lists.newArrayList();
-      this.excludes = Lists.newArrayList();
       this.excludeDirectories = false;
       this.pathFilter = file -> true;
     }
@@ -374,37 +305,29 @@
      * @throws InterruptedException if the thread is interrupted.
      */
     public List<File> glob() throws IOException, InterruptedException {
-      return globInternal(base, patterns, excludes, excludeDirectories, pathFilter, threadPool);
-    }
-
-    /**
-     * Executes the glob asynchronously. {@link #setThreadPool} must have been called already with a
-     * non-null argument.
-     *
-     * @param checkForInterrupt if the returned future may throw InterruptedException.
-     */
-    public Future<List<File>> globAsync() {
-      return globAsyncInternal(
-          base, patterns, excludes, excludeDirectories, pathFilter, threadPool);
+      Set<File> included = globInternal(base, patterns, excludeDirectories, pathFilter, threadPool);
+      Set<File> excluded = globInternal(base, excludes, excludeDirectories, pathFilter, threadPool);
+      included.removeAll(excluded);
+      return Ordering.<File>natural().immutableSortedCopy(included);
     }
   }
 
   /** Adapts the result of the glob visitation as a Future. */
-  private static class GlobFuture extends ForwardingListenableFuture<List<File>> {
+  private static class GlobFuture extends ForwardingListenableFuture<Set<File>> {
     private final GlobVisitor visitor;
-    private final SettableFuture<List<File>> delegate = SettableFuture.create();
+    private final SettableFuture<Set<File>> delegate = SettableFuture.create();
 
-    public GlobFuture(GlobVisitor visitor) {
+    private GlobFuture(GlobVisitor visitor) {
       this.visitor = visitor;
     }
 
     @Override
-    public List<File> get() throws InterruptedException, ExecutionException {
+    public Set<File> get() throws InterruptedException, ExecutionException {
       return super.get();
     }
 
     @Override
-    protected ListenableFuture<List<File>> delegate() {
+    protected ListenableFuture<Set<File>> delegate() {
       return delegate;
     }
 
@@ -412,7 +335,7 @@
       delegate.setException(exception);
     }
 
-    public void set(List<File> paths) {
+    public void set(Set<File> paths) {
       delegate.set(paths);
     }
 
@@ -423,7 +346,7 @@
       return true;
     }
 
-    public void markCanceled() {
+    void markCanceled() {
       super.cancel(true);
     }
   }
@@ -434,7 +357,7 @@
    */
   private static final class GlobVisitor {
     // These collections are used across workers and must therefore be thread-safe.
-    private final Collection<File> results = Sets.newConcurrentHashSet();
+    private final Set<File> results = Sets.newConcurrentHashSet();
     private final Cache<String, Pattern> cache =
         CacheBuilder.newBuilder()
             .build(
@@ -452,40 +375,34 @@
     private final FileAttributeProvider fileAttributeProvider = FileAttributeProvider.getInstance();
     private volatile boolean canceled = false;
 
-    public GlobVisitor(ThreadPoolExecutor executor) {
+    private GlobVisitor(ThreadPoolExecutor executor) {
       this.executor = executor;
       this.result = new GlobFuture(this);
     }
 
-    public GlobVisitor() {
+    private GlobVisitor() {
       this(null);
     }
 
     /**
      * Performs wildcard globbing: returns the sorted list of filenames that match any of {@code
-     * patterns} relative to {@code base}, but which do not match {@code excludePatterns}.
-     * Directories are traversed if and only if they match {@code dirPred}. The predicate is also
-     * called for the root of the traversal.
+     * patterns} relative to {@code base}. Directories are traversed if and only if they match
+     * {@code dirPred}. The predicate is also called for the root of the traversal.
      *
      * <p>Patterns may include "*" and "?", but not "[a-z]".
      *
      * <p><code>**</code> gets special treatment in include patterns. If it is used as a complete
      * path segment it matches the filenames in subdirectories recursively.
      *
-     * @throws IllegalArgumentException if any glob or exclude pattern {@linkplain
-     *     #checkPatternForError(String) contains errors} or if any exclude pattern segment contains
-     *     <code>**</code> or if any include pattern segment contains <code>**</code> but not equal
-     *     to it.
+     * @throws IllegalArgumentException if any glob or exclude pattern contains errors, or if any
+     *     exclude pattern segment contains <code>**</code> or if any include pattern segment
+     *     contains <code>**</code> but not equal to it.
      */
-    public List<File> glob(
-        File base,
-        Collection<String> patterns,
-        Collection<String> excludePatterns,
-        boolean excludeDirectories,
-        Predicate<File> dirPred)
+    private Set<File> glob(
+        File base, Collection<String> patterns, boolean excludeDirectories, Predicate<File> dirPred)
         throws IOException, InterruptedException {
       try {
-        return globAsync(base, patterns, excludePatterns, excludeDirectories, dirPred).get();
+        return globAsync(base, patterns, excludeDirectories, dirPred).get();
       } catch (ExecutionException e) {
         Throwable cause = e.getCause();
         Throwables.propagateIfPossible(cause, IOException.class);
@@ -493,40 +410,24 @@
       }
     }
 
-    public Future<List<File>> globAsync(
-        File base,
-        Collection<String> patterns,
-        Collection<String> excludePatterns,
-        boolean excludeDirectories,
-        Predicate<File> dirPred)
+    private Future<Set<File>> globAsync(
+        File base, Collection<String> patterns, boolean excludeDirectories, Predicate<File> dirPred)
         throws IOException {
 
       if (!fileAttributeProvider.exists(base) || patterns.isEmpty()) {
-        return Futures.immediateFuture(Collections.emptyList());
+        return Futures.immediateFuture(Collections.emptySet());
       }
       boolean baseIsDirectory = fileAttributeProvider.isDirectory(base);
 
-      List<String[]> splitPatterns = checkAndSplitPatterns(patterns);
-      List<String[]> splitExcludes = checkAndSplitPatterns(excludePatterns);
-
       // We do a dumb loop, even though it will likely duplicate work
       // (e.g., readdir calls). In order to optimize, we would need
       // to keep track of which patterns shared sub-patterns and which did not
       // (for example consider the glob [*/*.java, sub/*.java, */*.txt]).
       pendingOps.incrementAndGet();
       try {
-        for (String[] splitPattern : splitPatterns) {
+        for (String[] splitPattern : checkAndSplitPatterns(patterns)) {
           queueGlob(
-              base,
-              baseIsDirectory,
-              splitPattern,
-              0,
-              excludeDirectories,
-              splitExcludes,
-              0,
-              results,
-              cache,
-              dirPred);
+              base, baseIsDirectory, splitPattern, 0, excludeDirectories, results, cache, dirPred);
         }
       } finally {
         decrementAndCheckDone();
@@ -541,8 +442,6 @@
         String[] patternParts,
         int idx,
         boolean excludeDirectories,
-        List<String[]> excludePatterns,
-        int excludeIdx,
         Collection<File> results,
         Cache<String, Pattern> cache,
         Predicate<File> dirPred)
@@ -556,8 +455,6 @@
                   patternParts,
                   idx,
                   excludeDirectories,
-                  excludePatterns,
-                  excludeIdx,
                   results,
                   cache,
                   dirPred);
@@ -567,7 +464,7 @@
           });
     }
 
-    protected void enqueue(final Runnable r) {
+    void enqueue(final Runnable r) {
       pendingOps.incrementAndGet();
 
       Runnable wrapped =
@@ -602,7 +499,7 @@
         } else if (failure.get() != null) {
           result.setException(failure.get());
         } else {
-          result.set(Ordering.<File>natural().immutableSortedCopy(results));
+          result.set(results);
         }
       }
     }
@@ -621,8 +518,6 @@
         String[] patternParts,
         int idx,
         boolean excludeDirectories,
-        List<String[]> excludePatterns,
-        int excludeIdx,
         Collection<File> results,
         Cache<String, Pattern> cache,
         Predicate<File> dirPred)
@@ -633,8 +528,7 @@
       }
 
       if (idx == patternParts.length) { // Base case.
-        if (!(excludeDirectories && baseIsDirectory)
-            && !excludedOnMatch(base, excludePatterns, excludeIdx, cache)) {
+        if (!(excludeDirectories && baseIsDirectory)) {
           results.add(base);
         }
         return;
@@ -645,8 +539,6 @@
         return;
       }
 
-      List<String[]> relevantExcludes =
-          getRelevantExcludes(base, excludePatterns, excludeIdx, cache);
       final String pattern = patternParts[idx];
 
       // ** is special: it can match nothing at all.
@@ -658,8 +550,6 @@
             patternParts,
             idx + 1,
             excludeDirectories,
-            excludePatterns,
-            excludeIdx,
             results,
             cache,
             dirPred);
@@ -675,16 +565,7 @@
         }
 
         queueGlob(
-            child,
-            childIsDir,
-            patternParts,
-            idx + 1,
-            excludeDirectories,
-            relevantExcludes,
-            excludeIdx + 1,
-            results,
-            cache,
-            dirPred);
+            child, childIsDir, patternParts, idx + 1, excludeDirectories, results, cache, dirPred);
         return;
       }
 
@@ -699,16 +580,7 @@
           // Recurse without shifting the pattern.
           if (childIsDir) {
             queueGlob(
-                child,
-                childIsDir,
-                patternParts,
-                idx,
-                excludeDirectories,
-                relevantExcludes,
-                excludeIdx + 1,
-                results,
-                cache,
-                dirPred);
+                child, childIsDir, patternParts, idx, excludeDirectories, results, cache, dirPred);
           }
         }
         if (matches(pattern, child.getName(), cache)) {
@@ -720,15 +592,12 @@
                 patternParts,
                 idx + 1,
                 excludeDirectories,
-                relevantExcludes,
-                excludeIdx + 1,
                 results,
                 cache,
                 dirPred);
           } else {
             // Instead of using an async call, just repeat the base case above.
-            if (idx + 1 == patternParts.length
-                && !excludedOnMatch(child, relevantExcludes, excludeIdx + 1, cache)) {
+            if (idx + 1 == patternParts.length) {
               results.add(child);
             }
           }
@@ -738,16 +607,7 @@
 
     @Nullable
     private File[] getChildren(File file) {
-      if (!ApplicationManager.getApplication().isUnitTestMode()) {
-        return file.listFiles();
-      }
-      TempFileSystem fs = TempFileSystem.getInstance();
-      VirtualFile vf = fs.findFileByIoFile(file);
-      VirtualFile[] children = vf.getChildren();
-      if (children == null) {
-        return null;
-      }
-      return Arrays.stream(children).map(VirtualFile::getPath).map(File::new).toArray(File[]::new);
+      return FileAttributeProvider.getInstance().listFiles(file);
     }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/language/BuildFileTypeFactory.java b/base/src/com/google/idea/blaze/base/lang/buildfile/language/BuildFileTypeFactory.java
index e975e61..a73c0a4 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/language/BuildFileTypeFactory.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/language/BuildFileTypeFactory.java
@@ -17,7 +17,6 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.idea.blaze.base.bazel.BuildSystemProvider;
-import com.intellij.openapi.fileTypes.ExtensionFileNameMatcher;
 import com.intellij.openapi.fileTypes.FileNameMatcher;
 import com.intellij.openapi.fileTypes.FileTypeConsumer;
 import com.intellij.openapi.fileTypes.FileTypeFactory;
@@ -30,8 +29,8 @@
   public void createFileTypes(@NotNull final FileTypeConsumer consumer) {
     ImmutableList<FileNameMatcher> fileNameMatchers =
         ImmutableList.<FileNameMatcher>builder()
-            .addAll(BuildSystemProvider.defaultBuildSystem().buildFileMatchers())
-            .add(new ExtensionFileNameMatcher("bzl"))
+            .addAll(BuildSystemProvider.defaultBuildSystem().buildLanguageFileTypeMatchers())
+            .add()
             .build();
     consumer.consume(BuildFileType.INSTANCE, fileNameMatchers.toArray(new FileNameMatcher[0]));
   }
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/Argument.java b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/Argument.java
index 67ff005..ecf79f8 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/Argument.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/Argument.java
@@ -107,13 +107,15 @@
     }
   }
 
+  /** Variable number of positional arguments: *args */
   static class Star extends Argument {
     public Star(ASTNode node) {
       super(node);
     }
   }
 
-  static class StarStar extends Argument {
+  /** Variable number of keyword arguments: **kwargs */
+  public static class StarStar extends Argument {
     public StarStar(ASTNode node) {
       super(node);
     }
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildElement.java b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildElement.java
index 35a67c5..7cfd64b 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildElement.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildElement.java
@@ -16,7 +16,6 @@
 package com.google.idea.blaze.base.lang.buildfile.psi;
 
 import com.google.idea.blaze.base.lang.buildfile.search.BlazePackage;
-import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.intellij.psi.NavigatablePsiElement;
 import com.intellij.psi.PsiElement;
 import javax.annotation.Nullable;
@@ -41,8 +40,6 @@
   @Nullable
   <P extends PsiElement> P firstChildOfClass(Class<P> psiClass);
 
-  WorkspacePath getWorkspacePath();
-
   @Nullable
   BlazePackage getBlazePackage();
 }
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildElementImpl.java b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildElementImpl.java
index 78990fb..700f4dc 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildElementImpl.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildElementImpl.java
@@ -16,7 +16,6 @@
 package com.google.idea.blaze.base.lang.buildfile.psi;
 
 import com.google.idea.blaze.base.lang.buildfile.search.BlazePackage;
-import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.intellij.extapi.psi.ASTWrapperPsiElement;
 import com.intellij.lang.ASTNode;
 import com.intellij.navigation.ItemPresentation;
@@ -160,13 +159,6 @@
 
   @Nullable
   @Override
-  public WorkspacePath getWorkspacePath() {
-    BuildFile file = getContainingFile();
-    return file != null ? file.getWorkspacePath() : null;
-  }
-
-  @Nullable
-  @Override
   public BlazePackage getBlazePackage() {
     PsiFile file = getContainingFile();
     return file != null ? BlazePackage.getContainingPackage(file) : null;
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildFile.java b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildFile.java
index b9cc459..75c6417 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildFile.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/BuildFile.java
@@ -15,26 +15,22 @@
  */
 package com.google.idea.blaze.base.lang.buildfile.psi;
 
-import com.google.common.collect.Lists;
 import com.google.idea.blaze.base.lang.buildfile.language.BuildFileType;
-import com.google.idea.blaze.base.lang.buildfile.references.BuildReferenceManager;
 import com.google.idea.blaze.base.lang.buildfile.references.QuoteType;
 import com.google.idea.blaze.base.lang.buildfile.search.BlazePackage;
-import com.google.idea.blaze.base.lang.buildfile.search.ResolveUtil;
-import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.Label;
+import com.google.idea.blaze.base.sync.workspace.WorkspaceHelper;
 import com.intellij.extapi.psi.PsiFileBase;
-import com.intellij.lang.ASTNode;
+import com.intellij.navigation.ItemPresentation;
 import com.intellij.openapi.fileTypes.FileType;
 import com.intellij.openapi.project.Project;
 import com.intellij.psi.FileViewProvider;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiNamedElement;
-import com.intellij.psi.tree.TokenSet;
 import com.intellij.util.PathUtil;
 import com.intellij.util.Processor;
 import icons.BlazeIcons;
 import java.io.File;
-import java.util.List;
 import javax.annotation.Nullable;
 import javax.swing.Icon;
 
@@ -44,24 +40,17 @@
   /** The blaze file type */
   public enum BlazeFileType {
     SkylarkExtension,
-    BuildPackage // "BUILD", plus hacks such as "BUILD.tools", "BUILD.bazel"
-  }
-
-  @Nullable
-  public static WorkspacePath getWorkspacePath(Project project, String filePath) {
-    return BuildReferenceManager.getInstance(project).getWorkspaceRelativePath(filePath);
+    BuildPackage, // "BUILD", "BUILD.bazel"
+    Workspace, // the top-level WORKSPACE file
   }
 
   public static String getBuildFileString(Project project, String filePath) {
-    WorkspacePath workspacePath = getWorkspacePath(project, PathUtil.getParentPath(filePath));
-    if (workspacePath == null) {
+    Label label = WorkspaceHelper.getBuildLabel(project, new File(filePath));
+    if (label == null) {
       return "BUILD file: " + filePath;
     }
-    String fileName = PathUtil.getFileName(filePath);
-    if (fileName.startsWith("BUILD")) {
-      return "//" + workspacePath + "/" + fileName;
-    }
-    return "//" + workspacePath + ":" + fileName;
+    String labelString = label.toString();
+    return labelString.replace(":__pkg__", "/" + PathUtil.getFileName(filePath));
   }
 
   public BuildFile(FileViewProvider viewProvider) {
@@ -78,6 +67,9 @@
     if (fileName.startsWith("BUILD")) {
       return BlazeFileType.BuildPackage;
     }
+    if (fileName.equals("WORKSPACE")) {
+      return BlazeFileType.Workspace;
+    }
     return BlazeFileType.SkylarkExtension;
   }
 
@@ -117,37 +109,19 @@
     return new File(getFilePath());
   }
 
-  @Nullable
-  @Override
-  public WorkspacePath getWorkspacePath() {
-    return getWorkspacePath(getProject(), getFilePath());
-  }
-
   /**
-   * The workspace path of the containing blaze package (this is always the parent directory for
-   * BUILD files, but may be a more distant ancestor for Skylark extensions)
+   * The label of the containing blaze package (this is always the parent directory for BUILD files,
+   * but may be a more distant ancestor for Skylark extensions)
    */
   @Nullable
-  public WorkspacePath getPackageWorkspacePath() {
+  public Label getPackageLabel() {
     BlazePackage parentPackage = getBlazePackage();
-    if (parentPackage == null) {
-      return null;
-    }
-    String filePath = parentPackage.buildFile.getFilePath();
-    return filePath != null
-        ? getWorkspacePath(getProject(), PathUtil.getParentPath(filePath))
-        : null;
-  }
-
-  @Nullable
-  public String getWorkspaceRelativePackagePath() {
-    WorkspacePath packagePath = getPackageWorkspacePath();
-    return packagePath != null ? packagePath.relativePath() : null;
+    return parentPackage != null ? parentPackage.getPackageLabel() : null;
   }
 
   /** The path for this file, formatted as a BUILD label. */
   @Nullable
-  public String getBuildLabel() {
+  public Label getBuildLabel() {
     BlazePackage containingPackage = getBlazePackage();
     return containingPackage != null
         ? containingPackage.getBuildLabelForChild(getFilePath())
@@ -166,24 +140,6 @@
     return null;
   }
 
-  /** .bzl files referenced in 'load' statements */
-  @Nullable
-  public String[] getImportedPaths() {
-    ASTNode[] loadStatements =
-        getNode().getChildren(TokenSet.create(BuildElementTypes.LOAD_STATEMENT));
-    if (loadStatements.length == 0) {
-      return null;
-    }
-    List<String> importedPaths = Lists.newArrayListWithCapacity(loadStatements.length);
-    for (int i = 0; i < loadStatements.length; i++) {
-      String path = ((LoadStatement) loadStatements[i].getPsi()).getImportedPath();
-      if (path != null) {
-        importedPaths.add(path);
-      }
-    }
-    return importedPaths.toArray(new String[importedPaths.size()]);
-  }
-
   @Nullable
   public FunctionStatement findDeclaredFunction(String name) {
     for (FunctionStatement fn : getFunctionDeclarations()) {
@@ -195,11 +151,6 @@
   }
 
   @Nullable
-  public TargetExpression findTopLevelVariable(String name) {
-    return ResolveUtil.searchChildAssignmentStatements(this, name);
-  }
-
-  @Nullable
   public FunctionStatement findLoadedFunction(String name) {
     for (LoadStatement loadStatement : findChildrenByClass(LoadStatement.class)) {
       for (LoadedSymbol loadedSymbol : loadStatement.getImportedSymbolElements()) {
@@ -293,6 +244,28 @@
   }
 
   @Override
+  public ItemPresentation getPresentation() {
+    final BuildFile element = this;
+    return new ItemPresentation() {
+      @Override
+      public String getPresentableText() {
+        return element.getName();
+      }
+
+      @Override
+      public String getLocationString() {
+        String label = getBuildFileString(element.getProject(), element.getFilePath());
+        return String.format("(%s)", label);
+      }
+
+      @Override
+      public Icon getIcon(boolean unused) {
+        return element.getIcon(0);
+      }
+    };
+  }
+
+  @Override
   public String toString() {
     return getBuildFileString(getProject(), getFilePath());
   }
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/FuncallExpression.java b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/FuncallExpression.java
index 713807a..46701da 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/FuncallExpression.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/FuncallExpression.java
@@ -15,6 +15,7 @@
  */
 package com.google.idea.blaze.base.lang.buildfile.psi;
 
+import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile.BlazeFileType;
 import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
 import com.google.idea.blaze.base.lang.buildfile.references.FuncallReference;
 import com.google.idea.blaze.base.lang.buildfile.references.LabelUtils;
@@ -104,8 +105,10 @@
   @Nullable
   public Label resolveBuildLabel() {
     BuildFile containingFile = getContainingFile();
-    if (containingFile == null
-        || containingFile.getBlazeFileType() == BuildFile.BlazeFileType.SkylarkExtension) {
+    if (containingFile == null) {
+      return null;
+    }
+    if (containingFile.getBlazeFileType() != BlazeFileType.BuildPackage) {
       return null;
     }
     return LabelUtils.createLabelFromRuleName(getBlazePackage(), getNameArgumentValue());
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/StringLiteral.java b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/StringLiteral.java
index 027107e..933bd47 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/StringLiteral.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/StringLiteral.java
@@ -18,6 +18,7 @@
 import com.google.idea.blaze.base.lang.buildfile.psi.Argument.Keyword;
 import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
 import com.google.idea.blaze.base.lang.buildfile.references.AttributeSpecificStringLiteralReferenceProvider;
+import com.google.idea.blaze.base.lang.buildfile.references.ExternalWorkspaceReferenceFragment;
 import com.google.idea.blaze.base.lang.buildfile.references.LabelReference;
 import com.google.idea.blaze.base.lang.buildfile.references.LoadedSymbolReference;
 import com.google.idea.blaze.base.lang.buildfile.references.PackageReferenceFragment;
@@ -128,8 +129,11 @@
     }
     PsiReference primaryReference = getReference();
     if (primaryReference instanceof LabelReference) {
+      LabelReference labelReference = (LabelReference) primaryReference;
       return new PsiReference[] {
-        primaryReference, new PackageReferenceFragment((LabelReference) primaryReference)
+        primaryReference,
+        new PackageReferenceFragment(labelReference),
+        new ExternalWorkspaceReferenceFragment(labelReference)
       };
     }
     return primaryReference != null
@@ -159,7 +163,7 @@
   /** If this string is an attribute value within a BUILD rule, return the attribute type. */
   @Nullable
   private String getParentAttributeName() {
-    Keyword parentKeyword = PsiUtils.getParentOfType(this, Keyword.class);
+    Keyword parentKeyword = PsiUtils.getParentOfType(this, Keyword.class, true);
     return parentKeyword != null ? parentKeyword.getName() : null;
   }
 
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/util/PsiUtils.java b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/util/PsiUtils.java
index 30d8c5e..213586b 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/psi/util/PsiUtils.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/psi/util/PsiUtils.java
@@ -67,13 +67,14 @@
    * a parent of type PsiDirectory.
    */
   @Nullable
-  public static <T extends PsiElement> T getParentOfType(PsiElement element, Class<T> psiClass) {
-    PsiElement parent = element.getParent();
-    while (parent != null && !(parent instanceof PsiDirectory)) {
-      if (psiClass.isInstance(parent)) {
-        return (T) parent;
+  public static <T extends PsiElement> T getParentOfType(
+      PsiElement element, Class<T> psiClass, boolean strict) {
+    element = strict ? element.getParent() : element;
+    while (element != null && !(element instanceof PsiDirectory)) {
+      if (psiClass.isInstance(element)) {
+        return psiClass.cast(element);
       }
-      parent = parent.getParent();
+      element = element.getParent();
     }
     return null;
   }
@@ -159,7 +160,7 @@
    * Unwraps ParenthesizedExpression.<br>
    * For other types, returns the input expression.
    */
-  public static PsiElement getReferencedTarget(Expression expr) {
+  private static PsiElement getReferencedTarget(Expression expr) {
     PsiElement element = expr;
     while (true) {
       PsiElement unwrapped = unwrap(element);
@@ -170,6 +171,7 @@
     }
   }
 
+  @Nullable
   private static PsiElement unwrap(PsiElement expr) {
     if (expr instanceof ParenthesizedExpression) {
       return ((ParenthesizedExpression) expr).getContainedExpression();
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/quickfix/DeprecatedLoadQuickFix.java b/base/src/com/google/idea/blaze/base/lang/buildfile/quickfix/DeprecatedLoadQuickFix.java
index c58a039..2fdb3a3 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/quickfix/DeprecatedLoadQuickFix.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/quickfix/DeprecatedLoadQuickFix.java
@@ -18,6 +18,7 @@
 import com.google.idea.blaze.base.bazel.BuildSystemProvider;
 import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
 import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
+import com.google.idea.blaze.base.lang.buildfile.references.LabelUtils;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.settings.Blaze;
@@ -56,7 +57,7 @@
 
   private static void fixLoadString(Project project, StringLiteral importString) {
     String contents = importString.getStringContents();
-    if (!contents.startsWith("/") || contents.startsWith("//")) {
+    if (!contents.startsWith("/") || LabelUtils.isAbsolute(contents)) {
       return;
     }
     WorkspaceRoot root = WorkspaceRoot.fromProjectSafe(project);
@@ -81,7 +82,7 @@
     if (relativePath == null) {
       return;
     }
-    String newString = "//" + packagePath + ":" + relativePath;
+    String newString = "//" + packagePath + ":" + relativePath + ".bzl";
 
     ASTNode node = importString.getNode();
     node.replaceChild(
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/refactor/BuildNamesValidator.java b/base/src/com/google/idea/blaze/base/lang/buildfile/refactor/BuildNamesValidator.java
index f85425d..ded303f 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/refactor/BuildNamesValidator.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/refactor/BuildNamesValidator.java
@@ -15,18 +15,24 @@
  */
 package com.google.idea.blaze.base.lang.buildfile.refactor;
 
+import com.google.common.collect.ImmutableSet;
 import com.google.idea.blaze.base.lang.buildfile.lexer.BuildLexer;
 import com.google.idea.blaze.base.lang.buildfile.lexer.BuildLexerBase;
 import com.google.idea.blaze.base.lang.buildfile.lexer.TokenKind;
 import com.intellij.lang.refactoring.NamesValidator;
 import com.intellij.openapi.project.Project;
+import java.util.stream.Collectors;
 
-/** Used for rename validation */
+/** Used for rename validation of elements which aren't string literals. */
 public class BuildNamesValidator implements NamesValidator {
 
+  private static final ImmutableSet<String> KEYWORDS =
+      ImmutableSet.copyOf(
+          TokenKind.KEYWORDS.stream().map(TokenKind::toString).collect(Collectors.toSet()));
+
   @Override
   public boolean isKeyword(String s, Project project) {
-    return false;
+    return KEYWORDS.contains(s);
   }
 
   @Override
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/refactor/TargetRenameValidator.java b/base/src/com/google/idea/blaze/base/lang/buildfile/refactor/TargetRenameValidator.java
new file mode 100644
index 0000000..a46ccad
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/refactor/TargetRenameValidator.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.lang.buildfile.refactor;
+
+import com.google.idea.blaze.base.lang.buildfile.psi.FuncallExpression;
+import com.google.idea.blaze.base.model.primitives.TargetName;
+import com.intellij.patterns.ElementPattern;
+import com.intellij.patterns.PlatformPatterns;
+import com.intellij.psi.PsiElement;
+import com.intellij.refactoring.rename.RenameInputValidator;
+import com.intellij.util.ProcessingContext;
+
+/** Overrides name validation for target names. */
+public class TargetRenameValidator implements RenameInputValidator {
+
+  @Override
+  public ElementPattern<? extends PsiElement> getPattern() {
+    // FuncallExpression is the owner of the target name.
+    return PlatformPatterns.psiElement(FuncallExpression.class);
+  }
+
+  @Override
+  public boolean isInputValid(String newName, PsiElement element, ProcessingContext context) {
+    return TargetName.validate(newName);
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/references/BuildReferenceManager.java b/base/src/com/google/idea/blaze/base/lang/buildfile/references/BuildReferenceManager.java
index 9b72b1d..4738bdd 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/references/BuildReferenceManager.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/references/BuildReferenceManager.java
@@ -25,6 +25,7 @@
 import com.google.idea.blaze.base.model.primitives.TargetName;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.blaze.base.sync.workspace.WorkspaceHelper;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolverProvider;
 import com.intellij.openapi.components.ServiceManager;
@@ -58,19 +59,19 @@
   /** Finds the PSI element associated with the given label. */
   @Nullable
   public PsiElement resolveLabel(Label label) {
-    return resolveLabel(label.blazePackage(), label.targetName(), false);
+    return resolveLabel(label, false);
   }
 
   /** Finds the PSI element associated with the given label. */
   @Nullable
-  public PsiElement resolveLabel(
-      WorkspacePath packagePath, TargetName targetName, boolean excludeRules) {
-    File packageDir = resolvePackage(packagePath);
+  public PsiElement resolveLabel(Label label, boolean excludeRules) {
+    File packageDir = WorkspaceHelper.resolveBlazePackage(project, label);
     if (packageDir == null) {
       return null;
     }
 
-    if (targetName.toString().equals("__pkg__")) {
+    String targetName = label.targetName().toString();
+    if (targetName.equals("__pkg__")) {
       return findBuildFile(packageDir);
     }
 
@@ -82,7 +83,7 @@
     }
 
     // try a direct file reference (e.g. ":a.java")
-    File fullFile = new File(packageDir, targetName.toString());
+    File fullFile = new File(packageDir, targetName);
     if (FileAttributeProvider.getInstance().exists(fullFile)) {
       return resolveFile(fullFile);
     }
@@ -90,9 +91,9 @@
     return null;
   }
 
-  private FuncallExpression findRule(File packageDir, TargetName targetName) {
+  private FuncallExpression findRule(File packageDir, String targetName) {
     BuildFile psiFile = findBuildFile(packageDir);
-    return psiFile != null ? psiFile.findRule(targetName.toString()) : null;
+    return psiFile != null ? psiFile.findRule(targetName) : null;
   }
 
   @Nullable
@@ -190,7 +191,8 @@
   }
 
   private BuildLookupElement lookupForFile(VirtualFile file, FileLookupData lookupData) {
-    WorkspacePath workspacePath = getWorkspaceRelativePath(file.getPath());
+    WorkspacePath workspacePath =
+        WorkspaceHelper.resolveWorkspacePath(project, new File(file.getPath()));
     return lookupData.lookupElementForFile(project, file, workspacePath);
   }
 
@@ -244,10 +246,4 @@
     String rulePathParent = PathUtil.getParentPath(targetName.toString());
     return new File(packageFile, rulePathParent);
   }
-
-  @Nullable
-  public WorkspacePath getWorkspaceRelativePath(String absolutePath) {
-    WorkspacePathResolver pathResolver = getWorkspacePathResolver();
-    return pathResolver != null ? pathResolver.getWorkspacePath(new File(absolutePath)) : null;
-  }
 }
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/references/ExternalWorkspaceReferenceFragment.java b/base/src/com/google/idea/blaze/base/lang/buildfile/references/ExternalWorkspaceReferenceFragment.java
new file mode 100644
index 0000000..521f432
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/references/ExternalWorkspaceReferenceFragment.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright 2016 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.lang.buildfile.references;
+
+import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
+import com.google.idea.blaze.base.lang.buildfile.psi.FuncallExpression;
+import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
+import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.intellij.lang.ASTNode;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFileSystemItem;
+import com.intellij.psi.PsiReferenceBase;
+import com.intellij.util.IncorrectOperationException;
+import com.intellij.util.ObjectUtils;
+import javax.annotation.Nullable;
+
+/** The external workspace component of a label (between '@' and '//') */
+public class ExternalWorkspaceReferenceFragment extends PsiReferenceBase<StringLiteral> {
+
+  public ExternalWorkspaceReferenceFragment(LabelReference labelReference) {
+    super(labelReference.getElement(), labelReference.getRangeInElement(), labelReference.isSoft());
+  }
+
+  @Override
+  public TextRange getRangeInElement() {
+    String rawText = myElement.getText();
+    boolean valid = LabelUtils.getExternalWorkspaceComponent(myElement.getStringContents()) != null;
+    if (!valid) {
+      return TextRange.EMPTY_RANGE;
+    }
+    int endIndex = rawText.indexOf("//");
+    if (endIndex == -1) {
+      endIndex = rawText.length() - 1;
+    }
+    return new TextRange(1, endIndex);
+  }
+
+  @Nullable
+  @Override
+  public FuncallExpression resolve() {
+    String name = LabelUtils.getExternalWorkspaceComponent(myElement.getStringContents());
+    if (name == null) {
+      return null;
+    }
+    BuildFile workspaceFile = resolveProjectWorkspaceFile(myElement.getProject());
+    return workspaceFile != null ? workspaceFile.findRule(name) : null;
+  }
+
+  @Nullable
+  private static BuildFile resolveProjectWorkspaceFile(Project project) {
+    WorkspaceRoot projectRoot = WorkspaceRoot.fromProject(project);
+    if (projectRoot == null) {
+      return null;
+    }
+    PsiFileSystemItem workspaceFile =
+        BuildReferenceManager.getInstance(project)
+            .resolveFile(projectRoot.fileForPath(new WorkspacePath("WORKSPACE")));
+    return ObjectUtils.tryCast(workspaceFile, BuildFile.class);
+  }
+
+  @Override
+  public Object[] getVariants() {
+    return EMPTY_ARRAY;
+  }
+
+  @Override
+  public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
+    String oldString = myElement.getStringContents();
+    int slashesIndex = oldString.indexOf("//");
+    String newString =
+        String.format(
+            "@%s%s", newElementName, slashesIndex == -1 ? "" : oldString.substring(slashesIndex));
+    return handleRename(newString);
+  }
+
+  @Override
+  public PsiElement bindToElement(PsiElement element) throws IncorrectOperationException {
+    return myElement;
+  }
+
+  private PsiElement handleRename(String newStringContents) {
+    ASTNode node = myElement.getNode();
+    node.replaceChild(
+        node.getFirstChildNode(),
+        PsiUtils.createNewLabel(myElement.getProject(), newStringContents));
+    return myElement;
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/references/FileLookupData.java b/base/src/com/google/idea/blaze/base/lang/buildfile/references/FileLookupData.java
index 8a21adb..36ae50c 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/references/FileLookupData.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/references/FileLookupData.java
@@ -19,6 +19,7 @@
 import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
 import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
 import com.google.idea.blaze.base.lang.buildfile.search.BlazePackage;
+import com.google.idea.blaze.base.model.primitives.Label;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.settings.Blaze;
 import com.intellij.icons.AllIcons;
@@ -89,11 +90,14 @@
       StringLiteral element,
       @Nullable BuildFile basePackage,
       @Nullable VirtualFileFilter fileFilter) {
-    String basePackagePath =
-        basePackage != null ? basePackage.getWorkspaceRelativePackagePath() : null;
-    if (basePackagePath == null) {
+    if (basePackage == null) {
       return null;
     }
+    Label packageLabel = basePackage.getPackageLabel();
+    if (packageLabel == null) {
+      return null;
+    }
+    String basePackagePath = packageLabel.blazePackage().relativePath();
     String filePath = basePackagePath + "/" + LabelUtils.getRuleComponent(originalLabel);
     return new FileLookupData(
         originalLabel,
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/references/GlobReference.java b/base/src/com/google/idea/blaze/base/lang/buildfile/references/GlobReference.java
index c3ddb46..1f349c1 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/references/GlobReference.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/references/GlobReference.java
@@ -17,7 +17,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
-import com.google.idea.blaze.base.io.FileAttributeProvider;
+import com.google.idea.blaze.base.bazel.BuildSystemProvider;
 import com.google.idea.blaze.base.lang.buildfile.globbing.UnixGlob;
 import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
 import com.google.idea.blaze.base.lang.buildfile.psi.Expression;
@@ -25,7 +25,9 @@
 import com.google.idea.blaze.base.lang.buildfile.psi.ListLiteral;
 import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
 import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
+import com.google.idea.blaze.base.settings.Blaze;
 import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.TextRange;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiElementResolveResult;
@@ -109,19 +111,19 @@
     if (includes.isEmpty()) {
       return ResolveResult.EMPTY_ARRAY;
     }
-
+    Project project = element.getProject();
     try {
       List<File> files =
           UnixGlob.forPath(containingDirectory)
               .addPatterns(includes)
               .addExcludes(excludes)
               .setExcludeDirectories(directoriesExcluded)
-              .setDirectoryFilter(directoryFilter(containingDirectory.getPath()))
+              .setDirectoryFilter(directoryFilter(project, containingDirectory.getPath()))
               .glob();
+
       List<ResolveResult> results = Lists.newArrayListWithCapacity(files.size());
       for (File file : files) {
-        PsiFileSystemItem psiFile =
-            BuildReferenceManager.getInstance(element.getProject()).resolveFile(file);
+        PsiFileSystemItem psiFile = BuildReferenceManager.getInstance(project).resolveFile(file);
         if (psiFile != null) {
           results.add(new PsiElementResolveResult(psiFile));
         }
@@ -133,14 +135,14 @@
     }
   }
 
-  private static Predicate<File> directoryFilter(String base) {
+  /** Don't traverse sub-directories which are themselves blaze packages */
+  private static Predicate<File> directoryFilter(Project project, String base) {
+    BuildSystemProvider provider = Blaze.getBuildSystemProvider(project);
     return file -> {
       if (base.equals(file.getPath())) {
         return true;
       }
-      File child = new File(file, "BUILD");
-      FileAttributeProvider attributeProvider = FileAttributeProvider.getInstance();
-      return !attributeProvider.exists(child) || attributeProvider.isDirectory(child);
+      return provider.findBuildFileInDirectory(file) == null;
     };
   }
 
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/references/LabelReference.java b/base/src/com/google/idea/blaze/base/lang/buildfile/references/LabelReference.java
index 9bbf574..a3457bb 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/references/LabelReference.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/references/LabelReference.java
@@ -36,7 +36,6 @@
 import com.intellij.util.ArrayUtil;
 import com.intellij.util.IncorrectOperationException;
 import javax.annotation.Nullable;
-import org.jetbrains.annotations.NotNull;
 
 /** Converts a blaze label into an absolute path, then resolves that path to a PsiElements */
 public class LabelReference extends PsiReferenceBase<StringLiteral> {
@@ -51,7 +50,7 @@
     /* Possibilities:
      * - target
      * - data file (.java, .txt, etc.)
-     * - glob contents (not yet handling globs)
+     * - glob contents
      */
     return resolveTarget(myElement.getStringContents());
   }
@@ -65,8 +64,8 @@
     if (!validLabelLocation(myElement)) {
       return null;
     }
-    if (!labelString.startsWith("//") && insideSkylarkExtension(myElement)) {
-      return getReferenceManager().resolveLabel(label.blazePackage(), label.targetName(), true);
+    if (!LabelUtils.isAbsolute(labelString) && insideSkylarkExtension(myElement)) {
+      return getReferenceManager().resolveLabel(label, true);
     }
     return getReferenceManager().resolveLabel(label);
   }
@@ -86,7 +85,6 @@
     return true;
   }
 
-  @NotNull
   @Override
   public Object[] getVariants() {
     if (!validLabelLocation(myElement)) {
@@ -110,7 +108,8 @@
     }
     String self = null;
     if (referencedBuildFile == myElement.getContainingFile()) {
-      FuncallExpression funcall = PsiUtils.getParentOfType(myElement, FuncallExpression.class);
+      FuncallExpression funcall =
+          PsiUtils.getParentOfType(myElement, FuncallExpression.class, true);
       if (funcall != null) {
         self = funcall.getName();
       }
@@ -242,8 +241,7 @@
       return null;
     }
     BlazePackage blazePackage = myElement.getBlazePackage();
-    return LabelUtils.createLabelFromString(
-        blazePackage != null ? blazePackage.buildFile : null, labelString);
+    return LabelUtils.createLabelFromString(blazePackage, labelString);
   }
 
   private static boolean skylarkExtensionReference(StringLiteral element) {
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/references/LabelUtils.java b/base/src/com/google/idea/blaze/base/lang/buildfile/references/LabelUtils.java
index db58991..cf3e8df 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/references/LabelUtils.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/references/LabelUtils.java
@@ -54,8 +54,8 @@
     if (blazePackage == null || ruleName == null) {
       return null;
     }
-    WorkspacePath packagePath = blazePackage.buildFile.getPackageWorkspacePath();
-    return createLabelFromRuleName(packagePath, ruleName);
+    Label packageLabel = blazePackage.buildFile.getPackageLabel();
+    return packageLabel != null ? packageLabel.withTargetName(ruleName) : null;
   }
 
   public static Label createLabelFromRuleName(
@@ -67,36 +67,35 @@
     if (packagePath == null || name == null) {
       return null;
     }
-    // TODO: Is Label too inefficient?
-    // (validation done twice,creating List during constructor,
-    // re-parsing to extract the package/rule each time)
-    return new Label(packagePath, name);
+    return Label.create(packagePath, name);
   }
 
   /**
-   * Canonicalizes the label (to the form //packagePath:packageRelativeTarget). Returns null if the
-   * string does not represent a valid label.
+   * Canonicalizes the label (to the form [@external_workspace]//packagePath:packageRelativeTarget).
+   * Returns null if the string does not represent a valid label.
    */
   @Nullable
   public static Label createLabelFromString(
-      @Nullable BuildFile file, @Nullable String labelString) {
+      @Nullable BlazePackage blazePackage, @Nullable String labelString) {
     if (labelString == null) {
       return null;
     }
     int colonIndex = labelString.indexOf(':');
-    if (labelString.startsWith("//")) {
+    if (isAbsolute(labelString)) {
       if (colonIndex == -1) {
         // add the implicit rule name
         labelString += ":" + PathUtil.getFileName(labelString);
       }
       return Label.createIfValid(labelString);
     }
-    WorkspacePath packagePath = file != null ? file.getPackageWorkspacePath() : null;
-    if (packagePath == null) {
+    // package-relative label of the form '[:]relativePath'
+    if (colonIndex > 0 || blazePackage == null) {
       return null;
     }
-    String localPath = colonIndex == -1 ? labelString : labelString.substring(1);
-    return Label.createIfValid("//" + packagePath.relativePath() + ":" + localPath);
+    Label packageLabel = blazePackage.getPackageLabel();
+    return packageLabel != null
+        ? packageLabel.withTargetName(labelString.substring(colonIndex + 1))
+        : null;
   }
 
   /** The blaze file referenced by the label. */
@@ -121,12 +120,33 @@
     return labelString.startsWith(":") ? labelString.substring(1) : labelString;
   }
 
+  /** For a label of the form '[@ext]//package/path:target/name', returns '//package/path' */
   public static String getPackagePathComponent(String labelString) {
-    if (!labelString.startsWith("//")) {
+    if (!isAbsolute(labelString)) {
+      return "";
+    }
+    int slashesIndex = labelString.indexOf("//");
+    if (slashesIndex == -1) {
       return "";
     }
     int colonIndex = labelString.indexOf(':');
-    return colonIndex == -1 ? labelString : labelString.substring(0, colonIndex);
+    return colonIndex == -1
+        ? labelString.substring(slashesIndex)
+        : labelString.substring(slashesIndex, colonIndex);
+  }
+
+  @Nullable
+  public static String getExternalWorkspaceComponent(String labelString) {
+    if (!labelString.startsWith("@")) {
+      return null;
+    }
+    int slashesIndex = labelString.indexOf("//");
+    return slashesIndex == -1 ? null : labelString.substring(1, slashesIndex);
+  }
+
+  /** Returns false for package-relative labels */
+  public static boolean isAbsolute(String labelString) {
+    return labelString.startsWith("//") || labelString.startsWith("@");
   }
 
   /** 'load' reference. Of the form [path][/ or :][extra_path/]file_name.bzl */
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/references/PackageReferenceFragment.java b/base/src/com/google/idea/blaze/base/lang/buildfile/references/PackageReferenceFragment.java
index 6dba496..746d4e5 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/references/PackageReferenceFragment.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/references/PackageReferenceFragment.java
@@ -18,6 +18,7 @@
 import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
 import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
 import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
+import com.google.idea.blaze.base.model.primitives.Label;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.intellij.lang.ASTNode;
 import com.intellij.openapi.util.TextRange;
@@ -27,7 +28,7 @@
 import com.intellij.util.PathUtil;
 import javax.annotation.Nullable;
 
-/** The label component preceeding the colon. */
+/** The label component preceding the colon. */
 public class PackageReferenceFragment extends PsiReferenceBase<StringLiteral> {
 
   public PackageReferenceFragment(LabelReference labelReference) {
@@ -84,10 +85,11 @@
     if (element.equals(resolve())) {
       return myElement;
     }
-    WorkspacePath newPath = ((BuildFile) element).getPackageWorkspacePath();
-    if (newPath == null) {
+    Label newPackageLabel = ((BuildFile) element).getPackageLabel();
+    if (newPackageLabel == null) {
       return myElement;
     }
+    String newPath = newPackageLabel.blazePackage().toString();
     String labelString = myElement.getStringContents();
     int colonIndex = labelString.indexOf(':');
     if (colonIndex != -1) {
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/search/BlazePackage.java b/base/src/com/google/idea/blaze/base/lang/buildfile/search/BlazePackage.java
index 51cf7a7..94f2f48 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/search/BlazePackage.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/search/BlazePackage.java
@@ -17,8 +17,9 @@
 
 import com.google.idea.blaze.base.bazel.BuildSystemProvider;
 import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
-import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.Label;
 import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.blaze.base.sync.workspace.WorkspaceHelper;
 import com.intellij.history.core.Paths;
 import com.intellij.openapi.roots.ProjectFileIndex;
 import com.intellij.openapi.vfs.VirtualFile;
@@ -32,7 +33,10 @@
 import java.util.Objects;
 import javax.annotation.Nullable;
 
-/** Defines the files accessible by a given blaze package. */
+/**
+ * A Blaze package is a directory containing a BUILD file, plus all subdirectories which aren't
+ * themselves Blaze packages.
+ */
 public class BlazePackage {
 
   @Nullable
@@ -98,6 +102,11 @@
     return new BlazePackageSearchScope(this, onlyBlazeFiles);
   }
 
+  @Nullable
+  public Label getPackageLabel() {
+    return WorkspaceHelper.getBuildLabel(buildFile.getProject(), buildFile.getFile());
+  }
+
   /**
    * Returns the file path relative to this blaze package, or null if it does lie inside this
    * package
@@ -110,19 +119,13 @@
 
   /** Formats the child file path as a BUILD label (i.e. "//package_path[:relative_path]") */
   @Nullable
-  public String getBuildLabelForChild(String filePath) {
-    WorkspacePath packagePath = buildFile.getPackageWorkspacePath();
-    if (packagePath == null) {
+  public Label getBuildLabelForChild(String filePath) {
+    Label parentPackage = getPackageLabel();
+    if (parentPackage == null) {
       return null;
     }
     String relativePath = getPackageRelativePath(filePath);
-    if (relativePath == null) {
-      return null;
-    }
-    if (relativePath.isEmpty()) {
-      return "//" + packagePath;
-    }
-    return "//" + packagePath + ":" + relativePath;
+    return parentPackage.withTargetName(relativePath);
   }
 
   /**
@@ -192,7 +195,7 @@
   public String toString() {
     return String.format(
         "%s package: %s",
-        Blaze.buildSystemName(buildFile.getProject()), buildFile.getPackageWorkspacePath());
+        Blaze.buildSystemName(buildFile.getProject()), buildFile.getPackageLabel());
   }
 
   public static boolean hasBlazePackageChild(PsiDirectory directory) {
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/search/BlazePackageSearchScope.java b/base/src/com/google/idea/blaze/base/lang/buildfile/search/BlazePackageSearchScope.java
index d5f6606..841ad88 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/search/BlazePackageSearchScope.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/search/BlazePackageSearchScope.java
@@ -65,7 +65,7 @@
   public String toString() {
     return String.format(
         "%s directory scope: %s",
-        Blaze.buildSystemName(getProject()), blazePackage.buildFile.getPackageWorkspacePath());
+        Blaze.buildSystemName(getProject()), blazePackage.buildFile.getPackageLabel());
   }
 
   @Override
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/search/BuildReferenceSearcher.java b/base/src/com/google/idea/blaze/base/lang/buildfile/search/BuildReferenceSearcher.java
index 44af324..d35fc90 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/search/BuildReferenceSearcher.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/search/BuildReferenceSearcher.java
@@ -24,7 +24,6 @@
 import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
 import com.google.idea.blaze.base.lang.buildfile.references.LabelUtils;
 import com.google.idea.blaze.base.model.primitives.Label;
-import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.intellij.openapi.application.QueryExecutorBase;
 import com.intellij.psi.PsiDirectory;
 import com.intellij.psi.PsiElement;
@@ -62,19 +61,22 @@
       processFileReferences(params, file);
       return;
     }
-
     if (!(element instanceof FuncallExpression)) {
       return;
     }
-
-    Label label = ((FuncallExpression) element).resolveBuildLabel();
+    FuncallExpression funcall = (FuncallExpression) element;
     PsiFile localFile = element.getContainingFile();
-    if (label == null || localFile == null) {
+    if (localFile == null) {
+      return;
+    }
+    Label label = funcall.resolveBuildLabel();
+    if (label == null) {
+      searchForExternalWorkspace(params, localFile, funcall);
       return;
     }
     List<String> stringsToSearch = LabelUtils.getAllValidLabelStrings(label, true);
     for (String string : stringsToSearch) {
-      if (string.startsWith("//")) {
+      if (LabelUtils.isAbsolute(string)) {
         searchForString(params, element, string);
       } else {
         // only a valid reference from local package -- restrict the search scope accordingly
@@ -118,17 +120,18 @@
 
   /** Find references to both the file itself, and build targets defined in the file. */
   private void processBuildFileReferences(SearchParameters params, BuildFile file) {
-    WorkspacePath workspacePath = file.getPackageWorkspacePath();
-    if (workspacePath == null) {
+    Label label = file.getBuildLabel();
+    if (label == null) {
       return;
     }
+    String labelString = label.toString();
     List<String> stringsToSearch = Lists.newArrayList();
     if (file.getBlazeFileType() == BlazeFileType.BuildPackage) {
-      stringsToSearch.add("//" + workspacePath);
+      // remove ':__pkg__' component of label
+      stringsToSearch.add(labelString.split(":", 2)[0]);
     } else {
-      stringsToSearch.add("//" + workspacePath + ":" + file.getName());
-      stringsToSearch.add(
-          "//" + workspacePath + "/" + file.getName()); // deprecated load/subinclude format
+      stringsToSearch.add(labelString);
+      stringsToSearch.add(labelString.replace(':', '/')); // deprecated load/subinclude format
     }
     for (String string : stringsToSearch) {
       searchForString(params, file, string);
@@ -162,4 +165,21 @@
     }
     params.getOptimizer().searchWord(string, scope, UsageSearchContext.IN_STRINGS, true, element);
   }
+
+  private static void searchForExternalWorkspace(
+      SearchParameters params, PsiFile file, FuncallExpression funcall) {
+    if (!isBlazeWorkspaceFile(file)) {
+      return;
+    }
+    String name = funcall.getNameArgumentValue();
+    if (name != null) {
+      searchForString(params, funcall, "@" + name);
+    }
+  }
+
+  /** Is the file a blaze WORKSPACE file */
+  private static boolean isBlazeWorkspaceFile(PsiFile file) {
+    return file instanceof BuildFile
+        && ((BuildFile) file).getBlazeFileType() == BlazeFileType.Workspace;
+  }
 }
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/sync/BuildLangSyncPlugin.java b/base/src/com/google/idea/blaze/base/lang/buildfile/sync/BuildLangSyncPlugin.java
index c901eb8..4a0f12b 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/sync/BuildLangSyncPlugin.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/sync/BuildLangSyncPlugin.java
@@ -18,6 +18,7 @@
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.idea.blaze.base.command.BlazeFlags;
 import com.google.idea.blaze.base.command.info.BlazeInfo;
+import com.google.idea.blaze.base.command.info.BlazeInfoRunner;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.lang.buildfile.language.semantics.BuildLanguageSpec;
 import com.google.idea.blaze.base.model.SyncState;
@@ -30,7 +31,6 @@
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
-import com.google.idea.blaze.base.sync.workspace.BlazeRoots;
 import com.google.idea.blaze.base.sync.workspace.WorkingSet;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import com.google.repackaged.devtools.build.lib.query2.proto.proto2api.Build;
@@ -53,7 +53,7 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings,
-      BlazeRoots blazeRoots,
+      BlazeInfo blazeInfo,
       @Nullable WorkingSet workingSet,
       WorkspacePathResolver workspacePathResolver,
       ArtifactLocationDecoder artifactLocationDecoder,
@@ -105,7 +105,7 @@
       // it's wasteful converting to a string and back, but uses existing code,
       // and has a very minor cost (this is only run once per workspace)
       ListenableFuture<byte[]> future =
-          BlazeInfo.getInstance()
+          BlazeInfoRunner.getInstance()
               .runBlazeInfoGetBytes(
                   context,
                   Blaze.getBuildSystemProvider(project).getSyncBinaryPath(),
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/validation/BuildElementValidation.java b/base/src/com/google/idea/blaze/base/lang/buildfile/validation/BuildElementValidation.java
index c069bb9..d8a8206 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/validation/BuildElementValidation.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/validation/BuildElementValidation.java
@@ -50,9 +50,9 @@
   private static final EnumSet<Build.Attribute.Discriminator> DICT_TYPES =
       EnumSet.of(
           Discriminator.LABEL_LIST_DICT,
+          Discriminator.LABEL_KEYED_STRING_DICT,
           Discriminator.STRING_DICT,
           Discriminator.STRING_LIST_DICT,
-          Discriminator.STRING_DICT_UNARY,
           Discriminator.LABEL_DICT_UNARY);
 
   private static final EnumSet<Build.Attribute.Discriminator> STRING_TYPES =
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/validation/BuiltInRuleAnnotator.java b/base/src/com/google/idea/blaze/base/lang/buildfile/validation/BuiltInRuleAnnotator.java
index 48f8136..8fa0362 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/validation/BuiltInRuleAnnotator.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/validation/BuiltInRuleAnnotator.java
@@ -43,8 +43,16 @@
     if (rule == null) {
       return;
     }
+    if (node.getReferencedElement() != null) {
+      // this has been locally overridden, so don't attempt validation
+      return;
+    }
     Set<String> missingAttributes = new TreeSet<>(rule.mandatoryAttributes.keySet());
     for (Argument arg : node.getArguments()) {
+      if (arg instanceof Argument.StarStar) {
+        missingAttributes.clear();
+        continue;
+      }
       String name = arg.getName();
       if (name == null) {
         continue;
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/validation/GlobPatternValidator.java b/base/src/com/google/idea/blaze/base/lang/buildfile/validation/GlobPatternValidator.java
index c82d736..f039e31 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/validation/GlobPatternValidator.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/validation/GlobPatternValidator.java
@@ -20,16 +20,12 @@
 
 /**
  * Support for resolving globs.
- *
- * <p>
  */
 public class GlobPatternValidator {
 
   /**
    * Validate a single glob pattern. If it's invalid, returns an error message. Otherwise, returns
    * null.
-   *
-   * <p>
    */
   @Nullable
   public static String validate(String pattern) {
@@ -58,6 +54,7 @@
         case '[':
         case ']':
           return "illegal character '" + c + "'";
+        default: // fall out
       }
     }
     Iterable<String> segments = Splitter.on('/').split(pattern);
diff --git a/base/src/com/google/idea/blaze/base/lang/buildfile/validation/LoadStatementAnnotator.java b/base/src/com/google/idea/blaze/base/lang/buildfile/validation/LoadStatementAnnotator.java
index b3c8a55..c51ccc8 100644
--- a/base/src/com/google/idea/blaze/base/lang/buildfile/validation/LoadStatementAnnotator.java
+++ b/base/src/com/google/idea/blaze/base/lang/buildfile/validation/LoadStatementAnnotator.java
@@ -53,6 +53,7 @@
     if (targetString == null
         || targetString.startsWith(":")
         || targetString.startsWith("//")
+        || targetString.startsWith("@")
         || targetString.length() < 2) {
       return;
     }
diff --git a/base/src/com/google/idea/blaze/base/lang/projectview/completion/AdditionalLanguagesCompletionContributor.java b/base/src/com/google/idea/blaze/base/lang/projectview/completion/AdditionalLanguagesCompletionContributor.java
index 4cf2f36..598372f 100644
--- a/base/src/com/google/idea/blaze/base/lang/projectview/completion/AdditionalLanguagesCompletionContributor.java
+++ b/base/src/com/google/idea/blaze/base/lang/projectview/completion/AdditionalLanguagesCompletionContributor.java
@@ -17,10 +17,14 @@
 
 import static com.intellij.patterns.PlatformPatterns.psiElement;
 
+import com.google.common.collect.Ordering;
 import com.google.idea.blaze.base.lang.projectview.language.ProjectViewLanguage;
 import com.google.idea.blaze.base.lang.projectview.psi.ProjectViewPsiListSection;
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspaceType;
 import com.google.idea.blaze.base.projectview.section.sections.AdditionalLanguagesSection;
+import com.google.idea.blaze.base.sync.SyncCache;
+import com.google.idea.blaze.base.sync.projectview.LanguageSupport;
 import com.intellij.codeInsight.completion.AutoCompletionContext;
 import com.intellij.codeInsight.completion.AutoCompletionDecision;
 import com.intellij.codeInsight.completion.CompletionContributor;
@@ -30,8 +34,11 @@
 import com.intellij.codeInsight.completion.CompletionType;
 import com.intellij.codeInsight.lookup.LookupElement;
 import com.intellij.codeInsight.lookup.LookupElementBuilder;
+import com.intellij.openapi.project.Project;
 import com.intellij.patterns.StandardPatterns;
 import com.intellij.util.ProcessingContext;
+import java.util.List;
+import java.util.stream.Collectors;
 
 /** Code completion for additional language types. */
 public class AdditionalLanguagesCompletionContributor extends CompletionContributor {
@@ -62,10 +69,28 @@
               CompletionParameters parameters,
               ProcessingContext context,
               CompletionResultSet result) {
-            for (LanguageClass type : LanguageClass.values()) {
+            for (LanguageClass type :
+                availableAdditionalLanguages(parameters.getEditor().getProject())) {
               result.addElement(LookupElementBuilder.create(type.getName()));
             }
           }
         });
   }
+
+  private static List<LanguageClass> availableAdditionalLanguages(Project project) {
+    List<LanguageClass> langs =
+        SyncCache.getInstance(project)
+            .get(
+                AdditionalLanguagesCompletionContributor.class,
+                (proj, projectData) ->
+                    additionalLanguages(projectData.workspaceLanguageSettings.getWorkspaceType()));
+    return langs == null ? additionalLanguages(LanguageSupport.getDefaultWorkspaceType()) : langs;
+  }
+
+  private static List<LanguageClass> additionalLanguages(WorkspaceType workspaceType) {
+    return LanguageSupport.availableAdditionalLanguages(workspaceType)
+        .stream()
+        .sorted(Ordering.usingToString())
+        .collect(Collectors.toList());
+  }
 }
diff --git a/base/src/com/google/idea/blaze/base/lang/projectview/documentation/ProjectViewDocumentationProvider.java b/base/src/com/google/idea/blaze/base/lang/projectview/documentation/ProjectViewDocumentationProvider.java
new file mode 100644
index 0000000..fda1879
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/lang/projectview/documentation/ProjectViewDocumentationProvider.java
@@ -0,0 +1,141 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.lang.projectview.documentation;
+
+import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
+import com.google.idea.blaze.base.lang.projectview.psi.ProjectViewSection;
+import com.google.idea.blaze.base.projectview.section.SectionParser;
+import com.google.idea.blaze.base.settings.Blaze;
+import com.intellij.lang.documentation.AbstractDocumentationProvider;
+import com.intellij.lang.documentation.ExternalDocumentationProvider;
+import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.List;
+import javax.annotation.Nullable;
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.methods.HeadMethod;
+import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
+
+/** Provides quick docs for some .blazeproject elements. */
+public class ProjectViewDocumentationProvider extends AbstractDocumentationProvider
+    implements ExternalDocumentationProvider {
+
+  @Nullable
+  private static SectionParser getSection(PsiElement element) {
+    ProjectViewSection section = PsiUtils.getParentOfType(element, ProjectViewSection.class, false);
+    return section != null ? section.getSectionParser() : null;
+  }
+
+  @Nullable
+  @Override
+  public String generateDoc(PsiElement element, @Nullable PsiElement originalElement) {
+    SectionParser section = getSection(element);
+    if (section == null) {
+      return null;
+    }
+    StringBuilder builder = new StringBuilder();
+    String quickDocs = section.quickDocs();
+    if (quickDocs != null) {
+      builder.append(wrapInTag("<p>" + section.quickDocs(), "code"));
+    }
+    String url = getUrlFor(element.getProject(), section, false);
+    if (url != null) {
+      builder.append(
+          String.format("<p><b>External documentation</b>:<br><a href=\"%s\">%s</a>", url, url));
+    }
+    return wrapInTag(wrapInTag(builder.toString(), "body"), "html");
+  }
+
+  private static String wrapInTag(String doc, String htmlTag) {
+    return String.format("<%s>%s</%s>", htmlTag, doc, htmlTag);
+  }
+
+  @Override
+  public boolean hasDocumentationFor(PsiElement element, PsiElement originalElement) {
+    return getUrlFor(element, false) != null;
+  }
+
+  @Override
+  public List<String> getUrlFor(PsiElement element, PsiElement originalElement) {
+    final String url = getUrlFor(element, true);
+    return url == null ? null : Collections.singletonList(url);
+  }
+
+  @Nullable
+  @Override
+  public String fetchExternalDocumentation(
+      Project project, PsiElement element, List<String> docUrls) {
+    return null;
+  }
+
+  @Override
+  public boolean canPromptToConfigureDocumentation(PsiElement element) {
+    return false;
+  }
+
+  @Override
+  public void promptToConfigureDocumentation(PsiElement element) {}
+
+  @Nullable
+  private static String getUrlFor(PsiElement element, boolean checkExistence) {
+    SectionParser section = getSection(element);
+    return section != null ? getUrlFor(element.getProject(), section, checkExistence) : null;
+  }
+
+  @Nullable
+  private static String getUrlFor(Project project, SectionParser section, boolean checkExistence) {
+    String baseDocsUrl = Blaze.getBuildSystemProvider(project).getProjectViewDocumentationUrl();
+    if (baseDocsUrl == null) {
+      return null;
+    }
+    String url = baseDocsUrl + "#" + section.getName();
+    if (checkExistence && !pageExists(url)) {
+      return baseDocsUrl;
+    }
+    return url;
+  }
+
+  private static boolean pageExists(String url) {
+    final HttpClient client = new HttpClient();
+    final HttpConnectionManagerParams params = client.getHttpConnectionManager().getParams();
+    params.setSoTimeout(5 * 1000);
+    params.setConnectionTimeout(5 * 1000);
+
+    try {
+      final HeadMethod method = new HeadMethod(url);
+      final int rc = client.executeMethod(method);
+      if (rc == 404) {
+        return false;
+      }
+    } catch (IllegalArgumentException e) {
+      return false;
+    } catch (IOException e) {
+      // ignore
+    }
+    return true;
+  }
+
+  @Nullable
+  @Override
+  public PsiElement getCustomDocumentationElement(
+      Editor editor, PsiFile file, @Nullable PsiElement contextElement) {
+    return PsiUtils.getParentOfType(contextElement, ProjectViewSection.class, false);
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/lang/projectview/formatting/ProjectViewCodeStyleSettingsProvider.java b/base/src/com/google/idea/blaze/base/lang/projectview/formatting/ProjectViewCodeStyleSettingsProvider.java
new file mode 100644
index 0000000..3df7613
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/lang/projectview/formatting/ProjectViewCodeStyleSettingsProvider.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.lang.projectview.formatting;
+
+import com.google.idea.blaze.base.lang.projectview.language.ProjectViewLanguage;
+import com.intellij.lang.Language;
+import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
+import com.intellij.psi.codeStyle.LanguageCodeStyleSettingsProvider;
+import javax.annotation.Nullable;
+
+/** Allows blazeproject-specific code style settings */
+public class ProjectViewCodeStyleSettingsProvider extends LanguageCodeStyleSettingsProvider {
+
+  @Override
+  public Language getLanguage() {
+    return ProjectViewLanguage.INSTANCE;
+  }
+
+  @Override
+  public String getCodeSample(SettingsType settingsType) {
+    return "";
+  }
+
+  @Nullable
+  @Override
+  public CommonCodeStyleSettings getDefaultCommonSettings() {
+    CommonCodeStyleSettings defaultSettings =
+        new CommonCodeStyleSettings(ProjectViewLanguage.INSTANCE);
+    defaultSettings.LINE_COMMENT_AT_FIRST_COLUMN = false;
+    defaultSettings.LINE_COMMENT_ADD_SPACE = true;
+    CommonCodeStyleSettings.IndentOptions indentOptions = defaultSettings.initIndentOptions();
+    indentOptions.TAB_SIZE = 2;
+    indentOptions.INDENT_SIZE = 2;
+    indentOptions.CONTINUATION_INDENT_SIZE = 2;
+    return defaultSettings;
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewPsiListSection.java b/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewPsiListSection.java
index d75547a..3d2ad2b 100644
--- a/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewPsiListSection.java
+++ b/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewPsiListSection.java
@@ -15,12 +15,22 @@
  */
 package com.google.idea.blaze.base.lang.projectview.psi;
 
+import com.google.idea.blaze.base.lang.projectview.lexer.ProjectViewTokenType;
 import com.intellij.lang.ASTNode;
+import com.intellij.psi.PsiElement;
+import javax.annotation.Nullable;
 
 /** Psi element for list section. */
-public class ProjectViewPsiListSection extends ProjectViewPsiElement {
+public class ProjectViewPsiListSection extends ProjectViewSection {
 
   public ProjectViewPsiListSection(ASTNode node) {
     super(node);
   }
+
+  @Nullable
+  @Override
+  public String getSectionName() {
+    PsiElement keyword = findChildByType(ProjectViewTokenType.LIST_KEYWORD);
+    return keyword != null ? keyword.getText() : null;
+  }
 }
diff --git a/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewPsiScalarSection.java b/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewPsiScalarSection.java
index 6f03ff4..19819a4 100644
--- a/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewPsiScalarSection.java
+++ b/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewPsiScalarSection.java
@@ -15,12 +15,22 @@
  */
 package com.google.idea.blaze.base.lang.projectview.psi;
 
+import com.google.idea.blaze.base.lang.projectview.lexer.ProjectViewTokenType;
 import com.intellij.lang.ASTNode;
+import com.intellij.psi.PsiElement;
+import javax.annotation.Nullable;
 
 /** Psi element for scalar section. */
-public class ProjectViewPsiScalarSection extends ProjectViewPsiElement {
+public class ProjectViewPsiScalarSection extends ProjectViewSection {
 
   public ProjectViewPsiScalarSection(ASTNode node) {
     super(node);
   }
+
+  @Nullable
+  @Override
+  public String getSectionName() {
+    PsiElement keyword = findChildByType(ProjectViewTokenType.SCALAR_KEYWORD);
+    return keyword != null ? keyword.getText() : null;
+  }
 }
diff --git a/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewSection.java b/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewSection.java
new file mode 100644
index 0000000..9e275bf
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/lang/projectview/psi/ProjectViewSection.java
@@ -0,0 +1,75 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.lang.projectview.psi;
+
+import com.google.idea.blaze.base.projectview.section.SectionParser;
+import com.google.idea.blaze.base.projectview.section.sections.Sections;
+import com.intellij.lang.ASTNode;
+import com.intellij.navigation.ItemPresentation;
+import com.intellij.navigation.NavigationItem;
+import javax.annotation.Nullable;
+import javax.swing.Icon;
+
+/** Psi element for a list or scalar section. */
+public abstract class ProjectViewSection extends ProjectViewPsiElement implements NavigationItem {
+
+  public ProjectViewSection(ASTNode node) {
+    super(node);
+  }
+
+  @Override
+  public ItemPresentation getPresentation() {
+    final ProjectViewSection element = this;
+    return new ItemPresentation() {
+      @Override
+      public String getPresentableText() {
+        return getSectionName();
+      }
+
+      @Override
+      public String getLocationString() {
+        return null;
+      }
+
+      @Override
+      public Icon getIcon(boolean unused) {
+        return element.getIcon(0);
+      }
+    };
+  }
+
+  @Override
+  public String getName() {
+    return getSectionName();
+  }
+
+  @Nullable
+  protected abstract String getSectionName();
+
+  @Nullable
+  public SectionParser getSectionParser() {
+    String text = getSectionName();
+    if (text == null) {
+      return null;
+    }
+    for (SectionParser parser : Sections.getParsers()) {
+      if (text.equals(parser.getName())) {
+        return parser;
+      }
+    }
+    return null;
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/lang/projectview/stubs/ProjectViewFileStubBuilder.java b/base/src/com/google/idea/blaze/base/lang/projectview/stubs/ProjectViewFileStubBuilder.java
new file mode 100644
index 0000000..dcf8917
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/lang/projectview/stubs/ProjectViewFileStubBuilder.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.lang.projectview.stubs;
+
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.stubs.BinaryFileStubBuilder;
+import com.intellij.psi.stubs.Stub;
+import com.intellij.util.indexing.FileContent;
+import javax.annotation.Nullable;
+
+/** Empty stub builder to suppress errors when IntelliJ is looking for stubs. */
+public class ProjectViewFileStubBuilder implements BinaryFileStubBuilder {
+  private static final int STUB_VERSION = 0;
+
+  @Override
+  public boolean acceptsFile(VirtualFile file) {
+    return false;
+  }
+
+  @Nullable
+  @Override
+  public Stub buildStubTree(FileContent fileContent) {
+    return null;
+  }
+
+  @Override
+  public int getStubVersion() {
+    return STUB_VERSION;
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/logging/EventLogger.java b/base/src/com/google/idea/blaze/base/logging/EventLogger.java
index 5f2a701..02a930f 100644
--- a/base/src/com/google/idea/blaze/base/logging/EventLogger.java
+++ b/base/src/com/google/idea/blaze/base/logging/EventLogger.java
@@ -38,18 +38,13 @@
 
   boolean isApplicable();
 
-  default void log(String eventType, Map<String, String> keyValues) {
-    log(eventType, keyValues, null);
-  }
-
-  default void log(
-      String eventType, Map<String, String> keyValues, @Nullable Long timestampInMillis) {
-    log(eventType, keyValues, timestampInMillis, null);
+  default void log(Class<?> loggingClass, String eventType, Map<String, String> keyValues) {
+    log(loggingClass, eventType, keyValues, null);
   }
 
   void log(
+      Class<?> loggingClass,
       String eventType,
       Map<String, String> keyValues,
-      @Nullable Long timestampInMillis,
       @Nullable Long durationInNanos);
 }
diff --git a/base/src/com/google/idea/blaze/base/logging/NullEventLogger.java b/base/src/com/google/idea/blaze/base/logging/NullEventLogger.java
index 15562ab..0546f7b 100644
--- a/base/src/com/google/idea/blaze/base/logging/NullEventLogger.java
+++ b/base/src/com/google/idea/blaze/base/logging/NullEventLogger.java
@@ -31,8 +31,8 @@
 
   @Override
   public void log(
+      Class<?> loggingClass,
       String eventType,
       Map<String, String> keyValues,
-      @Nullable Long timestampInMillis,
       @Nullable Long durationInNanos) {}
 }
diff --git a/base/src/com/google/idea/blaze/base/model/BlazeProjectData.java b/base/src/com/google/idea/blaze/base/model/BlazeProjectData.java
index 77862fd..bba404b 100644
--- a/base/src/com/google/idea/blaze/base/model/BlazeProjectData.java
+++ b/base/src/com/google/idea/blaze/base/model/BlazeProjectData.java
@@ -15,13 +15,12 @@
  */
 package com.google.idea.blaze.base.model;
 
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMultimap;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetKey;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
-import com.google.idea.blaze.base.sync.workspace.BlazeRoots;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import java.io.Serializable;
 import javax.annotation.concurrent.Immutable;
@@ -29,12 +28,11 @@
 /** The top-level object serialized to cache. */
 @Immutable
 public class BlazeProjectData implements Serializable {
-  private static final long serialVersionUID = 27L;
+  private static final long serialVersionUID = 28L;
 
   public final long syncTime;
   public final TargetMap targetMap;
-  public final ImmutableMap<String, String> blazeInfo;
-  public final BlazeRoots blazeRoots;
+  public final BlazeInfo blazeInfo;
   public final BlazeVersionData blazeVersionData;
   public final WorkspacePathResolver workspacePathResolver;
   public final ArtifactLocationDecoder artifactLocationDecoder;
@@ -45,19 +43,16 @@
   public BlazeProjectData(
       long syncTime,
       TargetMap targetMap,
-      ImmutableMap<String, String> blazeInfo,
-      BlazeRoots blazeRoots,
+      BlazeInfo blazeInfo,
       BlazeVersionData blazeVersionData,
       WorkspacePathResolver workspacePathResolver,
       ArtifactLocationDecoder artifactLocationDecoder,
       WorkspaceLanguageSettings workspaceLanguageSettings,
       SyncState syncState,
-      ImmutableMultimap<TargetKey, TargetKey> reverseDependencies,
-      Object dummy) {
+      ImmutableMultimap<TargetKey, TargetKey> reverseDependencies) {
     this.syncTime = syncTime;
     this.targetMap = targetMap;
     this.blazeInfo = blazeInfo;
-    this.blazeRoots = blazeRoots;
     this.blazeVersionData = blazeVersionData;
     this.workspacePathResolver = workspacePathResolver;
     this.artifactLocationDecoder = artifactLocationDecoder;
diff --git a/base/src/com/google/idea/blaze/base/model/BlazeVersionData.java b/base/src/com/google/idea/blaze/base/model/BlazeVersionData.java
index 1cbdbff..ded37ad 100644
--- a/base/src/com/google/idea/blaze/base/model/BlazeVersionData.java
+++ b/base/src/com/google/idea/blaze/base/model/BlazeVersionData.java
@@ -16,9 +16,9 @@
 package com.google.idea.blaze.base.model;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableMap;
 import com.google.idea.blaze.base.bazel.BazelVersion;
 import com.google.idea.blaze.base.bazel.BuildSystemProvider;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
 import java.io.Serializable;
@@ -59,10 +59,12 @@
     return bazelVersion != null && bazelVersion.isAtLeast(major, minor, bugfix);
   }
 
+  public BuildSystem buildSystem() {
+    return bazelVersion != null ? BuildSystem.Bazel : BuildSystem.Blaze;
+  }
+
   public static BlazeVersionData build(
-      BuildSystem buildSystem,
-      WorkspaceRoot workspaceRoot,
-      ImmutableMap<String, String> blazeInfo) {
+      BuildSystem buildSystem, WorkspaceRoot workspaceRoot, BlazeInfo blazeInfo) {
     Builder builder = new Builder();
     for (BuildSystemProvider provider : BuildSystemProvider.EP_NAME.getExtensions()) {
       provider.populateBlazeVersionData(buildSystem, workspaceRoot, blazeInfo, builder);
diff --git a/base/src/com/google/idea/blaze/base/model/primitives/Kind.java b/base/src/com/google/idea/blaze/base/model/primitives/Kind.java
index eba71f9..b5fbda8 100644
--- a/base/src/com/google/idea/blaze/base/model/primitives/Kind.java
+++ b/base/src/com/google/idea/blaze/base/model/primitives/Kind.java
@@ -15,9 +15,11 @@
  */
 package com.google.idea.blaze.base.model.primitives;
 
+import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultimap;
 import java.util.Arrays;
-import java.util.List;
+import java.util.Collection;
 
 /** Wrapper around a string for a blaze kind (android_library, android_test...) */
 public enum Kind {
@@ -25,6 +27,7 @@
   ANDROID_LIBRARY("android_library", LanguageClass.ANDROID),
   ANDROID_TEST("android_test", LanguageClass.ANDROID),
   ANDROID_ROBOLECTRIC_TEST("android_robolectric_test", LanguageClass.ANDROID),
+  ANDROID_SDK("android_sdk", LanguageClass.ANDROID),
   JAVA_LIBRARY("java_library", LanguageClass.JAVA),
   JAVA_TEST("java_test", LanguageClass.JAVA),
   JAVA_BINARY("java_binary", LanguageClass.JAVA),
@@ -57,10 +60,16 @@
   GO_APPENGINE_LIBRARY("go_appengine_library", LanguageClass.GO),
   GO_WRAP_CC("go_wrap_cc", LanguageClass.GO),
   INTELLIJ_PLUGIN_DEBUG_TARGET("intellij_plugin_debug_target", LanguageClass.JAVA),
+  SCALA_BINARY("scala_binary", LanguageClass.SCALA),
+  SCALA_LIBRARY("scala_library", LanguageClass.SCALA),
+  SCALA_MACRO_LIBRARY("scala_macro_library", LanguageClass.SCALA),
+  SCALA_TEST("scala_test", LanguageClass.SCALA),
   ;
 
   static final ImmutableMap<String, Kind> STRING_TO_KIND = makeStringToKindMap();
 
+  static final ImmutableMultimap<LanguageClass, Kind> PER_LANGUAGES_KINDS = makePerLanguageMap();
+
   private static ImmutableMap<String, Kind> makeStringToKindMap() {
     ImmutableMap.Builder<String, Kind> result = ImmutableMap.builder();
     for (Kind kind : Kind.values()) {
@@ -69,10 +78,22 @@
     return result.build();
   }
 
+  private static ImmutableMultimap<LanguageClass, Kind> makePerLanguageMap() {
+    ImmutableMultimap.Builder<LanguageClass, Kind> result = ImmutableMultimap.builder();
+    for (Kind kind : Kind.values()) {
+      result.put(kind.languageClass, kind);
+    }
+    return result.build();
+  }
+
   public static Kind fromString(String kindString) {
     return STRING_TO_KIND.get(kindString);
   }
 
+  public static ImmutableCollection<Kind> allKindsForLanguage(LanguageClass language) {
+    return PER_LANGUAGES_KINDS.get(language);
+  }
+
   private final String kind;
   private final LanguageClass languageClass;
 
@@ -94,7 +115,7 @@
     return isOneOf(Arrays.asList(kinds));
   }
 
-  public boolean isOneOf(List<Kind> kinds) {
+  public boolean isOneOf(Collection<Kind> kinds) {
     for (Kind kind : kinds) {
       if (this.equals(kind)) {
         return true;
diff --git a/base/src/com/google/idea/blaze/base/model/primitives/Label.java b/base/src/com/google/idea/blaze/base/model/primitives/Label.java
index c06f6a2..f86da52 100644
--- a/base/src/com/google/idea/blaze/base/model/primitives/Label.java
+++ b/base/src/com/google/idea/blaze/base/model/primitives/Label.java
@@ -23,7 +23,7 @@
 import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 
-/** Wrapper around a string for a blaze label (//package:rule). */
+/** Wrapper around a string for a blaze label ([@external_workspace]//package:rule). */
 @Immutable
 public final class Label extends TargetExpression {
   private static final Logger logger = Logger.getInstance(Label.class);
@@ -39,16 +39,31 @@
     return null;
   }
 
-  public Label(String label) {
-    super(label);
+  public static Label create(String label) {
     List<BlazeValidationError> errors = Lists.newArrayList();
     if (!validate(label, errors)) {
       BlazeValidationError.throwError(errors);
     }
+    return new Label(label);
   }
 
-  public Label(WorkspacePath packageName, TargetName newTargetName) {
-    this("//" + packageName.toString() + ":" + newTargetName.toString());
+  public static Label create(WorkspacePath packageName, TargetName newTargetName) {
+    return create(null, packageName, newTargetName);
+  }
+
+  public static Label create(
+      @Nullable String externalWorkspaceName, WorkspacePath packagePath, TargetName targetName) {
+    String fullLabel =
+        String.format(
+            "%s//%s:%s",
+            externalWorkspaceName != null ? "@" + externalWorkspaceName : "",
+            packagePath,
+            targetName);
+    return new Label(fullLabel);
+  }
+
+  private Label(String label) {
+    super(label);
   }
 
   public static boolean validate(String label) {
@@ -81,6 +96,25 @@
     return false;
   }
 
+  public boolean isExternal() {
+    return toString().startsWith("@");
+  }
+
+  /**
+   * Returns the external workspace referenced by this label, or null if it's a main workspace
+   * label.
+   */
+  @Nullable
+  public String externalWorkspaceName() {
+    String label = toString();
+    if (!label.startsWith("@")) {
+      return null;
+    }
+    int slashesIndex = label.indexOf("//");
+    logger.assertTrue(slashesIndex >= 0);
+    return label.substring(1, slashesIndex);
+  }
+
   /**
    * Extract the target name from a label. The target name follows a colon at the end of the label.
    *
@@ -106,7 +140,17 @@
     return new WorkspacePath(labelStr.substring(startIndex, colonIndex));
   }
 
-  public static boolean validatePackagePath(String path) {
+  /** A new label with the same workspace and package paths, but a different target name. */
+  @Nullable
+  public Label withTargetName(@Nullable String targetName) {
+    if (targetName == null) {
+      return null;
+    }
+    TargetName target = TargetName.createIfValid(targetName);
+    return target != null ? Label.create(externalWorkspaceName(), blazePackage(), target) : null;
+  }
+
+  static boolean validatePackagePath(String path) {
     return validatePackagePath(path, null);
   }
 
diff --git a/base/src/com/google/idea/blaze/base/model/primitives/LanguageClass.java b/base/src/com/google/idea/blaze/base/model/primitives/LanguageClass.java
index cf030a2..e9cb3a8 100644
--- a/base/src/com/google/idea/blaze/base/model/primitives/LanguageClass.java
+++ b/base/src/com/google/idea/blaze/base/model/primitives/LanguageClass.java
@@ -29,7 +29,9 @@
   TYPESCRIPT("typescript", ImmutableSet.of("ts", "ats")),
   DART("dart", ImmutableSet.of("dart")),
   GO("go", ImmutableSet.of("go")),
-  PYTHON("python", ImmutableSet.of("py", "pyw"));
+  PYTHON("python", ImmutableSet.of("py", "pyw")),
+  SCALA("scala", ImmutableSet.of("scala")),
+  ;
 
   private static final ImmutableMap<String, LanguageClass> RECOGNIZED_EXTENSIONS =
       extensionToClassMap();
@@ -65,6 +67,11 @@
     return null;
   }
 
+  @Override
+  public String toString() {
+    return name;
+  }
+
   /** Returns the LanguageClass associated with the given filename extension, if it's recognized. */
   @Nullable
   public static LanguageClass fromExtension(String filenameExtension) {
diff --git a/base/src/com/google/idea/blaze/base/model/primitives/TargetExpression.java b/base/src/com/google/idea/blaze/base/model/primitives/TargetExpression.java
index ea3d847..4e36aab 100644
--- a/base/src/com/google/idea/blaze/base/model/primitives/TargetExpression.java
+++ b/base/src/com/google/idea/blaze/base/model/primitives/TargetExpression.java
@@ -32,16 +32,21 @@
    *     it is not.
    */
   public static TargetExpression fromString(String expression) {
-    return Label.validate(expression) ? new Label(expression) : new TargetExpression(expression);
+    return Label.validate(expression) ? Label.create(expression) : new TargetExpression(expression);
   }
 
-  TargetExpression(String expression) {
+  protected TargetExpression(String expression) {
     // TODO(joshgiles): Validation/canonicalization for target expressions.
     // For reference, handled in Blaze/Bazel in TargetPattern.java.
     Preconditions.checkArgument(!expression.isEmpty(), "Target should be non-empty.");
     this.expression = expression;
   }
 
+  /** Is this an excluded target expression (i.e. starts with '-')? */
+  public boolean isExcluded() {
+    return expression.startsWith("-");
+  }
+
   @Override
   public String toString() {
     return expression;
@@ -63,8 +68,7 @@
 
   /** All targets in all packages below the given path */
   public static TargetExpression allFromPackageRecursive(WorkspacePath localPackage) {
-    if (localPackage.relativePath().isEmpty()) {
-      // localPackage is the workspace root
+    if (localPackage.isWorkspaceRoot()) {
       return new TargetExpression("//...:all");
     }
     return new TargetExpression("//" + localPackage.relativePath() + "/...:all");
diff --git a/base/src/com/google/idea/blaze/base/model/primitives/WorkspaceRoot.java b/base/src/com/google/idea/blaze/base/model/primitives/WorkspaceRoot.java
index b4a0a13..53d156d 100644
--- a/base/src/com/google/idea/blaze/base/model/primitives/WorkspaceRoot.java
+++ b/base/src/com/google/idea/blaze/base/model/primitives/WorkspaceRoot.java
@@ -108,7 +108,8 @@
 
   private WorkspacePath workspacePathFor(String path) {
     if (!isInWorkspace(path)) {
-      throw new IllegalArgumentException("File is not under this workspace");
+      throw new IllegalArgumentException(
+          String.format("File '%s' is not under workspace %s", path, directory));
     }
     if (directory.getPath().length() == path.length()) {
       return new WorkspacePath("");
diff --git a/base/src/com/google/idea/blaze/base/plugin/BlazeActionRemover.java b/base/src/com/google/idea/blaze/base/plugin/BlazeActionRemover.java
index 17e6043..c59731b 100644
--- a/base/src/com/google/idea/blaze/base/plugin/BlazeActionRemover.java
+++ b/base/src/com/google/idea/blaze/base/plugin/BlazeActionRemover.java
@@ -32,7 +32,7 @@
     }
   }
 
-  private static void replaceAction(String actionId, AnAction newAction) {
+  public static void replaceAction(String actionId, AnAction newAction) {
     ActionManager actionManager = ActionManager.getInstance();
     AnAction oldAction = actionManager.getAction(actionId);
     if (oldAction != null) {
diff --git a/base/src/com/google/idea/blaze/base/plugin/PluginUtils.java b/base/src/com/google/idea/blaze/base/plugin/PluginUtils.java
new file mode 100644
index 0000000..6156cbc
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/plugin/PluginUtils.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.plugin;
+
+import com.google.common.collect.ImmutableSet;
+import com.intellij.ide.plugins.IdeaPluginDescriptor;
+import com.intellij.ide.plugins.PluginManager;
+import com.intellij.openapi.extensions.PluginId;
+import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.PluginsAdvertiser;
+import com.intellij.openapi.util.EmptyRunnable;
+import com.intellij.pom.Navigatable;
+import com.intellij.pom.NavigatableAdapter;
+
+/** Utility methods for querying / manipulating other plugins. */
+public final class PluginUtils {
+
+  private PluginUtils() {}
+
+  /** If the plugin is already installed, enable it, otherwise both install and enable it. */
+  public static void installOrEnablePlugin(String pluginId) {
+    if (isPluginInstalled(pluginId)) {
+      PluginManager.enablePlugin(pluginId);
+    } else {
+      PluginsAdvertiser.installAndEnablePlugins(ImmutableSet.of(pluginId), EmptyRunnable.INSTANCE);
+    }
+  }
+
+  /** Returns a {@link Navigatable} which will install (if necessary) and enable the given plugin */
+  public static Navigatable installOrEnablePluginNavigable(String pluginId) {
+    return new NavigatableAdapter() {
+      @Override
+      public void navigate(boolean requestFocus) {
+        installOrEnablePlugin(pluginId);
+      }
+    };
+  }
+
+  public static boolean isPluginInstalled(String pluginId) {
+    return getPluginDescriptor(pluginId) != null;
+  }
+
+  public static boolean isPluginEnabled(String pluginId) {
+    IdeaPluginDescriptor descriptor = getPluginDescriptor(pluginId);
+    return descriptor != null && descriptor.isEnabled();
+  }
+
+  private static IdeaPluginDescriptor getPluginDescriptor(String pluginId) {
+    return PluginManager.getPlugin(PluginId.getId(pluginId));
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/prefetch/PrefetchFileSource.java b/base/src/com/google/idea/blaze/base/prefetch/PrefetchFileSource.java
index dcdc666..26c7491 100644
--- a/base/src/com/google/idea/blaze/base/prefetch/PrefetchFileSource.java
+++ b/base/src/com/google/idea/blaze/base/prefetch/PrefetchFileSource.java
@@ -16,6 +16,7 @@
 package com.google.idea.blaze.base.prefetch;
 
 import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.intellij.openapi.extensions.ExtensionPointName;
 import com.intellij.openapi.project.Project;
 import java.io.File;
@@ -28,7 +29,10 @@
       ExtensionPointName.create("com.google.idea.blaze.PrefetchFileSource");
   /** Adds any files or directories that we would be interested in prefetching. */
   void addFilesToPrefetch(
-      Project project, BlazeProjectData blazeProjectData, Collection<File> files);
+      Project project,
+      ProjectViewSet projectViewSet,
+      BlazeProjectData blazeProjectData,
+      Collection<File> files);
 
   /** Returns any source file extensions that are a good candidate for the {@link Prefetcher}. */
   Set<String> prefetchSrcFileExtensions();
diff --git a/base/src/com/google/idea/blaze/base/prefetch/PrefetchProjectInitializer.java b/base/src/com/google/idea/blaze/base/prefetch/PrefetchProjectInitializer.java
new file mode 100644
index 0000000..ed7b4cc
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/prefetch/PrefetchProjectInitializer.java
@@ -0,0 +1,116 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.prefetch;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.projectview.ProjectViewManager;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.settings.BlazeImportSettings;
+import com.google.idea.blaze.base.settings.BlazeImportSettingsManager;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManagerImpl;
+import com.google.idea.common.experiments.BoolExperiment;
+import com.intellij.openapi.application.TransactionGuard;
+import com.intellij.openapi.components.ApplicationComponent;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.progress.ProgressIndicator;
+import com.intellij.openapi.project.DumbModeTask;
+import com.intellij.openapi.project.DumbService;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.project.ProjectManager;
+import com.intellij.openapi.project.ProjectManagerAdapter;
+import com.intellij.util.TimeoutUtil;
+import java.io.IOException;
+import javax.annotation.Nullable;
+
+/** Run prefetching on project open, prior to initial indexing step. */
+public class PrefetchProjectInitializer extends ApplicationComponent.Adapter {
+
+  private static final Logger logger = Logger.getInstance(PrefetchProjectInitializer.class);
+
+  private static final BoolExperiment prefetchOnProjectOpen =
+      new BoolExperiment("prefetch.on.project.open2", true);
+
+  @Override
+  public void initComponent() {
+    ProjectManager projectManager = ProjectManager.getInstance();
+    projectManager.addProjectManagerListener(
+        new ProjectManagerAdapter() {
+          @Override
+          public void projectOpened(Project project) {
+            if (prefetchOnProjectOpen.getValue()) {
+              prefetchProjectFiles(project);
+            }
+          }
+        });
+  }
+
+  private static void prefetchProjectFiles(Project project) {
+    BlazeProjectData projectData = getBlazeProjectData(project);
+    if (projectData == null) {
+      return;
+    }
+    ProjectViewSet projectViewSet = ProjectViewManager.getInstance(project).getProjectViewSet();
+    if (projectViewSet == null) {
+      return;
+    }
+    long start = System.currentTimeMillis();
+    ListenableFuture<?> future =
+        PrefetchService.getInstance().prefetchProjectFiles(project, projectViewSet, projectData);
+    TransactionGuard.submitTransaction(
+        project,
+        () -> {
+          DumbService.getInstance(project).queueTask(new PrefetchTask(future, start));
+        });
+  }
+
+  static class PrefetchTask extends DumbModeTask {
+    private final ListenableFuture<?> future;
+    private final long startTimeMillis;
+
+    private PrefetchTask(ListenableFuture<?> future, long startTimeMillis) {
+      this.future = future;
+      this.startTimeMillis = startTimeMillis;
+    }
+
+    @Override
+    public void performInDumbMode(ProgressIndicator indicator) {
+      indicator.setIndeterminate(true);
+      indicator.setText("Prefetching files...");
+      while (!future.isCancelled() && !future.isDone()) {
+        indicator.checkCanceled();
+        TimeoutUtil.sleep(100);
+      }
+      long end = System.currentTimeMillis();
+      logger.info(String.format("Initial prefetching took: %d ms", (end - startTimeMillis)));
+    }
+  }
+
+  @Nullable
+  private static BlazeProjectData getBlazeProjectData(Project project) {
+    BlazeImportSettings importSettings =
+        BlazeImportSettingsManager.getInstance(project).getImportSettings();
+    if (importSettings == null) {
+      return null;
+    }
+    try {
+      return BlazeProjectDataManagerImpl.getImpl(project).loadProjectRoot(importSettings);
+    } catch (IOException e) {
+      // ignore: if we can't load the previous project data, we don't know what to prefetch
+      return null;
+    }
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/prefetch/PrefetchService.java b/base/src/com/google/idea/blaze/base/prefetch/PrefetchService.java
index fc5f5e2..726f970 100644
--- a/base/src/com/google/idea/blaze/base/prefetch/PrefetchService.java
+++ b/base/src/com/google/idea/blaze/base/prefetch/PrefetchService.java
@@ -17,6 +17,7 @@
 
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.project.Project;
 import java.io.File;
@@ -31,5 +32,6 @@
   /** Instructs all prefetchers to prefetch these files. */
   ListenableFuture<?> prefetchFiles(Project project, Collection<File> files);
 
-  ListenableFuture<?> prefetchProjectFiles(Project project, BlazeProjectData blazeProjectData);
+  ListenableFuture<?> prefetchProjectFiles(
+      Project project, ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData);
 }
diff --git a/base/src/com/google/idea/blaze/base/prefetch/PrefetchServiceImpl.java b/base/src/com/google/idea/blaze/base/prefetch/PrefetchServiceImpl.java
index 8046db0..05e02a6 100644
--- a/base/src/com/google/idea/blaze/base/prefetch/PrefetchServiceImpl.java
+++ b/base/src/com/google/idea/blaze/base/prefetch/PrefetchServiceImpl.java
@@ -22,7 +22,6 @@
 import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
-import com.google.idea.blaze.base.projectview.ProjectViewManager;
 import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.settings.BlazeImportSettings;
 import com.google.idea.blaze.base.settings.BlazeImportSettingsManager;
@@ -47,11 +46,7 @@
 
   @Override
   public ListenableFuture<?> prefetchProjectFiles(
-      Project project, BlazeProjectData blazeProjectData) {
-    ProjectViewSet projectViewSet = ProjectViewManager.getInstance(project).getProjectViewSet();
-    if (projectViewSet == null) {
-      return Futures.immediateFuture(null);
-    }
+      Project project, ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
     BlazeImportSettings importSettings =
         BlazeImportSettingsManager.getInstance(project).getImportSettings();
     if (importSettings == null) {
@@ -68,7 +63,7 @@
       files.add(workspaceRoot.fileForPath(workspacePath));
     }
     for (PrefetchFileSource fileSource : PrefetchFileSource.EP_NAME.getExtensions()) {
-      fileSource.addFilesToPrefetch(project, blazeProjectData, files);
+      fileSource.addFilesToPrefetch(project, projectViewSet, blazeProjectData, files);
     }
     return prefetchFiles(project, files);
   }
diff --git a/base/src/com/google/idea/blaze/base/projectview/ProjectView.java b/base/src/com/google/idea/blaze/base/projectview/ProjectView.java
index 8dfc6f3..4d09c18 100644
--- a/base/src/com/google/idea/blaze/base/projectview/ProjectView.java
+++ b/base/src/com/google/idea/blaze/base/projectview/ProjectView.java
@@ -17,11 +17,15 @@
 
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.idea.blaze.base.projectview.section.ListSection;
+import com.google.idea.blaze.base.projectview.section.ScalarSection;
 import com.google.idea.blaze.base.projectview.section.Section;
 import com.google.idea.blaze.base.projectview.section.SectionBuilder;
 import com.google.idea.blaze.base.projectview.section.SectionKey;
 import java.io.Serializable;
+import java.util.Collection;
 import java.util.List;
 import javax.annotation.Nullable;
 
@@ -47,6 +51,32 @@
     return result.build();
   }
 
+  /** Returns all values from the given list section */
+  public <T> List<T> listItems(SectionKey<T, ListSection<T>> key) {
+    List<T> result = Lists.newArrayList();
+    for (ListSection<T> section : getSectionsOfType(key)) {
+      result.addAll(section.items());
+    }
+    return result;
+  }
+
+  /** Gets the last value from any scalar sections */
+  @Nullable
+  public <T> T getScalarValue(SectionKey<T, ScalarSection<T>> key) {
+    return getScalarValue(key, null);
+  }
+
+  /** Gets the last value from any scalar sections */
+  @Nullable
+  public <T> T getScalarValue(SectionKey<T, ScalarSection<T>> key, @Nullable T defaultValue) {
+    Collection<ScalarSection<T>> sections = getSectionsOfType(key);
+    if (sections.isEmpty()) {
+      return defaultValue;
+    } else {
+      return Iterables.getLast(sections).getValue();
+    }
+  }
+
   public static Builder builder() {
     return new Builder();
   }
@@ -107,6 +137,11 @@
       return this;
     }
 
+    public <T> Builder remove(Section<T> section) {
+      sections.remove(section);
+      return this;
+    }
+
     /** Replaces a section if it already exists. If it doesn't, just add the section. */
     public <T, SectionType extends Section<T>> Builder replace(
         @Nullable Section<T> section, SectionBuilder<T, SectionType> builder) {
diff --git a/base/src/com/google/idea/blaze/base/projectview/ProjectViewSet.java b/base/src/com/google/idea/blaze/base/projectview/ProjectViewSet.java
index 1f3ed1f..e2e1211 100644
--- a/base/src/com/google/idea/blaze/base/projectview/ProjectViewSet.java
+++ b/base/src/com/google/idea/blaze/base/projectview/ProjectViewSet.java
@@ -63,7 +63,8 @@
   }
 
   /** Gets the last value from any scalar sections */
-  public <T> T getScalarValue(SectionKey<T, ScalarSection<T>> key, T defaultValue) {
+  @Nullable
+  public <T> T getScalarValue(SectionKey<T, ScalarSection<T>> key, @Nullable T defaultValue) {
     Collection<ScalarSection<T>> sections = getSections(key);
     if (sections.isEmpty()) {
       return defaultValue;
@@ -82,7 +83,7 @@
     return result;
   }
 
-  public Collection<ProjectViewFile> getProjectViewFiles() {
+  public ImmutableList<ProjectViewFile> getProjectViewFiles() {
     return projectViewFiles;
   }
 
diff --git a/base/src/com/google/idea/blaze/base/projectview/ProjectViewVerifier.java b/base/src/com/google/idea/blaze/base/projectview/ProjectViewVerifier.java
index 9b4b465..1d35932 100644
--- a/base/src/com/google/idea/blaze/base/projectview/ProjectViewVerifier.java
+++ b/base/src/com/google/idea/blaze/base/projectview/ProjectViewVerifier.java
@@ -29,11 +29,14 @@
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.scope.output.IssueOutput;
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
+import com.google.idea.blaze.base.sync.projectview.LanguageSupport;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.io.FileUtil;
 import java.io.File;
 import java.util.List;
+import javax.annotation.Nullable;
 
 /** Verifies project views. */
 public class ProjectViewVerifier {
@@ -48,6 +51,7 @@
 
   /** Verifies the project view. Any errors are output to the context as issues. */
   public static boolean verifyProjectView(
+      @Nullable Project project,
       BlazeContext context,
       WorkspacePathResolver workspacePathResolver,
       ProjectViewSet projectViewSet,
@@ -56,10 +60,14 @@
       return false;
     }
     for (BlazeSyncPlugin syncPlugin : BlazeSyncPlugin.EP_NAME.getExtensions()) {
-      if (!syncPlugin.validateProjectView(context, projectViewSet, workspaceLanguageSettings)) {
+      if (!syncPlugin.validateProjectView(
+          project, context, projectViewSet, workspaceLanguageSettings)) {
         return false;
       }
     }
+    if (!LanguageSupport.validateLanguageSettings(context, workspaceLanguageSettings)) {
+      return false;
+    }
     warnAboutDeprecatedSections(context, projectViewSet);
     if (!verifyIncludedPackagesExistOnDisk(context, workspacePathResolver, projectViewSet)) {
       return false;
diff --git a/base/src/com/google/idea/blaze/base/projectview/parser/ParseContext.java b/base/src/com/google/idea/blaze/base/projectview/parser/ParseContext.java
index 29bacb8..6956bbb 100644
--- a/base/src/com/google/idea/blaze/base/projectview/parser/ParseContext.java
+++ b/base/src/com/google/idea/blaze/base/projectview/parser/ParseContext.java
@@ -15,6 +15,7 @@
  */
 package com.google.idea.blaze.base.projectview.parser;
 
+import com.google.common.base.Splitter;
 import com.google.common.collect.Lists;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.scope.output.IssueOutput;
@@ -55,7 +56,7 @@
     this.context = context;
     this.workspacePathResolver = workspacePathResolver;
     this.file = file;
-    this.lines = Lists.newArrayList(text.split("\n"));
+    this.lines = Lists.newArrayList(Splitter.on('\n').split(text));
     this.currentLine = null;
     this.currentLineIndex = -1;
     consume();
diff --git a/base/src/com/google/idea/blaze/base/projectview/parser/ProjectViewParser.java b/base/src/com/google/idea/blaze/base/projectview/parser/ProjectViewParser.java
index 2f4707f..5349ec2 100644
--- a/base/src/com/google/idea/blaze/base/projectview/parser/ProjectViewParser.java
+++ b/base/src/com/google/idea/blaze/base/projectview/parser/ProjectViewParser.java
@@ -68,6 +68,11 @@
   }
 
   public void parseProjectView(String text) {
+    if (text.isEmpty()) {
+      ProjectView projectView = new ProjectView(ImmutableList.of());
+      projectViewFiles.add(new ProjectViewSet.ProjectViewFile(projectView, null));
+      return;
+    }
     parseProjectView(new ParseContext(context, workspacePathResolver, null, text));
   }
 
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/LabelSectionParser.java b/base/src/com/google/idea/blaze/base/projectview/section/LabelSectionParser.java
index bc1ed4a..9c7aafc 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/LabelSectionParser.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/LabelSectionParser.java
@@ -38,7 +38,7 @@
       parseContext.addErrors(errors);
       return null;
     }
-    return new Label(text);
+    return Label.create(text);
   }
 
   @Override
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/ListSection.java b/base/src/com/google/idea/blaze/base/projectview/section/ListSection.java
index 40ec7da..d3d9e06 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/ListSection.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/ListSection.java
@@ -19,7 +19,9 @@
 import com.google.common.collect.ImmutableList;
 import com.google.idea.blaze.base.projectview.section.sections.ItemOrTextBlock;
 import com.google.idea.blaze.base.projectview.section.sections.TextBlock;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 
@@ -82,7 +84,7 @@
 
   /** Builder for list sections */
   public static class Builder<T> extends SectionBuilder<T, ListSection<T>> {
-    private final ImmutableList.Builder<ItemOrTextBlock<T>> items = ImmutableList.builder();
+    private final List<ItemOrTextBlock<T>> items = new ArrayList<>();
 
     public Builder(SectionKey<T, ListSection<T>> sectionKey, @Nullable ListSection<T> section) {
       super(sectionKey);
@@ -96,14 +98,26 @@
       return this;
     }
 
+    public final Builder<T> addAll(List<T> items) {
+      for (T item : items) {
+        add(item);
+      }
+      return this;
+    }
+
     public final Builder<T> add(TextBlock textBlock) {
       items.add(new ItemOrTextBlock<T>(textBlock));
       return this;
     }
 
+    public final Builder<T> remove(T item) {
+      items.remove(new ItemOrTextBlock<>(item));
+      return this;
+    }
+
     @Override
     public final ListSection<T> build() {
-      return new ListSection<>(getSectionKey(), items.build());
+      return new ListSection<>(getSectionKey(), ImmutableList.copyOf(items));
     }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/ProjectViewDefaultValueProvider.java b/base/src/com/google/idea/blaze/base/projectview/section/ProjectViewDefaultValueProvider.java
new file mode 100644
index 0000000..370295f
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/projectview/section/ProjectViewDefaultValueProvider.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.projectview.section;
+
+import com.google.idea.blaze.base.projectview.ProjectView;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import com.intellij.openapi.extensions.ExtensionPointName;
+
+/** Allows the adding default values to sections. Used during the wizard. */
+public interface ProjectViewDefaultValueProvider {
+  ExtensionPointName<ProjectViewDefaultValueProvider> EP_NAME =
+      ExtensionPointName.create("com.google.idea.blaze.ProjectViewDefaultValueProvider");
+
+  ProjectView addProjectViewDefaultValue(
+      BuildSystem buildSystem, ProjectViewSet projectViewSet, ProjectView topLevelProjectView);
+
+  SectionKey<?, ?> getSectionKey();
+}
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/SectionParser.java b/base/src/com/google/idea/blaze/base/projectview/section/SectionParser.java
index 1e0f043..2c76bb6 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/SectionParser.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/SectionParser.java
@@ -15,7 +15,6 @@
  */
 package com.google.idea.blaze.base.projectview.section;
 
-import com.google.idea.blaze.base.projectview.ProjectView;
 import com.google.idea.blaze.base.projectview.parser.ParseContext;
 import com.google.idea.blaze.base.projectview.parser.ProjectViewParser;
 import javax.annotation.Nullable;
@@ -52,9 +51,10 @@
     return null;
   }
 
-  /** Allows the section to add a default value. Used during the wizard. */
-  public ProjectView addProjectViewDefaultValue(ProjectView projectView) {
-    return projectView;
+  /** A brief description of this section, used for in-IDE documentation. */
+  @Nullable
+  public String quickDocs() {
+    return null;
   }
 
   /** The type of item(s) in this section. */
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/sections/AdditionalLanguagesSection.java b/base/src/com/google/idea/blaze/base/projectview/section/sections/AdditionalLanguagesSection.java
index d9dc894..9e05e64 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/sections/AdditionalLanguagesSection.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/sections/AdditionalLanguagesSection.java
@@ -15,13 +15,21 @@
  */
 package com.google.idea.blaze.base.projectview.section.sections;
 
+import com.google.common.collect.Ordering;
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.projectview.ProjectView;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.projectview.parser.ParseContext;
 import com.google.idea.blaze.base.projectview.parser.ProjectViewParser;
 import com.google.idea.blaze.base.projectview.section.ListSection;
 import com.google.idea.blaze.base.projectview.section.ListSectionParser;
+import com.google.idea.blaze.base.projectview.section.ProjectViewDefaultValueProvider;
 import com.google.idea.blaze.base.projectview.section.SectionKey;
 import com.google.idea.blaze.base.projectview.section.SectionParser;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import com.google.idea.blaze.base.sync.projectview.LanguageSupport;
+import java.util.Set;
 import javax.annotation.Nullable;
 
 /** Allows users to set the rule classes they want to be imported */
@@ -56,5 +64,45 @@
     public ItemType getItemType() {
       return ItemType.Other;
     }
+
+    @Override
+    public String quickDocs() {
+      return "Additional languages to support in this project.";
+    }
+  }
+
+  static class AdditionalLanguagesDefaultValueProvider implements ProjectViewDefaultValueProvider {
+    @Override
+    public ProjectView addProjectViewDefaultValue(
+        BuildSystem buildSystem, ProjectViewSet projectViewSet, ProjectView topLevelProjectView) {
+      if (!topLevelProjectView.getSectionsOfType(KEY).isEmpty()) {
+        return topLevelProjectView;
+      }
+      Set<LanguageClass> additionalLanguages = availableAdditionalLanguages(projectViewSet);
+      if (additionalLanguages.isEmpty()) {
+        return topLevelProjectView;
+      }
+      ListSection.Builder<LanguageClass> builder = ListSection.builder(KEY);
+      builder.add(TextBlock.of("  # Uncomment any additional languages you want supported"));
+      additionalLanguages
+          .stream()
+          .sorted(Ordering.usingToString())
+          .map(lang -> "  # " + lang.getName())
+          .forEach(string -> builder.add(TextBlock.of(string)));
+      builder.add(TextBlock.newLine());
+      return ProjectView.builder(topLevelProjectView).add(builder).build();
+    }
+
+    @Override
+    public SectionKey<?, ?> getSectionKey() {
+      return KEY;
+    }
+
+    private static Set<LanguageClass> availableAdditionalLanguages(ProjectViewSet projectView) {
+      WorkspaceType workspaceType =
+          projectView.getScalarValue(
+              WorkspaceTypeSection.KEY, LanguageSupport.getDefaultWorkspaceType());
+      return LanguageSupport.availableAdditionalLanguages(workspaceType);
+    }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/sections/BuildFlagsSection.java b/base/src/com/google/idea/blaze/base/projectview/section/sections/BuildFlagsSection.java
index 588d289..51f0709 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/sections/BuildFlagsSection.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/sections/BuildFlagsSection.java
@@ -48,5 +48,10 @@
     public ItemType getItemType() {
       return ItemType.Other;
     }
+
+    @Override
+    public String quickDocs() {
+      return "A set of flags that get passed to all build command invocations as arguments";
+    }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/sections/DirectorySection.java b/base/src/com/google/idea/blaze/base/projectview/section/sections/DirectorySection.java
index cc1cb23..c470e37 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/sections/DirectorySection.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/sections/DirectorySection.java
@@ -18,12 +18,15 @@
 import com.google.common.collect.Lists;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.projectview.ProjectView;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.projectview.parser.ParseContext;
 import com.google.idea.blaze.base.projectview.parser.ProjectViewParser;
 import com.google.idea.blaze.base.projectview.section.ListSection;
 import com.google.idea.blaze.base.projectview.section.ListSectionParser;
+import com.google.idea.blaze.base.projectview.section.ProjectViewDefaultValueProvider;
 import com.google.idea.blaze.base.projectview.section.SectionKey;
 import com.google.idea.blaze.base.projectview.section.SectionParser;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
 import com.google.idea.blaze.base.ui.BlazeValidationError;
 import com.intellij.util.PathUtil;
 import java.util.List;
@@ -69,16 +72,32 @@
     }
 
     @Override
-    public ProjectView addProjectViewDefaultValue(ProjectView projectView) {
-      if (!projectView.getSectionsOfType(KEY).isEmpty()) {
-        return projectView;
+    public String quickDocs() {
+      return "A list of project directories that will be added as source.";
+    }
+  }
+
+  static class DirectoriesProjectViewDefaultValueProvider
+      implements ProjectViewDefaultValueProvider {
+    @Override
+    public ProjectView addProjectViewDefaultValue(
+        BuildSystem buildSystem, ProjectViewSet projectViewSet, ProjectView topLevelProjectView) {
+      if (!topLevelProjectView.getSectionsOfType(KEY).isEmpty()) {
+        return topLevelProjectView;
       }
-      return ProjectView.builder(projectView)
-          .add(
-              ListSection.builder(KEY)
-                  .add(TextBlock.of("  # Add the directories you want added as source here"))
-                  .add(TextBlock.newLine()))
-          .build();
+      ListSection.Builder<DirectoryEntry> builder = ListSection.builder(KEY);
+      builder.add(TextBlock.of("  # Add the directories you want added as source here"));
+      if (buildSystem == BuildSystem.Bazel) {
+        builder.add(TextBlock.of("  # By default, we've added your entire workspace ('.')"));
+        builder.add(DirectoryEntry.include(new WorkspacePath(".")));
+      }
+      builder.add(TextBlock.newLine());
+      return ProjectView.builder(topLevelProjectView).add(builder).build();
+    }
+
+    @Override
+    public SectionKey<?, ?> getSectionKey() {
+      return KEY;
     }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/sections/ImportSection.java b/base/src/com/google/idea/blaze/base/projectview/section/sections/ImportSection.java
index 4d9b6ef..d054235 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/sections/ImportSection.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/sections/ImportSection.java
@@ -70,5 +70,10 @@
     public ItemType getItemType() {
       return ItemType.FileSystemItem;
     }
+
+    @Override
+    public String quickDocs() {
+      return "Imports another project view.";
+    }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/sections/RunConfigurationsSection.java b/base/src/com/google/idea/blaze/base/projectview/section/sections/RunConfigurationsSection.java
index 9ffda84..c3a8ef6 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/sections/RunConfigurationsSection.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/sections/RunConfigurationsSection.java
@@ -59,5 +59,10 @@
     public ItemType getItemType() {
       return ItemType.FileSystemItem;
     }
+
+    @Override
+    public String quickDocs() {
+      return "A list of XML files which will be imported as run configurations during sync.";
+    }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/sections/Sections.java b/base/src/com/google/idea/blaze/base/projectview/section/sections/Sections.java
index 4d071a3..eda173f 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/sections/Sections.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/sections/Sections.java
@@ -36,7 +36,8 @@
           ImportTargetOutputSection.PARSER,
           ExcludeTargetSection.PARSER,
           ExcludedSourceSection.PARSER,
-          RunConfigurationsSection.PARSER);
+          RunConfigurationsSection.PARSER,
+          ShardBlazeBuildsSection.PARSER);
 
   public static List<SectionParser> getParsers() {
     List<SectionParser> parsers = Lists.newArrayList(PARSERS);
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/sections/ShardBlazeBuildsSection.java b/base/src/com/google/idea/blaze/base/projectview/section/sections/ShardBlazeBuildsSection.java
new file mode 100644
index 0000000..0b75c8b
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/projectview/section/sections/ShardBlazeBuildsSection.java
@@ -0,0 +1,65 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.projectview.section.sections;
+
+import com.google.idea.blaze.base.projectview.parser.ParseContext;
+import com.google.idea.blaze.base.projectview.parser.ProjectViewParser;
+import com.google.idea.blaze.base.projectview.section.ScalarSection;
+import com.google.idea.blaze.base.projectview.section.ScalarSectionParser;
+import com.google.idea.blaze.base.projectview.section.SectionKey;
+import com.google.idea.blaze.base.projectview.section.SectionParser;
+import javax.annotation.Nullable;
+
+/** Set for particularly large projects to enable sharding blaze invocations during blaze sync. */
+public class ShardBlazeBuildsSection {
+  public static final SectionKey<Boolean, ScalarSection<Boolean>> KEY = SectionKey.of("shard_sync");
+  public static final SectionParser PARSER = new ShardBlazeSyncSectionParser();
+
+  private static class ShardBlazeSyncSectionParser extends ScalarSectionParser<Boolean> {
+    ShardBlazeSyncSectionParser() {
+      super(KEY, ':');
+    }
+
+    @Override
+    @Nullable
+    protected Boolean parseItem(ProjectViewParser parser, ParseContext parseContext, String text) {
+      if (text.equals("true")) {
+        return true;
+      }
+      if (text.equals("false")) {
+        return false;
+      }
+      parseContext.addError(
+          "'shard_sync' must be set to 'true' or 'false' (e.g. 'shard_sync: true')");
+      return null;
+    }
+
+    @Override
+    protected void printItem(StringBuilder sb, Boolean item) {
+      sb.append(item);
+    }
+
+    @Override
+    public ItemType getItemType() {
+      return ItemType.Other;
+    }
+
+    @Override
+    public String quickDocs() {
+      return "Allows sharding build invocations when syncing and compiling your project.";
+    }
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/sections/TargetSection.java b/base/src/com/google/idea/blaze/base/projectview/section/sections/TargetSection.java
index cd69179..01e38c6 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/sections/TargetSection.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/sections/TargetSection.java
@@ -17,12 +17,16 @@
 
 import com.google.idea.blaze.base.model.primitives.TargetExpression;
 import com.google.idea.blaze.base.projectview.ProjectView;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.projectview.parser.ParseContext;
 import com.google.idea.blaze.base.projectview.parser.ProjectViewParser;
 import com.google.idea.blaze.base.projectview.section.ListSection;
 import com.google.idea.blaze.base.projectview.section.ListSectionParser;
+import com.google.idea.blaze.base.projectview.section.ProjectViewDefaultValueProvider;
 import com.google.idea.blaze.base.projectview.section.SectionKey;
 import com.google.idea.blaze.base.projectview.section.SectionParser;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import javax.annotation.Nullable;
 
 /** "targets" section. */
 public class TargetSection {
@@ -51,20 +55,35 @@
       return ItemType.Label;
     }
 
+    @Nullable
     @Override
-    public ProjectView addProjectViewDefaultValue(ProjectView projectView) {
-      if (!projectView.getSectionsOfType(KEY).isEmpty()) {
-        return projectView;
+    public String quickDocs() {
+      return "A list of build targets that will be included during sync. To resolve source files "
+          + "under a project directory, the source must be reachable from one of your targets.";
+    }
+  }
+
+  static class TargetsProjectViewDefaultValueProvider implements ProjectViewDefaultValueProvider {
+    @Override
+    public ProjectView addProjectViewDefaultValue(
+        BuildSystem buildSystem, ProjectViewSet projectViewSet, ProjectView topLevelProjectView) {
+      if (!topLevelProjectView.getSectionsOfType(KEY).isEmpty()) {
+        return topLevelProjectView;
       }
-      return ProjectView.builder(projectView)
-          .add(
-              ListSection.builder(KEY)
-                  .add(
-                      TextBlock.of(
-                          "  # Add targets that reach the source code "
-                              + "that you want to resolve here"))
-                  .add(TextBlock.newLine()))
-          .build();
+      ListSection.Builder<TargetExpression> builder = ListSection.builder(KEY);
+      builder.add(
+          TextBlock.of("  # Add targets that reach the source code that you want to resolve here"));
+      if (buildSystem == BuildSystem.Bazel) {
+        builder.add(TextBlock.of("  # By default, we've added all targets in your workspace"));
+        builder.add(TargetExpression.fromString("//..."));
+      }
+      builder.add(TextBlock.newLine());
+      return ProjectView.builder(topLevelProjectView).add(builder).build();
+    }
+
+    @Override
+    public SectionKey<?, ?> getSectionKey() {
+      return KEY;
     }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/sections/TestSourceSection.java b/base/src/com/google/idea/blaze/base/projectview/section/sections/TestSourceSection.java
index 44da7b0..309b765 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/sections/TestSourceSection.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/sections/TestSourceSection.java
@@ -24,5 +24,12 @@
 /** Section for configuring test sources. */
 public class TestSourceSection {
   public static final SectionKey<Glob, ListSection<Glob>> KEY = SectionKey.of("test_sources");
-  public static final SectionParser PARSER = new GlobSectionParser(KEY);
+  public static final SectionParser PARSER =
+      new GlobSectionParser(KEY) {
+        @Override
+        public String quickDocs() {
+          return "A list of workspace-relative glob patterns. Determines which sources IntelliJ "
+              + "treats as test sources.";
+        }
+      };
 }
diff --git a/base/src/com/google/idea/blaze/base/projectview/section/sections/TextBlockSection.java b/base/src/com/google/idea/blaze/base/projectview/section/sections/TextBlockSection.java
index b12b781..1631179 100644
--- a/base/src/com/google/idea/blaze/base/projectview/section/sections/TextBlockSection.java
+++ b/base/src/com/google/idea/blaze/base/projectview/section/sections/TextBlockSection.java
@@ -137,5 +137,11 @@
     public ItemType getItemType() {
       return ItemType.Other;
     }
+
+    @Nullable
+    @Override
+    public String quickDocs() {
+      return null;
+    }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/run/BlazeRunConfigurationSyncListener.java b/base/src/com/google/idea/blaze/base/run/BlazeRunConfigurationSyncListener.java
index dfcc68a..96be88d 100644
--- a/base/src/com/google/idea/blaze/base/run/BlazeRunConfigurationSyncListener.java
+++ b/base/src/com/google/idea/blaze/base/run/BlazeRunConfigurationSyncListener.java
@@ -34,6 +34,7 @@
 import com.intellij.execution.configurations.RunConfiguration;
 import com.intellij.openapi.project.Project;
 import java.io.File;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -67,7 +68,7 @@
 
           Set<Label> labelsWithConfigs = labelsWithConfigs(project);
           Set<TargetExpression> targetExpressions =
-              Sets.newHashSet(projectViewSet.listItems(TargetSection.KEY));
+              Sets.newLinkedHashSet(projectViewSet.listItems(TargetSection.KEY));
           // We only auto-generate configurations for rules listed in the project view.
           for (TargetExpression target : targetExpressions) {
             if (!(target instanceof Label) || labelsWithConfigs.contains(target)) {
@@ -86,7 +87,7 @@
         .listItems(RunConfigurationsSection.KEY)
         .stream()
         .map(pathResolver::resolveToFile)
-        .collect(Collectors.toSet());
+        .collect(Collectors.toCollection(LinkedHashSet::new));
   }
 
   /** Collects a set of all the Blaze labels that have an associated run configuration. */
diff --git a/base/src/com/google/idea/blaze/base/run/TargetNameHeuristic.java b/base/src/com/google/idea/blaze/base/run/TargetNameHeuristic.java
index 507fe2c..bf3cd6c 100644
--- a/base/src/com/google/idea/blaze/base/run/TargetNameHeuristic.java
+++ b/base/src/com/google/idea/blaze/base/run/TargetNameHeuristic.java
@@ -19,6 +19,7 @@
 import com.google.idea.blaze.base.ideinfo.TestIdeInfo.TestSize;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.psi.PsiFile;
 import java.io.File;
 import javax.annotation.Nullable;
 
@@ -27,7 +28,11 @@
 
   @Override
   public boolean matchesSource(
-      Project project, TargetIdeInfo target, File sourceFile, @Nullable TestSize testSize) {
+      Project project,
+      TargetIdeInfo target,
+      @Nullable PsiFile sourcePsiFile,
+      File sourceFile,
+      @Nullable TestSize testSize) {
     String filePathWithoutExtension = FileUtil.getNameWithoutExtension(sourceFile.getPath());
     String targetName = target.key.label.targetName().toString();
     if (!filePathWithoutExtension.endsWith(targetName)) {
diff --git a/base/src/com/google/idea/blaze/base/run/TestSizeHeuristic.java b/base/src/com/google/idea/blaze/base/run/TestSizeHeuristic.java
index 5b40bcf..c30a55e 100644
--- a/base/src/com/google/idea/blaze/base/run/TestSizeHeuristic.java
+++ b/base/src/com/google/idea/blaze/base/run/TestSizeHeuristic.java
@@ -19,6 +19,7 @@
 import com.google.idea.blaze.base.ideinfo.TestIdeInfo;
 import com.google.idea.blaze.base.ideinfo.TestIdeInfo.TestSize;
 import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiFile;
 import java.io.File;
 import javax.annotation.Nullable;
 
@@ -27,7 +28,11 @@
 
   @Override
   public boolean matchesSource(
-      Project project, TargetIdeInfo target, File sourceFile, @Nullable TestSize testSize) {
+      Project project,
+      TargetIdeInfo target,
+      @Nullable PsiFile sourcePsiFile,
+      File sourceFile,
+      @Nullable TestSize testSize) {
     // If testSize == null then prefer small
     // Some test runners will assume no size annotation == small and filter on that, others will not
     TestSize size = testSize != null ? testSize : TestIdeInfo.DEFAULT_NON_ANNOTATED_TEST_SIZE;
diff --git a/base/src/com/google/idea/blaze/base/run/TestTargetHeuristic.java b/base/src/com/google/idea/blaze/base/run/TestTargetHeuristic.java
index 7d5576a..74a46e4 100644
--- a/base/src/com/google/idea/blaze/base/run/TestTargetHeuristic.java
+++ b/base/src/com/google/idea/blaze/base/run/TestTargetHeuristic.java
@@ -39,22 +39,18 @@
     if (element == null) {
       return null;
     }
-    File file = getContainingFile(element);
-    if (file == null) {
-      return null;
-    }
-    Collection<TargetIdeInfo> rules =
-        TestTargetFinder.getInstance(element.getProject()).testTargetsForSourceFile(file);
-    return chooseTestTargetForSourceFile(element.getProject(), file, rules, null);
-  }
-
-  static File getContainingFile(PsiElement element) {
     PsiFile psiFile = element.getContainingFile();
     if (psiFile == null) {
       return null;
     }
     VirtualFile vf = psiFile.getVirtualFile();
-    return vf != null ? new File(vf.getPath()) : null;
+    File file = vf != null ? new File(vf.getPath()) : null;
+    if (file == null) {
+      return null;
+    }
+    Collection<TargetIdeInfo> rules =
+        TestTargetFinder.getInstance(element.getProject()).testTargetsForSourceFile(file);
+    return chooseTestTargetForSourceFile(element.getProject(), psiFile, file, rules, null);
   }
 
   /**
@@ -64,6 +60,7 @@
   @Nullable
   static Label chooseTestTargetForSourceFile(
       Project project,
+      @Nullable PsiFile sourcePsiFile,
       File sourceFile,
       Collection<TargetIdeInfo> targets,
       @Nullable TestSize testSize) {
@@ -72,7 +69,9 @@
       TargetIdeInfo match =
           targets
               .stream()
-              .filter(target -> filter.matchesSource(project, target, sourceFile, testSize))
+              .filter(
+                  target ->
+                      filter.matchesSource(project, target, sourcePsiFile, sourceFile, testSize))
               .findFirst()
               .orElse(null);
 
@@ -85,5 +84,9 @@
 
   /** Returns true if the rule and source file match, according to this heuristic. */
   boolean matchesSource(
-      Project project, TargetIdeInfo target, File sourceFile, @Nullable TestSize testSize);
+      Project project,
+      TargetIdeInfo target,
+      @Nullable PsiFile sourcePsiFile,
+      File sourceFile,
+      @Nullable TestSize testSize);
 }
diff --git a/base/src/com/google/idea/blaze/base/run/TestTargetSourcesHeuristic.java b/base/src/com/google/idea/blaze/base/run/TestTargetSourcesHeuristic.java
index f42cf1b..9a9fb9f 100644
--- a/base/src/com/google/idea/blaze/base/run/TestTargetSourcesHeuristic.java
+++ b/base/src/com/google/idea/blaze/base/run/TestTargetSourcesHeuristic.java
@@ -22,6 +22,7 @@
 import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiFile;
 import java.io.File;
 import javax.annotation.Nullable;
 
@@ -33,7 +34,11 @@
 
   @Override
   public boolean matchesSource(
-      Project project, TargetIdeInfo target, File sourceFile, @Nullable TestSize testSize) {
+      Project project,
+      TargetIdeInfo target,
+      @Nullable PsiFile sourcePsiFile,
+      File sourceFile,
+      @Nullable TestSize testSize) {
     BlazeProjectData projectData =
         BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
     if (projectData == null) {
diff --git a/base/src/com/google/idea/blaze/base/run/WithBrowserHyperlinkExecutionException.java b/base/src/com/google/idea/blaze/base/run/WithBrowserHyperlinkExecutionException.java
new file mode 100644
index 0000000..16b9c23
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/run/WithBrowserHyperlinkExecutionException.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.run;
+
+import com.intellij.execution.ExecutionException;
+import com.intellij.notification.Notification;
+import com.intellij.notification.NotificationListener;
+import com.intellij.ui.BrowserHyperlinkListener;
+import javax.swing.event.HyperlinkEvent;
+import javax.swing.event.HyperlinkListener;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * An {@link ExecutionException} containing a clickable browser hyperlink. It attempts to navigate
+ * to a URL formed from the hyperlink description verbatim.
+ */
+public class WithBrowserHyperlinkExecutionException extends ExecutionException
+    implements HyperlinkListener, NotificationListener {
+
+  public WithBrowserHyperlinkExecutionException(String string) {
+    super(string);
+  }
+
+  @Override
+  public final void hyperlinkUpdate(HyperlinkEvent e) {
+    if (e.getEventType() == HyperlinkEvent.EventType.ACTIVATED) {
+      BrowserHyperlinkListener.INSTANCE.hyperlinkUpdate(e);
+    }
+  }
+
+  @Override
+  public final void hyperlinkUpdate(
+      @NotNull Notification notification, @NotNull HyperlinkEvent event) {
+    hyperlinkUpdate(event);
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/run/confighandler/BlazeCommandGenericRunConfigurationHandler.java b/base/src/com/google/idea/blaze/base/run/confighandler/BlazeCommandGenericRunConfigurationHandler.java
index da3d641..6d8dcd7 100644
--- a/base/src/com/google/idea/blaze/base/run/confighandler/BlazeCommandGenericRunConfigurationHandler.java
+++ b/base/src/com/google/idea/blaze/base/run/confighandler/BlazeCommandGenericRunConfigurationHandler.java
@@ -72,7 +72,7 @@
   @Override
   @Nullable
   public String getCommandName() {
-    BlazeCommandName command = state.getCommand();
+    BlazeCommandName command = state.getCommandState().getCommand();
     return command != null ? command.toString() : null;
   }
 
diff --git a/base/src/com/google/idea/blaze/base/run/confighandler/BlazeCommandGenericRunConfigurationRunner.java b/base/src/com/google/idea/blaze/base/run/confighandler/BlazeCommandGenericRunConfigurationRunner.java
index 2c6bd90..4605c17 100644
--- a/base/src/com/google/idea/blaze/base/run/confighandler/BlazeCommandGenericRunConfigurationRunner.java
+++ b/base/src/com/google/idea/blaze/base/run/confighandler/BlazeCommandGenericRunConfigurationRunner.java
@@ -166,27 +166,27 @@
       assert projectViewSet != null;
 
       String binaryPath =
-          handlerState.getBlazeBinary() != null
-              ? handlerState.getBlazeBinary()
+          handlerState.getBlazeBinaryState().getBlazeBinary() != null
+              ? handlerState.getBlazeBinaryState().getBlazeBinary()
               : Blaze.getBuildSystemProvider(project).getBinaryPath();
 
       BlazeCommand.Builder command =
-          BlazeCommand.builder(binaryPath, handlerState.getCommand())
+          BlazeCommand.builder(binaryPath, handlerState.getCommandState().getCommand())
               .addTargets(configuration.getTarget())
               .addBlazeFlags(BlazeFlags.buildFlags(project, projectViewSet))
               .addBlazeFlags(testHandlerFlags)
-              .addBlazeFlags(handlerState.getBlazeFlags())
-              .addExeFlags(handlerState.getExeFlags());
+              .addBlazeFlags(handlerState.getBlazeFlagsState().getExpandedFlags())
+              .addExeFlags(handlerState.getExeFlagsState().getExpandedFlags());
 
       command.addBlazeFlags(
           DistributedExecutorSupport.getBlazeFlags(
-              project, handlerState.getRunOnDistributedExecutor()));
+              project, handlerState.getRunOnDistributedExecutorState().runOnDistributedExecutor));
       return command.build();
     }
 
     private boolean canUseTestUi() {
-      return BlazeCommandName.TEST.equals(handlerState.getCommand())
-          && !handlerState.getRunOnDistributedExecutor();
+      return BlazeCommandName.TEST.equals(handlerState.getCommandState().getCommand())
+          && !handlerState.getRunOnDistributedExecutorState().runOnDistributedExecutor;
     }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/run/filter/BlazeTargetFilter.java b/base/src/com/google/idea/blaze/base/run/filter/BlazeTargetFilter.java
index 07e6233..2e4f9ea 100644
--- a/base/src/com/google/idea/blaze/base/run/filter/BlazeTargetFilter.java
+++ b/base/src/com/google/idea/blaze/base/run/filter/BlazeTargetFilter.java
@@ -15,6 +15,7 @@
  */
 package com.google.idea.blaze.base.run.filter;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.idea.blaze.base.lang.buildfile.references.BuildReferenceManager;
 import com.google.idea.blaze.base.lang.buildfile.references.LabelUtils;
 import com.google.idea.blaze.base.model.primitives.Label;
@@ -23,6 +24,8 @@
 import com.intellij.openapi.project.Project;
 import com.intellij.psi.NavigatablePsiElement;
 import com.intellij.psi.PsiElement;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import javax.annotation.Nullable;
@@ -30,7 +33,15 @@
 /** Parse blaze targets in streamed output. */
 public class BlazeTargetFilter implements Filter {
 
-  private static final Pattern TARGET_PATTERN = Pattern.compile("//([^\\s:]*):(\\S*)");
+  // See Bazel's LabelValidator class. Whitespace character intentionally not included here.
+  private static final String PACKAGE_NAME_CHARS = "a-zA-Z0-9/\\-\\._$()";
+  private static final String TARGET_CHARS = "a-zA-Z0-9+,=~#()$_@\\-";
+
+  private static final String TARGET_REGEX =
+      String.format(
+          "(@[%s]*)?//[%s]*(:[%s]*)?", PACKAGE_NAME_CHARS, PACKAGE_NAME_CHARS, TARGET_CHARS);
+
+  @VisibleForTesting static final Pattern TARGET_PATTERN = Pattern.compile(TARGET_REGEX);
 
   private final Project project;
 
@@ -42,20 +53,21 @@
   @Override
   public Result applyFilter(String line, int entireLength) {
     Matcher matcher = TARGET_PATTERN.matcher(line);
-    if (!matcher.find()) {
-      return null;
+    List<ResultItem> results = new ArrayList<>();
+    while (matcher.find()) {
+      String labelString = matcher.group();
+      Label label = LabelUtils.createLabelFromString(null, labelString);
+      if (label == null) {
+        continue;
+      }
+      PsiElement psi = BuildReferenceManager.getInstance(project).resolveLabel(label);
+      if (!(psi instanceof NavigatablePsiElement)) {
+        continue;
+      }
+      HyperlinkInfo link = project -> ((NavigatablePsiElement) psi).navigate(true);
+      int offset = entireLength - line.length();
+      results.add(new ResultItem(matcher.start() + offset, matcher.end() + offset, link));
     }
-    String labelString = matcher.group();
-    Label label = LabelUtils.createLabelFromString(null, labelString);
-    if (label == null) {
-      return null;
-    }
-    PsiElement psi = BuildReferenceManager.getInstance(project).resolveLabel(label);
-    if (!(psi instanceof NavigatablePsiElement)) {
-      return null;
-    }
-    HyperlinkInfo link = project -> ((NavigatablePsiElement) psi).navigate(true);
-    int offset = entireLength - line.length();
-    return new Result(matcher.start() + offset, matcher.end() + offset, link);
+    return results.isEmpty() ? null : new Result(results);
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/run/filter/StandardFileResolver.java b/base/src/com/google/idea/blaze/base/run/filter/StandardFileResolver.java
index 15a3d09..652c2a5 100644
--- a/base/src/com/google/idea/blaze/base/run/filter/StandardFileResolver.java
+++ b/base/src/com/google/idea/blaze/base/run/filter/StandardFileResolver.java
@@ -21,6 +21,7 @@
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
 import java.io.File;
+import java.io.IOException;
 import javax.annotation.Nullable;
 
 /** Parses absolute and workspace-relative paths. */
@@ -31,7 +32,9 @@
   public VirtualFile resolveToFile(Project project, String fileString) {
     File file = new File(fileString);
     if (file.isAbsolute()) {
-      return VirtualFileSystemProvider.getInstance().getSystem().findFileByPath(file.getPath());
+      return VirtualFileSystemProvider.getInstance()
+          .getSystem()
+          .findFileByPath(getCanonicalPathSafe(file));
     }
     BlazeProjectData projectData =
         BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
@@ -41,4 +44,16 @@
     file = projectData.workspacePathResolver.resolveToFile(fileString);
     return VirtualFileSystemProvider.getInstance().getSystem().findFileByPath(file.getPath());
   }
+
+  /**
+   * Swallows {@link IOException}s, falling back to returning the absolute, possibly non-canonical
+   * path.
+   */
+  private static String getCanonicalPathSafe(File file) {
+    try {
+      return file.getCanonicalPath();
+    } catch (IOException e) {
+      return file.getAbsolutePath();
+    }
+  }
 }
diff --git a/base/src/com/google/idea/blaze/base/run/producers/AllInPackageBlazeConfigurationProducer.java b/base/src/com/google/idea/blaze/base/run/producers/AllInPackageBlazeConfigurationProducer.java
index 372a315..d344018 100644
--- a/base/src/com/google/idea/blaze/base/run/producers/AllInPackageBlazeConfigurationProducer.java
+++ b/base/src/com/google/idea/blaze/base/run/producers/AllInPackageBlazeConfigurationProducer.java
@@ -62,7 +62,7 @@
     if (handlerState == null) {
       return false;
     }
-    handlerState.setCommand(BlazeCommandName.TEST);
+    handlerState.getCommandState().setCommand(BlazeCommandName.TEST);
     configuration.setGeneratedName();
     return true;
   }
@@ -85,7 +85,7 @@
     if (handlerState == null) {
       return false;
     }
-    return Objects.equals(handlerState.getCommand(), BlazeCommandName.TEST)
+    return Objects.equals(handlerState.getCommandState().getCommand(), BlazeCommandName.TEST)
         && Objects.equals(
             configuration.getTarget(), TargetExpression.allFromPackageRecursive(packagePath));
   }
diff --git a/base/src/com/google/idea/blaze/base/run/producers/BlazeBuildFileRunConfigurationProducer.java b/base/src/com/google/idea/blaze/base/run/producers/BlazeBuildFileRunConfigurationProducer.java
index 60faff7..9a838ed 100644
--- a/base/src/com/google/idea/blaze/base/run/producers/BlazeBuildFileRunConfigurationProducer.java
+++ b/base/src/com/google/idea/blaze/base/run/producers/BlazeBuildFileRunConfigurationProducer.java
@@ -195,8 +195,9 @@
         configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
     if (handlerState != null) {
       // TODO move the old test rule functionality to a BlazeRunConfigurationFactory
-      handlerState.setCommand(
-          Kind.isTestRule(target.ruleType) ? BlazeCommandName.TEST : BlazeCommandName.BUILD);
+      BlazeCommandName command =
+          Kind.isTestRule(target.ruleType) ? BlazeCommandName.TEST : BlazeCommandName.BUILD;
+      handlerState.getCommandState().setCommand(command);
     }
     configuration.setGeneratedName();
   }
diff --git a/base/src/com/google/idea/blaze/base/run/producers/BlazeFilterExistingRunConfigurationProducer.java b/base/src/com/google/idea/blaze/base/run/producers/BlazeFilterExistingRunConfigurationProducer.java
index feae47b..92089e4 100644
--- a/base/src/com/google/idea/blaze/base/run/producers/BlazeFilterExistingRunConfigurationProducer.java
+++ b/base/src/com/google/idea/blaze/base/run/producers/BlazeFilterExistingRunConfigurationProducer.java
@@ -59,14 +59,20 @@
     }
     BlazeCommandRunConfigurationCommonState handlerState =
         configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
-    if (handlerState == null || !BlazeCommandName.TEST.equals(handlerState.getCommand())) {
+    if (handlerState == null
+        || !BlazeCommandName.TEST.equals(handlerState.getCommandState().getCommand())) {
       return false;
     }
     // replace old test filter flag if present
-    List<String> flags = new ArrayList<>(handlerState.getBlazeFlags());
+    List<String> flags = new ArrayList<>(handlerState.getBlazeFlagsState().getRawFlags());
     flags.removeIf((flag) -> flag.startsWith(BlazeFlags.TEST_FILTER));
     flags.add(testFilter);
-    handlerState.setBlazeFlags(flags);
+
+    if (SmRunnerUtils.countSelectedTestCases(context) == 1
+        && !flags.contains(BlazeFlags.DISABLE_TEST_SHARDING)) {
+      flags.add(BlazeFlags.DISABLE_TEST_SHARDING);
+    }
+    handlerState.getBlazeFlagsState().setRawFlags(flags);
     configuration.setName(configuration.getName() + " (filtered)");
     configuration.setNameChangedByUser(true);
     return true;
@@ -83,7 +89,7 @@
         configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
 
     return handlerState != null
-        && Objects.equals(handlerState.getCommand(), BlazeCommandName.TEST)
+        && Objects.equals(handlerState.getCommandState().getCommand(), BlazeCommandName.TEST)
         && Objects.equals(testFilter, handlerState.getTestFilterFlag());
   }
 
diff --git a/base/src/com/google/idea/blaze/base/run/smrunner/BlazeRerunFailedTestsAction.java b/base/src/com/google/idea/blaze/base/run/smrunner/BlazeRerunFailedTestsAction.java
index 2522bab..578bb9b 100644
--- a/base/src/com/google/idea/blaze/base/run/smrunner/BlazeRerunFailedTestsAction.java
+++ b/base/src/com/google/idea/blaze/base/run/smrunner/BlazeRerunFailedTestsAction.java
@@ -80,13 +80,15 @@
         throws ExecutionException {
       BlazeCommandRunConfigurationCommonState handlerState =
           configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
-      if (handlerState == null || !BlazeCommandName.TEST.equals(handlerState.getCommand())) {
+      if (handlerState == null
+          || !BlazeCommandName.TEST.equals(handlerState.getCommandState().getCommand())) {
         return null;
       }
       Project project = getProject();
       List<Location<?>> locations =
           getFailedTests(project)
               .stream()
+              .filter(AbstractTestProxy::isLeaf)
               .map((test) -> toLocation(project, test))
               .filter(Objects::nonNull)
               .collect(Collectors.toList());
@@ -94,8 +96,9 @@
       if (testFilter == null) {
         return null;
       }
-      List<String> blazeFlags = setTestFilter(handlerState.getBlazeFlags(), testFilter);
-      handlerState.setBlazeFlags(blazeFlags);
+      List<String> blazeFlags =
+          setTestFilter(handlerState.getBlazeFlagsState().getRawFlags(), testFilter);
+      handlerState.getBlazeFlagsState().setRawFlags(blazeFlags);
       return configuration.getState(executor, environment);
     }
 
diff --git a/base/src/com/google/idea/blaze/base/run/smrunner/BlazeXmlToTestEventsConverter.java b/base/src/com/google/idea/blaze/base/run/smrunner/BlazeXmlToTestEventsConverter.java
index be9d154..0cdee3b 100644
--- a/base/src/com/google/idea/blaze/base/run/smrunner/BlazeXmlToTestEventsConverter.java
+++ b/base/src/com/google/idea/blaze/base/run/smrunner/BlazeXmlToTestEventsConverter.java
@@ -15,7 +15,6 @@
  */
 package com.google.idea.blaze.base.run.smrunner;
 
-import com.google.common.collect.ImmutableMultimap;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
 import com.google.idea.blaze.base.model.primitives.Kind;
 import com.google.idea.blaze.base.model.primitives.Label;
@@ -23,7 +22,8 @@
 import com.google.idea.blaze.base.run.smrunner.BlazeXmlSchema.TestCase;
 import com.google.idea.blaze.base.run.smrunner.BlazeXmlSchema.TestSuite;
 import com.google.idea.blaze.base.run.targetfinder.TargetFinder;
-import com.google.idea.blaze.base.run.testlogs.BlazeTestXmlFinderStrategy;
+import com.google.idea.blaze.base.run.testlogs.BlazeTestResultFinderStrategy;
+import com.google.idea.blaze.base.run.testlogs.BlazeTestResults;
 import com.google.idea.sdkcompat.smrunner.SmRunnerCompatUtils;
 import com.intellij.execution.process.ProcessOutputTypes;
 import com.intellij.execution.testframework.TestConsoleProperties;
@@ -91,11 +91,26 @@
     onStartTesting();
     getProcessor().onTestsReporterAttached();
 
-    ImmutableMultimap<Label, File> xmlFiles =
-        BlazeTestXmlFinderStrategy.locateTestXmlFiles(project);
-    for (Label label : xmlFiles.keySet()) {
-      processTestSuites(label, xmlFiles.get(label));
+    BlazeTestResults testResults = BlazeTestResultFinderStrategy.locateTestResults(project);
+    for (Label target : testResults.failedTargets) {
+      reportFailedTarget(target);
     }
+    for (Label label : testResults.testXmlFiles.keySet()) {
+      processTestSuites(label, testResults.testXmlFiles.get(label));
+    }
+  }
+
+  private void reportFailedTarget(Label label) {
+    GeneralTestEventsProcessor processor = getProcessor();
+    TestSuiteStarted suiteStarted = new TestSuiteStarted(label.toString());
+    processor.onSuiteStarted(new TestSuiteStartedEvent(suiteStarted, null));
+    String targetName = label.targetName().toString();
+    processor.onTestStarted(new TestStartedEvent(targetName, null));
+    processor.onTestFailure(
+        SmRunnerCompatUtils.getTestFailedEvent(
+            targetName, "Target failed to build. See console output for details", null, 0));
+    processor.onTestFinished(new TestFinishedEvent(targetName, 0L));
+    processor.onSuiteFinished(new TestSuiteFinishedEvent(label.toString()));
   }
 
   /** Process all test XML files from a single test target. */
diff --git a/base/src/com/google/idea/blaze/base/run/smrunner/SmRunnerUtils.java b/base/src/com/google/idea/blaze/base/run/smrunner/SmRunnerUtils.java
index b9e80ba..54f6595 100644
--- a/base/src/com/google/idea/blaze/base/run/smrunner/SmRunnerUtils.java
+++ b/base/src/com/google/idea/blaze/base/run/smrunner/SmRunnerUtils.java
@@ -33,8 +33,10 @@
 import com.intellij.openapi.util.Disposer;
 import com.intellij.psi.search.GlobalSearchScope;
 import java.util.Arrays;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 import javax.swing.tree.TreePath;
@@ -88,6 +90,26 @@
   }
 
   public static List<Location<?>> getSelectedSmRunnerTreeElements(ConfigurationContext context) {
+    Project project = context.getProject();
+    List<SMTestProxy> tests = getSelectedTestProxies(context);
+    return tests
+        .stream()
+        .map(test -> (Location<?>) test.getLocation(project, GlobalSearchScope.allScope(project)))
+        .filter(Objects::nonNull)
+        .collect(Collectors.toList());
+  }
+
+  /** Counts all selected test cases, and their children, recursively */
+  public static int countSelectedTestCases(ConfigurationContext context) {
+    List<SMTestProxy> tests = getSelectedTestProxies(context);
+    Set<SMTestProxy> allTests = new HashSet<>(tests);
+    for (SMTestProxy test : tests) {
+      allTests.addAll(test.collectChildren());
+    }
+    return allTests.size();
+  }
+
+  private static List<SMTestProxy> getSelectedTestProxies(ConfigurationContext context) {
     SMTRunnerTestTreeView treeView =
         SMTRunnerTestTreeView.SM_TEST_RUNNER_VIEW.getData(context.getDataContext());
     if (treeView == null) {
@@ -98,18 +120,16 @@
       return ImmutableList.of();
     }
     return Arrays.stream(paths)
-        .map((path) -> toLocation(context.getProject(), treeView, path))
+        .map((path) -> toTestProxy(treeView, path))
         .filter(Objects::nonNull)
         .collect(Collectors.toList());
   }
 
   @Nullable
-  private static Location<?> toLocation(
-      Project project, SMTRunnerTestTreeView treeView, TreePath path) {
+  private static SMTestProxy toTestProxy(SMTRunnerTestTreeView treeView, TreePath path) {
     if (treeView.isPathSelected(path.getParentPath())) {
       return null;
     }
-    SMTestProxy test = treeView.getSelectedTest(path);
-    return test != null ? test.getLocation(project, GlobalSearchScope.allScope(project)) : null;
+    return treeView.getSelectedTest(path);
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/run/state/BlazeCommandRunConfigurationCommonState.java b/base/src/com/google/idea/blaze/base/run/state/BlazeCommandRunConfigurationCommonState.java
index ef2ec8e..082f4be 100644
--- a/base/src/com/google/idea/blaze/base/run/state/BlazeCommandRunConfigurationCommonState.java
+++ b/base/src/com/google/idea/blaze/base/run/state/BlazeCommandRunConfigurationCommonState.java
@@ -23,7 +23,6 @@
 import com.intellij.execution.configurations.RuntimeConfigurationException;
 import com.intellij.openapi.project.Project;
 import java.io.File;
-import java.util.List;
 import javax.annotation.Nullable;
 
 /**
@@ -49,46 +48,32 @@
     addStates(command, blazeFlags, exeFlags, blazeBinary, runOnDistributedExecutor);
   }
 
-  @Nullable
-  public BlazeCommandName getCommand() {
-    return command.getCommand();
-  }
-
   /** @return The list of blaze flags that the user specified manually. */
-  public List<String> getBlazeFlags() {
-    return blazeFlags.getFlags();
+  public RunConfigurationFlagsState getBlazeFlagsState() {
+    return blazeFlags;
   }
 
   /** @return The list of executable flags the user specified manually. */
-  public List<String> getExeFlags() {
-    return exeFlags.getFlags();
+  public RunConfigurationFlagsState getExeFlagsState() {
+    return exeFlags;
   }
 
-  @Nullable
-  public String getBlazeBinary() {
-    return blazeBinary.getBlazeBinary();
+  public BlazeBinaryState getBlazeBinaryState() {
+    return blazeBinary;
   }
 
-  public void setCommand(@Nullable BlazeCommandName command) {
-    this.command.setCommand(command);
+  public BlazeCommandState getCommandState() {
+    return command;
   }
 
-  public void setBlazeFlags(List<String> flags) {
-    this.blazeFlags.setFlags(flags);
-  }
-
-  public void setExeFlags(List<String> flags) {
-    this.exeFlags.setFlags(flags);
-  }
-
-  public void setBlazeBinary(@Nullable String blazeBinary) {
-    this.blazeBinary.setBlazeBinary(blazeBinary);
+  public BlazeRunOnDistributedExecutorState getRunOnDistributedExecutorState() {
+    return runOnDistributedExecutor;
   }
 
   /** Searches through all blaze flags for the first one beginning with '--test_filter' */
   @Nullable
   public String getTestFilterFlag() {
-    for (String flag : getBlazeFlags()) {
+    for (String flag : getBlazeFlagsState().getExpandedFlags()) {
       if (flag.startsWith(BlazeFlags.TEST_FILTER)) {
         return flag;
       }
@@ -96,19 +81,11 @@
     return null;
   }
 
-  public boolean getRunOnDistributedExecutor() {
-    return runOnDistributedExecutor.runOnDistributedExecutor;
-  }
-
-  public void setRunOnDistributedExecutor(boolean runOnDistributedExecutor) {
-    this.runOnDistributedExecutor.runOnDistributedExecutor = runOnDistributedExecutor;
-  }
-
   public void validate(String buildSystemName) throws RuntimeConfigurationException {
-    if (getCommand() == null) {
+    if (getCommandState().getCommand() == null) {
       throw new RuntimeConfigurationError("You must specify a command.");
     }
-    String blazeBinaryString = getBlazeBinary();
+    String blazeBinaryString = getBlazeBinaryState().getBlazeBinary();
     if (blazeBinaryString != null && !(new File(blazeBinaryString).exists())) {
       throw new RuntimeConfigurationError(buildSystemName + " binary does not exist");
     }
@@ -135,7 +112,7 @@
 
         // this editor needs to update based on state provided by other children.
         if (runOnExecutorEditor != null) {
-          boolean isTest = BlazeCommandName.TEST.equals(state.getCommand());
+          boolean isTest = BlazeCommandName.TEST.equals(state.getCommandState().getCommand());
           runOnExecutorEditor.updateVisibility(isTest);
         }
       }
diff --git a/base/src/com/google/idea/blaze/base/run/state/RunConfigurationFlagsState.java b/base/src/com/google/idea/blaze/base/run/state/RunConfigurationFlagsState.java
index 87d306c..9cb8a3c 100644
--- a/base/src/com/google/idea/blaze/base/run/state/RunConfigurationFlagsState.java
+++ b/base/src/com/google/idea/blaze/base/run/state/RunConfigurationFlagsState.java
@@ -17,6 +17,7 @@
 
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.command.BlazeFlags;
 import com.google.idea.blaze.base.ui.UiUtil;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.text.StringUtil;
@@ -42,11 +43,17 @@
     this.fieldLabel = fieldLabel;
   }
 
-  public List<String> getFlags() {
+  /** @return Flags subject to macro expansion. */
+  public List<String> getExpandedFlags() {
+    return BlazeFlags.expandBuildFlags(flags);
+  }
+
+  /** @return Raw flags that haven't been macro expanded */
+  public List<String> getRawFlags() {
     return flags;
   }
 
-  public void setFlags(List<String> flags) {
+  public void setRawFlags(List<String> flags) {
     this.flags = ImmutableList.copyOf(flags);
   }
 
@@ -118,13 +125,13 @@
     @Override
     public void resetEditorFrom(RunConfigurationState genericState) {
       RunConfigurationFlagsState state = (RunConfigurationFlagsState) genericState;
-      flagsField.setText(makeFlagString(state.getFlags()));
+      flagsField.setText(makeFlagString(state.getRawFlags()));
     }
 
     @Override
     public void applyEditorTo(RunConfigurationState genericState) {
       RunConfigurationFlagsState state = (RunConfigurationFlagsState) genericState;
-      state.setFlags(ParametersListUtil.parse(Strings.nullToEmpty(flagsField.getText())));
+      state.setRawFlags(ParametersListUtil.parse(Strings.nullToEmpty(flagsField.getText())));
     }
 
     @Override
diff --git a/base/src/com/google/idea/blaze/base/run/targetfinder/TargetFinder.java b/base/src/com/google/idea/blaze/base/run/targetfinder/TargetFinder.java
index cc88533..23a03a2 100644
--- a/base/src/com/google/idea/blaze/base/run/targetfinder/TargetFinder.java
+++ b/base/src/com/google/idea/blaze/base/run/targetfinder/TargetFinder.java
@@ -35,7 +35,7 @@
 
   @Nullable
   public TargetIdeInfo targetForLabel(Project project, final Label label) {
-    return findTarget(project, target -> target.key.label.equals(label));
+    return findTarget(project, target -> target.key.label.equals(label) && target.isPlainTarget());
   }
 
   public ImmutableList<TargetIdeInfo> targetsOfKinds(Project project, final Kind... kinds) {
diff --git a/base/src/com/google/idea/blaze/base/run/testlogs/BlazeCommandLogParser.java b/base/src/com/google/idea/blaze/base/run/testlogs/BlazeCommandLogParser.java
index 9993c83..6920313 100644
--- a/base/src/com/google/idea/blaze/base/run/testlogs/BlazeCommandLogParser.java
+++ b/base/src/com/google/idea/blaze/base/run/testlogs/BlazeCommandLogParser.java
@@ -36,6 +36,8 @@
   private static final Logger logger = Logger.getInstance(BlazeCommandLogParser.class);
 
   private static final Pattern TEST_LOG = Pattern.compile("^(//[^\\s]*) .*? (PASSED|FAILED)");
+  private static final Pattern FAILED_TARGET =
+      Pattern.compile("^Target (//[^\\s]*) failed to build");
 
   /** Finds log location and target label for all tests listed in the master log. */
   public static ImmutableSet<Label> parseTestTargets(File commandLog) {
@@ -47,6 +49,25 @@
     }
   }
 
+  /** Finds the targets which failed to build */
+  public static ImmutableSet<Label> parseFailedTargets(File commandLog) {
+    try (Stream<String> stream = Files.lines(Paths.get(commandLog.getPath()))) {
+      return parseTestTargets(stream);
+    } catch (IOException e) {
+      logger.warn("Error parsing master log", e);
+      return ImmutableSet.of();
+    }
+  }
+
+  @VisibleForTesting
+  static ImmutableSet<Label> parseFailedTargets(Stream<String> lines) {
+    return ImmutableSet.copyOf(
+        lines
+            .map(BlazeCommandLogParser::parseBuildFailure)
+            .filter(Objects::nonNull)
+            .collect(Collectors.toSet()));
+  }
+
   @VisibleForTesting
   static ImmutableSet<Label> parseTestTargets(Stream<String> lines) {
     return ImmutableSet.copyOf(
@@ -65,4 +86,14 @@
     }
     return Label.createIfValid(match.group(1));
   }
+
+  @Nullable
+  @VisibleForTesting
+  static Label parseBuildFailure(String line) {
+    Matcher match = FAILED_TARGET.matcher(line);
+    if (!match.find()) {
+      return null;
+    }
+    return Label.createIfValid(match.group(1));
+  }
 }
diff --git a/base/src/com/google/idea/blaze/base/run/testlogs/BlazeTestXmlFinderStrategy.java b/base/src/com/google/idea/blaze/base/run/testlogs/BlazeTestResultFinderStrategy.java
similarity index 60%
rename from base/src/com/google/idea/blaze/base/run/testlogs/BlazeTestXmlFinderStrategy.java
rename to base/src/com/google/idea/blaze/base/run/testlogs/BlazeTestResultFinderStrategy.java
index a069108..cff8bd4 100644
--- a/base/src/com/google/idea/blaze/base/run/testlogs/BlazeTestXmlFinderStrategy.java
+++ b/base/src/com/google/idea/blaze/base/run/testlogs/BlazeTestResultFinderStrategy.java
@@ -15,40 +15,40 @@
  */
 package com.google.idea.blaze.base.run.testlogs;
 
-import com.google.common.collect.ImmutableMultimap;
-import com.google.idea.blaze.base.model.primitives.Label;
 import com.google.idea.blaze.base.settings.Blaze;
 import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
 import com.intellij.openapi.extensions.ExtensionPointName;
 import com.intellij.openapi.project.Project;
-import java.io.File;
+import javax.annotation.Nullable;
 
-/** A strategy for locating output test XML files. */
-public interface BlazeTestXmlFinderStrategy {
+/** A strategy for locating results from 'blaze test' invocation (e.g. output XML files). */
+public interface BlazeTestResultFinderStrategy {
 
-  ExtensionPointName<BlazeTestXmlFinderStrategy> EP_NAME =
+  ExtensionPointName<BlazeTestResultFinderStrategy> EP_NAME =
       ExtensionPointName.create("com.google.idea.blaze.BlazeTestXmlFinderStrategy");
 
   /**
    * Attempt to find all output test XML files produced by the most recent blaze invocation, grouped
    * by target label.
    */
-  static ImmutableMultimap<Label, File> locateTestXmlFiles(Project project) {
+  @Nullable
+  static BlazeTestResults locateTestResults(Project project) {
     BuildSystem buildSystem = Blaze.getBuildSystem(project);
-    ImmutableMultimap.Builder<Label, File> output = ImmutableMultimap.builder();
-    for (BlazeTestXmlFinderStrategy strategy : EP_NAME.getExtensions()) {
+    for (BlazeTestResultFinderStrategy strategy : EP_NAME.getExtensions()) {
       if (strategy.handlesBuildSystem(buildSystem)) {
-        output.putAll(strategy.findTestXmlFiles(project));
+        return strategy.findTestResults(project);
       }
     }
-    return output.build();
+    return null;
   }
 
   /**
-   * Attempt to find all output test XML files produced by the most recent blaze invocation, grouped
-   * by target label. Called after the 'blaze test' process completes.
+   * Attempt to find test results corresponding to the most recent blaze invocation. Called after
+   * the 'blaze test' process completes.
    */
-  ImmutableMultimap<Label, File> findTestXmlFiles(Project project);
+  @Nullable
+  BlazeTestResults findTestResults(Project project);
 
+  /** Results are taken from the first strategy handling a given build system */
   boolean handlesBuildSystem(BuildSystem buildSystem);
 }
diff --git a/base/src/com/google/idea/blaze/base/run/testlogs/BlazeTestResults.java b/base/src/com/google/idea/blaze/base/run/testlogs/BlazeTestResults.java
new file mode 100644
index 0000000..7d50bf2
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/run/testlogs/BlazeTestResults.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.run.testlogs;
+
+import com.google.common.collect.ImmutableMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.model.primitives.Label;
+import java.io.File;
+
+/** Results from a 'blaze test' invocation. */
+public class BlazeTestResults {
+
+  /** Output test XML files, grouped by target label. */
+  public final ImmutableMultimap<Label, File> testXmlFiles;
+  /** Targets which failed to build */
+  public final ImmutableSet<Label> failedTargets;
+
+  public BlazeTestResults(
+      ImmutableMultimap<Label, File> testXmlFiles, ImmutableSet<Label> failedTargets) {
+    this.testXmlFiles = testXmlFiles;
+    this.failedTargets = failedTargets;
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/run/testlogs/TargetPathTestXmlFinderStrategy.java b/base/src/com/google/idea/blaze/base/run/testlogs/TargetPathTestResultFinderStrategy.java
similarity index 90%
rename from base/src/com/google/idea/blaze/base/run/testlogs/TargetPathTestXmlFinderStrategy.java
rename to base/src/com/google/idea/blaze/base/run/testlogs/TargetPathTestResultFinderStrategy.java
index 30b2b05..c18cc65 100644
--- a/base/src/com/google/idea/blaze/base/run/testlogs/TargetPathTestXmlFinderStrategy.java
+++ b/base/src/com/google/idea/blaze/base/run/testlogs/TargetPathTestResultFinderStrategy.java
@@ -30,7 +30,7 @@
  * Attempts to parse the list of test targets from the command log, then searches the corresponding
  * path in the bazel-testlogs output tree.
  */
-public class TargetPathTestXmlFinderStrategy implements BlazeTestXmlFinderStrategy {
+public class TargetPathTestResultFinderStrategy implements BlazeTestResultFinderStrategy {
 
   @Override
   public boolean handlesBuildSystem(BuildSystem buildSystem) {
@@ -38,14 +38,14 @@
   }
 
   @Override
-  public ImmutableMultimap<Label, File> findTestXmlFiles(Project project) {
+  public BlazeTestResults findTestResults(Project project) {
     File testLogsDir = getTestLogsTree(project);
     if (testLogsDir == null) {
-      return ImmutableMultimap.of();
+      return null;
     }
     File commandLog = getCommandLog(project);
     if (commandLog == null) {
-      return ImmutableMultimap.of();
+      return null;
     }
     ImmutableMultimap.Builder<Label, File> output = ImmutableMultimap.builder();
     for (Label label : BlazeCommandLogParser.parseTestTargets(commandLog)) {
@@ -54,7 +54,8 @@
         output.put(label, testXml);
       }
     }
-    return output.build();
+    return new BlazeTestResults(
+        output.build(), BlazeCommandLogParser.parseFailedTargets(commandLog));
   }
 
   @Nullable
diff --git a/base/src/com/google/idea/blaze/base/scope/Scope.java b/base/src/com/google/idea/blaze/base/scope/Scope.java
index 27003e5..e288d8a 100644
--- a/base/src/com/google/idea/blaze/base/scope/Scope.java
+++ b/base/src/com/google/idea/blaze/base/scope/Scope.java
@@ -16,6 +16,7 @@
 package com.google.idea.blaze.base.scope;
 
 import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.progress.ProcessCanceledException;
 import javax.annotation.Nullable;
 import org.jetbrains.annotations.NotNull;
 
@@ -34,6 +35,9 @@
     BlazeContext context = new BlazeContext(parentContext);
     try {
       return scopedFunction.execute(context);
+    } catch (ProcessCanceledException e) {
+      context.setCancelled();
+      throw e;
     } catch (RuntimeException e) {
       context.setHasError();
       logger.error(e);
@@ -54,6 +58,9 @@
     BlazeContext context = new BlazeContext(parentContext);
     try {
       scopedOperation.execute(context);
+    } catch (ProcessCanceledException e) {
+      context.setCancelled();
+      throw e;
     } catch (RuntimeException e) {
       context.setHasError();
       logger.error(e);
diff --git a/base/src/com/google/idea/blaze/base/settings/BlazeImportSettings.java b/base/src/com/google/idea/blaze/base/settings/BlazeImportSettings.java
index 86194e8..e19d578 100644
--- a/base/src/com/google/idea/blaze/base/settings/BlazeImportSettings.java
+++ b/base/src/com/google/idea/blaze/base/settings/BlazeImportSettings.java
@@ -16,6 +16,7 @@
 package com.google.idea.blaze.base.settings;
 
 import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import java.util.UUID;
 import javax.annotation.Nullable;
 
 /** Project settings that are set at import time. */
@@ -42,17 +43,22 @@
       String workspaceRoot,
       String projectName,
       String projectDataDirectory,
-      String locationHash,
       String projectViewFile,
       BuildSystem buildSystem) {
     this.workspaceRoot = workspaceRoot;
     this.projectName = projectName;
     this.projectDataDirectory = projectDataDirectory;
-    this.locationHash = locationHash;
+    this.locationHash = createLocationHash(projectName);
     this.projectViewFile = projectViewFile;
     this.buildSystem = buildSystem;
   }
 
+  private static String createLocationHash(String projectName) {
+    String uuid = UUID.randomUUID().toString();
+    uuid = uuid.substring(0, Math.min(uuid.length(), 8));
+    return projectName.replaceAll("[^a-zA-Z0-9]", "") + "-" + uuid;
+  }
+
   @SuppressWarnings("unused")
   public String getWorkspaceRoot() {
     return workspaceRoot;
diff --git a/base/src/com/google/idea/blaze/base/settings/ui/AddDirectoryToProjectAction.java b/base/src/com/google/idea/blaze/base/settings/ui/AddDirectoryToProjectAction.java
new file mode 100644
index 0000000..b9b1203
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/settings/ui/AddDirectoryToProjectAction.java
@@ -0,0 +1,248 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.settings.ui;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.util.stream.Collectors.toCollection;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.actions.BlazeProjectAction;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.projectview.ProjectViewEdit;
+import com.google.idea.blaze.base.projectview.ProjectViewManager;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.projectview.section.ListSection;
+import com.google.idea.blaze.base.projectview.section.ListSection.Builder;
+import com.google.idea.blaze.base.projectview.section.sections.DirectoryEntry;
+import com.google.idea.blaze.base.projectview.section.sections.DirectorySection;
+import com.google.idea.blaze.base.projectview.section.sections.TargetSection;
+import com.google.idea.blaze.base.settings.BlazeImportSettings;
+import com.google.idea.blaze.base.settings.BlazeImportSettingsManager;
+import com.google.idea.blaze.base.settings.BlazeUserSettings;
+import com.google.idea.blaze.base.sync.BlazeSyncManager;
+import com.google.idea.blaze.base.sync.BlazeSyncParams;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.sync.projectview.ImportRoots;
+import com.google.idea.blaze.base.sync.projectview.RelatedWorkspacePathFinder;
+import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.google.idea.blaze.base.ui.WorkspaceFileTextField;
+import com.intellij.icons.AllIcons;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.fileChooser.FileChooserDescriptor;
+import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory;
+import com.intellij.openapi.fileChooser.FileTextField;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.DialogWrapper;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.ui.ValidationInfo;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.ui.components.JBLabel;
+import com.intellij.util.ui.SwingHelper;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.io.File;
+import java.util.LinkedHashSet;
+import java.util.Set;
+import javax.annotation.Nullable;
+import javax.swing.Box;
+import javax.swing.JComponent;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+
+final class AddDirectoryToProjectAction extends BlazeProjectAction {
+
+  private static final String WARNING_TEXT =
+      "This will add all blaze targets below this directory to your project. This could have a "
+          + "large impact on your project build times if the directory contains a lot of code or "
+          + "expensive genrule targets.";
+
+  @Override
+  protected void actionPerformedInBlazeProject(Project project, AnActionEvent e) {
+    BlazeProjectData blazeProjectData =
+        BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
+    if (blazeProjectData == null) {
+      return;
+    }
+
+    new OpenBlazeWorkspaceFileActionDialog(project, blazeProjectData.workspacePathResolver).show();
+  }
+
+  private static class OpenBlazeWorkspaceFileActionDialog extends DialogWrapper {
+
+    static final int PATH_FIELD_WIDTH = 40;
+    final Project project;
+    final WorkspacePathResolver workspacePathResolver;
+    final JPanel component;
+    final FileTextField fileTextField;
+
+    OpenBlazeWorkspaceFileActionDialog(
+        Project project, WorkspacePathResolver workspacePathResolver) {
+      super(project, /* canBeParent */ false, IdeModalityType.PROJECT);
+      this.project = project;
+      this.workspacePathResolver = workspacePathResolver;
+
+      FileChooserDescriptor descriptor =
+          FileChooserDescriptorFactory.createSingleFolderDescriptor();
+      fileTextField =
+          WorkspaceFileTextField.create(
+              workspacePathResolver, descriptor, PATH_FIELD_WIDTH, myDisposable);
+      JBLabel directoryLabel =
+          new JBLabel("Directory:", AllIcons.Modules.SourceFolder, SwingConstants.LEFT);
+      JPanel directoryPanel =
+          SwingHelper.newHorizontalPanel(
+              Component.TOP_ALIGNMENT, directoryLabel, fileTextField.getField());
+
+      JBLabel warning =
+          new JBLabel(
+              "<html>" + WARNING_TEXT + "</html>",
+              AllIcons.General.BalloonWarning,
+              SwingConstants.LEFT);
+      warning.setPreferredSize(new Dimension(800, 100));
+      component =
+          SwingHelper.newLeftAlignedVerticalPanel(
+              directoryPanel, warning, Box.createVerticalGlue());
+
+      setTitle("Add Directory to Project");
+
+      init();
+    }
+
+    @Nullable
+    @Override
+    protected JComponent createCenterPanel() {
+      return component;
+    }
+
+    @Nullable
+    @Override
+    public JComponent getPreferredFocusedComponent() {
+      return fileTextField.getField();
+    }
+
+    @Nullable
+    @Override
+    protected ValidationInfo doValidate() {
+      VirtualFile selectedFile = fileTextField.getSelectedFile();
+      if (selectedFile == null || !selectedFile.exists()) {
+        return new ValidationInfo("File does not exist", fileTextField.getField());
+      } else if (!selectedFile.isDirectory()) {
+        return new ValidationInfo("File is not a directory", fileTextField.getField());
+      }
+
+      WorkspacePath workspacePath =
+          workspacePathResolver.getWorkspacePath(new File(selectedFile.getPath()));
+      if (workspacePath == null) {
+        return new ValidationInfo("File is not in workspace", fileTextField.getField());
+      }
+
+      ProjectViewSet projectViewSet = ProjectViewManager.getInstance(project).getProjectViewSet();
+      checkState(projectViewSet != null);
+
+      BlazeImportSettings importSettings =
+          BlazeImportSettingsManager.getInstance(project).getImportSettings();
+      checkState(importSettings != null);
+
+      ImportRoots importRoots =
+          ImportRoots.builder(
+                  WorkspaceRoot.fromImportSettings(importSettings), importSettings.getBuildSystem())
+              .add(projectViewSet)
+              .build();
+
+      if (importRoots.containsWorkspacePath(workspacePath)) {
+        return new ValidationInfo("This directory is already included in your project");
+      }
+
+      return null;
+    }
+
+    @Override
+    protected void doOKAction() {
+      VirtualFile selectedFile = fileTextField.getSelectedFile();
+      checkState(selectedFile != null);
+      WorkspacePath workspacePath =
+          workspacePathResolver.getWorkspacePath(new File(selectedFile.getPath()));
+      checkState(workspacePath != null);
+
+      ProjectViewSet projectViewSet = ProjectViewManager.getInstance(project).getProjectViewSet();
+      checkState(projectViewSet != null);
+
+      Set<DirectoryEntry> existingDirectories =
+          ImmutableSet.copyOf(projectViewSet.listItems(DirectorySection.KEY));
+      Set<TargetExpression> existingTargets =
+          ImmutableSet.copyOf(projectViewSet.listItems(TargetSection.KEY));
+
+      Set<WorkspacePath> pathsToAdd = new LinkedHashSet<>();
+      pathsToAdd.add(workspacePath);
+      pathsToAdd.addAll(
+          RelatedWorkspacePathFinder.getInstance()
+              .findRelatedWorkspaceDirectories(workspacePathResolver, workspacePath));
+
+      Set<DirectoryEntry> newDirectories =
+          pathsToAdd
+              .stream()
+              .map(DirectoryEntry::include)
+              .filter(entry -> !existingDirectories.contains(entry))
+              .collect(toCollection(LinkedHashSet::new));
+
+      Set<TargetExpression> newTargets =
+          pathsToAdd
+              .stream()
+              .map(TargetExpression::allFromPackageRecursive)
+              .filter(entry -> !existingTargets.contains(entry))
+              .collect(toCollection(LinkedHashSet::new));
+
+      ProjectViewEdit edit =
+          ProjectViewEdit.editLocalProjectView(
+              project,
+              builder -> {
+                ListSection<DirectoryEntry> directories = builder.getLast(DirectorySection.KEY);
+                Builder<DirectoryEntry> directoriesUpdater =
+                    ListSection.update(DirectorySection.KEY, directories);
+                newDirectories.forEach(directoriesUpdater::add);
+                builder.replace(directories, directoriesUpdater);
+
+                ListSection<TargetExpression> targets = builder.getLast(TargetSection.KEY);
+                Builder<TargetExpression> targetsUpdater =
+                    ListSection.update(TargetSection.KEY, targets);
+                newTargets.forEach(targetsUpdater::add);
+                builder.replace(targets, targetsUpdater);
+
+                return true;
+              });
+
+      if (edit == null) {
+        Messages.showErrorDialog(
+            "Could not modify project view. Check for errors in your project view and try again",
+            "Error");
+        return;
+      }
+
+      edit.apply();
+
+      BlazeSyncManager.getInstance(project)
+          .requestProjectSync(
+              new BlazeSyncParams.Builder("Sync", BlazeSyncParams.SyncMode.INCREMENTAL)
+                  .addProjectViewTargets(true)
+                  .addWorkingSet(BlazeUserSettings.getInstance().getExpandSyncToWorkingSet())
+                  .build());
+
+      super.doOKAction();
+    }
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/settings/ui/JPanelProvidingProject.java b/base/src/com/google/idea/blaze/base/settings/ui/JPanelProvidingProject.java
index 8e763f1..62370d2 100644
--- a/base/src/com/google/idea/blaze/base/settings/ui/JPanelProvidingProject.java
+++ b/base/src/com/google/idea/blaze/base/settings/ui/JPanelProvidingProject.java
@@ -37,6 +37,11 @@
     this.project = project;
   }
 
+  public JPanelProvidingProject(Project project) {
+    super();
+    this.project = project;
+  }
+
   @Nullable
   @Override
   public Object getData(String dataId) {
diff --git a/base/src/com/google/idea/blaze/base/sync/BlazeSyncPlugin.java b/base/src/com/google/idea/blaze/base/sync/BlazeSyncPlugin.java
index 6675f13..c79a9c9 100644
--- a/base/src/com/google/idea/blaze/base/sync/BlazeSyncPlugin.java
+++ b/base/src/com/google/idea/blaze/base/sync/BlazeSyncPlugin.java
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.model.BlazeVersionData;
@@ -30,7 +31,6 @@
 import com.google.idea.blaze.base.sync.libraries.LibrarySource;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
-import com.google.idea.blaze.base.sync.workspace.BlazeRoots;
 import com.google.idea.blaze.base.sync.workspace.WorkingSet;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import com.intellij.openapi.extensions.ExtensionPointName;
@@ -90,6 +90,12 @@
   /** @return The set of supported languages under this workspace type. */
   Set<LanguageClass> getSupportedLanguagesInWorkspace(WorkspaceType workspaceType);
 
+  /**
+   * @return The set of languages which are always active, regardless of which
+   *     'additional_languages' are requested.
+   */
+  Set<LanguageClass> getAlwaysActiveLanguages();
+
   /** Installs any global SDKs */
   void installSdks(BlazeContext context);
 
@@ -100,7 +106,7 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings,
-      BlazeRoots blazeRoots,
+      BlazeInfo blazeInfo,
       @Nullable WorkingSet workingSet,
       WorkspacePathResolver workspacePathResolver,
       ArtifactLocationDecoder artifactLocationDecoder,
@@ -160,6 +166,7 @@
    * @return True for success, false for fatal error.
    */
   boolean validateProjectView(
+      @Nullable Project project,
       BlazeContext context,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings);
@@ -168,7 +175,7 @@
   Collection<SectionParser> getSections();
 
   @Nullable
-  LibrarySource getLibrarySource(BlazeProjectData blazeProjectData);
+  LibrarySource getLibrarySource(ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData);
 
   /** Convenience adapter to help stubbing out methods. */
   class Adapter implements BlazeSyncPlugin {
@@ -196,6 +203,11 @@
     }
 
     @Override
+    public Set<LanguageClass> getAlwaysActiveLanguages() {
+      return ImmutableSet.of();
+    }
+
+    @Override
     public void installSdks(BlazeContext context) {}
 
     @Override
@@ -205,7 +217,7 @@
         WorkspaceRoot workspaceRoot,
         ProjectViewSet projectViewSet,
         WorkspaceLanguageSettings workspaceLanguageSettings,
-        BlazeRoots blazeRoots,
+        BlazeInfo blazeInfo,
         @Nullable WorkingSet workingSet,
         WorkspacePathResolver workspacePathResolver,
         ArtifactLocationDecoder artifactLocationDecoder,
@@ -259,6 +271,7 @@
 
     @Override
     public boolean validateProjectView(
+        @Nullable Project project,
         BlazeContext context,
         ProjectViewSet projectViewSet,
         WorkspaceLanguageSettings workspaceLanguageSettings) {
@@ -272,7 +285,8 @@
 
     @Nullable
     @Override
-    public LibrarySource getLibrarySource(BlazeProjectData blazeProjectData) {
+    public LibrarySource getLibrarySource(
+        ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
       return null;
     }
   }
diff --git a/base/src/com/google/idea/blaze/base/sync/BlazeSyncTask.java b/base/src/com/google/idea/blaze/base/sync/BlazeSyncTask.java
index 5504048..a019ffd 100644
--- a/base/src/com/google/idea/blaze/base/sync/BlazeSyncTask.java
+++ b/base/src/com/google/idea/blaze/base/sync/BlazeSyncTask.java
@@ -16,7 +16,6 @@
 package com.google.idea.blaze.base.sync;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
@@ -27,6 +26,7 @@
 import com.google.idea.blaze.base.async.executor.BlazeExecutor;
 import com.google.idea.blaze.base.command.BlazeFlags;
 import com.google.idea.blaze.base.command.info.BlazeInfo;
+import com.google.idea.blaze.base.command.info.BlazeInfoRunner;
 import com.google.idea.blaze.base.experiments.ExperimentScope;
 import com.google.idea.blaze.base.filecache.FileCaches;
 import com.google.idea.blaze.base.ideinfo.TargetKey;
@@ -65,7 +65,7 @@
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin.ModuleEditor;
 import com.google.idea.blaze.base.sync.SyncListener.SyncResult;
 import com.google.idea.blaze.base.sync.aspects.BlazeIdeInterface;
-import com.google.idea.blaze.base.sync.aspects.BlazeIdeInterface.BuildResult;
+import com.google.idea.blaze.base.sync.aspects.BuildResult;
 import com.google.idea.blaze.base.sync.data.BlazeDataStorage;
 import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
 import com.google.idea.blaze.base.sync.data.BlazeProjectDataManagerImpl;
@@ -75,12 +75,16 @@
 import com.google.idea.blaze.base.sync.projectstructure.DirectoryStructure;
 import com.google.idea.blaze.base.sync.projectstructure.ModuleEditorImpl;
 import com.google.idea.blaze.base.sync.projectstructure.ModuleEditorProvider;
+import com.google.idea.blaze.base.sync.projectstructure.ModuleFinder;
 import com.google.idea.blaze.base.sync.projectview.ImportRoots;
 import com.google.idea.blaze.base.sync.projectview.LanguageSupport;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
+import com.google.idea.blaze.base.sync.sharding.BlazeBuildTargetSharder;
+import com.google.idea.blaze.base.sync.sharding.BlazeBuildTargetSharder.ShardedTargetsResult;
+import com.google.idea.blaze.base.sync.sharding.ShardedTargetList;
+import com.google.idea.blaze.base.sync.sharding.SuggestEnablingShardingNotification;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoderImpl;
-import com.google.idea.blaze.base.sync.workspace.BlazeRoots;
 import com.google.idea.blaze.base.sync.workspace.WorkingSet;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolverImpl;
@@ -91,8 +95,8 @@
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.module.Module;
-import com.intellij.openapi.module.ModuleManager;
 import com.intellij.openapi.module.ModuleType;
+import com.intellij.openapi.progress.ProcessCanceledException;
 import com.intellij.openapi.progress.ProgressIndicator;
 import com.intellij.openapi.progress.Progressive;
 import com.intellij.openapi.project.Project;
@@ -102,6 +106,7 @@
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vfs.VirtualFileManager;
 import java.io.File;
+import java.io.IOException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
@@ -154,6 +159,20 @@
         });
   }
 
+  @Nullable
+  private BlazeProjectData getOldProjectData(BlazeContext context) {
+    try {
+      return BlazeProjectDataManagerImpl.getImpl(project).loadProjectRoot(importSettings);
+    } catch (IOException e) {
+      logger.info(e);
+      context.output(
+          new StatusOutput(
+              String.format(
+                  "Couldn't load previously cached project data; full sync will be needed")));
+      return null;
+    }
+  }
+
   /** Returns true if sync successfully completed */
   @VisibleForTesting
   boolean syncProject(BlazeContext context) {
@@ -162,10 +181,7 @@
     try {
       SaveUtil.saveAllFiles();
       BlazeProjectData oldBlazeProjectData =
-          syncMode != SyncMode.FULL
-              ? BlazeProjectDataManagerImpl.getImpl(project)
-                  .loadProjectRoot(context, importSettings)
-              : null;
+          syncMode != SyncMode.FULL ? getOldProjectData(context) : null;
       if (oldBlazeProjectData == null) {
         syncMode = SyncMode.FULL;
       }
@@ -184,8 +200,14 @@
         onSyncComplete(project, context, projectViewSet, blazeProjectData, syncMode, syncResult);
       }
     } catch (AssertionError | Exception e) {
-      logger.error(e);
-      IssueOutput.error("Internal error: " + e.getMessage()).submit(context);
+      Throwable rootCause = e;
+      while (rootCause.getCause() != null) {
+        rootCause = rootCause.getCause();
+      }
+      if (!(rootCause instanceof ProcessCanceledException)) {
+        logger.error(e);
+        IssueOutput.error("Internal error: " + e.getMessage()).submit(context);
+      }
     } finally {
       afterSync(project, context, syncMode, syncResult);
     }
@@ -217,19 +239,19 @@
     }
     ProjectViewSet projectViewSet = workspacePathResolverAndProjectView.projectViewSet;
 
-    ListenableFuture<ImmutableMap<String, String>> blazeInfoFuture =
-        BlazeInfo.getInstance()
+    ListenableFuture<BlazeInfo> blazeInfoFuture =
+        BlazeInfoRunner.getInstance()
             .runBlazeInfo(
                 context,
+                importSettings.getBuildSystem(),
                 Blaze.getBuildSystemProvider(project).getSyncBinaryPath(),
                 workspaceRoot,
                 BlazeFlags.buildFlags(project, projectViewSet));
 
-
     ListenableFuture<WorkingSet> workingSetFuture =
         vcsHandler.getWorkingSet(project, context, workspaceRoot, executor);
 
-    ImmutableMap<String, String> blazeInfo =
+    BlazeInfo blazeInfo =
         FutureUtil.waitForFuture(context, blazeInfoFuture)
             .timed(Blaze.buildSystemName(project) + "Info")
             .withProgressMessage(
@@ -240,17 +262,16 @@
     if (blazeInfo == null) {
       return SyncResult.FAILURE;
     }
-    BlazeRoots blazeRoots = BlazeRoots.build(importSettings.getBuildSystem(), blazeInfo);
     BlazeVersionData blazeVersionData =
         BlazeVersionData.build(importSettings.getBuildSystem(), workspaceRoot, blazeInfo);
 
     WorkspacePathResolver workspacePathResolver =
         workspacePathResolverAndProjectView.workspacePathResolver;
     ArtifactLocationDecoder artifactLocationDecoder =
-        new ArtifactLocationDecoderImpl(blazeRoots, workspacePathResolver);
+        new ArtifactLocationDecoderImpl(blazeInfo, workspacePathResolver);
 
     WorkspaceLanguageSettings workspaceLanguageSettings =
-        LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
     if (workspaceLanguageSettings == null) {
       return SyncResult.FAILURE;
     }
@@ -260,7 +281,7 @@
     }
 
     if (!ProjectViewVerifier.verifyProjectView(
-        context, workspacePathResolver, projectViewSet, workspaceLanguageSettings)) {
+        project, context, workspacePathResolver, projectViewSet, workspaceLanguageSettings)) {
       return SyncResult.FAILURE;
     }
 
@@ -309,6 +330,14 @@
       printTargets(context, syncParams.title, syncParams.targetExpressions);
     }
 
+    ShardedTargetsResult shardedTargetsResult =
+        BlazeBuildTargetSharder.expandAndShardTargets(
+            project, context, workspaceRoot, projectViewSet, workspacePathResolver, targets);
+    if (shardedTargetsResult.buildResult.status == BuildResult.Status.FATAL_ERROR) {
+      return SyncResult.FAILURE;
+    }
+    ShardedTargetList shardedTargets = shardedTargetsResult.shardedTargets;
+
     boolean mergeWithOldState = !syncParams.addProjectViewTargets;
     BlazeIdeInterface.IdeResult ideQueryResult =
         getIdeQueryResult(
@@ -316,7 +345,7 @@
             context,
             projectViewSet,
             blazeVersionData,
-            targets,
+            shardedTargets,
             workspaceLanguageSettings,
             artifactLocationDecoder,
             syncStateBuilder,
@@ -325,8 +354,12 @@
     if (context.isCancelled()) {
       return SyncResult.CANCELLED;
     }
-    if (ideQueryResult.targetMap == null || ideQueryResult.buildResult == BuildResult.FATAL_ERROR) {
+    if (ideQueryResult.targetMap == null
+        || ideQueryResult.buildResult.status == BuildResult.Status.FATAL_ERROR) {
       context.setHasError();
+      if (ideQueryResult.buildResult.outOfMemory()) {
+        SuggestEnablingShardingNotification.suggestSharding(project, context);
+      }
       return SyncResult.FAILURE;
     }
 
@@ -338,9 +371,12 @@
 
     BuildResult ideResolveResult =
         resolveIdeArtifacts(
-            project, context, workspaceRoot, projectViewSet, blazeVersionData, targets);
-    if (ideResolveResult == BuildResult.FATAL_ERROR) {
+            project, context, workspaceRoot, projectViewSet, blazeVersionData, shardedTargets);
+    if (ideResolveResult.status == BuildResult.Status.FATAL_ERROR) {
       context.setHasError();
+      if (ideResolveResult.outOfMemory()) {
+        SuggestEnablingShardingNotification.suggestSharding(project, context);
+      }
       return SyncResult.FAILURE;
     }
     if (context.isCancelled()) {
@@ -358,7 +394,7 @@
                 workspaceRoot,
                 projectViewSet,
                 workspaceLanguageSettings,
-                blazeRoots,
+                blazeInfo,
                 workingSet,
                 workspacePathResolver,
                 artifactLocationDecoder,
@@ -383,18 +419,17 @@
             syncStartTime,
             targetMap,
             blazeInfo,
-            blazeRoots,
             blazeVersionData,
             workspacePathResolver,
             artifactLocationDecoder,
             workspaceLanguageSettings,
             syncStateBuilder.build(),
-            reverseDependencies,
-            null);
+            reverseDependencies);
 
     FileCaches.onSync(project, context, projectViewSet, newBlazeProjectData, syncMode);
     ListenableFuture<?> prefetch =
-        PrefetchService.getInstance().prefetchProjectFiles(project, newBlazeProjectData);
+        PrefetchService.getInstance()
+            .prefetchProjectFiles(project, projectViewSet, newBlazeProjectData);
     FutureUtil.waitForFuture(context, prefetch)
         .withProgressMessage("Prefetching files...")
         .timed("PrefetchFiles")
@@ -431,16 +466,19 @@
 
     SyncResult syncResult = SyncResult.SUCCESS;
 
-    if (ideInfoResult == BuildResult.BUILD_ERROR || ideResolveResult == BuildResult.BUILD_ERROR) {
+    if (ideInfoResult.status == BuildResult.Status.BUILD_ERROR
+        || ideResolveResult.status == BuildResult.Status.BUILD_ERROR) {
       final String errorType =
-          ideInfoResult == BuildResult.BUILD_ERROR ? "BUILD file errors" : "compilation errors";
+          ideInfoResult.status == BuildResult.Status.BUILD_ERROR
+              ? "BUILD file errors"
+              : "compilation errors";
 
       String message =
           String.format(
               "Sync was successful, but there were %s. "
                   + "The project may not be fully updated or resolve until fixed. "
                   + "If the errors are from your working set, please uncheck "
-                  + "'Blaze > Expand Sync to Working Set' and try again.",
+                  + "'Blaze > Sync > Expand Sync to Working Set' and try again.",
               errorType);
       context.output(PrintOutput.error(message));
       IssueOutput.warn(message).submit(context);
@@ -481,9 +519,7 @@
   }
 
   private WorkspacePathResolverAndProjectView computeWorkspacePathResolverAndProjectView(
-      BlazeContext context,
-      BlazeVcsHandler vcsHandler,
-      ListeningExecutorService executor) {
+      BlazeContext context, BlazeVcsHandler vcsHandler, ListeningExecutorService executor) {
     context.output(new StatusOutput("Updating VCS..."));
 
     for (int i = 0; i < 3; ++i) {
@@ -603,7 +639,7 @@
       BlazeContext parentContext,
       ProjectViewSet projectViewSet,
       BlazeVersionData blazeVersionData,
-      List<TargetExpression> targets,
+      ShardedTargetList shardedTargets,
       WorkspaceLanguageSettings workspaceLanguageSettings,
       ArtifactLocationDecoder artifactLocationDecoder,
       Builder syncStateBuilder,
@@ -624,7 +660,7 @@
               workspaceRoot,
               projectViewSet,
               blazeVersionData,
-              targets,
+              shardedTargets,
               workspaceLanguageSettings,
               artifactLocationDecoder,
               syncStateBuilder,
@@ -639,7 +675,7 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       BlazeVersionData blazeVersionData,
-      List<TargetExpression> targetExpressions) {
+      ShardedTargetList shardedTargets) {
     return Scope.push(
         parentContext,
         context -> {
@@ -649,12 +685,12 @@
           // We don't want IDE resolve errors to fail the whole sync
           context.setPropagatesErrors(false);
 
-          if (targetExpressions.isEmpty()) {
+          if (shardedTargets.isEmpty()) {
             return BuildResult.SUCCESS;
           }
           BlazeIdeInterface blazeIdeInterface = BlazeIdeInterface.getInstance();
           return blazeIdeInterface.resolveIdeArtifacts(
-              project, context, workspaceRoot, projectViewSet, blazeVersionData, targetExpressions);
+              project, context, workspaceRoot, projectViewSet, blazeVersionData, shardedTargets);
         });
   }
 
@@ -744,8 +780,10 @@
         directoryStructure,
         workspaceModifiableModel);
 
-    List<BlazeLibrary> libraries = BlazeLibraryCollector.getLibraries(newBlazeProjectData);
-    LibraryEditor.updateProjectLibraries(project, context, newBlazeProjectData, libraries);
+    List<BlazeLibrary> libraries =
+        BlazeLibraryCollector.getLibraries(projectViewSet, newBlazeProjectData);
+    LibraryEditor.updateProjectLibraries(
+        project, context, projectViewSet, newBlazeProjectData, libraries);
     LibraryEditor.configureDependencies(workspaceModifiableModel, libraries);
 
     for (BlazeSyncPlugin blazeSyncPlugin : BlazeSyncPlugin.EP_NAME.getExtensions()) {
@@ -781,7 +819,7 @@
               .runReadAction(
                   () -> {
                     Module workspaceModule =
-                        ModuleManager.getInstance(project)
+                        ModuleFinder.getInstance(project)
                             .findModuleByName(BlazeDataStorage.WORKSPACE_MODULE_NAME);
                     for (BlazeSyncPlugin blazeSyncPlugin :
                         BlazeSyncPlugin.EP_NAME.getExtensions()) {
diff --git a/base/src/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterface.java b/base/src/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterface.java
index c355d5d..34f952a 100644
--- a/base/src/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterface.java
+++ b/base/src/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterface.java
@@ -18,15 +18,14 @@
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.model.BlazeVersionData;
 import com.google.idea.blaze.base.model.SyncState;
-import com.google.idea.blaze.base.model.primitives.TargetExpression;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
+import com.google.idea.blaze.base.sync.sharding.ShardedTargetList;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.project.Project;
-import java.util.List;
 import javax.annotation.Nullable;
 
 /** Indirection between ide_build_info and aspect style IDE info. */
@@ -36,22 +35,6 @@
     return ServiceManager.getService(BlazeIdeInterface.class);
   }
 
-  /** The result of a blaze operation */
-  enum BuildResult {
-    SUCCESS, // Success
-    BUILD_ERROR, // Return code 1, a build error
-    FATAL_ERROR; // Some other failure
-
-    public static BuildResult fromExitCode(int exitCode) {
-      if (exitCode == 0) {
-        return SUCCESS;
-      } else if (exitCode == 1) {
-        return BUILD_ERROR;
-      }
-      return FATAL_ERROR;
-    }
-  }
-
   /** The result of the ide operation */
   class IdeResult {
     @Nullable public final TargetMap targetMap;
@@ -75,7 +58,7 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       BlazeVersionData blazeVersionData,
-      List<TargetExpression> targets,
+      ShardedTargetList shardedTargets,
       WorkspaceLanguageSettings workspaceLanguageSettings,
       ArtifactLocationDecoder artifactLocationDecoder,
       SyncState.Builder syncStateBuilder,
@@ -93,7 +76,7 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       BlazeVersionData blazeVersionData,
-      List<TargetExpression> targets);
+      ShardedTargetList shardedTargets);
 
   /**
    * Attempts to compile the requested ide artifacts.
@@ -106,5 +89,5 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       BlazeVersionData blazeVersionData,
-      List<TargetExpression> targets);
+      ShardedTargetList shardedTargets);
 }
diff --git a/base/src/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterfaceAspectsImpl.java b/base/src/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterfaceAspectsImpl.java
index beb53db..18a884c 100644
--- a/base/src/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterfaceAspectsImpl.java
+++ b/base/src/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterfaceAspectsImpl.java
@@ -15,10 +15,12 @@
  */
 package com.google.idea.blaze.base.sync.aspects;
 
-import com.google.common.base.Objects;
+import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.common.util.concurrent.ListeningExecutorService;
@@ -36,37 +38,55 @@
 import com.google.idea.blaze.base.ideinfo.TargetKey;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.issueparser.IssueOutputLineProcessor;
+import com.google.idea.blaze.base.lang.AdditionalLanguagesHelper;
 import com.google.idea.blaze.base.model.BlazeVersionData;
 import com.google.idea.blaze.base.model.SyncState;
+import com.google.idea.blaze.base.model.primitives.Kind;
+import com.google.idea.blaze.base.model.primitives.Label;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.TargetExpression;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.prefetch.PrefetchService;
 import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.projectview.section.sections.TargetSection;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.scope.Result;
 import com.google.idea.blaze.base.scope.Scope;
 import com.google.idea.blaze.base.scope.ScopedFunction;
+import com.google.idea.blaze.base.scope.output.IssueOutput;
 import com.google.idea.blaze.base.scope.output.PerformanceWarning;
 import com.google.idea.blaze.base.scope.output.PrintOutput;
 import com.google.idea.blaze.base.scope.scopes.TimingScope;
 import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
 import com.google.idea.blaze.base.sync.aspects.strategy.AspectStrategy;
 import com.google.idea.blaze.base.sync.aspects.strategy.AspectStrategyProvider;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
+import com.google.idea.blaze.base.sync.sharding.ShardedTargetList;
+import com.google.idea.blaze.base.sync.sharding.WildcardTargetPattern;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.google.repackaged.devtools.intellij.ideinfo.IntellijIdeInfo;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
+import com.intellij.pom.NavigatableAdapter;
+import com.intellij.util.PathUtil;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Function;
 import java.util.function.Predicate;
+import java.util.stream.Collectors;
 import java.util.zip.GZIPInputStream;
 import javax.annotation.Nullable;
 
@@ -91,7 +111,7 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       BlazeVersionData blazeVersionData,
-      List<TargetExpression> targets,
+      ShardedTargetList shardedTargets,
       WorkspaceLanguageSettings workspaceLanguageSettings,
       ArtifactLocationDecoder artifactLocationDecoder,
       SyncState.Builder syncStateBuilder,
@@ -108,22 +128,23 @@
     // If the aspect strategy has changed, redo everything from scratch
     final AspectStrategy aspectStrategy = getAspectStrategy(project, blazeVersionData);
     if (prevState != null
-        && !Objects.equal(prevState.aspectStrategyName, aspectStrategy.getName())) {
+        && !Objects.equals(prevState.aspectStrategyName, aspectStrategy.getName())) {
       prevState = null;
     }
 
     IdeInfoResult ideInfoResult =
-        getIdeInfo(project, context, workspaceRoot, projectViewSet, targets, aspectStrategy);
-    if (ideInfoResult.buildResult == BuildResult.FATAL_ERROR) {
-      return new IdeResult(prevState != null ? prevState.targetMap : null, BuildResult.FATAL_ERROR);
+        getIdeInfo(project, context, workspaceRoot, projectViewSet, shardedTargets, aspectStrategy);
+    if (ideInfoResult.buildResult.status == BuildResult.Status.FATAL_ERROR) {
+      return new IdeResult(
+          prevState != null ? prevState.targetMap : null, ideInfoResult.buildResult);
     }
     // If there was a partial error, make a best-effort attempt to sync. Retain
     // any old state that we have in an attempt not to lose too much code.
-    if (ideInfoResult.buildResult == BuildResult.BUILD_ERROR) {
+    if (ideInfoResult.buildResult.status == BuildResult.Status.BUILD_ERROR) {
       mergeWithOldState = true;
     }
 
-    List<File> fileList = ideInfoResult.files;
+    Collection<File> fileList = ideInfoResult.files;
     List<File> updatedFiles = Lists.newArrayList();
     List<File> removedFiles = Lists.newArrayList();
     ImmutableMap<File, Long> fileState =
@@ -149,13 +170,16 @@
       return new IdeResult(prevState != null ? prevState.targetMap : null, BuildResult.FATAL_ERROR);
     }
 
+    Set<Label> targets = getNonWildcardProjectViewTargets(projectViewSet);
+
     State state =
         updateState(
+            project,
             context,
             prevState,
             fileState,
             workspaceLanguageSettings,
-            artifactLocationDecoder,
+            targets,
             aspectStrategy,
             updatedFiles,
             removedFiles,
@@ -167,11 +191,38 @@
     return new IdeResult(state.targetMap, ideInfoResult.buildResult);
   }
 
-  private static class IdeInfoResult {
-    private final List<File> files;
-    private final BuildResult buildResult;
+  private static Set<Label> getNonWildcardProjectViewTargets(ProjectViewSet projectViewSet) {
+    return projectViewSet
+        .listItems(TargetSection.KEY)
+        .stream()
+        .map(BlazeIdeInterfaceAspectsImpl::singleTargetLabel)
+        .filter(Objects::nonNull)
+        .collect(Collectors.toSet());
+  }
 
-    IdeInfoResult(List<File> files, BuildResult buildResult) {
+  @Nullable
+  private static Label singleTargetLabel(TargetExpression expression) {
+    if (WildcardTargetPattern.fromExpression(expression) != null) {
+      return null;
+    }
+    // convert to a valid Label format
+    String pattern = expression.toString();
+    if (!pattern.startsWith("//")) {
+      pattern = "//" + pattern;
+    }
+    int colonIndex = pattern.indexOf(':');
+    if (colonIndex == -1) {
+      // add the implicit rule name
+      pattern += ":" + PathUtil.getFileName(pattern);
+    }
+    return Label.createIfValid(pattern);
+  }
+
+  private static class IdeInfoResult {
+    final Collection<File> files;
+    final BuildResult buildResult;
+
+    IdeInfoResult(Collection<File> files, BuildResult buildResult) {
       this.files = files;
       this.buildResult = buildResult;
     }
@@ -182,45 +233,70 @@
       BlazeContext parentContext,
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
-      List<TargetExpression> targets,
+      ShardedTargetList shardedTargets,
       AspectStrategy aspectStrategy) {
     return Scope.push(
         parentContext,
         context -> {
           context.push(
               new TimingScope(String.format("Execute%sCommand", Blaze.buildSystemName(project))));
-
-          String fileExtension = aspectStrategy.getAspectOutputFileExtension();
-          String gzFileExtension = fileExtension + ".gz";
-          Predicate<String> fileFilter =
-              fileName -> fileName.endsWith(fileExtension) || fileName.endsWith(gzFileExtension);
-          BuildResultHelper buildResultHelper = BuildResultHelper.forFiles(fileFilter);
-
-          BlazeCommand.Builder blazeCommandBuilder =
-              BlazeCommand.builder(getBinaryPath(project), BlazeCommandName.BUILD);
-          blazeCommandBuilder.addTargets(targets);
-          blazeCommandBuilder.addBlazeFlags(BlazeFlags.KEEP_GOING);
-          blazeCommandBuilder
-              .addBlazeFlags(buildResultHelper.getBuildFlags())
-              .addBlazeFlags(BlazeFlags.buildFlags(project, projectViewSet));
-
-          aspectStrategy.modifyIdeInfoCommand(blazeCommandBuilder);
-
-          int retVal =
-              ExternalTask.builder(workspaceRoot)
-                  .addBlazeCommand(blazeCommandBuilder.build())
-                  .context(context)
-                  .stderr(
-                      buildResultHelper.stderr(
-                          new IssueOutputLineProcessor(project, context, workspaceRoot)))
-                  .build()
-                  .run();
-
-          BuildResult buildResult = BuildResult.fromExitCode(retVal);
-          return new IdeInfoResult(buildResultHelper.getBuildArtifacts(), buildResult);
+          Set<File> ideInfoFiles = new LinkedHashSet<>();
+          Function<Integer, String> progressMessage =
+              count ->
+                  String.format(
+                      "Building IDE info files for shard %s of %s...",
+                      count, shardedTargets.shardedTargets.size());
+          Function<List<TargetExpression>, BuildResult> invocation =
+              targets -> {
+                IdeInfoResult result =
+                    getIdeInfoForTargets(
+                        project, context, workspaceRoot, projectViewSet, targets, aspectStrategy);
+                ideInfoFiles.addAll(result.files);
+                return result.buildResult;
+              };
+          BuildResult result =
+              shardedTargets.runShardedCommand(project, context, progressMessage, invocation);
+          return new IdeInfoResult(ideInfoFiles, result);
         });
   }
 
+  /** Runs blaze build with the aspect's ide-info output group for a given set of targets */
+  private static IdeInfoResult getIdeInfoForTargets(
+      Project project,
+      BlazeContext context,
+      WorkspaceRoot workspaceRoot,
+      ProjectViewSet projectViewSet,
+      List<TargetExpression> targets,
+      AspectStrategy aspectStrategy) {
+    String fileExtension = aspectStrategy.getAspectOutputFileExtension();
+    String gzFileExtension = fileExtension + ".gz";
+    Predicate<String> fileFilter =
+        fileName -> fileName.endsWith(fileExtension) || fileName.endsWith(gzFileExtension);
+    BuildResultHelper buildResultHelper = BuildResultHelper.forFiles(fileFilter);
+
+    BlazeCommand.Builder builder =
+        BlazeCommand.builder(getBinaryPath(project), BlazeCommandName.BUILD)
+            .addTargets(targets)
+            .addBlazeFlags(BlazeFlags.KEEP_GOING)
+            .addBlazeFlags(buildResultHelper.getBuildFlags())
+            .addBlazeFlags(BlazeFlags.buildFlags(project, projectViewSet));
+
+    aspectStrategy.modifyIdeInfoCommand(builder);
+
+    int retVal =
+        ExternalTask.builder(workspaceRoot)
+            .addBlazeCommand(builder.build())
+            .context(context)
+            .stderr(
+                buildResultHelper.stderr(
+                    new IssueOutputLineProcessor(project, context, workspaceRoot)))
+            .build()
+            .run();
+
+    BuildResult buildResult = BuildResult.fromExitCode(retVal);
+    return new IdeInfoResult(buildResultHelper.getBuildArtifacts(), buildResult);
+  }
+
   private static class TargetFilePair {
     private final File file;
     private final TargetIdeInfo target;
@@ -233,11 +309,12 @@
 
   @Nullable
   static State updateState(
+      Project project,
       BlazeContext parentContext,
       @Nullable State prevState,
       ImmutableMap<File, Long> fileState,
       WorkspaceLanguageSettings workspaceLanguageSettings,
-      ArtifactLocationDecoder artifactLocationDecoder,
+      Set<Label> nonWildcardProjectTargets,
       AspectStrategy aspectStrategy,
       List<File> newFiles,
       List<File> removedFiles,
@@ -286,6 +363,7 @@
                   }
 
                   AtomicLong totalSizeLoaded = new AtomicLong(0);
+                  Set<LanguageClass> ignoredLanguages = Sets.newConcurrentHashSet();
 
                   ListeningExecutorService executor = BlazeExecutor.getInstance().getExecutor();
 
@@ -297,11 +375,14 @@
                             () -> {
                               totalSizeLoaded.addAndGet(file.length());
                               try (InputStream inputStream = getAspectInputStream(file)) {
-                                IntellijIdeInfo.TargetIdeInfo ruleProto =
+                                IntellijIdeInfo.TargetIdeInfo message =
                                     aspectStrategy.readAspectFile(inputStream);
                                 TargetIdeInfo target =
-                                    IdeInfoFromProtobuf.makeTargetIdeInfo(
-                                        workspaceLanguageSettings, ruleProto);
+                                    protoToTarget(
+                                        workspaceLanguageSettings,
+                                        nonWildcardProjectTargets,
+                                        message,
+                                        ignoredLanguages);
                                 return new TargetFilePair(file, target);
                               }
                             }));
@@ -347,6 +428,8 @@
                                 (100 * duplicateTargetLabels / targetMap.size()))));
                   }
 
+                  warnIgnoredLanguages(project, context, ignoredLanguages);
+
                   state.targetMap = new TargetMap(ImmutableMap.copyOf(targetMap));
                   return Result.of(state);
                 });
@@ -358,6 +441,48 @@
     return result.result;
   }
 
+  @Nullable
+  private static TargetIdeInfo protoToTarget(
+      WorkspaceLanguageSettings languageSettings,
+      Set<Label> nonWildcardProjectTargets,
+      IntellijIdeInfo.TargetIdeInfo message,
+      Set<LanguageClass> ignoredLanguages) {
+    Kind kind = IdeInfoFromProtobuf.getKind(message);
+    if (kind == null) {
+      return null;
+    }
+    if (languageSettings.isLanguageActive(kind.getLanguageClass())) {
+      return IdeInfoFromProtobuf.makeTargetIdeInfo(message);
+    }
+    if (nonWildcardProjectTargets.contains(IdeInfoFromProtobuf.getKey(message).label)) {
+      ignoredLanguages.add(kind.getLanguageClass());
+    }
+    return null;
+  }
+
+  private static void warnIgnoredLanguages(
+      Project project, BlazeContext context, Set<LanguageClass> ignoredLangs) {
+    if (ignoredLangs.isEmpty()) {
+      return;
+    }
+    List<LanguageClass> sorted = new ArrayList<>(ignoredLangs);
+    sorted.sort(Ordering.usingToString());
+
+    String msg =
+        "Some project targets were ignored because the corresponding language support "
+            + "isn't enabled. Click here to enable support for: "
+            + Joiner.on(", ").join(sorted);
+    IssueOutput.warn(msg)
+        .navigatable(
+            new NavigatableAdapter() {
+              @Override
+              public void navigate(boolean requestFocus) {
+                AdditionalLanguagesHelper.enableLanguageSupport(project, sorted);
+              }
+            })
+        .submit(context);
+  }
+
   private static InputStream getAspectInputStream(File file) throws IOException {
     InputStream inputStream = new FileInputStream(file);
     if (file.getName().endsWith(".gz")) {
@@ -373,9 +498,9 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       BlazeVersionData blazeVersionData,
-      List<TargetExpression> targets) {
+      ShardedTargetList shardedTargets) {
     return resolveIdeArtifacts(
-        project, context, workspaceRoot, projectViewSet, blazeVersionData, targets, false);
+        project, context, workspaceRoot, projectViewSet, blazeVersionData, shardedTargets, false);
   }
 
   @Override
@@ -385,14 +510,21 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       BlazeVersionData blazeVersionData,
-      List<TargetExpression> targets) {
+      ShardedTargetList shardedTargets) {
     boolean ideCompile = hasIdeCompileOutputGroup(blazeVersionData);
     return resolveIdeArtifacts(
-        project, context, workspaceRoot, projectViewSet, blazeVersionData, targets, ideCompile);
+        project,
+        context,
+        workspaceRoot,
+        projectViewSet,
+        blazeVersionData,
+        shardedTargets,
+        ideCompile);
   }
 
   private static boolean hasIdeCompileOutputGroup(BlazeVersionData blazeVersionData) {
-    return blazeVersionData.bazelIsAtLeastVersion(0, 4, 4);
+    return blazeVersionData.buildSystem() == BuildSystem.Blaze
+        || blazeVersionData.bazelIsAtLeastVersion(0, 4, 4);
   }
 
   private static BuildResult resolveIdeArtifacts(
@@ -401,6 +533,33 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       BlazeVersionData blazeVersionData,
+      ShardedTargetList shardedTargets,
+      boolean useIdeCompileOutputGroup) {
+
+    Function<Integer, String> progressMessage =
+        count ->
+            String.format(
+                "Building IDE resolve files for shard %s of %s...",
+                count, shardedTargets.shardedTargets.size());
+    Function<List<TargetExpression>, BuildResult> invocation =
+        targets ->
+            doResolveIdeArtifacts(
+                project,
+                context,
+                workspaceRoot,
+                projectViewSet,
+                blazeVersionData,
+                targets,
+                useIdeCompileOutputGroup);
+    return shardedTargets.runShardedCommand(project, context, progressMessage, invocation);
+  }
+
+  private static BuildResult doResolveIdeArtifacts(
+      Project project,
+      BlazeContext context,
+      WorkspaceRoot workspaceRoot,
+      ProjectViewSet projectViewSet,
+      BlazeVersionData blazeVersionData,
       List<TargetExpression> targets,
       boolean useIdeCompileOutputGroup) {
     AspectStrategy aspectStrategy = getAspectStrategy(project, blazeVersionData);
diff --git a/base/src/com/google/idea/blaze/base/sync/aspects/BuildResult.java b/base/src/com/google/idea/blaze/base/sync/aspects/BuildResult.java
new file mode 100644
index 0000000..d556be7
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/aspects/BuildResult.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.aspects;
+
+/** The result of a blaze operation */
+public class BuildResult {
+
+  private static final int SUCCESS_EXIT_CODE = 0;
+  private static final int BUILD_ERROR_EXIT_CODE = 1;
+  // blaze server out-of-memory exit code
+  private static final int OOM_EXIT_CODE = 33;
+
+  /** The status of a blaze operation */
+  public enum Status {
+    SUCCESS, // Success
+    BUILD_ERROR, // Return code 1, a build error
+    FATAL_ERROR; // Some other failure
+
+    private static Status fromExitCode(int exitCode) {
+      if (exitCode == SUCCESS_EXIT_CODE) {
+        return SUCCESS;
+      } else if (exitCode == BUILD_ERROR_EXIT_CODE) {
+        return BUILD_ERROR;
+      }
+      return FATAL_ERROR;
+    }
+  }
+
+  public static final BuildResult SUCCESS = fromExitCode(SUCCESS_EXIT_CODE);
+  /** A general fatal error build result */
+  public static final BuildResult FATAL_ERROR = fromExitCode(-1);
+
+  public static BuildResult fromExitCode(int exitCode) {
+    return new BuildResult(exitCode);
+  }
+
+  /** Returns the 'worst' build result of the two. */
+  public static BuildResult combine(BuildResult first, BuildResult second) {
+    return fromExitCode(combineExitCode(first.exitCode, second.exitCode));
+  }
+
+  private final int exitCode;
+  public final Status status;
+
+  private BuildResult(int exitCode) {
+    this.exitCode = exitCode;
+    status = Status.fromExitCode(exitCode);
+  }
+
+  public boolean outOfMemory() {
+    return exitCode == OOM_EXIT_CODE;
+  }
+
+  private static int combineExitCode(int first, int second) {
+    if (first == OOM_EXIT_CODE || second == OOM_EXIT_CODE) {
+      // OOM errors treated specially, so preserve them.
+      return OOM_EXIT_CODE;
+    }
+    Status firstStatus = Status.fromExitCode(first);
+    Status secondStatus = Status.fromExitCode(second);
+    return firstStatus.ordinal() >= secondStatus.ordinal() ? first : second;
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/aspects/IdeInfoFromProtobuf.java b/base/src/com/google/idea/blaze/base/sync/aspects/IdeInfoFromProtobuf.java
index 8bf9585..a37991f 100644
--- a/base/src/com/google/idea/blaze/base/sync/aspects/IdeInfoFromProtobuf.java
+++ b/base/src/com/google/idea/blaze/base/sync/aspects/IdeInfoFromProtobuf.java
@@ -18,17 +18,18 @@
 
 import static java.util.stream.Collectors.toList;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 import com.google.idea.blaze.base.ideinfo.AndroidIdeInfo;
+import com.google.idea.blaze.base.ideinfo.AndroidSdkIdeInfo;
 import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
 import com.google.idea.blaze.base.ideinfo.CIdeInfo;
 import com.google.idea.blaze.base.ideinfo.CToolchainIdeInfo;
 import com.google.idea.blaze.base.ideinfo.Dependency;
 import com.google.idea.blaze.base.ideinfo.Dependency.DependencyType;
-import com.google.idea.blaze.base.ideinfo.IntellijPluginDeployInfo;
-import com.google.idea.blaze.base.ideinfo.IntellijPluginDeployInfo.IntellijPluginDeployFile;
 import com.google.idea.blaze.base.ideinfo.JavaIdeInfo;
 import com.google.idea.blaze.base.ideinfo.JavaToolchainIdeInfo;
 import com.google.idea.blaze.base.ideinfo.LibraryArtifact;
@@ -40,8 +41,8 @@
 import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
 import com.google.idea.blaze.base.model.primitives.Kind;
 import com.google.idea.blaze.base.model.primitives.Label;
-import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.repackaged.devtools.intellij.ideinfo.IntellijIdeInfo;
+import com.intellij.openapi.util.text.StringUtil;
 import java.util.Collection;
 import java.util.List;
 import javax.annotation.Nullable;
@@ -50,23 +51,12 @@
 public class IdeInfoFromProtobuf {
 
   @Nullable
-  public static TargetIdeInfo makeTargetIdeInfo(
-      WorkspaceLanguageSettings workspaceLanguageSettings, IntellijIdeInfo.TargetIdeInfo message) {
+  public static TargetIdeInfo makeTargetIdeInfo(IntellijIdeInfo.TargetIdeInfo message) {
     Kind kind = getKind(message);
     if (kind == null) {
       return null;
     }
-    if (!workspaceLanguageSettings.isLanguageActive(kind.getLanguageClass())) {
-      return null;
-    }
-
-    final TargetKey key;
-    if (message.hasKey()) {
-      key = makeTargetKey(message.getKey());
-    } else {
-      key = TargetKey.forPlainTarget(new Label(message.getLabel()));
-    }
-
+    TargetKey key = getKey(message);
     ArtifactLocation buildFile = getBuildFile(message);
 
     final Collection<Dependency> dependencies;
@@ -107,6 +97,10 @@
     if (message.hasAndroidIdeInfo()) {
       androidIdeInfo = makeAndroidIdeInfo(message.getAndroidIdeInfo());
     }
+    AndroidSdkIdeInfo androidSdkIdeInfo = null;
+    if (message.hasAndroidSdkIdeInfo()) {
+      androidSdkIdeInfo = makeAndroidSdkIdeInfo(message.getAndroidSdkIdeInfo());
+    }
     PyIdeInfo pyIdeInfo = null;
     if (message.hasPyIdeInfo()) {
       pyIdeInfo = makePyIdeInfo(message.getPyIdeInfo());
@@ -125,11 +119,6 @@
     if (message.hasJavaToolchainIdeInfo()) {
       javaToolchainIdeInfo = makeJavaToolchainIdeInfo(message.getJavaToolchainIdeInfo());
     }
-    IntellijPluginDeployInfo intellijPluginDeployInfo = null;
-    if (message.hasIntellijPluginDeployInfo()) {
-      intellijPluginDeployInfo =
-          makeIntellijPluginDeployInfo(message.getIntellijPluginDeployInfo());
-    }
 
     return new TargetIdeInfo(
         key,
@@ -142,23 +131,23 @@
         cToolchainIdeInfo,
         javaIdeInfo,
         androidIdeInfo,
+        androidSdkIdeInfo,
         pyIdeInfo,
         testIdeInfo,
         protoLibraryLegacyInfo,
-        javaToolchainIdeInfo,
-        intellijPluginDeployInfo);
+        javaToolchainIdeInfo);
   }
 
   private static Collection<Dependency> makeDependencyListFromLabelList(
       List<String> dependencyList, Dependency.DependencyType dependencyType) {
     return dependencyList
         .stream()
-        .map(dep -> new Dependency(TargetKey.forPlainTarget(new Label(dep)), dependencyType))
+        .map(dep -> new Dependency(TargetKey.forPlainTarget(Label.create(dep)), dependencyType))
         .collect(toList());
   }
 
   private static TargetKey makeTargetKey(IntellijIdeInfo.TargetKey key) {
-    return TargetKey.forGeneralTarget(new Label(key.getLabel()), key.getAspectIdsList());
+    return TargetKey.forGeneralTarget(Label.create(key.getLabel()), key.getAspectIdsList());
   }
 
   private static Dependency makeDependency(IntellijIdeInfo.Dependency dep) {
@@ -194,10 +183,27 @@
         makeExecutionRootPathList(cIdeInfo.getTransitiveQuoteIncludeDirectoryList());
     List<ExecutionRootPath> transitiveSystemIncludeDirectories =
         makeExecutionRootPathList(cIdeInfo.getTransitiveSystemIncludeDirectoryList());
+    List<String> coptDefines;
+    List<ExecutionRootPath> coptIncludeDirectories;
+    if (cIdeInfo.getTargetCoptList().isEmpty()) {
+      coptDefines = ImmutableList.of();
+      coptIncludeDirectories = ImmutableList.of();
+    } else {
+      UnfilteredCompilerOptions compilerOptions =
+          UnfilteredCompilerOptions.builder()
+              .registerSingleOrSplitOption("-D")
+              .registerSingleOrSplitOption("-I")
+              .build(cIdeInfo.getTargetCoptList());
+      coptDefines = compilerOptions.getExtractedOptionValues("-D");
+      coptIncludeDirectories =
+          makeExecutionRootPathList(compilerOptions.getExtractedOptionValues("-I"));
+    }
 
     CIdeInfo.Builder builder =
         CIdeInfo.builder()
             .addSources(sources)
+            .addLocalDefines(coptDefines)
+            .addLocalIncludeDirectories(coptIncludeDirectories)
             .addTransitiveIncludeDirectories(transitiveIncludeDirectories)
             .addTransitiveQuoteIncludeDirectories(transitiveQuoteIncludeDirectories)
             .addTransitiveDefines(cIdeInfo.getTransitiveDefineList())
@@ -222,8 +228,10 @@
     ExecutionRootPath preprocessorExecutable =
         new ExecutionRootPath(cToolchainIdeInfo.getPreprocessorExecutable());
 
-    UnfilteredCompilerOptions unfilteredCompilerOptions =
-        new UnfilteredCompilerOptions(cToolchainIdeInfo.getUnfilteredCompilerOptionList());
+    UnfilteredCompilerOptions compilerOptions =
+        UnfilteredCompilerOptions.builder()
+            .registerSingleOrSplitOption("-isystem")
+            .build(cToolchainIdeInfo.getUnfilteredCompilerOptionList());
 
     CToolchainIdeInfo.Builder builder =
         CToolchainIdeInfo.builder()
@@ -235,9 +243,9 @@
             .setCppExecutable(cppExecutable)
             .setPreprocessorExecutable(preprocessorExecutable)
             .setTargetName(cToolchainIdeInfo.getTargetName())
-            .addUnfilteredCompilerOptions(unfilteredCompilerOptions.getToolchainFlags())
+            .addUnfilteredCompilerOptions(compilerOptions.getUninterpretedOptions())
             .addUnfilteredToolchainSystemIncludes(
-                unfilteredCompilerOptions.getToolchainSysIncludes());
+                makeExecutionRootPathList(compilerOptions.getExtractedOptionValues("-isystem")));
 
     return builder.build();
   }
@@ -268,10 +276,15 @@
             : null,
         androidIdeInfo.getHasIdlSources(),
         !Strings.isNullOrEmpty(androidIdeInfo.getLegacyResources())
-            ? new Label(androidIdeInfo.getLegacyResources())
+            ? Label.create(androidIdeInfo.getLegacyResources())
             : null);
   }
 
+  private static AndroidSdkIdeInfo makeAndroidSdkIdeInfo(
+      IntellijIdeInfo.AndroidSdkIdeInfo androidSdkIdeInfo) {
+    return new AndroidSdkIdeInfo(makeArtifactLocation(androidSdkIdeInfo.getAndroidJar()));
+  }
+
   private static PyIdeInfo makePyIdeInfo(IntellijIdeInfo.PyIdeInfo info) {
     return PyIdeInfo.builder().addSources(makeArtifactLocationList(info.getSourcesList())).build();
   }
@@ -334,21 +347,6 @@
         javaToolchainIdeInfo.getSourceVersion(), javaToolchainIdeInfo.getTargetVersion());
   }
 
-  private static IntellijPluginDeployInfo makeIntellijPluginDeployInfo(
-      IntellijIdeInfo.IntellijPluginDeployInfo intellijPluginDeployInfo) {
-    return new IntellijPluginDeployInfo(
-        ImmutableList.copyOf(
-            intellijPluginDeployInfo
-                .getDeployFilesList()
-                .stream()
-                .map(
-                    deployFile ->
-                        new IntellijPluginDeployFile(
-                            makeArtifactLocation(deployFile.getSrc()),
-                            deployFile.getDeployLocation()))
-                .collect(toList())));
-  }
-
   private static Collection<LibraryArtifact> makeLibraryArtifactList(
       List<IntellijIdeInfo.LibraryArtifact> jarsList) {
     ImmutableList.Builder<LibraryArtifact> builder = ImmutableList.builder();
@@ -394,26 +392,46 @@
     return builder.build();
   }
 
+  @VisibleForTesting
   @Nullable
-  private static ArtifactLocation makeArtifactLocation(
-      IntellijIdeInfo.ArtifactLocation pbArtifactLocation) {
-    if (pbArtifactLocation == null) {
+  public static ArtifactLocation makeArtifactLocation(
+      @Nullable IntellijIdeInfo.ArtifactLocation location) {
+    if (location == null) {
       return null;
     }
+    String relativePath = location.getRelativePath();
+    String rootExecutionPathFragment = location.getRootExecutionPathFragment();
+    if (!location.getIsNewExternalVersion() && location.getIsExternal()) {
+      // fix up incorrect paths created with older aspect version
+      // Note: bazel always uses the '/' separator here, even on windows.
+      List<String> components = StringUtil.split(relativePath, "/");
+      if (components.size() > 2) {
+        relativePath = Joiner.on('/').join(components.subList(2, components.size()));
+        String prefix = components.get(0) + "/" + components.get(1);
+        rootExecutionPathFragment =
+            rootExecutionPathFragment.isEmpty() ? prefix : rootExecutionPathFragment + "/" + prefix;
+      }
+    }
     return ArtifactLocation.builder()
-        .setRootExecutionPathFragment(pbArtifactLocation.getRootExecutionPathFragment())
-        .setRelativePath(pbArtifactLocation.getRelativePath())
-        .setIsSource(pbArtifactLocation.getIsSource())
-        .setIsExternal(pbArtifactLocation.getIsExternal())
+        .setRootExecutionPathFragment(rootExecutionPathFragment)
+        .setRelativePath(relativePath)
+        .setIsSource(location.getIsSource())
+        .setIsExternal(location.getIsExternal())
         .build();
   }
 
   @Nullable
-  private static Kind getKind(IntellijIdeInfo.TargetIdeInfo target) {
-    String kindString = target.getKindString();
+  static Kind getKind(IntellijIdeInfo.TargetIdeInfo message) {
+    String kindString = message.getKindString();
     if (!Strings.isNullOrEmpty(kindString)) {
       return Kind.fromString(kindString);
     }
     return null;
   }
+
+  static TargetKey getKey(IntellijIdeInfo.TargetIdeInfo message) {
+    return message.hasKey()
+        ? makeTargetKey(message.getKey())
+        : TargetKey.forPlainTarget(Label.create(message.getLabel()));
+  }
 }
diff --git a/base/src/com/google/idea/blaze/base/sync/aspects/UnfilteredCompilerOptions.java b/base/src/com/google/idea/blaze/base/sync/aspects/UnfilteredCompilerOptions.java
index 8509647..e76ead1 100644
--- a/base/src/com/google/idea/blaze/base/sync/aspects/UnfilteredCompilerOptions.java
+++ b/base/src/com/google/idea/blaze/base/sync/aspects/UnfilteredCompilerOptions.java
@@ -15,70 +15,173 @@
  */
 package com.google.idea.blaze.base.sync.aspects;
 
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.Lists;
-import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 /**
- * unfilteredCompilerOptions is a grab bag of options passed to the compiler. Do minimal parsing to
- * extract what we need.
+ * Parses any compiler options that were not extracted by the build system earlier. Do minimal
+ * parsing to extract what we need.
  */
 final class UnfilteredCompilerOptions {
-  private enum NextOption {
-    ISYSTEM,
-    FLAG
-  }
 
-  private final List<ExecutionRootPath> toolchainSysIncludes;
-  private final List<String> toolchainFlags;
+  static class Builder {
+    private final BaseOptionParser baseOptionParser = new BaseOptionParser();
+    private final ImmutableMap.Builder<String, OptionParser> registeredParsers =
+        ImmutableMap.builder();
 
-  public UnfilteredCompilerOptions(Iterable<String> unfilteredOptions) {
-    List<String> toolchainSystemIncludePaths = Lists.newArrayList();
-    toolchainFlags = Lists.newArrayList();
-    splitUnfilteredCompilerOptions(unfilteredOptions, toolchainSystemIncludePaths, toolchainFlags);
+    /** Have the options parser handle the given one-or-two-token option (e.g., -Ifoo or -I foo). */
+    Builder registerSingleOrSplitOption(String optionName) {
+      registeredParsers.put(
+          optionName, new SingleOrSplitOptionParser(optionName, baseOptionParser));
+      return this;
+    }
 
-    toolchainSysIncludes = Lists.newArrayList();
-    for (String systemInclude : toolchainSystemIncludePaths) {
-      toolchainSysIncludes.add(new ExecutionRootPath(systemInclude));
+    /** Parse the given options and build extracted compiler options */
+    UnfilteredCompilerOptions build(Iterable<String> unfilteredOptions) {
+      ImmutableMap<String, OptionParser> registered = registeredParsers.build();
+      baseOptionParser.setRegisteredOptionParsers(registered.values());
+      UnfilteredCompilerOptions options =
+          new UnfilteredCompilerOptions(baseOptionParser, registered);
+      options.parse(unfilteredOptions);
+      return options;
     }
   }
 
-  public List<String> getToolchainFlags() {
-    return toolchainFlags;
+  /** Make a new builder to register options to extract. */
+  static Builder builder() {
+    return new Builder();
   }
 
-  public List<ExecutionRootPath> getToolchainSysIncludes() {
-    return toolchainSysIncludes;
+  private final OptionParser baseOptionParser;
+  private final ImmutableMap<String, OptionParser> registeredParsers;
+
+  private UnfilteredCompilerOptions(
+      OptionParser baseOptionParser, ImmutableMap<String, OptionParser> registeredParsers) {
+    this.baseOptionParser = baseOptionParser;
+    this.registeredParsers = registeredParsers;
   }
 
-  @VisibleForTesting
-  static void splitUnfilteredCompilerOptions(
-      Iterable<String> unfilteredOptions,
-      List<String> toolchainSysIncludes,
-      List<String> toolchainFlags) {
-    NextOption nextOption = NextOption.FLAG;
+  private void parse(Iterable<String> unfilteredOptions) {
+    OptionParser nextOptionParser = baseOptionParser;
     for (String unfilteredOption : unfilteredOptions) {
-      // We are looking for either the flag pair
-      // "-isystem /path/to/dir" or the flag "-isystem/path/to/dir"
-      //
-      // blaze emits isystem flags in both formats.
-      // The latter isn't ideal but apparently it is accepted by GCC and will be emitted by
-      // blaze under certain circumstances.
-      if (nextOption == NextOption.ISYSTEM) {
-        toolchainSysIncludes.add(unfilteredOption);
-        nextOption = NextOption.FLAG;
-      } else {
-        if (unfilteredOption.equals("-isystem")) {
-          nextOption = NextOption.ISYSTEM;
-        } else if (unfilteredOption.startsWith("-isystem")) {
-          String iSystemIncludePath = unfilteredOption.substring("-isystem".length());
-          toolchainSysIncludes.add(iSystemIncludePath);
-        } else {
-          toolchainFlags.add(unfilteredOption);
-          nextOption = NextOption.FLAG;
+      nextOptionParser = nextOptionParser.parseValue(unfilteredOption);
+    }
+  }
+
+  /**
+   * Return the list of arguments that are not extracted (don't correspond to a registered option),
+   * in the original order.
+   */
+  List<String> getUninterpretedOptions() {
+    return baseOptionParser.values();
+  }
+
+  /**
+   * Return the extracted option values for the given registered option name. E.g., if -I is
+   * registered, and ["-foo", "-Ibar"] is parsed then getExtractedOptionValues("-I") returns
+   * ["bar"]. List is in the original order.
+   *
+   * @param optionName the name of a flag that was registered to be extracted
+   * @return option values corresponding to the flag.
+   */
+  List<String> getExtractedOptionValues(String optionName) {
+    OptionParser parser = registeredParsers.get(optionName);
+    Preconditions.checkNotNull(parser);
+    return parser.values();
+  }
+
+  private interface OptionParser {
+    /** Checks if the parser handles the next option value. */
+    boolean handlesOptionValue(String optionValue);
+
+    /**
+     * Parses the option and returns the next handler (assumes {@link #handlesOptionValue} is true).
+     */
+    OptionParser parseValue(String optionValue);
+
+    /** Return a list of option values captured by the parser. */
+    List<String> values();
+  }
+
+  /**
+   * A base option parser that defers to a list of more-specific registered flag parsers, before
+   * handling the flag itself.
+   */
+  private static class BaseOptionParser implements OptionParser {
+    private final List<String> values = new ArrayList<>();
+    private Collection<OptionParser> registeredOptionParsers;
+
+    void setRegisteredOptionParsers(Collection<OptionParser> registeredOptionParsers) {
+      this.registeredOptionParsers = registeredOptionParsers;
+    }
+
+    @Override
+    public boolean handlesOptionValue(String optionValue) {
+      return true;
+    }
+
+    @Override
+    public OptionParser parseValue(String optionValue) {
+      for (OptionParser registeredParser : registeredOptionParsers) {
+        if (registeredParser.handlesOptionValue(optionValue)) {
+          return registeredParser.parseValue(optionValue);
         }
       }
+      values.add(optionValue);
+      return this;
+    }
+
+    @Override
+    public List<String> values() {
+      return values;
+    }
+  }
+
+  /**
+   * A parser that handles flags that can be one or two tokens (e.g., "-Ihdrs", vs "-I", "hdrs").
+   */
+  private static class SingleOrSplitOptionParser implements OptionParser {
+    private final String optionName;
+    private final BaseOptionParser baseOptionParser;
+    private final List<String> values = new ArrayList<>();
+    private boolean consumeNext;
+
+    SingleOrSplitOptionParser(String optionName, BaseOptionParser baseOptionParser) {
+      this.optionName = optionName;
+      this.baseOptionParser = baseOptionParser;
+    }
+
+    @Override
+    public boolean handlesOptionValue(String optionValue) {
+      return consumeNext || optionValue.startsWith(optionName);
+    }
+
+    @Override
+    public OptionParser parseValue(String optionValue) {
+      if (consumeNext) {
+        consumeNext = false;
+        values.add(optionValue);
+        return baseOptionParser;
+      }
+      if (optionValue.equals(optionName)) {
+        consumeNext = true;
+        return this;
+      }
+      if (optionValue.startsWith(optionName)) {
+        values.add(optionValue.substring(optionName.length()));
+        return baseOptionParser;
+      }
+      Preconditions.checkState(
+          false, "Should check handlesOptionValue before attempting to parseValue");
+      return null;
+    }
+
+    @Override
+    public List<String> values() {
+      return values;
     }
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/sync/aspects/strategy/AspectStrategyNative.java b/base/src/com/google/idea/blaze/base/sync/aspects/strategy/AspectStrategyNative.java
deleted file mode 100644
index 63787db..0000000
--- a/base/src/com/google/idea/blaze/base/sync/aspects/strategy/AspectStrategyNative.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.base.sync.aspects.strategy;
-
-import com.google.idea.blaze.base.command.BlazeCommand;
-import com.google.repackaged.devtools.intellij.ideinfo.IntellijIdeInfo;
-import java.io.IOException;
-import java.io.InputStream;
-
-/** Aspect strategy for native. */
-public class AspectStrategyNative implements AspectStrategy {
-
-  @Override
-  public String getName() {
-    return "NativeAspect";
-  }
-
-  @Override
-  public void modifyIdeInfoCommand(BlazeCommand.Builder blazeCommandBuilder) {
-    blazeCommandBuilder
-        .addBlazeFlags("--aspects=AndroidStudioInfoAspect")
-        .addBlazeFlags("--output_groups=ide-info");
-  }
-
-  @Override
-  public void modifyIdeResolveCommand(BlazeCommand.Builder blazeCommandBuilder) {
-    blazeCommandBuilder
-        .addBlazeFlags("--aspects=AndroidStudioInfoAspect")
-        .addBlazeFlags("--output_groups=ide-resolve");
-  }
-
-  @Override
-  public void modifyIdeCompileCommand(BlazeCommand.Builder blazeCommandBuilder) {
-    blazeCommandBuilder
-        .addBlazeFlags("--aspects=AndroidStudioInfoAspect")
-        .addBlazeFlags("--output_groups=ide-compile");
-  }
-
-  @Override
-  public String getAspectOutputFileExtension() {
-    return ".aswb-build";
-  }
-
-  @Override
-  public IntellijIdeInfo.TargetIdeInfo readAspectFile(InputStream inputStream) throws IOException {
-    return IntellijIdeInfo.TargetIdeInfo.parseFrom(inputStream);
-  }
-}
diff --git a/base/src/com/google/idea/blaze/base/sync/aspects/strategy/AspectStrategyProviderBazel.java b/base/src/com/google/idea/blaze/base/sync/aspects/strategy/AspectStrategyProviderBazel.java
index c8a4920..9c0faa4 100644
--- a/base/src/com/google/idea/blaze/base/sync/aspects/strategy/AspectStrategyProviderBazel.java
+++ b/base/src/com/google/idea/blaze/base/sync/aspects/strategy/AspectStrategyProviderBazel.java
@@ -16,18 +16,11 @@
 package com.google.idea.blaze.base.sync.aspects.strategy;
 
 import com.google.idea.blaze.base.model.BlazeVersionData;
-import com.google.idea.common.experiments.BoolExperiment;
 import com.intellij.openapi.project.Project;
 
 class AspectStrategyProviderBazel implements AspectStrategyProvider {
-  private static final BoolExperiment useSkylarkAspect =
-      new BoolExperiment("use.skylark.aspect.bazel.3", true);
-
   @Override
   public AspectStrategy getAspectStrategy(Project project, BlazeVersionData blazeVersionData) {
-    boolean canUseSkylark =
-        useSkylarkAspect.getValue() && blazeVersionData.bazelIsAtLeastVersion(0, 4, 5);
-
-    return canUseSkylark ? new AspectStrategySkylark() : new AspectStrategyNative();
+    return new AspectStrategySkylark();
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/sync/data/BlazeProjectDataManagerImpl.java b/base/src/com/google/idea/blaze/base/sync/data/BlazeProjectDataManagerImpl.java
index bd4494f..2720611 100644
--- a/base/src/com/google/idea/blaze/base/sync/data/BlazeProjectDataManagerImpl.java
+++ b/base/src/com/google/idea/blaze/base/sync/data/BlazeProjectDataManagerImpl.java
@@ -18,8 +18,6 @@
 import com.google.common.collect.Lists;
 import com.google.idea.blaze.base.async.executor.BlazeExecutor;
 import com.google.idea.blaze.base.model.BlazeProjectData;
-import com.google.idea.blaze.base.scope.BlazeContext;
-import com.google.idea.blaze.base.scope.output.StatusOutput;
 import com.google.idea.blaze.base.settings.BlazeImportSettings;
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
 import com.google.idea.blaze.base.util.SerializationUtil;
@@ -52,15 +50,14 @@
   }
 
   @Nullable
-  public BlazeProjectData loadProjectRoot(
-      BlazeContext context, BlazeImportSettings importSettings) {
+  public BlazeProjectData loadProjectRoot(BlazeImportSettings importSettings) throws IOException {
     BlazeProjectData projectData = blazeProjectData;
     if (projectData != null) {
       return projectData;
     }
     synchronized (this) {
       projectData = blazeProjectData;
-      return projectData != null ? projectData : loadProject(context, importSettings);
+      return projectData != null ? projectData : loadProject(importSettings);
     }
   }
 
@@ -71,29 +68,18 @@
   }
 
   @Nullable
-  private synchronized BlazeProjectData loadProject(
-      BlazeContext context, BlazeImportSettings importSettings) {
-    BlazeProjectData blazeProjectData = null;
-    try {
-      File file = getCacheFile(project, importSettings);
+  private synchronized BlazeProjectData loadProject(BlazeImportSettings importSettings)
+      throws IOException {
+    File file = getCacheFile(project, importSettings);
 
-      List<ClassLoader> classLoaders = Lists.newArrayList();
-      for (BlazeSyncPlugin syncPlugin : BlazeSyncPlugin.EP_NAME.getExtensions()) {
-        classLoaders.add(syncPlugin.getClass().getClassLoader());
-      }
-      classLoaders.add(getClass().getClassLoader());
-      classLoaders.add(Thread.currentThread().getContextClassLoader());
-
-      blazeProjectData = (BlazeProjectData) SerializationUtil.loadFromDisk(file, classLoaders);
-    } catch (IOException e) {
-      String buildSystemName = importSettings.getBuildSystem().getLowerCaseName();
-      context.output(
-          new StatusOutput(
-              String.format("Stale %s project cache, sync will be needed", buildSystemName)));
-      logger.info(e);
+    List<ClassLoader> classLoaders = Lists.newArrayList();
+    for (BlazeSyncPlugin syncPlugin : BlazeSyncPlugin.EP_NAME.getExtensions()) {
+      classLoaders.add(syncPlugin.getClass().getClassLoader());
     }
+    classLoaders.add(getClass().getClassLoader());
+    classLoaders.add(Thread.currentThread().getContextClassLoader());
 
-    this.blazeProjectData = blazeProjectData;
+    blazeProjectData = (BlazeProjectData) SerializationUtil.loadFromDisk(file, classLoaders);
     return blazeProjectData;
   }
 
diff --git a/base/src/com/google/idea/blaze/base/sync/libraries/BlazeLibraryCollector.java b/base/src/com/google/idea/blaze/base/sync/libraries/BlazeLibraryCollector.java
index 9e029ed..c8e38db 100644
--- a/base/src/com/google/idea/blaze/base/sync/libraries/BlazeLibraryCollector.java
+++ b/base/src/com/google/idea/blaze/base/sync/libraries/BlazeLibraryCollector.java
@@ -16,21 +16,26 @@
 package com.google.idea.blaze.base.sync.libraries;
 
 import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 import com.google.idea.blaze.base.model.BlazeLibrary;
 import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
 import java.util.List;
 import java.util.Objects;
+import java.util.Set;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /** Collects libraries from the sync data using all contributors. */
 public class BlazeLibraryCollector {
-  public static List<BlazeLibrary> getLibraries(BlazeProjectData blazeProjectData) {
-    List<BlazeLibrary> result = Lists.newArrayList();
+  public static List<BlazeLibrary> getLibraries(
+      ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
+    // Use set to filter out duplicates.
+    Set<BlazeLibrary> result = Sets.newLinkedHashSet();
     List<LibrarySource> librarySources = Lists.newArrayList();
     for (BlazeSyncPlugin syncPlugin : BlazeSyncPlugin.EP_NAME.getExtensions()) {
-      LibrarySource librarySource = syncPlugin.getLibrarySource(blazeProjectData);
+      LibrarySource librarySource = syncPlugin.getLibrarySource(projectViewSet, blazeProjectData);
       if (librarySource != null) {
         librarySources.add(librarySource);
       }
diff --git a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryEditor.java b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryEditor.java
index 44969c3..cd59adb 100644
--- a/base/src/com/google/idea/blaze/base/sync/libraries/LibraryEditor.java
+++ b/base/src/com/google/idea/blaze/base/sync/libraries/LibraryEditor.java
@@ -20,6 +20,7 @@
 import com.google.idea.blaze.base.model.BlazeLibrary;
 import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.model.LibraryKey;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.scope.output.PrintOutput;
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
@@ -45,6 +46,7 @@
   public static void updateProjectLibraries(
       Project project,
       BlazeContext context,
+      ProjectViewSet projectViewSet,
       BlazeProjectData blazeProjectData,
       Collection<BlazeLibrary> libraries) {
     Set<LibraryKey> intelliJLibraryState = Sets.newHashSet();
@@ -71,7 +73,7 @@
       // Garbage collect unused libraries
       List<LibrarySource> librarySources = Lists.newArrayList();
       for (BlazeSyncPlugin syncPlugin : BlazeSyncPlugin.EP_NAME.getExtensions()) {
-        LibrarySource librarySource = syncPlugin.getLibrarySource(blazeProjectData);
+        LibrarySource librarySource = syncPlugin.getLibrarySource(projectViewSet, blazeProjectData);
         if (librarySource != null) {
           librarySources.add(librarySource);
         }
diff --git a/base/src/com/google/idea/blaze/base/sync/projectstructure/ModuleFinder.java b/base/src/com/google/idea/blaze/base/sync/projectstructure/ModuleFinder.java
new file mode 100644
index 0000000..2973200
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/projectstructure/ModuleFinder.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.projectstructure;
+
+import com.intellij.openapi.components.ServiceManager;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import javax.annotation.Nullable;
+
+/** Service for looking up modules (might not be committed during tests). */
+public interface ModuleFinder {
+
+  static ModuleFinder getInstance(Project project) {
+    return ServiceManager.getService(project, ModuleFinder.class);
+  }
+
+  @Nullable
+  Module findModuleByName(String name);
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/projectstructure/ModuleFinderImpl.java b/base/src/com/google/idea/blaze/base/sync/projectstructure/ModuleFinderImpl.java
new file mode 100644
index 0000000..36413f1
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/projectstructure/ModuleFinderImpl.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.projectstructure;
+
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleManager;
+import com.intellij.openapi.project.Project;
+import javax.annotation.Nullable;
+
+/** Default implementation of {@link ModuleFinder} */
+public class ModuleFinderImpl implements ModuleFinder {
+
+  private final Project project;
+
+  ModuleFinderImpl(Project project) {
+    this.project = project;
+  }
+
+  @Nullable
+  @Override
+  public Module findModuleByName(String name) {
+    return ModuleManager.getInstance(project).findModuleByName(name);
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/projectview/ImportRoots.java b/base/src/com/google/idea/blaze/base/sync/projectview/ImportRoots.java
index c484df1..38568dc 100644
--- a/base/src/com/google/idea/blaze/base/sync/projectview/ImportRoots.java
+++ b/base/src/com/google/idea/blaze/base/sync/projectview/ImportRoots.java
@@ -23,16 +23,34 @@
 import com.google.idea.blaze.base.model.primitives.Label;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.projectview.ProjectViewManager;
 import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.projectview.section.sections.DirectoryEntry;
 import com.google.idea.blaze.base.projectview.section.sections.DirectorySection;
+import com.google.idea.blaze.base.settings.Blaze;
 import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
 import com.google.idea.blaze.base.util.WorkspacePathUtil;
+import com.intellij.openapi.project.Project;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
 import java.util.Collection;
 import java.util.Set;
+import javax.annotation.Nullable;
 
 /** The roots to import. Derived from project view. */
 public final class ImportRoots {
+
+  /** Returns the ImportRoots for the project, or null if it's not a blaze project. */
+  @Nullable
+  public static ImportRoots forProjectSafe(Project project) {
+    WorkspaceRoot root = WorkspaceRoot.fromProjectSafe(project);
+    ProjectViewSet projectViewSet = ProjectViewManager.getInstance(project).getProjectViewSet();
+    if (root == null || projectViewSet == null) {
+      return null;
+    }
+    return ImportRoots.builder(root, Blaze.getBuildSystem(project)).add(projectViewSet).build();
+  }
+
   /** Builder for import roots */
   public static class Builder {
     private final ImmutableCollection.Builder<WorkspacePath> rootDirectoriesBuilder =
@@ -123,29 +141,27 @@
   }
 
   private boolean containsLabel(Label label) {
+    return !label.isExternal() && containsWorkspacePath(label.blazePackage());
+  }
+
+  public boolean containsWorkspacePath(WorkspacePath workspacePath) {
     boolean included = false;
     boolean excluded = false;
-    for (WorkspacePath workspacePath : rootDirectories()) {
-      included = included || matchesLabel(workspacePath, label);
+    for (WorkspacePath rootDirectory : rootDirectories()) {
+      included = included || isSubdirectory(rootDirectory, workspacePath);
     }
-    for (WorkspacePath workspacePath : excludeDirectories()) {
-      excluded = excluded || matchesLabel(workspacePath, label);
+    for (WorkspacePath excludeDirectory : excludeDirectories()) {
+      excluded = excluded || isSubdirectory(excludeDirectory, workspacePath);
     }
     return included && !excluded;
   }
 
-  private static boolean matchesLabel(WorkspacePath workspacePath, Label label) {
-    if (workspacePath.isWorkspaceRoot()) {
+  private static boolean isSubdirectory(WorkspacePath ancestor, WorkspacePath descendant) {
+    if (ancestor.isWorkspaceRoot()) {
       return true;
     }
-    String moduleLabelStr = label.toString();
-    int packagePrefixLength = "//".length();
-    int nextCharIndex = workspacePath.relativePath().length() + packagePrefixLength;
-    if (moduleLabelStr.startsWith(workspacePath.relativePath(), packagePrefixLength)
-        && moduleLabelStr.length() >= nextCharIndex) {
-      char c = moduleLabelStr.charAt(nextCharIndex);
-      return c == '/' || c == ':';
-    }
-    return false;
+    Path ancestorPath = FileSystems.getDefault().getPath(ancestor.relativePath());
+    Path descendantPath = FileSystems.getDefault().getPath(descendant.relativePath());
+    return descendantPath.startsWith(ancestorPath);
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/sync/projectview/LanguageSupport.java b/base/src/com/google/idea/blaze/base/sync/projectview/LanguageSupport.java
index da9ae7f..bae9239 100644
--- a/base/src/com/google/idea/blaze/base/sync/projectview/LanguageSupport.java
+++ b/base/src/com/google/idea/blaze/base/sync/projectview/LanguageSupport.java
@@ -15,7 +15,7 @@
  */
 package com.google.idea.blaze.base.sync.projectview;
 
-import com.google.common.collect.Sets;
+import com.google.common.collect.ImmutableSet;
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
 import com.google.idea.blaze.base.projectview.ProjectViewSet;
@@ -25,57 +25,81 @@
 import com.google.idea.blaze.base.scope.output.IssueOutput;
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
 import com.intellij.openapi.diagnostic.Logger;
+import java.util.Arrays;
 import java.util.EnumSet;
 import java.util.Set;
+import javax.annotation.Nullable;
 
 /** Reads the user's language preferences from the project view. */
 public class LanguageSupport {
 
   private static final Logger logger = Logger.getInstance(LanguageSupport.class);
 
-  public static WorkspaceLanguageSettings createWorkspaceLanguageSettings(
-      BlazeContext context, ProjectViewSet projectViewSet) {
-    WorkspaceType workspaceType = projectViewSet.getScalarValue(WorkspaceTypeSection.KEY);
-    Set<WorkspaceType> supportedTypes = supportedWorkspaceTypes();
-    if (workspaceType != null && !supportedTypes.contains(workspaceType)) {
-      IssueOutput.error(
-              String.format(
-                  "Workspace type '%s' is not supported by this plugin", workspaceType.getName()))
-          .submit(context);
-      return null;
-    }
-    if (workspaceType == null) {
-      // if no workspace type is specified, prioritize by enum ordinal.
-      for (BlazeSyncPlugin syncPlugin : BlazeSyncPlugin.EP_NAME.getExtensions()) {
-        WorkspaceType recommendedType = syncPlugin.getDefaultWorkspaceType();
-        if (recommendedType != null
-            && (workspaceType == null || workspaceType.ordinal() > recommendedType.ordinal())) {
-          workspaceType = recommendedType;
-        }
+  @Nullable
+  public static WorkspaceType getDefaultWorkspaceType() {
+    WorkspaceType workspaceType = null;
+    // prioritize by enum ordinal.
+    for (BlazeSyncPlugin syncPlugin : BlazeSyncPlugin.EP_NAME.getExtensions()) {
+      WorkspaceType recommendedType = syncPlugin.getDefaultWorkspaceType();
+      if (recommendedType != null
+          && (workspaceType == null || workspaceType.ordinal() > recommendedType.ordinal())) {
+        workspaceType = recommendedType;
       }
     }
+    return workspaceType;
+  }
+
+  /**
+   * Derives {@link WorkspaceLanguageSettings} from the {@link ProjectViewSet}. Does no validation.
+   */
+  @Nullable
+  public static WorkspaceLanguageSettings createWorkspaceLanguageSettings(
+      ProjectViewSet projectViewSet) {
+    WorkspaceType workspaceType = projectViewSet.getScalarValue(WorkspaceTypeSection.KEY);
+    if (workspaceType == null) {
+      workspaceType = getDefaultWorkspaceType();
+    }
 
     if (workspaceType == null) {
       logger.error("Could not find workspace type."); // Should never happen
       return null;
     }
 
-    Set<LanguageClass> activeLanguages = Sets.newHashSet(workspaceType.getLanguages());
-    activeLanguages.addAll(projectViewSet.listItems(AdditionalLanguagesSection.KEY));
+    ImmutableSet.Builder<LanguageClass> activeLanguages =
+        ImmutableSet.<LanguageClass>builder()
+            .addAll(workspaceType.getLanguages())
+            .addAll(projectViewSet.listItems(AdditionalLanguagesSection.KEY))
+            .add(LanguageClass.GENERIC);
+    Arrays.stream(BlazeSyncPlugin.EP_NAME.getExtensions())
+        .forEach(plugin -> activeLanguages.addAll(plugin.getAlwaysActiveLanguages()));
+    return new WorkspaceLanguageSettings(workspaceType, activeLanguages.build());
+  }
 
+  public static boolean validateLanguageSettings(
+      BlazeContext context, WorkspaceLanguageSettings languageSettings) {
+    Set<WorkspaceType> supportedTypes = supportedWorkspaceTypes();
+    WorkspaceType workspaceType = languageSettings.getWorkspaceType();
+    if (!supportedTypes.contains(languageSettings.getWorkspaceType())) {
+      IssueOutput.error(
+              String.format(
+                  "Workspace type '%s' is not supported by this plugin",
+                  languageSettings.getWorkspaceType().getName()))
+          .submit(context);
+      return false;
+    }
     Set<LanguageClass> supportedLanguages = supportedLanguagesForWorkspaceType(workspaceType);
     Set<LanguageClass> availableLanguages = EnumSet.noneOf(LanguageClass.class);
     for (WorkspaceType type : supportedTypes) {
       availableLanguages.addAll(supportedLanguagesForWorkspaceType(type));
     }
 
-    for (LanguageClass languageClass : activeLanguages) {
+    for (LanguageClass languageClass : languageSettings.activeLanguages) {
       if (!availableLanguages.contains(languageClass)) {
         IssueOutput.error(
                 String.format(
                     "Language '%s' is not supported by this plugin", languageClass.getName()))
             .submit(context);
-        return null;
+        return false;
       }
       if (!supportedLanguages.contains(languageClass)) {
         IssueOutput.error(
@@ -83,12 +107,10 @@
                     "Language '%s' is not supported for this plugin with workspace type: '%s'",
                     languageClass.getName(), workspaceType.getName()))
             .submit(context);
-        return null;
+        return false;
       }
     }
-
-    activeLanguages.add(LanguageClass.GENERIC);
-    return new WorkspaceLanguageSettings(workspaceType, activeLanguages);
+    return true;
   }
 
   /** The {@link WorkspaceType}s supported by this plugin */
@@ -105,7 +127,21 @@
     Set<LanguageClass> supportedLanguages = EnumSet.noneOf(LanguageClass.class);
     for (BlazeSyncPlugin syncPlugin : BlazeSyncPlugin.EP_NAME.getExtensions()) {
       supportedLanguages.addAll(syncPlugin.getSupportedLanguagesInWorkspace(type));
+      supportedLanguages.addAll(syncPlugin.getAlwaysActiveLanguages());
     }
+    supportedLanguages.add(LanguageClass.GENERIC);
     return supportedLanguages;
   }
+
+  /** @return The valid 'additional_language' options for this workspace type */
+  public static Set<LanguageClass> availableAdditionalLanguages(WorkspaceType workspaceType) {
+    Set<LanguageClass> langs = LanguageSupport.supportedLanguagesForWorkspaceType(workspaceType);
+    langs.removeAll(workspaceType.getLanguages());
+    langs.remove(LanguageClass.GENERIC);
+
+    Arrays.stream(BlazeSyncPlugin.EP_NAME.getExtensions())
+        .forEach(plugin -> langs.removeAll(plugin.getAlwaysActiveLanguages()));
+
+    return langs;
+  }
 }
diff --git a/base/src/com/google/idea/blaze/base/sync/projectview/RelatedWorkspacePathFinder.java b/base/src/com/google/idea/blaze/base/sync/projectview/RelatedWorkspacePathFinder.java
new file mode 100644
index 0000000..9006605
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/projectview/RelatedWorkspacePathFinder.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.projectview;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.io.FileAttributeProvider;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.intellij.openapi.components.ServiceManager;
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+/** Utility class to find WorkspacePaths that are related */
+public final class RelatedWorkspacePathFinder {
+
+  private final FileAttributeProvider fileAttributeProvider;
+
+  RelatedWorkspacePathFinder(FileAttributeProvider fileAttributeProvider) {
+    this.fileAttributeProvider = fileAttributeProvider;
+  }
+
+  public static RelatedWorkspacePathFinder getInstance() {
+    return ServiceManager.getService(RelatedWorkspacePathFinder.class);
+  }
+
+  public ImmutableSet<WorkspacePath> findRelatedWorkspaceDirectories(
+      WorkspacePathResolver pathResolver, WorkspacePath workspacePath) {
+
+    Path path = Paths.get(workspacePath.relativePath());
+    Path testsPath = Paths.get("");
+
+    boolean foundTests = false;
+    for (Path element : path) {
+      if (!foundTests && element.toString().equals("java")) {
+        Path potentialTestsPath = testsPath.resolve("javatests");
+        if (exists(pathResolver.resolveToFile(potentialTestsPath.toString()))) {
+          testsPath = potentialTestsPath;
+          foundTests = true;
+          continue;
+        }
+      }
+
+      testsPath = testsPath.resolve(element);
+    }
+
+    if (!foundTests || !exists(pathResolver.resolveToFile(testsPath.toString()))) {
+      return ImmutableSet.of();
+    }
+
+    return ImmutableSet.of(new WorkspacePath(testsPath.toString()));
+  }
+
+  private boolean exists(File file) {
+    return fileAttributeProvider.exists(file);
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/projectview/WorkspaceLanguageSettings.java b/base/src/com/google/idea/blaze/base/sync/projectview/WorkspaceLanguageSettings.java
index 4ebde4d..5fdd67f 100644
--- a/base/src/com/google/idea/blaze/base/sync/projectview/WorkspaceLanguageSettings.java
+++ b/base/src/com/google/idea/blaze/base/sync/projectview/WorkspaceLanguageSettings.java
@@ -16,10 +16,12 @@
 package com.google.idea.blaze.base.sync.projectview;
 
 import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.model.primitives.Kind;
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
 import java.io.Serializable;
-import java.util.Set;
+import java.util.EnumSet;
 import javax.annotation.concurrent.Immutable;
 
 /** Contains the user's language preferences from the project view. */
@@ -28,10 +30,10 @@
   private static final long serialVersionUID = 1L;
 
   private final WorkspaceType workspaceType;
-  private final Set<LanguageClass> activeLanguages;
+  final ImmutableSet<LanguageClass> activeLanguages;
 
   public WorkspaceLanguageSettings(
-      WorkspaceType workspaceType, Set<LanguageClass> activeLanguages) {
+      WorkspaceType workspaceType, ImmutableSet<LanguageClass> activeLanguages) {
     this.workspaceType = workspaceType;
     this.activeLanguages = activeLanguages;
   }
@@ -57,6 +59,12 @@
     return activeLanguages.contains(languageClass);
   }
 
+  public EnumSet<Kind> getAvailableTargetKinds() {
+    EnumSet<Kind> kinds = EnumSet.allOf(Kind.class);
+    kinds.removeIf(kind -> !activeLanguages.contains(kind.getLanguageClass()));
+    return kinds;
+  }
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {
diff --git a/base/src/com/google/idea/blaze/base/sync/sharding/BlazeBuildTargetSharder.java b/base/src/com/google/idea/blaze/base/sync/sharding/BlazeBuildTargetSharder.java
new file mode 100644
index 0000000..8f2279c
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/sharding/BlazeBuildTargetSharder.java
@@ -0,0 +1,176 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.sharding;
+
+import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.projectview.ProjectViewManager;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.projectview.section.sections.ShardBlazeBuildsSection;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.sync.aspects.BuildResult;
+import com.google.idea.blaze.base.sync.sharding.WildcardTargetExpander.ExpandedTargetsResult;
+import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.google.idea.common.experiments.BoolExperiment;
+import com.intellij.openapi.project.Project;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
+
+/** Utility methods for sharding blaze build invocations. */
+public class BlazeBuildTargetSharder {
+
+  private static final BoolExperiment allowSharding =
+      new BoolExperiment("blaze.build.sharding.allowed", true);
+
+  // number of packages per blaze query shard
+  static final int PACKAGE_SHARD_SIZE = 500;
+
+  // number of individual targets per blaze build shard
+  private static final int TARGET_SHARD_SIZE = 1000;
+
+  /** Result of expanding then sharding wildcard target patterns */
+  public static class ShardedTargetsResult {
+    public final ShardedTargetList shardedTargets;
+    public final BuildResult buildResult;
+
+    private ShardedTargetsResult(ShardedTargetList shardedTargets, BuildResult buildResult) {
+      this.shardedTargets = shardedTargets;
+      this.buildResult = buildResult;
+    }
+  }
+
+  /** Returns true if sharding can be enabled for this project, and is not already enabled */
+  static boolean canEnableSharding(Project project) {
+    if (!allowSharding.getValue()) {
+      return false;
+    }
+    ProjectViewSet projectViewSet = ProjectViewManager.getInstance(project).getProjectViewSet();
+    return projectViewSet != null && !shardingEnabled(projectViewSet);
+  }
+
+  private static boolean shardingEnabled(ProjectViewSet projectViewSet) {
+    if (!allowSharding.getValue()) {
+      return false;
+    }
+    return projectViewSet.getScalarValue(ShardBlazeBuildsSection.KEY, false);
+  }
+
+  /** Expand wildcard target patterns and partition the resulting target list. */
+  public static ShardedTargetsResult expandAndShardTargets(
+      Project project,
+      BlazeContext context,
+      WorkspaceRoot workspaceRoot,
+      ProjectViewSet projectViewSet,
+      WorkspacePathResolver pathResolver,
+      List<TargetExpression> targets) {
+    if (!shardingEnabled(projectViewSet)) {
+      return new ShardedTargetsResult(
+          new ShardedTargetList(ImmutableList.of(targets)), BuildResult.SUCCESS);
+    }
+
+    List<WildcardTargetPattern> wildcardIncludes = getWildcardPatterns(targets);
+    if (wildcardIncludes.isEmpty()) {
+      return new ShardedTargetsResult(
+          new ShardedTargetList(ImmutableList.of(targets)), BuildResult.SUCCESS);
+    }
+    ExpandedTargetsResult expandedTargets =
+        expandWildcardTargets(
+            project, context, workspaceRoot, projectViewSet, pathResolver, targets);
+    if (expandedTargets.buildResult.status == BuildResult.Status.FATAL_ERROR) {
+      return new ShardedTargetsResult(
+          new ShardedTargetList(ImmutableList.of()), expandedTargets.buildResult);
+    }
+    return new ShardedTargetsResult(
+        shardTargets(expandedTargets.singleTargets, TARGET_SHARD_SIZE),
+        expandedTargets.buildResult);
+  }
+
+  /** Expand wildcard target patterns into individual blaze targets. */
+  private static ExpandedTargetsResult expandWildcardTargets(
+      Project project,
+      BlazeContext context,
+      WorkspaceRoot workspaceRoot,
+      ProjectViewSet projectViewSet,
+      WorkspacePathResolver pathResolver,
+      List<TargetExpression> targets) {
+    if (!shardingEnabled(projectViewSet)) {
+      return new ExpandedTargetsResult(targets, BuildResult.SUCCESS);
+    }
+    List<WildcardTargetPattern> includes = getWildcardPatterns(targets);
+    if (includes.isEmpty()) {
+      return new ExpandedTargetsResult(targets, BuildResult.SUCCESS);
+    }
+    Map<TargetExpression, List<TargetExpression>> expandedTargets =
+        WildcardTargetExpander.expandToNonRecursiveWildcardTargets(
+            project, context, pathResolver, includes);
+    if (expandedTargets == null) {
+      return new ExpandedTargetsResult(ImmutableList.of(), BuildResult.FATAL_ERROR);
+    }
+
+    // replace original recursive targets with expanded list, retaining relative ordering
+    List<TargetExpression> fullList = new ArrayList<>();
+    for (TargetExpression target : targets) {
+      List<TargetExpression> expanded = expandedTargets.get(target);
+      if (expanded == null) {
+        fullList.add(target);
+      } else {
+        fullList.addAll(expanded);
+      }
+    }
+    return WildcardTargetExpander.expandToSingleTargets(
+        project, context, workspaceRoot, projectViewSet, fullList);
+  }
+
+  /**
+   * Partition targets list. Because order is important with respect to excluded targets, each shard
+   * has all subsequent excluded targets appended to it.
+   */
+  static ShardedTargetList shardTargets(List<TargetExpression> targets, int shardSize) {
+    if (targets.size() <= shardSize) {
+      return new ShardedTargetList(ImmutableList.of(targets));
+    }
+    List<List<TargetExpression>> output = new ArrayList<>();
+    for (int index = 0; index < targets.size(); index += shardSize) {
+      int endIndex = Math.min(targets.size(), index + shardSize);
+      List<TargetExpression> shard = new ArrayList<>(targets.subList(index, endIndex));
+      List<TargetExpression> remainingExcludes =
+          targets
+              .subList(endIndex, targets.size())
+              .stream()
+              .filter(TargetExpression::isExcluded)
+              .collect(Collectors.toList());
+      shard.addAll(remainingExcludes);
+      output.add(shard);
+    }
+    return new ShardedTargetList(output);
+  }
+
+  /** Returns the wildcard target patterns, ignoring exclude patterns (those starting with '-') */
+  private static List<WildcardTargetPattern> getWildcardPatterns(List<TargetExpression> targets) {
+    return targets
+        .stream()
+        .filter(t -> !t.isExcluded())
+        .map(WildcardTargetPattern::fromExpression)
+        .filter(Objects::nonNull)
+        .collect(Collectors.toList());
+  }
+
+  private BlazeBuildTargetSharder() {}
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/sharding/PackageLister.java b/base/src/com/google/idea/blaze/base/sync/sharding/PackageLister.java
new file mode 100644
index 0000000..d87d205
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/sharding/PackageLister.java
@@ -0,0 +1,140 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.sharding;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Maps;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.idea.blaze.base.async.FutureUtil;
+import com.google.idea.blaze.base.async.FutureUtil.FutureResult;
+import com.google.idea.blaze.base.bazel.BuildSystemProvider;
+import com.google.idea.blaze.base.io.FileAttributeProvider;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.prefetch.FetchExecutor;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.google.idea.blaze.base.util.WorkspacePathUtil;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
+
+/**
+ * Traverses blaze packages specified by wildcard target patterns, expanding to a set of
+ * single-package target patterns.
+ */
+class PackageLister {
+
+  private PackageLister() {}
+
+  /** The set of blaze packages to prefetch prior to traversing the directory tree. */
+  static Set<File> getDirectoriesToPrefetch(
+      WorkspacePathResolver pathResolver,
+      Collection<WildcardTargetPattern> includes,
+      Predicate<WorkspacePath> excluded) {
+    Set<WorkspacePath> prefetchPaths = new HashSet<>();
+    for (WildcardTargetPattern pattern : includes) {
+      WorkspacePath workspacePath = pattern.getBasePackage();
+      if (excluded.test(workspacePath)) {
+        continue;
+      }
+      prefetchPaths.add(workspacePath);
+    }
+    return WorkspacePathUtil.calculateMinimalWorkspacePaths(prefetchPaths)
+        .stream()
+        .map(pathResolver::resolveToFile)
+        .collect(Collectors.toSet());
+  }
+
+  /**
+   * Expands all-in-package-recursive wildcard targets into all-in-single-package targets by
+   * traversing the file system, looking for child blaze packages.
+   *
+   * <p>Returns null if directory traversal failed or was cancelled.
+   */
+  @Nullable
+  static Map<TargetExpression, List<TargetExpression>> expandPackageTargets(
+      BuildSystemProvider provider,
+      BlazeContext context,
+      WorkspacePathResolver pathResolver,
+      Collection<WildcardTargetPattern> wildcardPatterns) {
+    List<ListenableFuture<Entry<TargetExpression, List<TargetExpression>>>> futures =
+        Lists.newArrayList();
+    for (WildcardTargetPattern pattern : wildcardPatterns) {
+      if (!pattern.isRecursive() || pattern.toString().startsWith("-")) {
+        continue;
+      }
+      File dir = pathResolver.resolveToFile(pattern.getBasePackage());
+      if (!FileAttributeProvider.getInstance().isDirectory(dir)) {
+        continue;
+      }
+      futures.add(
+          FetchExecutor.EXECUTOR.submit(
+              () -> {
+                List<TargetExpression> expandedTargets = new ArrayList<>();
+                traversePackageRecursively(provider, pathResolver, dir, expandedTargets);
+                return Maps.immutableEntry(pattern.originalPattern, expandedTargets);
+              }));
+    }
+    if (futures.isEmpty()) {
+      return ImmutableMap.of();
+    }
+    FutureResult<List<Entry<TargetExpression, List<TargetExpression>>>> result =
+        FutureUtil.waitForFuture(context, Futures.allAsList(futures))
+            .withProgressMessage("Expanding wildcard target patterns...")
+            .timed("ExpandWildcardTargets")
+            .onError("Expanding wildcard target patterns failed")
+            .run();
+    if (!result.success()) {
+      return null;
+    }
+    return result
+        .result()
+        .stream()
+        .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (x, y) -> x));
+  }
+
+  private static void traversePackageRecursively(
+      BuildSystemProvider provider,
+      WorkspacePathResolver pathResolver,
+      File dir,
+      List<TargetExpression> output) {
+    WorkspacePath path = pathResolver.getWorkspacePath(dir);
+    if (path == null) {
+      return;
+    }
+    if (provider.findBuildFileInDirectory(dir) != null) {
+      output.add(TargetExpression.allFromPackageNonRecursive(path));
+    }
+    File[] children = FileAttributeProvider.getInstance().listFiles(dir);
+    if (children == null) {
+      return;
+    }
+    for (File child : children) {
+      traversePackageRecursively(provider, pathResolver, child, output);
+    }
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/sharding/QueryResultLineProcessor.java b/base/src/com/google/idea/blaze/base/sync/sharding/QueryResultLineProcessor.java
new file mode 100644
index 0000000..8d7a46a
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/sharding/QueryResultLineProcessor.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.sharding;
+
+import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.async.process.LineProcessingOutputStream;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import java.util.function.Predicate;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/** Collects the blaze targets output by 'blaze query --output label_kind "targets"' */
+class QueryResultLineProcessor implements LineProcessingOutputStream.LineProcessor {
+
+  static class RuleTypeAndLabel {
+    final String ruleType;
+    final String label;
+
+    private RuleTypeAndLabel(String ruleType, String label) {
+      this.ruleType = ruleType;
+      this.label = label;
+    }
+  }
+
+  private static final Pattern RULE_PATTERN = Pattern.compile("^([^\\s]*) rule ([^\\s]*)$");
+
+  private ImmutableList.Builder<TargetExpression> outputList;
+  private final Predicate<RuleTypeAndLabel> targetFilter;
+
+  /**
+   * @param outputList Parsed target expressions are added to this list
+   * @param targetFilter Ignore targets failing this predicate.
+   */
+  QueryResultLineProcessor(
+      ImmutableList.Builder<TargetExpression> outputList,
+      Predicate<RuleTypeAndLabel> targetFilter) {
+    this.outputList = outputList;
+    this.targetFilter = targetFilter;
+  }
+
+  @Override
+  public boolean processLine(String line) {
+    Matcher match = RULE_PATTERN.matcher(line);
+    if (!match.find()) {
+      return true;
+    }
+    String ruleType = match.group(1);
+    String label = match.group(2);
+    if (targetFilter.test(new RuleTypeAndLabel(ruleType, label))) {
+      outputList.add(TargetExpression.fromString(label));
+    }
+    return true;
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/sharding/ShardedTargetList.java b/base/src/com/google/idea/blaze/base/sync/sharding/ShardedTargetList.java
new file mode 100644
index 0000000..139c3b8
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/sharding/ShardedTargetList.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.sharding;
+
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.output.IssueOutput;
+import com.google.idea.blaze.base.scope.output.StatusOutput;
+import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.blaze.base.sync.aspects.BuildResult;
+import com.intellij.openapi.project.Project;
+import java.util.List;
+import java.util.function.Function;
+
+/** Partitioned list of blaze targets. */
+public class ShardedTargetList {
+
+  public final List<List<TargetExpression>> shardedTargets;
+
+  public ShardedTargetList(List<List<TargetExpression>> shardedTargets) {
+    this.shardedTargets = shardedTargets;
+  }
+
+  public boolean isEmpty() {
+    return shardedTargets.stream().flatMap(List::stream).findFirst().orElse(null) == null;
+  }
+
+  /**
+   * Runs the provided blaze invocation on each target list shard, returning the combined {@link
+   * BuildResult}. Attempts to work around out of memory errors caused by lack of blaze garbage
+   * collection where possible.
+   */
+  public BuildResult runShardedCommand(
+      Project project,
+      BlazeContext context,
+      Function<Integer, String> progressMessage,
+      Function<List<TargetExpression>, BuildResult> invocation) {
+    if (isEmpty()) {
+      return BuildResult.SUCCESS;
+    }
+    if (shardedTargets.size() == 1) {
+      return invocation.apply(shardedTargets.get(0));
+    }
+    int progress = 0;
+    BuildResult output = null;
+    for (int i = 0; i < shardedTargets.size(); i++, progress++) {
+      context.output(new StatusOutput(progressMessage.apply(i + 1)));
+      BuildResult result = invocation.apply(shardedTargets.get(i));
+      if (result.outOfMemory() && progress > 0) {
+        // re-try now that blaze server has restarted
+        progress = 0;
+        IssueOutput.warn(retryOnOomMessage(project, i)).submit(context);
+        result = invocation.apply(shardedTargets.get(i));
+      }
+      output = output == null ? result : BuildResult.combine(output, result);
+      if (output.status == BuildResult.Status.FATAL_ERROR) {
+        return output;
+      }
+    }
+    return output;
+  }
+
+  private String retryOnOomMessage(Project project, int shardIndex) {
+    String buildSystem = Blaze.buildSystemName(project);
+    return String.format(
+        "%s server ran out of memory on shard %s of %s. This is generally caused by %s garbage "
+            + "collection bugs. Attempting to workaround by resuming with a clean %s server.",
+        buildSystem, shardIndex + 1, shardedTargets.size(), buildSystem, buildSystem);
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/sharding/SuggestEnablingShardingNotification.java b/base/src/com/google/idea/blaze/base/sync/sharding/SuggestEnablingShardingNotification.java
new file mode 100644
index 0000000..71f69c0
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/sharding/SuggestEnablingShardingNotification.java
@@ -0,0 +1,103 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.sharding;
+
+import com.google.idea.blaze.base.projectview.ProjectViewEdit;
+import com.google.idea.blaze.base.projectview.section.ScalarSection;
+import com.google.idea.blaze.base.projectview.section.sections.ShardBlazeBuildsSection;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.output.IssueOutput;
+import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.blaze.base.settings.BlazeUserSettings;
+import com.google.idea.blaze.base.sync.BlazeSyncManager;
+import com.google.idea.blaze.base.sync.BlazeSyncParams;
+import com.intellij.notification.Notification;
+import com.intellij.notification.NotificationListener;
+import com.intellij.notification.NotificationType;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.pom.NavigatableAdapter;
+import com.intellij.xml.util.XmlStringUtil;
+import javax.swing.event.HyperlinkEvent;
+
+/** If blaze runs out of memory during sync, suggest that the user enables build sharding. */
+public class SuggestEnablingShardingNotification {
+
+  public static void suggestSharding(Project project, BlazeContext context) {
+    if (!BlazeBuildTargetSharder.canEnableSharding(project)) {
+      return;
+    }
+    String buildSystem = Blaze.buildSystemName(project);
+    String message =
+        String.format(
+            "The %1$s server ran out of memory during sync. This can occur for large projects. You "
+                + "can workaround this by <a href='fix'>sharding the %1$s build during sync</a>, "
+                + "or alternatively allocate more memory to %1$s",
+            buildSystem);
+    IssueOutput.error(message)
+        .navigatable(
+            new NavigatableAdapter() {
+              @Override
+              public void navigate(boolean requestFocus) {
+                enableShardingAndResync(project);
+              }
+            })
+        .submit(context);
+
+    Notification notification =
+        new Notification(
+            "Out of memory during sync",
+            buildSystem + " ran out of memory during sync",
+            XmlStringUtil.wrapInHtml(message),
+            NotificationType.ERROR,
+            new NotificationListener.Adapter() {
+              @Override
+              protected void hyperlinkActivated(
+                  Notification notification, HyperlinkEvent hyperlinkEvent) {
+                notification.expire();
+                enableShardingAndResync(project);
+              }
+            });
+    notification.setImportant(true);
+    ApplicationManager.getApplication().invokeLater(() -> notification.notify(project));
+  }
+
+  private static void enableShardingAndResync(Project project) {
+    ProjectViewEdit edit =
+        ProjectViewEdit.editLocalProjectView(
+            project,
+            builder -> {
+              ScalarSection<Boolean> existingSection = builder.getLast(ShardBlazeBuildsSection.KEY);
+              builder.replace(
+                  existingSection, ScalarSection.builder(ShardBlazeBuildsSection.KEY).set(true));
+              return true;
+            });
+    if (edit == null) {
+      Messages.showErrorDialog(
+          "Could not modify project view. Check for errors in your project view and try again",
+          "Error");
+      return;
+    }
+    edit.apply();
+    BlazeSyncManager.getInstance(project)
+        .requestProjectSync(
+            new BlazeSyncParams.Builder("Sync", BlazeSyncParams.SyncMode.INCREMENTAL)
+                .addProjectViewTargets(true)
+                .addWorkingSet(BlazeUserSettings.getInstance().getExpandSyncToWorkingSet())
+                .build());
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/sharding/WildcardTargetExpander.java b/base/src/com/google/idea/blaze/base/sync/sharding/WildcardTargetExpander.java
new file mode 100644
index 0000000..396c1cf
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/sharding/WildcardTargetExpander.java
@@ -0,0 +1,227 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.sharding;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.idea.blaze.base.async.FutureUtil;
+import com.google.idea.blaze.base.async.process.ExternalTask;
+import com.google.idea.blaze.base.async.process.LineProcessingOutputStream;
+import com.google.idea.blaze.base.async.process.PrintOutputLineProcessor;
+import com.google.idea.blaze.base.bazel.BuildSystemProvider;
+import com.google.idea.blaze.base.command.BlazeCommand;
+import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.command.BlazeFlags;
+import com.google.idea.blaze.base.model.primitives.Kind;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.prefetch.PrefetchService;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.output.StatusOutput;
+import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.blaze.base.sync.aspects.BuildResult;
+import com.google.idea.blaze.base.sync.projectview.LanguageSupport;
+import com.google.idea.blaze.base.sync.sharding.QueryResultLineProcessor.RuleTypeAndLabel;
+import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.google.idea.common.experiments.BoolExperiment;
+import com.intellij.openapi.project.Project;
+import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
+
+/** Expands wildcard target patterns into individual blaze targets. */
+public class WildcardTargetExpander {
+
+  private static final BoolExperiment filterByRuleType =
+      new BoolExperiment("blaze.build.filter.by.rule.type", true);
+
+  static class ExpandedTargetsResult {
+    final List<TargetExpression> singleTargets;
+    final BuildResult buildResult;
+
+    ExpandedTargetsResult(List<TargetExpression> singleTargets, BuildResult buildResult) {
+      this.singleTargets = singleTargets;
+      this.buildResult = buildResult;
+    }
+
+    static ExpandedTargetsResult merge(ExpandedTargetsResult first, ExpandedTargetsResult second) {
+      BuildResult buildResult = BuildResult.combine(first.buildResult, second.buildResult);
+      List<TargetExpression> targets =
+          ImmutableList.<TargetExpression>builder()
+              .addAll(first.singleTargets)
+              .addAll(second.singleTargets)
+              .build();
+      return new ExpandedTargetsResult(targets, buildResult);
+    }
+  }
+
+  /**
+   * Expand recursive wildcard blaze target patterns into single-package wildcard patterns, via a
+   * file system traversal.
+   *
+   * <p>Exclude target patterns (beginning with '-') are not expanded.
+   *
+   * <p>Returns null if operation failed or was cancelled.
+   */
+  @Nullable
+  static Map<TargetExpression, List<TargetExpression>> expandToNonRecursiveWildcardTargets(
+      Project project,
+      BlazeContext context,
+      WorkspacePathResolver pathResolver,
+      List<WildcardTargetPattern> wildcardPatterns) {
+
+    Set<WildcardTargetPattern> excludes =
+        wildcardPatterns
+            .stream()
+            .filter(WildcardTargetPattern::isExcluded)
+            .collect(Collectors.toSet());
+
+    Predicate<WorkspacePath> excludePredicate =
+        workspacePath ->
+            excludes.stream().anyMatch(pattern -> pattern.coversPackage(workspacePath));
+
+    List<WildcardTargetPattern> includes = new ArrayList<>(wildcardPatterns);
+    includes.removeAll(excludes);
+
+    Set<File> toPrefetch =
+        PackageLister.getDirectoriesToPrefetch(pathResolver, includes, excludePredicate);
+
+    ListenableFuture<?> prefetchFuture =
+        PrefetchService.getInstance().prefetchFiles(project, toPrefetch);
+    if (!FutureUtil.waitForFuture(context, prefetchFuture)
+        .withProgressMessage("Prefetching wildcard target pattern directories...")
+        .timed("PrefetchingWildcardTargetDirectories")
+        .onError("Prefetching wildcard target directories failed")
+        .run()
+        .success()) {
+      return null;
+    }
+
+    return PackageLister.expandPackageTargets(
+        Blaze.getBuildSystemProvider(project), context, pathResolver, includes);
+  }
+
+  /** Runs a sharded blaze query to expand wildcard targets to individual blaze targets */
+  static ExpandedTargetsResult expandToSingleTargets(
+      Project project,
+      BlazeContext context,
+      WorkspaceRoot workspaceRoot,
+      ProjectViewSet projectViewSet,
+      List<TargetExpression> allTargets) {
+    ShardedTargetList shards =
+        BlazeBuildTargetSharder.shardTargets(
+            allTargets, BlazeBuildTargetSharder.PACKAGE_SHARD_SIZE);
+    ImmutableSet<String> handledRuleTypes = handledRuleTypes(projectViewSet);
+    ExpandedTargetsResult output = null;
+    for (int i = 0; i < shards.shardedTargets.size(); i++) {
+      List<TargetExpression> shard = shards.shardedTargets.get(i);
+      context.output(
+          new StatusOutput(
+              String.format(
+                  "Expanding wildcard target patterns, shard %s of %s",
+                  i + 1, shards.shardedTargets.size())));
+      ExpandedTargetsResult result =
+          queryIndividualTargets(project, context, workspaceRoot, handledRuleTypes, shard);
+      output = output == null ? result : ExpandedTargetsResult.merge(output, result);
+      if (output.buildResult == BuildResult.FATAL_ERROR) {
+        return output;
+      }
+    }
+    return output;
+  }
+
+  /** Runs a blaze query to expand the input target patterns to individual blaze targets. */
+  private static ExpandedTargetsResult queryIndividualTargets(
+      Project project,
+      BlazeContext context,
+      WorkspaceRoot workspaceRoot,
+      ImmutableSet<String> handledRuleTypes,
+      List<TargetExpression> targetPatterns) {
+    BlazeCommand.Builder builder =
+        BlazeCommand.builder(getBinaryPath(project), BlazeCommandName.QUERY)
+            .addBlazeFlags(BlazeFlags.KEEP_GOING)
+            .addBlazeFlags("--output=label_kind")
+            .addBlazeFlags(queryString(targetPatterns));
+
+    ImmutableList.Builder<TargetExpression> output = ImmutableList.builder();
+
+    // it's fine to include wildcards here; they're guaranteed not to clash with actual labels.
+    Set<String> explicitTargets =
+        targetPatterns.stream().map(TargetExpression::toString).collect(Collectors.toSet());
+    Predicate<RuleTypeAndLabel> filter =
+        !filterByRuleType.getValue()
+            ? t -> true
+            : t -> handledRuleTypes.contains(t.ruleType) || explicitTargets.contains(t.label);
+
+    int retVal =
+        ExternalTask.builder(workspaceRoot)
+            .addBlazeCommand(builder.build())
+            .context(context)
+            .stdout(LineProcessingOutputStream.of(new QueryResultLineProcessor(output, filter)))
+            .stderr(LineProcessingOutputStream.of(new PrintOutputLineProcessor(context)))
+            .build()
+            .run();
+
+    BuildResult buildResult = BuildResult.fromExitCode(retVal);
+    return new ExpandedTargetsResult(output.build(), buildResult);
+  }
+
+  private static ImmutableSet<String> handledRuleTypes(ProjectViewSet projectViewSet) {
+    return ImmutableSet.copyOf(
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet)
+            .getAvailableTargetKinds()
+            .stream()
+            .map(Kind::toString)
+            .collect(Collectors.toList()));
+  }
+
+  private static String queryString(List<TargetExpression> targets) {
+    StringBuilder builder = new StringBuilder();
+    for (TargetExpression target : targets) {
+      boolean excluded = target.isExcluded();
+      if (builder.length() == 0) {
+        if (excluded) {
+          continue; // an excluded target at the start of the list has no effect
+        }
+        builder.append(target);
+      } else {
+        if (excluded) {
+          builder.append(" - ");
+          // trim leading '-'
+          String excludedTarget = target.toString();
+          builder.append(excludedTarget, 1, excludedTarget.length());
+        } else {
+          builder.append(" + ");
+          builder.append(target);
+        }
+      }
+    }
+    return builder.toString();
+  }
+
+  private static String getBinaryPath(Project project) {
+    BuildSystemProvider buildSystemProvider = Blaze.getBuildSystemProvider(project);
+    return buildSystemProvider.getSyncBinaryPath();
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/sharding/WildcardTargetPattern.java b/base/src/com/google/idea/blaze/base/sync/sharding/WildcardTargetPattern.java
new file mode 100644
index 0000000..663825c
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/sharding/WildcardTargetPattern.java
@@ -0,0 +1,134 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.sharding;
+
+import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.text.StringUtil;
+import javax.annotation.Nullable;
+
+/** A blaze wildcard target pattern. */
+public class WildcardTargetPattern {
+
+  private static final String ALL_PACKAGES_RECURSIVE_SUFFIX = "/...";
+  private static final ImmutableList<String> ALL_TARGETS_IN_SUFFIXES =
+      ImmutableList.of("*", "all-targets");
+  private static final String ALL_RULES_IN_SUFFIX = "all";
+
+  /** Returns null if the target is not a valid wildcard target pattern. */
+  @Nullable
+  public static WildcardTargetPattern fromExpression(TargetExpression target) {
+    String pattern = target.toString();
+    int colonIndex = pattern.lastIndexOf(':');
+    String packagePart = colonIndex < 0 ? pattern : pattern.substring(0, colonIndex);
+    String targetPart = colonIndex < 0 ? "" : pattern.substring(colonIndex + 1);
+
+    if (packagePart.startsWith("-")) {
+      packagePart = packagePart.substring(1);
+    }
+    packagePart = StringUtil.trimStart(packagePart, "//");
+
+    if (packagePart.endsWith(ALL_PACKAGES_RECURSIVE_SUFFIX)) {
+      WorkspacePath basePackageDir =
+          WorkspacePath.createIfValid(
+              StringUtil.trimEnd(packagePart, ALL_PACKAGES_RECURSIVE_SUFFIX));
+      if (basePackageDir == null) {
+        return null;
+      }
+      if (targetPart.isEmpty() || targetPart.equals(ALL_RULES_IN_SUFFIX)) {
+        return new WildcardTargetPattern(target, basePackageDir, true, true);
+      }
+      if (ALL_TARGETS_IN_SUFFIXES.contains(targetPart)) {
+        return new WildcardTargetPattern(target, basePackageDir, true, false);
+      }
+      return null; // ignore invalid patterns -- blaze will give us a better error later.
+    }
+
+    WorkspacePath packageDir = WorkspacePath.createIfValid(packagePart);
+    if (packageDir == null) {
+      return null;
+    }
+    if (targetPart.equals(ALL_RULES_IN_SUFFIX)) {
+      return new WildcardTargetPattern(target, packageDir, false, true);
+    }
+    if (ALL_TARGETS_IN_SUFFIXES.contains(targetPart)) {
+      return new WildcardTargetPattern(target, packageDir, false, false);
+    }
+    // not a wildcard target pattern
+    return null;
+  }
+
+  public final TargetExpression originalPattern;
+  private final WorkspacePath packageDir;
+  private final boolean recursive;
+  private final boolean rulesOnly;
+
+  private WildcardTargetPattern(
+      TargetExpression originalPattern,
+      WorkspacePath packageDir,
+      boolean recursive,
+      boolean rulesOnly) {
+    this.originalPattern = originalPattern;
+    this.packageDir = packageDir;
+    this.recursive = recursive;
+    this.rulesOnly = rulesOnly;
+  }
+
+  /** The base blaze package this target pattern refers to */
+  public WorkspacePath getBasePackage() {
+    return packageDir;
+  }
+
+  /** Whether the target pattern includes all packages below the base package. */
+  public boolean isRecursive() {
+    return recursive;
+  }
+
+  /** Whether the target pattern includes all targets, or only rules */
+  public boolean rulesOnly() {
+    return rulesOnly;
+  }
+
+  public boolean coversPackage(WorkspacePath packagePath) {
+    if (!recursive) {
+      return packagePath.equals(packageDir);
+    }
+    return FileUtil.isAncestor(packageDir.relativePath(), packagePath.relativePath(), false);
+  }
+
+  /** Is this an excluded target pattern (i.e. starts with '-')? */
+  public boolean isExcluded() {
+    return originalPattern.isExcluded();
+  }
+
+  @Override
+  public String toString() {
+    return originalPattern.toString();
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    return obj instanceof WildcardTargetPattern
+        && originalPattern.equals(((WildcardTargetPattern) obj).originalPattern);
+  }
+
+  @Override
+  public int hashCode() {
+    return originalPattern.hashCode();
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/workspace/ArtifactLocationDecoderImpl.java b/base/src/com/google/idea/blaze/base/sync/workspace/ArtifactLocationDecoderImpl.java
index 92ff6b8..1e3216a 100644
--- a/base/src/com/google/idea/blaze/base/sync/workspace/ArtifactLocationDecoderImpl.java
+++ b/base/src/com/google/idea/blaze/base/sync/workspace/ArtifactLocationDecoderImpl.java
@@ -15,30 +15,35 @@
  */
 package com.google.idea.blaze.base.sync.workspace;
 
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
+import com.intellij.openapi.util.io.FileUtil;
 import java.io.File;
+import java.nio.file.Paths;
 
 /** Decodes intellij_ide_info.proto ArtifactLocation file paths */
 public class ArtifactLocationDecoderImpl implements ArtifactLocationDecoder {
   private static final long serialVersionUID = 1L;
 
-  private final BlazeRoots blazeRoots;
+  private final BlazeInfo blazeInfo;
   private final WorkspacePathResolver pathResolver;
 
-  public ArtifactLocationDecoderImpl(BlazeRoots blazeRoots, WorkspacePathResolver pathResolver) {
-    this.blazeRoots = blazeRoots;
+  public ArtifactLocationDecoderImpl(BlazeInfo blazeInfo, WorkspacePathResolver pathResolver) {
+    this.blazeInfo = blazeInfo;
     this.pathResolver = pathResolver;
   }
 
   @Override
   public File decode(ArtifactLocation artifactLocation) {
-    if (artifactLocation.isSource) {
-      if (artifactLocation.isExternal) {
-        return new File(blazeRoots.externalSourceRoot, artifactLocation.relativePath);
-      }
-      File root = pathResolver.findPackageRoot(artifactLocation.relativePath);
-      return new File(root, artifactLocation.relativePath);
+    if (artifactLocation.isSource && !artifactLocation.isExternal) {
+      return pathResolver.resolveToFile(artifactLocation.relativePath);
     }
-    return new File(blazeRoots.executionRoot, artifactLocation.getExecutionRootRelativePath());
+    String path =
+        Paths.get(
+                blazeInfo.getExecutionRoot().getPath(),
+                artifactLocation.getExecutionRootRelativePath())
+            .toString();
+    // doesn't require file-system operations -- no attempt to resolve symlinks.
+    return new File(FileUtil.toCanonicalPath(path));
   }
 }
diff --git a/base/src/com/google/idea/blaze/base/sync/workspace/BlazeRoots.java b/base/src/com/google/idea/blaze/base/sync/workspace/BlazeRoots.java
deleted file mode 100644
index 26a00a2..0000000
--- a/base/src/com/google/idea/blaze/base/sync/workspace/BlazeRoots.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.base.sync.workspace;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableMap;
-import com.google.idea.blaze.base.command.info.BlazeInfo;
-import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
-import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
-import com.intellij.openapi.diagnostic.Logger;
-import java.io.File;
-import java.io.Serializable;
-
-/** The data output by BlazeInfo. */
-public class BlazeRoots implements Serializable {
-  public static final long serialVersionUID = 3L;
-  private static final Logger logger = Logger.getInstance(BlazeRoots.class);
-
-  public static BlazeRoots build(BuildSystem buildSystem, ImmutableMap<String, String> blazeInfo) {
-    return build(
-        getOrThrow(buildSystem, blazeInfo, BlazeInfo.EXECUTION_ROOT_KEY),
-        getOrThrow(buildSystem, blazeInfo, BlazeInfo.blazeBinKey(buildSystem)),
-        getOrThrow(buildSystem, blazeInfo, BlazeInfo.blazeGenfilesKey(buildSystem)),
-        getOrThrow(buildSystem, blazeInfo, BlazeInfo.OUTPUT_BASE_KEY));
-  }
-
-  private static BlazeRoots build(
-      String execRootString,
-      String blazeBinRoot,
-      String blazeGenfilesRoot,
-      String externalSourceRoot) {
-    File executionRoot = new File(execRootString.trim());
-    ExecutionRootPath blazeBinExecutionRootPath =
-        ExecutionRootPath.createAncestorRelativePath(executionRoot, new File(blazeBinRoot));
-    ExecutionRootPath blazeGenfilesExecutionRootPath =
-        ExecutionRootPath.createAncestorRelativePath(executionRoot, new File(blazeGenfilesRoot));
-    File externalSourceRootFile = new File(externalSourceRoot.trim());
-    logger.assertTrue(blazeBinExecutionRootPath != null);
-    logger.assertTrue(blazeGenfilesExecutionRootPath != null);
-    return new BlazeRoots(
-        executionRoot,
-        blazeBinExecutionRootPath,
-        blazeGenfilesExecutionRootPath,
-        externalSourceRootFile);
-  }
-
-  private static String getOrThrow(
-      BuildSystem buildSystem, ImmutableMap<String, String> map, String key) {
-    String value = map.get(key);
-    if (value == null) {
-      throw new RuntimeException(
-          String.format("Could not locate %s in %s info", key, buildSystem.getLowerCaseName()));
-    }
-    return value;
-  }
-
-  public final File executionRoot;
-  public final ExecutionRootPath blazeBinExecutionRootPath;
-  public final ExecutionRootPath blazeGenfilesExecutionRootPath;
-  public final File externalSourceRoot;
-
-  @VisibleForTesting
-  public BlazeRoots(
-      File executionRoot,
-      ExecutionRootPath blazeBinExecutionRootPath,
-      ExecutionRootPath blazeGenfilesExecutionRootPath,
-      File externalSourceRoot) {
-    this.executionRoot = executionRoot;
-    this.blazeBinExecutionRootPath = blazeBinExecutionRootPath;
-    this.blazeGenfilesExecutionRootPath = blazeGenfilesExecutionRootPath;
-    this.externalSourceRoot = externalSourceRoot;
-  }
-
-  public File getGenfilesDirectory() {
-    return blazeGenfilesExecutionRootPath.getFileRootedAt(executionRoot);
-  }
-
-  public File getBlazeBinDirectory() {
-    return blazeBinExecutionRootPath.getFileRootedAt(executionRoot);
-  }
-
-  public boolean isOutputArtifact(ExecutionRootPath path) {
-    return ExecutionRootPath.isAncestor(blazeGenfilesExecutionRootPath, path, false)
-        || ExecutionRootPath.isAncestor(blazeBinExecutionRootPath, path, false);
-  }
-}
diff --git a/base/src/com/google/idea/blaze/base/sync/workspace/WorkspaceHelper.java b/base/src/com/google/idea/blaze/base/sync/workspace/WorkspaceHelper.java
new file mode 100644
index 0000000..81ade09
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/sync/workspace/WorkspaceHelper.java
@@ -0,0 +1,183 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.workspace;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableMap;
+import com.google.idea.blaze.base.bazel.BuildSystemProvider;
+import com.google.idea.blaze.base.io.FileAttributeProvider;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.model.primitives.Label;
+import com.google.idea.blaze.base.model.primitives.TargetName;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import com.google.idea.blaze.base.sync.SyncCache;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.io.FileUtil;
+import java.io.File;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
+
+/** External-workspace-aware resolution of workspace paths. */
+public class WorkspaceHelper {
+
+  private static class Workspace {
+    private final WorkspaceRoot root;
+    @Nullable private final String externalWorkspaceName;
+
+    private Workspace(WorkspaceRoot root, @Nullable String externalWorkspaceName) {
+      this.root = root;
+      this.externalWorkspaceName = externalWorkspaceName;
+    }
+  }
+
+  @Nullable
+  public static WorkspaceRoot resolveExternalWorkspace(Project project, String workspaceName) {
+    Map<String, WorkspaceRoot> externalWorkspaces = getExternalWorkspaceRoots(project);
+    return externalWorkspaces != null ? externalWorkspaces.get(workspaceName) : null;
+  }
+
+  /** Resolves the parent blaze package corresponding to this label. */
+  @Nullable
+  public static File resolveBlazePackage(Project project, Label label) {
+    if (!label.isExternal()) {
+      WorkspacePathResolver pathResolver =
+          WorkspacePathResolverProvider.getInstance(project).getPathResolver();
+      return pathResolver != null ? pathResolver.resolveToFile(label.blazePackage()) : null;
+    }
+    Map<String, WorkspaceRoot> externalWorkspaces = getExternalWorkspaceRoots(project);
+    if (externalWorkspaces == null) {
+      return null;
+    }
+    WorkspaceRoot root = externalWorkspaces.get(label.externalWorkspaceName());
+    return root != null ? root.fileForPath(label.blazePackage()) : null;
+  }
+
+  @Nullable
+  public static WorkspacePath resolveWorkspacePath(Project project, File absoluteFile) {
+    Workspace workspace = resolveWorkspace(project, absoluteFile);
+    return workspace != null ? workspace.root.workspacePathForSafe(absoluteFile) : null;
+  }
+
+  /** Converts a file to the corresponding BUILD label for this project, if valid. */
+  @Nullable
+  public static Label getBuildLabel(Project project, File absoluteFile) {
+    Workspace workspace = resolveWorkspace(project, absoluteFile);
+    if (workspace == null) {
+      return null;
+    }
+    WorkspacePath workspacePath = workspace.root.workspacePathForSafe(absoluteFile);
+    if (workspacePath == null) {
+      return null;
+    }
+    return deriveLabel(project, workspace, workspacePath);
+  }
+
+  @Nullable
+  private static Workspace resolveWorkspace(Project project, File absoluteFile) {
+    WorkspacePathResolver pathResolver =
+        WorkspacePathResolverProvider.getInstance(project).getPathResolver();
+    if (pathResolver == null) {
+      return null;
+    }
+
+    // try project workspace first
+    WorkspaceRoot root = pathResolver.findWorkspaceRoot(absoluteFile);
+    if (root != null) {
+      return new Workspace(root, null);
+    }
+
+    Map<String, WorkspaceRoot> externalWorkspaces = getExternalWorkspaceRoots(project);
+    if (externalWorkspaces == null) {
+      return null;
+    }
+    for (Entry<String, WorkspaceRoot> entry : externalWorkspaces.entrySet()) {
+      root = entry.getValue();
+      WorkspacePath workspacePath = root.workspacePathForSafe(absoluteFile);
+      if (workspacePath != null) {
+        return new Workspace(root, entry.getKey());
+      }
+    }
+    return null;
+  }
+
+  private static Label deriveLabel(
+      Project project, Workspace workspace, WorkspacePath workspacePath) {
+    BuildSystemProvider provider = Blaze.getBuildSystemProvider(project);
+    File file = workspace.root.fileForPath(workspacePath);
+    if (provider.isBuildFile(file.getName())) {
+      return Label.create(
+          workspace.externalWorkspaceName,
+          workspace.root.workspacePathFor(file.getParentFile()),
+          TargetName.create("__pkg__"));
+    }
+    WorkspacePath packagePath = getPackagePath(provider, workspace.root, workspacePath);
+    if (packagePath == null) {
+      return null;
+    }
+    TargetName targetName =
+        TargetName.createIfValid(
+            FileUtil.getRelativePath(workspace.root.fileForPath(packagePath), file));
+    return targetName != null
+        ? Label.create(workspace.externalWorkspaceName, packagePath, targetName)
+        : null;
+  }
+
+  private static WorkspacePath getPackagePath(
+      BuildSystemProvider provider, WorkspaceRoot root, WorkspacePath workspacePath) {
+    File file = root.fileForPath(workspacePath).getParentFile();
+    while (file != null && FileUtil.isAncestor(root.directory(), file, false)) {
+      if (provider.findBuildFileInDirectory(file) != null) {
+        return root.workspacePathFor(file);
+      }
+      file = file.getParentFile();
+    }
+    return null;
+  }
+
+  @Nullable
+  private static synchronized Map<String, WorkspaceRoot> getExternalWorkspaceRoots(
+      Project project) {
+    if (Blaze.getBuildSystem(project) == BuildSystem.Blaze) {
+      return ImmutableMap.of();
+    }
+    return SyncCache.getInstance(project)
+        .get(WorkspaceHelper.class, WorkspaceHelper::enumerateExternalWorkspaces);
+  }
+
+  @SuppressWarnings("unused")
+  private static Map<String, WorkspaceRoot> enumerateExternalWorkspaces(
+      Project project, BlazeProjectData blazeProjectData) {
+    FileAttributeProvider provider = FileAttributeProvider.getInstance();
+    File[] children = provider.listFiles(getExternalSourceRoot(blazeProjectData));
+    if (children == null) {
+      return ImmutableMap.of();
+    }
+    return Arrays.stream(children)
+        .filter(provider::isDirectory)
+        .collect(Collectors.toMap(File::getName, WorkspaceRoot::new));
+  }
+
+  @VisibleForTesting
+  public static File getExternalSourceRoot(BlazeProjectData projectData) {
+    return new File(projectData.blazeInfo.getOutputBase(), "external");
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/sync/workspace/WorkspacePathResolver.java b/base/src/com/google/idea/blaze/base/sync/workspace/WorkspacePathResolver.java
index 128ca91..7392630 100644
--- a/base/src/com/google/idea/blaze/base/sync/workspace/WorkspacePathResolver.java
+++ b/base/src/com/google/idea/blaze/base/sync/workspace/WorkspacePathResolver.java
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import java.io.File;
 import java.io.Serializable;
 import javax.annotation.Nullable;
@@ -47,6 +48,13 @@
   File findPackageRoot(String relativePath);
 
   /**
+   * Finds the workspace root directory that an absolute file lies under. Returns null if the file
+   * is not in a known workspace.
+   */
+  @Nullable
+  WorkspaceRoot findWorkspaceRoot(File absoluteFile);
+
+  /**
    * Given a resolved, absolute file, returns the corresponding {@link WorkspacePath}. Returns null
    * if the file is not in the workspace.
    */
diff --git a/base/src/com/google/idea/blaze/base/sync/workspace/WorkspacePathResolverImpl.java b/base/src/com/google/idea/blaze/base/sync/workspace/WorkspacePathResolverImpl.java
index 48b4ddc..bccb969 100644
--- a/base/src/com/google/idea/blaze/base/sync/workspace/WorkspacePathResolverImpl.java
+++ b/base/src/com/google/idea/blaze/base/sync/workspace/WorkspacePathResolverImpl.java
@@ -46,4 +46,10 @@
   public WorkspacePath getWorkspacePath(File absoluteFile) {
     return workspaceRoot.workspacePathForSafe(absoluteFile);
   }
+
+  @Nullable
+  @Override
+  public WorkspaceRoot findWorkspaceRoot(File absoluteFile) {
+    return workspaceRoot.isInWorkspace(absoluteFile) ? workspaceRoot : null;
+  }
 }
diff --git a/base/src/com/google/idea/blaze/base/targetmaps/SourceToTargetMapImpl.java b/base/src/com/google/idea/blaze/base/targetmaps/SourceToTargetMapImpl.java
index 4d4a28f..19e8383 100644
--- a/base/src/com/google/idea/blaze/base/targetmaps/SourceToTargetMapImpl.java
+++ b/base/src/com/google/idea/blaze/base/targetmaps/SourceToTargetMapImpl.java
@@ -74,7 +74,7 @@
         .get(SourceToTargetMapImpl.class, SourceToTargetMapImpl::computeSourceToTargetMap);
   }
 
-  @Nullable
+  @SuppressWarnings("unused")
   private static ImmutableMultimap<File, TargetKey> computeSourceToTargetMap(
       Project project, BlazeProjectData blazeProjectData) {
     ArtifactLocationDecoder artifactLocationDecoder = blazeProjectData.artifactLocationDecoder;
diff --git a/base/src/com/google/idea/blaze/base/targetmaps/TransitiveDependencyMap.java b/base/src/com/google/idea/blaze/base/targetmaps/TransitiveDependencyMap.java
index f973c8d..b2a31ba 100644
--- a/base/src/com/google/idea/blaze/base/targetmaps/TransitiveDependencyMap.java
+++ b/base/src/com/google/idea/blaze/base/targetmaps/TransitiveDependencyMap.java
@@ -16,6 +16,7 @@
 package com.google.idea.blaze.base.targetmaps;
 
 import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Queues;
 import com.google.common.collect.Sets;
@@ -26,6 +27,7 @@
 import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
 import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.project.Project;
+import java.util.Collection;
 import java.util.List;
 import java.util.Queue;
 import java.util.Set;
@@ -53,11 +55,16 @@
     return getTransitiveDependencies(targetKey, blazeProjectData.targetMap);
   }
 
-  private static ImmutableCollection<TargetKey> getTransitiveDependencies(
+  public static ImmutableCollection<TargetKey> getTransitiveDependencies(
       TargetKey targetKey, TargetMap targetMap) {
+    return getTransitiveDependencies(ImmutableList.of(targetKey), targetMap);
+  }
+
+  public static ImmutableCollection<TargetKey> getTransitiveDependencies(
+      Collection<TargetKey> targetKeys, TargetMap targetMap) {
     Queue<TargetKey> targetsToVisit = Queues.newArrayDeque();
     Set<TargetKey> transitiveDependencies = Sets.newHashSet();
-    targetsToVisit.add(targetKey);
+    targetsToVisit.addAll(targetKeys);
     while (!targetsToVisit.isEmpty()) {
       TargetIdeInfo currentTarget = targetMap.get(targetsToVisit.remove());
       if (currentTarget == null) {
diff --git a/base/src/com/google/idea/blaze/base/ui/WorkspaceFileTextField.java b/base/src/com/google/idea/blaze/base/ui/WorkspaceFileTextField.java
new file mode 100644
index 0000000..87a45a0
--- /dev/null
+++ b/base/src/com/google/idea/blaze/base/ui/WorkspaceFileTextField.java
@@ -0,0 +1,129 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.ui;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.fileChooser.FileChooserDescriptor;
+import com.intellij.openapi.fileChooser.FileTextField;
+import com.intellij.openapi.fileChooser.ex.FileTextFieldImpl;
+import com.intellij.openapi.fileChooser.ex.LocalFsFinder.FileChooserFilter;
+import com.intellij.openapi.fileChooser.ex.LocalFsFinder.IoFile;
+import com.intellij.openapi.fileChooser.ex.LocalFsFinder.VfsFile;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.ui.components.JBTextField;
+import java.io.File;
+import javax.annotation.Nullable;
+import javax.swing.JTextField;
+
+/** A text field that auto-completes paths in the workspace root. */
+// This outer class basically a copy of FileTextFieldImpl.Vfs but we can't use that directly because
+// we need to specify our own custom Finder.
+public final class WorkspaceFileTextField extends FileTextFieldImpl {
+
+  private WorkspaceFileTextField(
+      WorkspacePathResolver pathResolver,
+      JTextField textField,
+      LookupFilter filter,
+      Disposable parent) {
+    super(textField, new WorkspaceFinder(pathResolver), filter, ImmutableMap.of(), parent);
+  }
+
+  public static FileTextField create(
+      WorkspacePathResolver pathResolver,
+      FileChooserDescriptor descriptor,
+      int columns,
+      Disposable parent) {
+    JTextField textField = new WorkspacePathTextField(pathResolver, columns);
+    return new WorkspaceFileTextField(
+        pathResolver, textField, new FileChooserFilter(descriptor, /* showHidden */ true), parent);
+  }
+
+  @Nullable
+  @Override
+  public VirtualFile getSelectedFile() {
+    LookupFile lookupFile = getFile();
+    return lookupFile != null ? ((VfsFile) lookupFile).getFile() : null;
+  }
+
+  private static class WorkspaceFinder implements Finder {
+
+    private final WorkspacePathResolver pathResolver;
+
+    private WorkspaceFinder(WorkspacePathResolver pathResolver) {
+      this.pathResolver = pathResolver;
+    }
+
+    @Nullable
+    @Override
+    public LookupFile find(String path) {
+      File file = new File(normalize(path));
+      VirtualFile vFile = LocalFileSystem.getInstance().findFileByIoFile(file);
+      if (vFile != null) {
+        return new VfsFile(/* unused LocalFsFinder */ null, vFile);
+      } else if (file.isAbsolute()) {
+        return new IoFile(new File(path));
+      }
+      return null;
+    }
+
+    @Override
+    public String normalize(String path) {
+      File file = new File(path);
+      if (!file.isAbsolute()) {
+        file = pathResolver.resolveToFile(path);
+      }
+
+      return file.getAbsolutePath();
+    }
+
+    @Override
+    public String getSeparator() {
+      return File.separator;
+    }
+  }
+
+  // FileTextFieldImpl calls setText with the absolute path after every filename autocomplete. But
+  // we don't want to swap in the absolute path, we'd rather just show the path relative to the
+  // workspace root. So we override setText().
+  private static class WorkspacePathTextField extends JBTextField {
+
+    final WorkspacePathResolver pathResolver;
+
+    WorkspacePathTextField(WorkspacePathResolver pathResolver, int columns) {
+      super(columns);
+      this.pathResolver = pathResolver;
+    }
+
+    @Override
+    public void setText(String path) {
+      WorkspacePath workspacePath = pathResolver.getWorkspacePath(new File(path));
+      if (workspacePath == null) {
+        super.setText(path);
+        return;
+      }
+
+      String relativePath = workspacePath.relativePath();
+      if (path.endsWith(File.separator) && !relativePath.endsWith(File.separator)) {
+        relativePath += File.separator;
+      }
+      super.setText(relativePath);
+    }
+  }
+}
diff --git a/base/src/com/google/idea/blaze/base/util/PackagePrefixCalculator.java b/base/src/com/google/idea/blaze/base/util/PackagePrefixCalculator.java
index e923236..f4bbfda 100644
--- a/base/src/com/google/idea/blaze/base/util/PackagePrefixCalculator.java
+++ b/base/src/com/google/idea/blaze/base/util/PackagePrefixCalculator.java
@@ -24,9 +24,16 @@
   public static String packagePrefixOf(@NotNull WorkspacePath workspacePath) {
     int skipIndex = 0;
 
+    // For Bazel-style projects.
     skipIndex = skipIndex == 0 ? skip(workspacePath, "java/") : skipIndex;
     skipIndex = skipIndex == 0 ? skip(workspacePath, "javatests/") : skipIndex;
 
+    // For Maven-style projects.
+    skipIndex = skipIndex == 0 ? skip(workspacePath, "src/main/java/") : skipIndex;
+    skipIndex = skipIndex == 0 ? skip(workspacePath, "src/test/java/") : skipIndex;
+    skipIndex = skipIndex == 0 ? skip(workspacePath, "src/main/scala/") : skipIndex;
+    skipIndex = skipIndex == 0 ? skip(workspacePath, "src/test/scala/") : skipIndex;
+
     return workspacePath.relativePath().substring(skipIndex).replace('/', '.');
   }
 
diff --git a/base/src/com/google/idea/blaze/base/wizard2/BlazeNewProjectBuilder.java b/base/src/com/google/idea/blaze/base/wizard2/BlazeNewProjectBuilder.java
index 16648e6..578af51 100644
--- a/base/src/com/google/idea/blaze/base/wizard2/BlazeNewProjectBuilder.java
+++ b/base/src/com/google/idea/blaze/base/wizard2/BlazeNewProjectBuilder.java
@@ -36,7 +36,6 @@
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
-import java.util.UUID;
 
 /** Contains the state to build a new project throughout the new project wizard process. */
 public final class BlazeNewProjectBuilder {
@@ -218,7 +217,6 @@
             workspaceRoot.directory().getPath(),
             projectName,
             projectDataDirectory,
-            createLocationHash(projectName),
             projectViewFile.getPath(),
             buildSystem);
 
@@ -226,10 +224,4 @@
     PluginDependencyHelper.addDependencyOnSyncPlugin(project);
     // Initial sync of the project happens in BlazeSyncStartupActivity
   }
-
-  private static String createLocationHash(String projectName) {
-    String uuid = UUID.randomUUID().toString();
-    uuid = uuid.substring(0, Math.min(uuid.length(), 8));
-    return projectName.replaceAll("[^a-zA-Z0-9]", "") + "-" + uuid;
-  }
 }
diff --git a/base/src/com/google/idea/blaze/base/wizard2/GenerateFromBuildFileSelectProjectViewOption.java b/base/src/com/google/idea/blaze/base/wizard2/GenerateFromBuildFileSelectProjectViewOption.java
index 6e4e74e..577f290 100644
--- a/base/src/com/google/idea/blaze/base/wizard2/GenerateFromBuildFileSelectProjectViewOption.java
+++ b/base/src/com/google/idea/blaze/base/wizard2/GenerateFromBuildFileSelectProjectViewOption.java
@@ -15,6 +15,8 @@
  */
 package com.google.idea.blaze.base.wizard2;
 
+import static com.google.common.base.Preconditions.checkState;
+
 import com.google.common.base.Strings;
 import com.google.idea.blaze.base.bazel.BuildSystemProvider;
 import com.google.idea.blaze.base.model.primitives.TargetExpression;
@@ -27,6 +29,7 @@
 import com.google.idea.blaze.base.projectview.section.sections.TargetSection;
 import com.google.idea.blaze.base.projectview.section.sections.TextBlock;
 import com.google.idea.blaze.base.projectview.section.sections.TextBlockSection;
+import com.google.idea.blaze.base.sync.projectview.RelatedWorkspacePathFinder;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import com.google.idea.blaze.base.ui.BlazeValidationResult;
 import com.google.idea.blaze.base.ui.UiUtil;
@@ -41,6 +44,8 @@
 import com.intellij.ui.TextFieldWithStoredHistory;
 import java.awt.Dimension;
 import java.io.File;
+import java.util.ArrayList;
+import java.util.List;
 import javax.annotation.Nullable;
 import javax.swing.JButton;
 import javax.swing.JComponent;
@@ -91,15 +96,26 @@
 
   @Override
   public BlazeValidationResult validate() {
-    if (getBuildFilePath().isEmpty()) {
+    String buildFilePath = getBuildFilePath();
+    if (buildFilePath.isEmpty()) {
       return BlazeValidationResult.failure("BUILD file field cannot be empty.");
     }
+    if (!WorkspacePath.validate(buildFilePath)) {
+      return BlazeValidationResult.failure(
+          "Invalid BUILD file path: specify a path relative to the workspace root.");
+    }
     WorkspacePathResolver workspacePathResolver =
         builder.getWorkspaceOption().getWorkspacePathResolver();
-    File file = workspacePathResolver.resolveToFile(new WorkspacePath(getBuildFilePath()));
+    File file = workspacePathResolver.resolveToFile(new WorkspacePath(buildFilePath));
     if (!file.exists()) {
       return BlazeValidationResult.failure("BUILD file does not exist.");
     }
+    BuildSystemProvider buildSystemProvider =
+        BuildSystemProvider.getBuildSystemProvider(builder.getBuildSystem());
+    checkState(buildSystemProvider != null);
+    if (!buildSystemProvider.isBuildFile(file.getName())) {
+      return BlazeValidationResult.failure("File must be a BUILD file.");
+    }
 
     return BlazeValidationResult.success();
   }
@@ -134,54 +150,31 @@
   private static String guessProjectViewFromLocation(
       WorkspacePathResolver workspacePathResolver, WorkspacePath workspacePath) {
 
-    WorkspacePath mainModuleWorkspaceRelativePath = workspacePath;
-    WorkspacePath testModuleWorkspaceRelativePath =
-        guessTestRelativePath(workspacePathResolver, mainModuleWorkspaceRelativePath);
+    List<WorkspacePath> workspacePaths = new ArrayList<>();
+    workspacePaths.add(workspacePath);
+    workspacePaths.addAll(
+        RelatedWorkspacePathFinder.getInstance()
+            .findRelatedWorkspaceDirectories(workspacePathResolver, workspacePath));
 
     ListSection.Builder<DirectoryEntry> directorySectionBuilder =
         ListSection.builder(DirectorySection.KEY);
-    directorySectionBuilder.add(DirectoryEntry.include(mainModuleWorkspaceRelativePath));
-    if (testModuleWorkspaceRelativePath != null) {
-      directorySectionBuilder.add(DirectoryEntry.include(testModuleWorkspaceRelativePath));
-    }
-
     ListSection.Builder<TargetExpression> targetSectionBuilder =
         ListSection.builder(TargetSection.KEY);
-    targetSectionBuilder.add(
-        TargetExpression.allFromPackageRecursive(mainModuleWorkspaceRelativePath));
-    if (testModuleWorkspaceRelativePath != null) {
-      targetSectionBuilder.add(
-          TargetExpression.allFromPackageRecursive(testModuleWorkspaceRelativePath));
-    }
+    workspacePaths.forEach(
+        path -> {
+          directorySectionBuilder.add(DirectoryEntry.include(path));
+          targetSectionBuilder.add(TargetExpression.allFromPackageRecursive(path));
+        });
 
     return ProjectViewParser.projectViewToString(
         ProjectView.builder()
             .add(directorySectionBuilder)
             .add(TextBlockSection.of(TextBlock.newLine()))
             .add(targetSectionBuilder)
+            .add(TextBlockSection.of(TextBlock.newLine()))
             .build());
   }
 
-  @Nullable
-  private static WorkspacePath guessTestRelativePath(
-      WorkspacePathResolver workspacePathResolver, WorkspacePath projectWorkspacePath) {
-    String projectRelativePath = projectWorkspacePath.relativePath();
-    String testBuildFileRelativePath = null;
-    if (projectRelativePath.startsWith("java/")) {
-      testBuildFileRelativePath = projectRelativePath.replaceFirst("java/", "javatests/");
-    } else if (projectRelativePath.contains("/java/")) {
-      testBuildFileRelativePath = projectRelativePath.replaceFirst("/java/", "/javatests/");
-    }
-    if (testBuildFileRelativePath != null) {
-      File testBuildFile =
-          workspacePathResolver.resolveToFile(new WorkspacePath(testBuildFileRelativePath));
-      if (testBuildFile.exists()) {
-        return new WorkspacePath(testBuildFileRelativePath);
-      }
-    }
-    return null;
-  }
-
   private String getBuildFilePath() {
     return buildFilePathField.getText().trim();
   }
diff --git a/base/src/com/google/idea/blaze/base/wizard2/ui/BlazeEditProjectViewControl.java b/base/src/com/google/idea/blaze/base/wizard2/ui/BlazeEditProjectViewControl.java
index 6c23cf1..5b652d8 100644
--- a/base/src/com/google/idea/blaze/base/wizard2/ui/BlazeEditProjectViewControl.java
+++ b/base/src/com/google/idea/blaze/base/wizard2/ui/BlazeEditProjectViewControl.java
@@ -15,6 +15,8 @@
  */
 package com.google.idea.blaze.base.wizard2.ui;
 
+import static java.util.stream.Collectors.toList;
+
 import com.google.common.collect.Lists;
 import com.google.common.hash.HashCode;
 import com.google.common.hash.Hashing;
@@ -26,15 +28,21 @@
 import com.google.idea.blaze.base.projectview.ProjectViewStorageManager;
 import com.google.idea.blaze.base.projectview.ProjectViewVerifier;
 import com.google.idea.blaze.base.projectview.parser.ProjectViewParser;
+import com.google.idea.blaze.base.projectview.section.ProjectViewDefaultValueProvider;
 import com.google.idea.blaze.base.projectview.section.ScalarSection;
+import com.google.idea.blaze.base.projectview.section.SectionKey;
 import com.google.idea.blaze.base.projectview.section.SectionParser;
+import com.google.idea.blaze.base.projectview.section.sections.DirectoryEntry;
+import com.google.idea.blaze.base.projectview.section.sections.DirectorySection;
 import com.google.idea.blaze.base.projectview.section.sections.ImportSection;
 import com.google.idea.blaze.base.projectview.section.sections.Sections;
+import com.google.idea.blaze.base.projectview.section.sections.TargetSection;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.scope.OutputSink.Propagation;
 import com.google.idea.blaze.base.scope.Scope;
 import com.google.idea.blaze.base.scope.output.IssueOutput;
 import com.google.idea.blaze.base.scope.output.IssueOutput.Category;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
 import com.google.idea.blaze.base.settings.ui.JPanelProvidingProject;
 import com.google.idea.blaze.base.settings.ui.ProjectViewUi;
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
@@ -67,8 +75,8 @@
 import java.awt.GridBagLayout;
 import java.io.File;
 import java.io.IOException;
+import java.util.Comparator;
 import java.util.List;
-import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 import javax.swing.ButtonGroup;
 import javax.swing.JLabel;
@@ -164,6 +172,13 @@
     workspaceDefaultNameOption = new JRadioButton("Workspace");
     branchDefaultNameOption = new JRadioButton("Branch");
     importDirectoryDefaultNameOption = new JRadioButton("Import Directory");
+
+    workspaceDefaultNameOption.setToolTipText("Infer default name from the workspace name");
+    branchDefaultNameOption.setToolTipText(
+        "Infer default name from the current branch of your workspace");
+    importDirectoryDefaultNameOption.setToolTipText(
+        "Infer default name from the directory used to import your project view");
+
     workspaceDefaultNameOption.addItemListener(e -> inferDefaultNameModeSelectionChanged());
     branchDefaultNameOption.addItemListener(e -> inferDefaultNameModeSelectionChanged());
     importDirectoryDefaultNameOption.addItemListener(e -> inferDefaultNameModeSelectionChanged());
@@ -205,6 +220,7 @@
       this.paramsHash = hashCode;
       this.isInitialising = true;
       init(
+          workspaceOption.getBuildSystemForWorkspace(),
           workspaceRoot,
           workspacePathResolver,
           workspacePath,
@@ -215,7 +231,9 @@
   }
 
   private static String modifyInitialProjectView(
-      String initialProjectViewText, WorkspacePathResolver workspacePathResolver) {
+      BuildSystem buildSystem,
+      String initialProjectViewText,
+      WorkspacePathResolver workspacePathResolver) {
     BlazeContext context = new BlazeContext();
     ProjectViewParser projectViewParser = new ProjectViewParser(context, workspacePathResolver);
     projectViewParser.parseProjectView(initialProjectViewText);
@@ -225,13 +243,23 @@
       return initialProjectViewText;
     }
     ProjectView projectView = projectViewFile.projectView;
-    for (SectionParser sectionParser : Sections.getParsers()) {
-      projectView = sectionParser.addProjectViewDefaultValue(projectView);
+
+    // Sort default value providers to match the section order
+    List<SectionKey> sectionKeys =
+        Sections.getParsers().stream().map(SectionParser::getSectionKey).collect(toList());
+    List<ProjectViewDefaultValueProvider> defaultValueProviders =
+        Lists.newArrayList(ProjectViewDefaultValueProvider.EP_NAME.getExtensions());
+    defaultValueProviders.sort(
+        Comparator.comparingInt(val -> sectionKeys.indexOf(val.getSectionKey())));
+    for (ProjectViewDefaultValueProvider defaultValueProvider : defaultValueProviders) {
+      projectView =
+          defaultValueProvider.addProjectViewDefaultValue(buildSystem, projectViewSet, projectView);
     }
     return ProjectViewParser.projectViewToString(projectView);
   }
 
   private void init(
+      BuildSystem buildSystem,
       WorkspaceRoot workspaceRoot,
       WorkspacePathResolver workspacePathResolver,
       @Nullable WorkspacePath sharedProjectView,
@@ -239,7 +267,7 @@
       boolean allowAddDefaultValues) {
     if (allowAddDefaultValues && initialProjectViewText != null) {
       initialProjectViewText =
-          modifyInitialProjectView(initialProjectViewText, workspacePathResolver);
+          modifyInitialProjectView(buildSystem, initialProjectViewText, workspacePathResolver);
     }
     this.workspaceRoot = workspaceRoot;
     this.workspacePathResolver = workspacePathResolver;
@@ -454,6 +482,16 @@
               + "Please report a bug.");
     }
 
+    List<DirectoryEntry> directories = projectViewSet.listItems(DirectorySection.KEY);
+    if (directories.isEmpty()) {
+      String msg = "Add some directories to index in the 'directories' section.";
+      if (projectViewSet.listItems(TargetSection.KEY).isEmpty()) {
+        msg += "\nTargets are also generally required to resolve sources.";
+      }
+      return BlazeValidationResult.failure(msg);
+    }
+
+
     return BlazeValidationResult.success();
   }
 
@@ -489,12 +527,12 @@
         syncPlugin.installSdks(context);
       }
       WorkspaceLanguageSettings workspaceLanguageSettings =
-          LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+          LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
       if (workspaceLanguageSettings == null) {
         return false;
       }
       return ProjectViewVerifier.verifyProjectView(
-          context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
+          null, context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
     }
   }
 
@@ -504,7 +542,7 @@
         issues
             .stream()
             .filter(issue -> issue.getCategory() == IssueOutput.Category.ERROR)
-            .collect(Collectors.toList());
+            .collect(toList());
 
     if (!errors.isEmpty()) {
       StringBuilder errorMessage = new StringBuilder();
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/actions/BuildFileModifierTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/actions/BuildFileModifierTest.java
index 311cfdf..691dc74 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/actions/BuildFileModifierTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/actions/BuildFileModifierTest.java
@@ -35,7 +35,7 @@
     BuildFile buildFile =
         createBuildFile(new WorkspacePath("BUILD"), "java_library(name = 'existing')", "");
     BuildFileModifier.getInstance()
-        .addRule(getProject(), new BlazeContext(), new Label("//:new_target"), Kind.JAVA_TEST);
+        .addRule(getProject(), new BlazeContext(), Label.create("//:new_target"), Kind.JAVA_TEST);
     assertFileContents(
         buildFile,
         "java_library(name = 'existing')",
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/completion/FilePathCompletionTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/completion/FilePathCompletionTest.java
index a13d261..a592d4e 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/completion/FilePathCompletionTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/completion/FilePathCompletionTest.java
@@ -20,6 +20,7 @@
 import com.google.idea.blaze.base.lang.buildfile.BuildFileIntegrationTestCase;
 import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.intellij.codeInsight.CodeInsightSettings;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.vfs.VirtualFile;
 import org.junit.Test;
@@ -44,6 +45,30 @@
   }
 
   @Test
+  public void testInsertPairQuoteOptionRespected() {
+    boolean old = CodeInsightSettings.getInstance().AUTOINSERT_PAIR_QUOTE;
+    try {
+      CodeInsightSettings.getInstance().AUTOINSERT_PAIR_QUOTE = false;
+      BuildFile file = createBuildFile(new WorkspacePath("java/BUILD"), "'//");
+      Editor editor = editorTest.openFileInEditor(file);
+      editorTest.setCaretPosition(editor, 0, "'//".length());
+
+      assertThat(editorTest.completeIfUnique()).isTrue();
+      assertFileContents(file, "'//java");
+
+      CodeInsightSettings.getInstance().AUTOINSERT_PAIR_QUOTE = true;
+      file = createBuildFile(new WorkspacePath("foo/BUILD"), "'//j");
+      editor = editorTest.openFileInEditor(file);
+      editorTest.setCaretPosition(editor, 0, "'//j".length());
+
+      assertThat(editorTest.completeIfUnique()).isTrue();
+      assertFileContents(file, "'//java'");
+    } finally {
+      CodeInsightSettings.getInstance().AUTOINSERT_PAIR_QUOTE = old;
+    }
+  }
+
+  @Test
   public void testUniqueMultiSegmentDirectoryCompleted() {
     BuildFile file = createBuildFile(new WorkspacePath("java/com/google/BUILD"), "'//'");
 
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/completion/RuleTargetCompletionTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/completion/RuleTargetCompletionTest.java
index 980da4d..ce2388b 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/completion/RuleTargetCompletionTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/completion/RuleTargetCompletionTest.java
@@ -17,11 +17,17 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.idea.blaze.base.lang.buildfile.BuildFileIntegrationTestCase;
+import com.google.idea.blaze.base.lang.buildfile.language.semantics.BuildLanguageSpec;
+import com.google.idea.blaze.base.lang.buildfile.language.semantics.BuildLanguageSpecProvider;
+import com.google.idea.blaze.base.lang.buildfile.language.semantics.RuleDefinition;
 import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.intellij.codeInsight.lookup.LookupElement;
 import com.intellij.openapi.editor.Editor;
+import com.intellij.openapi.project.Project;
+import javax.annotation.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -49,6 +55,28 @@
   }
 
   @Test
+  public void testCustomRuleCompletion() {
+    MockBuildLanguageSpecProvider specProvider = new MockBuildLanguageSpecProvider();
+    setBuildLanguageSpecRules(specProvider, "java_library");
+    registerApplicationService(BuildLanguageSpecProvider.class, specProvider);
+
+    BuildFile file =
+        createBuildFile(
+            new WorkspacePath("java/com/google/BUILD"),
+            "custom_rule(name = 'lib')",
+            "java_library(",
+            "    name = 'test',",
+            "    deps = [':']");
+
+    Editor editor = editorTest.openFileInEditor(file);
+    editorTest.setCaretPosition(editor, 3, "    deps = [':".length());
+
+    LookupElement[] completionItems = testFixture.completeBasic();
+    assertThat(completionItems).hasLength(1);
+    assertThat(completionItems[0].toString()).isEqualTo("':lib'");
+  }
+
+  @Test
   public void testIgnoreContainingTarget() {
     BuildFile file =
         createBuildFile(
@@ -160,4 +188,28 @@
     assertThat(completionItems).asList().contains("'//java:root_rule'");
     assertThat(completionItems).asList().doesNotContain("'//java/com/google:other_rule'");
   }
+
+  private static void setBuildLanguageSpecRules(
+      MockBuildLanguageSpecProvider specProvider, String... ruleNames) {
+    ImmutableMap.Builder<String, RuleDefinition> rules = ImmutableMap.builder();
+    for (String name : ruleNames) {
+      rules.put(name, new RuleDefinition(name, ImmutableMap.of(), null));
+    }
+    specProvider.setRules(rules.build());
+  }
+
+  private static class MockBuildLanguageSpecProvider implements BuildLanguageSpecProvider {
+
+    BuildLanguageSpec languageSpec = new BuildLanguageSpec(ImmutableMap.of());
+
+    void setRules(ImmutableMap<String, RuleDefinition> rules) {
+      languageSpec = new BuildLanguageSpec(rules);
+    }
+
+    @Nullable
+    @Override
+    public BuildLanguageSpec getLanguageSpec(Project project) {
+      return languageSpec;
+    }
+  }
 }
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/ExternalFileUsagesTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/ExternalFileUsagesTest.java
index f50dbf2..9964a22 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/ExternalFileUsagesTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/ExternalFileUsagesTest.java
@@ -61,7 +61,7 @@
 
     PsiElement ref = references[0].getElement();
     assertThat(ref).isInstanceOf(StringLiteral.class);
-    assertThat(PsiUtils.getParentOfType(ref, Argument.Keyword.class)).isEqualTo(arg);
+    assertThat(PsiUtils.getParentOfType(ref, Argument.Keyword.class, true)).isEqualTo(arg);
   }
 
   @Test
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/ExternalWorkspaceFindUsagesTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/ExternalWorkspaceFindUsagesTest.java
new file mode 100644
index 0000000..aec776f
--- /dev/null
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/ExternalWorkspaceFindUsagesTest.java
@@ -0,0 +1,124 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.lang.buildfile.findusages;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.idea.blaze.base.lang.buildfile.BuildFileIntegrationTestCase;
+import com.google.idea.blaze.base.lang.buildfile.psi.Argument;
+import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
+import com.google.idea.blaze.base.lang.buildfile.psi.FuncallExpression;
+import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
+import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
+import com.google.idea.blaze.base.lang.buildfile.search.FindUsages;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.sync.workspace.WorkspaceHelper;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiReference;
+import java.io.File;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Test that references to external workspaces appear in 'find usages' results. */
+@RunWith(JUnit4.class)
+public class ExternalWorkspaceFindUsagesTest extends BuildFileIntegrationTestCase {
+
+  @Override
+  protected BuildSystem buildSystem() {
+    return BuildSystem.Bazel;
+  }
+
+  @Test
+  public void testFindUsagesFromWorkspaceFile() {
+    BuildFile workspaceBuildFile =
+        createBuildFile(
+            new WorkspacePath("WORKSPACE"),
+            "maven_jar(",
+            "    name = 'javax_inject',",
+            "    artifact = 'javax.inject:javax.inject:1',",
+            "    sha1 = '6975da39a7040257bd51d21a231b76c915872d38',",
+            ")");
+    BuildFile refFile1 =
+        createBuildFile(
+            new WorkspacePath("java/com/foo/BUILD"),
+            "java_library(name = 'javax_inject', exports = ['@javax_inject//jar'])");
+
+    BuildFile refFile2 =
+        createBuildFile(
+            new WorkspacePath("java/com/bar/build_defs.bzl"),
+            "DEP = '@javax_inject//invalid:nonsense'");
+
+    FuncallExpression target = workspaceBuildFile.findRule("javax_inject");
+    StringLiteral ref1 =
+        PsiUtils.findFirstChildOfClassRecursive(
+            refFile1.findRule("javax_inject").getKeywordArgument("exports"), StringLiteral.class);
+    StringLiteral ref2 = PsiUtils.findFirstChildOfClassRecursive(refFile2, StringLiteral.class);
+
+    PsiReference[] references = FindUsages.findAllReferences(target);
+    assertThat(references).hasLength(2);
+    assertThat(Arrays.stream(references).map(PsiReference::getElement).collect(Collectors.toList()))
+        .containsExactly(ref1, ref2);
+  }
+
+  @Test
+  public void testFindUsagesFromExternalWorkspaceFile() {
+    BuildFile workspaceBuildFile =
+        createBuildFile(
+            new WorkspacePath("BUILD"),
+            "java_library(",
+            "    name = 'lib',",
+            "    exports = ['@junit//:jar'],",
+            ")");
+    BuildFile externalFile =
+        (BuildFile)
+            createFileInExternalWorkspace(
+                "junit",
+                new WorkspacePath("BUILD"),
+                "java_import(",
+                "    name = 'jar',",
+                "    jars = ['junit-4.11.jar'],",
+                ")");
+
+    FuncallExpression target = externalFile.findRule("jar");
+    assertThat(target).isNotNull();
+
+    Argument.Keyword arg = workspaceBuildFile.findRule("lib").getKeywordArgument("exports");
+    StringLiteral label = PsiUtils.findFirstChildOfClassRecursive(arg, StringLiteral.class);
+    assertThat(label).isNotNull();
+
+    PsiReference[] references = FindUsages.findAllReferences(target);
+    assertThat(references).hasLength(1);
+    assertThat(references[0].getElement()).isEqualTo(label);
+  }
+
+  private PsiFile createFileInExternalWorkspace(
+      String workspaceName, WorkspacePath path, String... contents) {
+    String filePath =
+        Paths.get(getExternalSourceRoot().getPath(), workspaceName, path.relativePath()).toString();
+    return fileSystem.createPsiFile(filePath, contents);
+  }
+
+  private File getExternalSourceRoot() {
+    return WorkspaceHelper.getExternalSourceRoot(
+        BlazeProjectDataManager.getInstance(getProject()).getBlazeProjectData());
+  }
+}
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/LocalVariableUsagesTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/LocalVariableUsagesTest.java
index 220c8f2..d46c259 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/LocalVariableUsagesTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/findusages/LocalVariableUsagesTest.java
@@ -61,14 +61,16 @@
     assertThat(funcall).isNotNull();
 
     PsiElement firstRef = references[0].getElement();
-    assertThat(PsiUtils.getParentOfType(firstRef, FuncallExpression.class)).isEqualTo(funcall);
+    assertThat(PsiUtils.getParentOfType(firstRef, FuncallExpression.class, true))
+        .isEqualTo(funcall);
 
     FunctionStatement function = buildFile.findChildByClass(FunctionStatement.class);
     assertThat(function).isNotNull();
 
     PsiElement secondRef = references[1].getElement();
     assertThat(secondRef.getParent()).isInstanceOf(AssignmentStatement.class);
-    assertThat(PsiUtils.getParentOfType(secondRef, FunctionStatement.class)).isEqualTo(function);
+    assertThat(PsiUtils.getParentOfType(secondRef, FunctionStatement.class, true))
+        .isEqualTo(function);
   }
 
   // the case where a symbol is the target of multiple assignment statements
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/quickfix/DeprecatedLoadQuickFixTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/quickfix/DeprecatedLoadQuickFixTest.java
index 549334f..4223a4d 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/quickfix/DeprecatedLoadQuickFixTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/quickfix/DeprecatedLoadQuickFixTest.java
@@ -40,7 +40,7 @@
     BuildFile file =
         createBuildFile(
             new WorkspacePath("java/com/google/BUILD"),
-            "load('/java/com/google/subdir/build_defs.bzl', 'symbol')");
+            "load('/java/com/google/subdir/build_defs', 'symbol')");
 
     StringLiteral string = PsiUtils.findFirstChildOfClassRecursive(file, StringLiteral.class);
     applyQuickFix(string);
@@ -55,8 +55,7 @@
 
     BuildFile file =
         createBuildFile(
-            new WorkspacePath("java/com/google/BUILD"),
-            "load('/foo/bar/build_defs.bzl', 'symbol')");
+            new WorkspacePath("java/com/google/BUILD"), "load('/foo/bar/build_defs', 'symbol')");
 
     StringLiteral string = PsiUtils.findFirstChildOfClassRecursive(file, StringLiteral.class);
     applyQuickFix(string);
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/refactor/RenameRefactoringTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/refactor/RenameRefactoringTest.java
index 71f8962..7db4d29 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/refactor/RenameRefactoringTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/refactor/RenameRefactoringTest.java
@@ -36,6 +36,7 @@
 import com.intellij.refactoring.move.moveClassesOrPackages.MoveDirectoryWithClassesProcessor;
 import com.intellij.refactoring.rename.RenameDialog;
 import com.intellij.refactoring.rename.RenamePsiElementProcessor;
+import com.intellij.refactoring.rename.RenameUtil;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.List;
@@ -115,6 +116,32 @@
   }
 
   @Test
+  public void testTargetRenameValidation() {
+    BuildFile file =
+        createBuildFile(new WorkspacePath("com/google/foo/BUILD"), "rule_type(name = \"target\")");
+    FuncallExpression target =
+        PsiUtils.findFirstChildOfClassRecursive(file, FuncallExpression.class);
+
+    assertThat(RenameUtil.isValidName(getProject(), target, "name-with_allowed,meta=chars+-./@~"))
+        .isTrue();
+    assertThat(RenameUtil.isValidName(getProject(), target, "name:withColon")).isFalse();
+    assertThat(RenameUtil.isValidName(getProject(), target, "/start-with-slash")).isFalse();
+    assertThat(RenameUtil.isValidName(getProject(), target, "up-level-ref/../etc")).isFalse();
+  }
+
+  @Test
+  public void testFunctionRenameValidation() {
+    BuildFile file =
+        createBuildFile(new WorkspacePath("com/google/foo/BUILD"), "def fn_name():", "  return");
+    FunctionStatement fn = PsiUtils.findFirstChildOfClassRecursive(file, FunctionStatement.class);
+
+    assertThat(RenameUtil.isValidName(getProject(), fn, "name-with-dash")).isFalse();
+    assertThat(RenameUtil.isValidName(getProject(), fn, "name:withColon")).isFalse();
+    assertThat(RenameUtil.isValidName(getProject(), fn, "return")).isFalse();
+    assertThat(RenameUtil.isValidName(getProject(), fn, "name_with_underscore")).isTrue();
+  }
+
+  @Test
   public void testRenameSkylarkExtension() {
     BuildFile extFile =
         createBuildFile(
@@ -237,6 +264,37 @@
   }
 
   @Test
+  public void testRenameExternalWorkspaceTarget() {
+    BuildFile workspaceFile =
+        createBuildFile(
+            new WorkspacePath("WORKSPACE"),
+            "maven_jar(",
+            "    name = \"javax\",",
+            "    artifact = \"javax.inject:javax.inject:1\",",
+            "    sha1 = \"6975da39a7040257bd51d21a231b76c915872d38\",",
+            ")");
+    BuildFile referencingFile =
+        createBuildFile(
+            new WorkspacePath("java/com/foo/BUILD"),
+            "java_library(name = \"javax_inject\", exports = [\"@javax//jar\"])");
+
+    FuncallExpression targetRule =
+        PsiUtils.findFirstChildOfClassRecursive(workspaceFile, FuncallExpression.class);
+    testFixture.renameElement(targetRule, "v2_lib");
+
+    assertFileContents(
+        workspaceFile,
+        "maven_jar(",
+        "    name = \"v2_lib\",",
+        "    artifact = \"javax.inject:javax.inject:1\",",
+        "    sha1 = \"6975da39a7040257bd51d21a231b76c915872d38\",",
+        ")");
+
+    assertFileContents(
+        referencingFile, "java_library(name = \"javax_inject\", exports = [\"@v2_lib//jar\"])");
+  }
+
+  @Test
   public void testRenameSuggestionForBuildFile() {
     BuildFile buildFile = createBuildFile(new WorkspacePath("java/com/google/BUILD"));
     RenamePsiElementProcessor processor = RenamePsiElementProcessor.forElement(buildFile);
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/ExternalWorkspaceReferenceTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/ExternalWorkspaceReferenceTest.java
new file mode 100644
index 0000000..6e2a045
--- /dev/null
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/ExternalWorkspaceReferenceTest.java
@@ -0,0 +1,153 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.lang.buildfile.references;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.idea.blaze.base.lang.buildfile.BuildFileIntegrationTestCase;
+import com.google.idea.blaze.base.lang.buildfile.psi.Argument;
+import com.google.idea.blaze.base.lang.buildfile.psi.BuildFile;
+import com.google.idea.blaze.base.lang.buildfile.psi.FuncallExpression;
+import com.google.idea.blaze.base.lang.buildfile.psi.StringLiteral;
+import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.sync.workspace.WorkspaceHelper;
+import com.intellij.psi.PsiFile;
+import java.io.File;
+import java.nio.file.Paths;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests that labels referencing external workspaces are correctly resolved. */
+@RunWith(JUnit4.class)
+public class ExternalWorkspaceReferenceTest extends BuildFileIntegrationTestCase {
+
+  @Override
+  protected BuildSystem buildSystem() {
+    return BuildSystem.Bazel;
+  }
+
+  @Test
+  public void testExternalWorkspaceTargetReference() {
+    BuildFile workspaceBuildFile =
+        createBuildFile(
+            new WorkspacePath("BUILD"),
+            "java_library(",
+            "    name = 'lib',",
+            "    exports = ['@junit//:jar'],",
+            ")");
+    BuildFile externalBuildFile =
+        (BuildFile)
+            createFileInExternalWorkspace(
+                "junit",
+                new WorkspacePath("BUILD"),
+                "java_import(",
+                "    name = 'jar',",
+                "    jars = ['junit-4.11.jar'],",
+                ")");
+
+    FuncallExpression target = externalBuildFile.findRule("jar");
+    assertThat(target).isNotNull();
+
+    Argument.Keyword arg = workspaceBuildFile.findRule("lib").getKeywordArgument("exports");
+    StringLiteral label = PsiUtils.findFirstChildOfClassRecursive(arg, StringLiteral.class);
+    assertThat(label.getReferencedElement()).isEqualTo(target);
+  }
+
+  @Test
+  public void testLocalTargetReferenceWithinExternalWorkspaceResolves() {
+    BuildFile externalFile =
+        (BuildFile)
+            createFileInExternalWorkspace(
+                "junit",
+                new WorkspacePath("BUILD"),
+                "java_import(",
+                "    name = 'jar',",
+                "    jars = ['junit-4.11.jar'],",
+                ")",
+                "java_library(",
+                "    name = 'lib',",
+                "    srcs = [':jar'],",
+                ")");
+    FuncallExpression target = externalFile.findRule("jar");
+    assertThat(target).isNotNull();
+
+    Argument.Keyword arg = externalFile.findRule("lib").getKeywordArgument("srcs");
+    StringLiteral label = PsiUtils.findFirstChildOfClassRecursive(arg, StringLiteral.class);
+    assertThat(label.getReferencedElement()).isEqualTo(target);
+  }
+
+  @Test
+  public void testFileReferenceWithinExternalWorkspaceResolves() {
+    BuildFile externalFile =
+        (BuildFile)
+            createFileInExternalWorkspace(
+                "junit",
+                new WorkspacePath("BUILD"),
+                "java_import(",
+                "    name = 'target',",
+                "    jars = ['junit-4.11.jar'],",
+                ")");
+    PsiFile jarFile = createFileInExternalWorkspace("junit", new WorkspacePath("junit-4.11.jar"));
+    FuncallExpression target = externalFile.findRule("target");
+    StringLiteral label =
+        PsiUtils.findFirstChildOfClassRecursive(
+            target.getKeywordArgument("jars"), StringLiteral.class);
+    assertThat(label.getReferencedElement()).isEqualTo(jarFile);
+  }
+
+  @Test
+  public void testReferenceToWorkspaceFileContents() {
+    BuildFile workspaceFile =
+        createBuildFile(
+            new WorkspacePath("WORKSPACE"),
+            "maven_jar(",
+            "    name = 'w3c_css_sac',",
+            "    artifact = 'org.w3c.css:sac:1.3',",
+            "    sha1 = 'cdb2dcb4e22b83d6b32b93095f644c3462739e82',",
+            ")");
+    BuildFile referencingFile =
+        createBuildFile(
+            new WorkspacePath("java/com/google/pkg/BUILD"),
+            "rule(",
+            "    name = 'other',",
+            "    dep = '@w3c_css_sac//jar'",
+            ")");
+    FuncallExpression target = workspaceFile.findRule("w3c_css_sac");
+    assertThat(target).isNotNull();
+
+    FuncallExpression other = referencingFile.findRule("other");
+    StringLiteral label =
+        PsiUtils.findFirstChildOfClassRecursive(
+            other.getKeywordArgument("dep"), StringLiteral.class);
+    assertThat(label.getReferencedElement()).isEqualTo(target);
+  }
+
+  private PsiFile createFileInExternalWorkspace(
+      String workspaceName, WorkspacePath path, String... contents) {
+    String filePath =
+        Paths.get(getExternalSourceRoot().getPath(), workspaceName, path.relativePath()).toString();
+    return fileSystem.createPsiFile(filePath, contents);
+  }
+
+  private File getExternalSourceRoot() {
+    return WorkspaceHelper.getExternalSourceRoot(
+        BlazeProjectDataManager.getInstance(getProject()).getBlazeProjectData());
+  }
+}
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/GlobReferenceTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/GlobReferenceTest.java
index cc9f04c..303ab02 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/GlobReferenceTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/GlobReferenceTest.java
@@ -137,8 +137,7 @@
     PsiFile foo = workspace.createPsiFile(new WorkspacePath("java/com/google/Foo.java"));
     BuildFile file =
         createBuildFile(
-            new WorkspacePath("java/com/google/BUILD"),
-            "glob(" + "  ['**/*']," + "  exclude = ['BUILD'])");
+            new WorkspacePath("java/com/google/BUILD"), "glob(['**/*'],  exclude = ['BUILD'])");
 
     GlobExpression glob = PsiUtils.findFirstChildOfClassRecursive(file, GlobExpression.class);
     List<PsiElement> references = multiResolve(glob);
@@ -147,6 +146,20 @@
   }
 
   @Test
+  public void testExcludeDirectories2() {
+    workspace.createDirectory(new WorkspacePath("java/com/google/tests"));
+    workspace.createPsiFile(new WorkspacePath("java/com/google/tests/Test.java"));
+    workspace.createPsiFile(new WorkspacePath("java/com/google/Foo.java"));
+    BuildFile file =
+        createBuildFile(
+            new WorkspacePath("java/com/google/BUILD"), "glob(['**/*'],  exclude = ['**/*'])");
+
+    GlobExpression glob = PsiUtils.findFirstChildOfClassRecursive(file, GlobExpression.class);
+    List<PsiElement> references = multiResolve(glob);
+    assertThat(references).isEmpty();
+  }
+
+  @Test
   public void testFilesInSubpackagesExcluded() {
     BuildFile pkg =
         createBuildFile(new WorkspacePath("java/com/google/BUILD"), "glob(['**/*.java'])");
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/LabelReferenceTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/LabelReferenceTest.java
index b14f4b7..7eb16c0 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/LabelReferenceTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/LabelReferenceTest.java
@@ -177,7 +177,7 @@
     assertThat(references).hasLength(1);
 
     PsiElement element = references[0].getElement();
-    FuncallExpression rule = PsiUtils.getParentOfType(element, FuncallExpression.class);
+    FuncallExpression rule = PsiUtils.getParentOfType(element, FuncallExpression.class, true);
     assertThat(rule.getName()).isEqualTo("bar");
     assertThat(rule.getContainingFile()).isEqualTo(referencingFile);
   }
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/PackageReferenceTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/PackageReferenceTest.java
index afb3760..6f09694 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/PackageReferenceTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/references/PackageReferenceTest.java
@@ -25,6 +25,8 @@
 import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.intellij.psi.PsiReference;
+import java.util.Arrays;
+import java.util.stream.Collectors;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -76,8 +78,7 @@
         PsiUtils.findFirstChildOfClassRecursive(packagesArg, StringLiteral.class);
 
     PsiReference[] references = string.getReferences();
-    assertThat(references).hasLength(2);
-    assertThat(references[0].resolve()).isEqualTo(libTarget);
-    assertThat(references[1].resolve()).isEqualTo(buildFile1);
+    assertThat(Arrays.stream(references).map(PsiReference::resolve).collect(Collectors.toList()))
+        .containsAllOf(libTarget, buildFile1);
   }
 }
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/validation/BuiltInRuleAnnotatorTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/validation/BuiltInRuleAnnotatorTest.java
index 2459af6..baf2d39 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/validation/BuiltInRuleAnnotatorTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/validation/BuiltInRuleAnnotatorTest.java
@@ -275,6 +275,35 @@
     assertNoErrors(file);
   }
 
+  @Test
+  public void testNoMissingMandatoryArgErrorIfKwargsPresent() {
+    specProvider.setRules(ImmutableMap.of(JAVA_TEST.name, JAVA_TEST));
+    BuildFile file =
+        createBuildFile(
+            new WorkspacePath("java/com/google/BUILD"),
+            "def java_test(srcs=[], **kwargs):",
+            "  native.java_test(srcs = srcs, **kwargs)");
+    assertNoErrors(file);
+  }
+
+  @Test
+  public void testNoMissingAttributeErrorsForOverriddenBuiltIns() {
+    specProvider.setRules(ImmutableMap.of(JAVA_TEST.name, JAVA_TEST));
+    BuildFile file =
+        createBuildFile(
+            new WorkspacePath("java/com/foo/BUILD"),
+            "java_test(name = 'test', srcs = [':src'], extra_arg = [])");
+    assertHasError(file, "Unrecognized attribute 'extra_arg' for rule type 'java_test'");
+
+    file =
+        createBuildFile(
+            new WorkspacePath("java/com/bar/BUILD"),
+            "def java_test(srcs=[], **kwargs, extra_arg=[]):",
+            "  native.java_test(srcs = srcs, **kwargs)",
+            "java_test(name = 'test', srcs = [':src'], extra_arg = [])");
+    assertNoErrors(file);
+  }
+
   private void setRules(String... ruleNames) {
     ImmutableMap.Builder<String, RuleDefinition> rules = ImmutableMap.builder();
     for (String name : ruleNames) {
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/validation/LoadStatementAnnotatorTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/validation/LoadStatementAnnotatorTest.java
index 9af84e7..ce2f332 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/validation/LoadStatementAnnotatorTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/buildfile/validation/LoadStatementAnnotatorTest.java
@@ -49,6 +49,15 @@
   }
 
   @Test
+  public void testNoWarningsInExternalLoad() {
+    BuildFile file =
+        createBuildFile(
+            new WorkspacePath("java/com/google/BUILD"),
+            "load('@tools//ide:build_test.bzl', 'build_test')");
+    assertNoAnnotations(file);
+  }
+
+  @Test
   public void testNoWarningsWhenTyping() {
     BuildFile file = createBuildFile(new WorkspacePath("java/com/google/BUILD"), "load('/')");
     assertNoAnnotations(file);
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/lang/projectview/ProjectViewCompletionTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/lang/projectview/ProjectViewCompletionTest.java
index 99390e2..edf97b7 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/lang/projectview/ProjectViewCompletionTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/lang/projectview/ProjectViewCompletionTest.java
@@ -19,7 +19,6 @@
 
 import com.google.common.base.Joiner;
 import com.google.idea.blaze.base.lang.projectview.completion.ProjectViewKeywordCompletionContributor;
-import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
 import com.google.idea.blaze.base.projectview.section.SectionParser;
@@ -126,20 +125,6 @@
   }
 
   @Test
-  public void testAdditionalLanguagesCompletion() {
-    setInput("additional_languages:", "  <caret>");
-
-    String[] types = editorTest.getCompletionItemsAsStrings();
-
-    assertThat(types)
-        .asList()
-        .containsAllIn(
-            Arrays.stream(LanguageClass.values())
-                .map(LanguageClass::getName)
-                .collect(Collectors.toList()));
-  }
-
-  @Test
   public void testUniqueDirectoryCompleted() {
     setInput("import <caret>");
 
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationGenericHandlerIntegrationTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationGenericHandlerIntegrationTest.java
index b6b1c80..42be3e9 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationGenericHandlerIntegrationTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationGenericHandlerIntegrationTest.java
@@ -84,10 +84,10 @@
 
     BlazeCommandRunConfigurationCommonState state =
         (BlazeCommandRunConfigurationCommonState) configuration.getHandler().getState();
-    state.setCommand(COMMAND);
-    state.setBlazeFlags(ImmutableList.of("--flag1", "--flag2"));
-    state.setExeFlags(ImmutableList.of("--exeFlag1"));
-    state.setBlazeBinary("/usr/bin/blaze");
+    state.getCommandState().setCommand(COMMAND);
+    state.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
+    state.getExeFlagsState().setRawFlags(ImmutableList.of("--exeFlag1"));
+    state.getBlazeBinaryState().setBlazeBinary("/usr/bin/blaze");
 
     Element element = new Element("test");
     configuration.writeExternal(element);
@@ -101,10 +101,12 @@
 
     BlazeCommandRunConfigurationCommonState readState =
         (BlazeCommandRunConfigurationCommonState) readConfiguration.getHandler().getState();
-    assertThat(readState.getCommand()).isEqualTo(COMMAND);
-    assertThat(readState.getBlazeFlags()).containsExactly("--flag1", "--flag2").inOrder();
-    assertThat(readState.getExeFlags()).containsExactly("--exeFlag1");
-    assertThat(readState.getBlazeBinary()).isEqualTo("/usr/bin/blaze");
+    assertThat(readState.getCommandState().getCommand()).isEqualTo(COMMAND);
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .containsExactly("--flag1", "--flag2")
+        .inOrder();
+    assertThat(readState.getExeFlagsState().getRawFlags()).containsExactly("--exeFlag1");
+    assertThat(readState.getBlazeBinaryState().getBlazeBinary()).isEqualTo("/usr/bin/blaze");
   }
 
   @Test
@@ -129,10 +131,10 @@
 
     BlazeCommandRunConfigurationCommonState state =
         (BlazeCommandRunConfigurationCommonState) configuration.getHandler().getState();
-    state.setCommand(COMMAND);
-    state.setBlazeFlags(ImmutableList.of("--flag1", "--flag2"));
-    state.setExeFlags(ImmutableList.of("--exeFlag1"));
-    state.setBlazeBinary("/usr/bin/blaze");
+    state.getCommandState().setCommand(COMMAND);
+    state.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
+    state.getExeFlagsState().setRawFlags(ImmutableList.of("--exeFlag1"));
+    state.getBlazeBinaryState().setBlazeBinary("/usr/bin/blaze");
 
     editor.resetFrom(configuration);
     BlazeCommandRunConfiguration readConfiguration =
@@ -145,10 +147,14 @@
 
     BlazeCommandRunConfigurationCommonState readState =
         (BlazeCommandRunConfigurationCommonState) readConfiguration.getHandler().getState();
-    assertThat(readState.getCommand()).isEqualTo(state.getCommand());
-    assertThat(readState.getBlazeFlags()).isEqualTo(state.getBlazeFlags());
-    assertThat(readState.getExeFlags()).isEqualTo(state.getExeFlags());
-    assertThat(readState.getBlazeBinary()).isEqualTo(state.getBlazeBinary());
+    assertThat(readState.getCommandState().getCommand())
+        .isEqualTo(state.getCommandState().getCommand());
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(state.getBlazeFlagsState().getRawFlags());
+    assertThat(readState.getExeFlagsState().getRawFlags())
+        .isEqualTo(state.getExeFlagsState().getRawFlags());
+    assertThat(readState.getBlazeBinaryState().getBlazeBinary())
+        .isEqualTo(state.getBlazeBinaryState().getBlazeBinary());
 
     Disposer.dispose(editor);
   }
@@ -175,10 +181,10 @@
 
     BlazeCommandRunConfigurationCommonState readState =
         (BlazeCommandRunConfigurationCommonState) readConfiguration.getHandler().getState();
-    readState.setCommand(COMMAND);
-    readState.setBlazeFlags(ImmutableList.of("--flag1", "--flag2"));
-    readState.setExeFlags(ImmutableList.of("--exeFlag1"));
-    readState.setBlazeBinary("/usr/bin/blaze");
+    readState.getCommandState().setCommand(COMMAND);
+    readState.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
+    readState.getExeFlagsState().setRawFlags(ImmutableList.of("--exeFlag1"));
+    readState.getBlazeBinaryState().setBlazeBinary("/usr/bin/blaze");
 
     editor.applyEditorTo(readConfiguration);
 
@@ -187,10 +193,14 @@
         .isInstanceOf(BlazeCommandGenericRunConfigurationHandler.class);
 
     readState = (BlazeCommandRunConfigurationCommonState) readConfiguration.getHandler().getState();
-    assertThat(readState.getCommand()).isEqualTo(state.getCommand());
-    assertThat(readState.getBlazeFlags()).isEqualTo(state.getBlazeFlags());
-    assertThat(readState.getExeFlags()).isEqualTo(state.getExeFlags());
-    assertThat(readState.getBlazeBinary()).isEqualTo(state.getBlazeBinary());
+    assertThat(readState.getCommandState().getCommand())
+        .isEqualTo(state.getCommandState().getCommand());
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(state.getBlazeFlagsState().getRawFlags());
+    assertThat(readState.getExeFlagsState().getRawFlags())
+        .isEqualTo(state.getExeFlagsState().getRawFlags());
+    assertThat(readState.getBlazeBinaryState().getBlazeBinary())
+        .isEqualTo(state.getBlazeBinaryState().getBlazeBinary());
 
     Disposer.dispose(editor);
   }
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationRunManagerImplTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationRunManagerImplTest.java
index d1e3b7f..715cbc0 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationRunManagerImplTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationRunManagerImplTest.java
@@ -77,7 +77,7 @@
 
   @Test
   public void loadStateAndGetStateShouldMatch() {
-    final Label label = new Label("//package:rule");
+    final Label label = Label.create("//package:rule");
     configuration.setTarget(label);
 
     final Element element = runManager.getState();
@@ -94,7 +94,7 @@
   @Test
   public void loadStateAndGetStateElementShouldMatch() {
     final XMLOutputter xmlOutputter = new XMLOutputter(Format.getCompactFormat());
-    configuration.setTarget(new Label("//package:rule"));
+    configuration.setTarget(Label.create("//package:rule"));
 
     final Element initialElement = runManager.getState();
     runManager.loadState(initialElement);
@@ -107,14 +107,14 @@
   @Test
   public void loadStateAndGetStateElementShouldMatchAfterChangeAndRevert() {
     final XMLOutputter xmlOutputter = new XMLOutputter(Format.getCompactFormat());
-    final Label label = new Label("//package:rule");
+    final Label label = Label.create("//package:rule");
     configuration.setTarget(label);
 
     final Element initialElement = runManager.getState();
     runManager.loadState(initialElement);
     final BlazeCommandRunConfiguration modifiedConfiguration =
         (BlazeCommandRunConfiguration) runManager.getAllConfigurations()[0];
-    modifiedConfiguration.setTarget(new Label("//new:label"));
+    modifiedConfiguration.setTarget(Label.create("//new:label"));
 
     final Element modifiedElement = runManager.getState();
     assertThat(xmlOutputter.outputString(modifiedElement))
@@ -135,7 +135,7 @@
     final XMLOutputter xmlOutputter = new XMLOutputter(Format.getCompactFormat());
     final BlazeCommandRunConfigurationSettingsEditor editor =
         new BlazeCommandRunConfigurationSettingsEditor(configuration);
-    configuration.setTarget(new Label("//package:rule"));
+    configuration.setTarget(Label.create("//package:rule"));
 
     final Element initialElement = runManager.getState();
     editor.resetFrom(configuration);
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationSettingsEditorTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationSettingsEditorTest.java
index 61b71f5..66984ae 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationSettingsEditorTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationSettingsEditorTest.java
@@ -51,7 +51,7 @@
   public void testEditorApplyToAndResetFromMatches() throws ConfigurationException {
     BlazeCommandRunConfigurationSettingsEditor editor =
         new BlazeCommandRunConfigurationSettingsEditor(configuration);
-    Label label = new Label("//package:rule");
+    Label label = Label.create("//package:rule");
     configuration.setTarget(label);
 
     editor.resetFrom(configuration);
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/run/TestTargetHeuristicTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/run/TestTargetHeuristicTest.java
index c68a696..9732eda 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/run/TestTargetHeuristicTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/run/TestTargetHeuristicTest.java
@@ -64,8 +64,8 @@
                 .build());
     Label match =
         TestTargetHeuristic.chooseTestTargetForSourceFile(
-            getProject(), source, targets, TestSize.SMALL);
-    assertThat(match).isEqualTo(new Label("//foo:test2"));
+            getProject(), null, source, targets, TestSize.SMALL);
+    assertThat(match).isEqualTo(Label.create("//foo:test2"));
   }
 
   @Test
@@ -84,8 +84,9 @@
                 .addSource(sourceRoot("java/com/foo/FooTest.java"))
                 .build());
     Label match =
-        TestTargetHeuristic.chooseTestTargetForSourceFile(getProject(), source, targets, null);
-    assertThat(match).isEqualTo(new Label("//foo:test2"));
+        TestTargetHeuristic.chooseTestTargetForSourceFile(
+            getProject(), null, source, targets, null);
+    assertThat(match).isEqualTo(Label.create("//foo:test2"));
   }
 
   @Test
@@ -96,8 +97,9 @@
             TargetIdeInfo.builder().setLabel("//foo:FirstTest").setKind("java_test").build(),
             TargetIdeInfo.builder().setLabel("//foo:FooTest").setKind("java_test").build());
     Label match =
-        TestTargetHeuristic.chooseTestTargetForSourceFile(getProject(), source, targets, null);
-    assertThat(match).isEqualTo(new Label("//foo:FooTest"));
+        TestTargetHeuristic.chooseTestTargetForSourceFile(
+            getProject(), null, source, targets, null);
+    assertThat(match).isEqualTo(Label.create("//foo:FooTest"));
   }
 
   @Test
@@ -117,8 +119,8 @@
                 .build());
     Label match =
         TestTargetHeuristic.chooseTestTargetForSourceFile(
-            getProject(), source, targets, TestSize.LARGE);
-    assertThat(match).isEqualTo(new Label("//bar:BarTest"));
+            getProject(), null, source, targets, TestSize.LARGE);
+    assertThat(match).isEqualTo(Label.create("//bar:BarTest"));
   }
 
   @Test
@@ -138,8 +140,8 @@
                 .build());
     Label match =
         TestTargetHeuristic.chooseTestTargetForSourceFile(
-            getProject(), source, targets, TestSize.SMALL);
-    assertThat(match).isEqualTo(new Label("//foo:FooTest"));
+            getProject(), null, source, targets, TestSize.SMALL);
+    assertThat(match).isEqualTo(Label.create("//foo:FooTest"));
   }
 
   @Test
@@ -161,8 +163,8 @@
                 .build());
     Label match =
         TestTargetHeuristic.chooseTestTargetForSourceFile(
-            getProject(), source, targets, TestSize.SMALL);
-    assertThat(match).isEqualTo(new Label("//foo:test2"));
+            getProject(), null, source, targets, TestSize.SMALL);
+    assertThat(match).isEqualTo(Label.create("//foo:test2"));
   }
 
   private static ArtifactLocation sourceRoot(String relativePath) {
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/run/exporter/RunConfigurationSerializerTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/run/exporter/RunConfigurationSerializerTest.java
index 775e65f..0a28d06 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/run/exporter/RunConfigurationSerializerTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/run/exporter/RunConfigurationSerializerTest.java
@@ -80,7 +80,7 @@
 
   @Test
   public void testRunConfigurationUnalteredBySerializationRoundTrip() throws InvalidDataException {
-    configuration.setTarget(new Label("//package:rule"));
+    configuration.setTarget(Label.create("//package:rule"));
     configuration.setKeepInSync(true);
 
     final Element initialElement = runManager.getState();
@@ -99,7 +99,7 @@
 
   @Test
   public void testSetKeepInSyncWhenImporting() throws InvalidDataException {
-    configuration.setTarget(new Label("//package:rule"));
+    configuration.setTarget(Label.create("//package:rule"));
     configuration.setKeepInSync(false);
 
     Element element = RunConfigurationSerializer.writeToXml(configuration);
diff --git a/base/tests/integrationtests/com/google/idea/blaze/base/sync/ImportRootsTest.java b/base/tests/integrationtests/com/google/idea/blaze/base/sync/ImportRootsTest.java
index 84bf00f..df9a08f 100644
--- a/base/tests/integrationtests/com/google/idea/blaze/base/sync/ImportRootsTest.java
+++ b/base/tests/integrationtests/com/google/idea/blaze/base/sync/ImportRootsTest.java
@@ -87,8 +87,18 @@
             .add(new DirectoryEntry(new WorkspacePath(""), true))
             .build();
 
-    assertThat(importRoots.importAsSource(new Label("//:target"))).isTrue();
-    assertThat(importRoots.importAsSource(new Label("//foo/bar:target"))).isTrue();
+    assertThat(importRoots.importAsSource(Label.create("//:target"))).isTrue();
+    assertThat(importRoots.importAsSource(Label.create("//foo/bar:target"))).isTrue();
+  }
+
+  @Test
+  public void testExternalWorkspaceLabelsNotIncludedUnderWorkspaceRoot() {
+    ImportRoots importRoots =
+        ImportRoots.builder(workspaceRoot, BuildSystem.Blaze)
+            .add(new DirectoryEntry(new WorkspacePath(""), true))
+            .build();
+
+    assertThat(importRoots.importAsSource(Label.create("@lib//:target"))).isFalse();
   }
 
   @Test
@@ -138,4 +148,55 @@
             .build();
     assertThat(importRoots.excludeDirectories()).containsExactly(new WorkspacePath("root"));
   }
+
+  @Test
+  public void testContainsWorkspacePath_samePath() throws Exception {
+    ImportRoots importRoots =
+        ImportRoots.builder(workspaceRoot, BuildSystem.Blaze)
+            .add(DirectoryEntry.include(new WorkspacePath("root")))
+            .build();
+
+    assertThat(importRoots.containsWorkspacePath(new WorkspacePath("root"))).isTrue();
+  }
+
+  @Test
+  public void testContainsWorkspacePath_subdirectory() throws Exception {
+    ImportRoots importRoots =
+        ImportRoots.builder(workspaceRoot, BuildSystem.Blaze)
+            .add(DirectoryEntry.include(new WorkspacePath("root")))
+            .build();
+
+    assertThat(importRoots.containsWorkspacePath(new WorkspacePath("root/subdir"))).isTrue();
+  }
+
+  @Test
+  public void testContainsWorkspacePath_differentRoot() throws Exception {
+    ImportRoots importRoots =
+        ImportRoots.builder(workspaceRoot, BuildSystem.Blaze)
+            .add(DirectoryEntry.include(new WorkspacePath("root")))
+            .build();
+
+    assertThat(importRoots.containsWorkspacePath(new WorkspacePath("otherroot"))).isFalse();
+  }
+
+  @Test
+  public void testContainsWorkspacePath_similarRoot() throws Exception {
+    ImportRoots importRoots =
+        ImportRoots.builder(workspaceRoot, BuildSystem.Blaze)
+            .add(DirectoryEntry.include(new WorkspacePath("root")))
+            .build();
+
+    assertThat(importRoots.containsWorkspacePath(new WorkspacePath("root2/subdir"))).isFalse();
+  }
+
+  @Test
+  public void testContainsWorkspacePath_excludedParentsAreHandled() throws Exception {
+    ImportRoots importRoots =
+        ImportRoots.builder(workspaceRoot, BuildSystem.Blaze)
+            .add(DirectoryEntry.include(new WorkspacePath("root")))
+            .add(DirectoryEntry.exclude(new WorkspacePath("root/a")))
+            .build();
+
+    assertThat(importRoots.containsWorkspacePath(new WorkspacePath("root/a/b"))).isFalse();
+  }
 }
diff --git a/base/tests/unittests/com/google/idea/blaze/base/actions/BlazeBuildServiceTest.java b/base/tests/unittests/com/google/idea/blaze/base/actions/BlazeBuildServiceTest.java
index 607aa15..23e40c8 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/actions/BlazeBuildServiceTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/actions/BlazeBuildServiceTest.java
@@ -61,7 +61,7 @@
   protected void initTest(Container applicationServices, Container projectServices) {
     BlazeImportSettingsManager importSettingsManager = new BlazeImportSettingsManager();
     importSettingsManager.setImportSettings(
-        new BlazeImportSettings("", "", "", "", "", Blaze.BuildSystem.Blaze));
+        new BlazeImportSettings("", "", "", "", Blaze.BuildSystem.Blaze));
     projectServices.register(BlazeImportSettingsManager.class, importSettingsManager);
 
     ProjectView view =
@@ -91,7 +91,7 @@
   @Test
   public void testBuildFile() {
     ImmutableCollection<Label> labels =
-        ImmutableList.of(new Label("//foo:bar"), new Label("//foo:baz"));
+        ImmutableList.of(Label.create("//foo:bar"), Label.create("//foo:baz"));
     List<TargetExpression> targets = Lists.newArrayList(labels);
     service.buildFile(project, "Foo.java", labels);
     verify(service).buildTargetExpressions(eq(project), eq(targets), eq(viewSet), any());
diff --git a/base/tests/unittests/com/google/idea/blaze/base/command/BlazeCommandTest.java b/base/tests/unittests/com/google/idea/blaze/base/command/BlazeCommandTest.java
index d50882b..30f41fa 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/command/BlazeCommandTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/command/BlazeCommandTest.java
@@ -47,7 +47,7 @@
   public void addedFlagsShouldGoAtStart() {
     List<String> flagsCommand =
         BlazeCommand.builder("/usr/bin/blaze", BlazeCommandName.RUN)
-            .addTargets(new Label("//a:b"))
+            .addTargets(Label.create("//a:b"))
             .addBlazeFlags("--flag1", "--flag2")
             .addExeFlags("--exeFlag1", "--exeFlag2")
             .build()
@@ -60,7 +60,7 @@
   public void targetsShouldGoAfterBlazeFlagsAndDoubleHyphen() {
     List<String> command =
         BlazeCommand.builder("/usr/bin/blaze", BlazeCommandName.RUN)
-            .addTargets(new Label("//a:b"), new Label("//c:d"))
+            .addTargets(Label.create("//a:b"), Label.create("//c:d"))
             .addBlazeFlags("--flag1", "--flag2")
             .addExeFlags("--exeFlag1", "--exeFlag2")
             .build()
@@ -75,7 +75,7 @@
   public void exeFlagsShouldGoLast() {
     List<String> command =
         BlazeCommand.builder("/usr/bin/blaze", BlazeCommandName.RUN)
-            .addTargets(new Label("//a:b"), new Label("//c:d"))
+            .addTargets(Label.create("//a:b"), Label.create("//c:d"))
             .addBlazeFlags("--flag1", "--flag2")
             .addExeFlags("--exeFlag1", "--exeFlag2")
             .build()
@@ -89,7 +89,7 @@
     List<String> command =
         BlazeCommand.builder("/usr/bin/blaze", BlazeCommandName.RUN)
             .addTargets(
-                new Label("//a:b"), TargetExpression.fromString("-//e:f"), new Label("//c:d"))
+                Label.create("//a:b"), TargetExpression.fromString("-//e:f"), Label.create("//c:d"))
             .addBlazeFlags("--flag1", "--flag2")
             .addExeFlags("--exeFlag1", "--exeFlag2")
             .build()
diff --git a/base/tests/unittests/com/google/idea/blaze/base/issueparser/BlazeIssueParserTest.java b/base/tests/unittests/com/google/idea/blaze/base/issueparser/BlazeIssueParserTest.java
index 437822a..6ed7193 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/issueparser/BlazeIssueParserTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/issueparser/BlazeIssueParserTest.java
@@ -77,6 +77,7 @@
             new BlazeIssueParser.CompileParser(workspaceRoot),
             new BlazeIssueParser.TracebackParser(),
             new BlazeIssueParser.BuildParser(),
+            new BlazeIssueParser.SkylarkErrorParser(),
             new BlazeIssueParser.LinelessBuildParser(),
             new BlazeIssueParser.ProjectViewLabelParser(projectViewSet),
             new BlazeIssueParser.InvalidTargetProjectViewPackageParser(
@@ -150,6 +151,22 @@
   }
 
   @Test
+  public void testParseSkylarkError() {
+    BlazeIssueParser blazeIssueParser = new BlazeIssueParser(parsers);
+    IssueOutput issue =
+        blazeIssueParser.parseIssue(
+            "ERROR: /root/third_party/bazel/tools/ide/intellij_info_impl.bzl:42:12: "
+                + "Variable artifact_location is read only");
+    assertNotNull(issue);
+    assertThat(issue.getFile().getPath())
+        .isEqualTo("/root/third_party/bazel/tools/ide/intellij_info_impl.bzl");
+    assertThat(issue.getLine()).isEqualTo(42);
+    assertThat(issue.getColumn()).isEqualTo(12);
+    assertThat(issue.getMessage()).isEqualTo("Variable artifact_location is read only");
+    assertThat(issue.getCategory()).isEqualTo(IssueOutput.Category.ERROR);
+  }
+
+  @Test
   public void testParseLinelessBuildError() {
     BlazeIssueParser blazeIssueParser = new BlazeIssueParser(parsers);
     IssueOutput issue =
diff --git a/base/tests/unittests/com/google/idea/blaze/base/model/primitives/LabelTest.java b/base/tests/unittests/com/google/idea/blaze/base/model/primitives/LabelTest.java
index 4ceb066..9227a6b 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/model/primitives/LabelTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/model/primitives/LabelTest.java
@@ -68,4 +68,47 @@
     assertThat(Label.validate("foo")).isFalse();
     assertThat(Label.validate("foo:bar")).isFalse();
   }
+
+  @Test
+  public void testFactoryMethod() {
+    String fullLabel = "//package/path:target/name";
+    Label label = Label.create(fullLabel);
+    assertThat(label.toString()).isEqualTo(fullLabel);
+    assertThat(label.blazePackage()).isEqualTo(new WorkspacePath("package/path"));
+    assertThat(label.targetName()).isEqualTo(TargetName.create("target/name"));
+  }
+
+  @Test
+  public void testFactoryMethodExternalWorkspace() {
+    String fullLabel = "@ext_workspace//package/path:target/name";
+    Label label = Label.create(fullLabel);
+    assertThat(label.toString()).isEqualTo(fullLabel);
+    assertThat(label.externalWorkspaceName()).isEqualTo("ext_workspace");
+    assertThat(label.blazePackage()).isEqualTo(new WorkspacePath("package/path"));
+    assertThat(label.targetName()).isEqualTo(TargetName.create("target/name"));
+  }
+
+  @Test
+  public void testConstructor() {
+    String externalWorkspaceName = "ext_workspace";
+    WorkspacePath packagePath = new WorkspacePath("package/path");
+    TargetName targetName = TargetName.create("target/name");
+
+    Label label = Label.create(externalWorkspaceName, packagePath, targetName);
+    assertThat(label.toString()).isEqualTo("@ext_workspace//package/path:target/name");
+    assertThat(label.externalWorkspaceName()).isEqualTo(externalWorkspaceName);
+    assertThat(label.blazePackage()).isEqualTo(packagePath);
+    assertThat(label.targetName()).isEqualTo(targetName);
+  }
+
+  @Test
+  public void testConstructorExternalWorkspace() {
+    WorkspacePath packagePath = new WorkspacePath("package/path");
+    TargetName targetName = TargetName.create("target/name");
+
+    Label label = Label.create(packagePath, targetName);
+    assertThat(label.toString()).isEqualTo("//package/path:target/name");
+    assertThat(label.blazePackage()).isEqualTo(packagePath);
+    assertThat(label.targetName()).isEqualTo(targetName);
+  }
 }
diff --git a/base/tests/unittests/com/google/idea/blaze/base/projectview/ProjectViewSetTest.java b/base/tests/unittests/com/google/idea/blaze/base/projectview/ProjectViewSetTest.java
index 7758293..9f1ad20 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/projectview/ProjectViewSetTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/projectview/ProjectViewSetTest.java
@@ -40,6 +40,7 @@
 import com.google.idea.blaze.base.projectview.section.sections.ImportTargetOutputSection;
 import com.google.idea.blaze.base.projectview.section.sections.RunConfigurationsSection;
 import com.google.idea.blaze.base.projectview.section.sections.Sections;
+import com.google.idea.blaze.base.projectview.section.sections.ShardBlazeBuildsSection;
 import com.google.idea.blaze.base.projectview.section.sections.TargetSection;
 import com.google.idea.blaze.base.projectview.section.sections.TestSourceSection;
 import com.google.idea.blaze.base.projectview.section.sections.TextBlock;
@@ -83,9 +84,10 @@
                     .add(ListSection.builder(BuildFlagsSection.KEY).add("--android_sdk=abcd"))
                     .add(
                         ListSection.builder(ImportTargetOutputSection.KEY)
-                            .add(new Label("//test:test")))
+                            .add(Label.create("//test:test")))
                     .add(
-                        ListSection.builder(ExcludeTargetSection.KEY).add(new Label("//test:test")))
+                        ListSection.builder(ExcludeTargetSection.KEY)
+                            .add(Label.create("//test:test")))
                     .add(ScalarSection.builder(WorkspaceTypeSection.KEY).set(WorkspaceType.JAVA))
                     .add(
                         ListSection.builder(AdditionalLanguagesSection.KEY).add(LanguageClass.JAVA))
@@ -93,6 +95,7 @@
                     .add(
                         ListSection.builder(RunConfigurationsSection.KEY)
                             .add(new WorkspacePath("test")))
+                    .add(ScalarSection.builder(ShardBlazeBuildsSection.KEY).set(false))
                     .build())
             .build();
 
diff --git a/base/tests/unittests/com/google/idea/blaze/base/projectview/ProjectViewVerifierTest.java b/base/tests/unittests/com/google/idea/blaze/base/projectview/ProjectViewVerifierTest.java
index fe15957..1b2e31c 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/projectview/ProjectViewVerifierTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/projectview/ProjectViewVerifierTest.java
@@ -15,6 +15,7 @@
  */
 package com.google.idea.blaze.base.projectview;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import com.google.idea.blaze.base.BlazeTestCase;
@@ -35,6 +36,7 @@
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolverImpl;
+import com.intellij.openapi.extensions.impl.ExtensionPointImpl;
 import java.io.File;
 import java.util.Set;
 import org.jetbrains.annotations.NotNull;
@@ -60,7 +62,20 @@
   protected void initTest(
       @NotNull Container applicationServices, @NotNull Container projectServices) {
     super.initTest(applicationServices, projectServices);
-    registerExtensionPoint(BlazeSyncPlugin.EP_NAME, BlazeSyncPlugin.class);
+    ExtensionPointImpl<BlazeSyncPlugin> ep =
+        registerExtensionPoint(BlazeSyncPlugin.EP_NAME, BlazeSyncPlugin.class);
+    ep.registerExtension(
+        new BlazeSyncPlugin.Adapter() {
+          @Override
+          public ImmutableList<WorkspaceType> getSupportedWorkspaceTypes() {
+            return ImmutableList.of(WorkspaceType.JAVA);
+          }
+
+          @Override
+          public Set<LanguageClass> getSupportedLanguagesInWorkspace(WorkspaceType workspaceType) {
+            return ImmutableSet.of(LanguageClass.JAVA);
+          }
+        });
 
     fileAttributeProvider = new MockFileAttributeProvider(workspaceRoot);
     applicationServices.register(FileAttributeProvider.class, fileAttributeProvider);
@@ -86,7 +101,7 @@
             .build();
     fileAttributeProvider.addProjectView(projectViewSet);
     ProjectViewVerifier.verifyProjectView(
-        context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
+        project, context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
     errorCollector.assertNoIssues();
   }
 
@@ -108,7 +123,7 @@
             .build();
     fileAttributeProvider.addProjectView(projectViewSet);
     ProjectViewVerifier.verifyProjectView(
-        context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
+        project, context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
     errorCollector.assertIssues(
         "java/com/google/android/apps/example is included, "
             + "but that contradicts java/com/google/android/apps/example which was excluded");
@@ -132,7 +147,7 @@
             .build();
     fileAttributeProvider.addProjectView(projectViewSet);
     ProjectViewVerifier.verifyProjectView(
-        context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
+        project, context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
     errorCollector.assertIssues(
         "java/com/google/android/apps/example is included, "
             + "but that contradicts java/com/google/android/apps which was excluded");
@@ -157,7 +172,7 @@
             .build();
     fileAttributeProvider.addProjectView(projectViewSet);
     ProjectViewVerifier.verifyProjectView(
-        context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
+        project, context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
     errorCollector.assertNoIssues();
   }
 
@@ -175,7 +190,7 @@
                     .build())
             .build();
     ProjectViewVerifier.verifyProjectView(
-        context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
+        project, context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
     errorCollector.assertIssues(
         String.format(
             "Directory '%s' specified in project view not found.",
@@ -197,7 +212,7 @@
             .build();
     fileAttributeProvider.addFile(new WorkspacePath("java/com/google/android/apps/example"));
     ProjectViewVerifier.verifyProjectView(
-        context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
+        project, context, workspacePathResolver, projectViewSet, workspaceLanguageSettings);
     errorCollector.assertIssues(
         String.format(
             "Directory '%s' specified in project view is a file.",
diff --git a/base/tests/unittests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationTest.java b/base/tests/unittests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationTest.java
index 989cb80..f0047bd 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/run/BlazeCommandRunConfigurationTest.java
@@ -43,7 +43,7 @@
 @RunWith(JUnit4.class)
 public class BlazeCommandRunConfigurationTest extends BlazeTestCase {
   private static final BlazeImportSettings DUMMY_IMPORT_SETTINGS =
-      new BlazeImportSettings("", "", "", "", "", Blaze.BuildSystem.Blaze);
+      new BlazeImportSettings("", "", "", "", Blaze.BuildSystem.Blaze);
 
   private final BlazeCommandRunConfigurationType type = new BlazeCommandRunConfigurationType();
   private BlazeCommandRunConfiguration configuration;
@@ -70,7 +70,7 @@
 
   @Test
   public void readAndWriteShouldMatch() throws Exception {
-    Label label = new Label("//package:rule");
+    Label label = Label.create("//package:rule");
     configuration.setTarget(label);
 
     Element element = new Element("test");
diff --git a/base/tests/unittests/com/google/idea/blaze/base/run/RuleNameHeuristicTest.java b/base/tests/unittests/com/google/idea/blaze/base/run/RuleNameHeuristicTest.java
index f7a0857..70a85be 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/run/RuleNameHeuristicTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/run/RuleNameHeuristicTest.java
@@ -46,7 +46,8 @@
     File source = new File("java/com/foo/FooTest.java");
     TargetIdeInfo target =
         TargetIdeInfo.builder().setLabel("//foo:FooTest").setKind("java_test").build();
-    assertThat(new TargetNameHeuristic().matchesSource(project, target, source, null)).isTrue();
+    assertThat(new TargetNameHeuristic().matchesSource(project, target, null, source, null))
+        .isTrue();
   }
 
   @Test
@@ -54,7 +55,8 @@
     File source = new File("java/com/foo/FooTest.java");
     TargetIdeInfo target =
         TargetIdeInfo.builder().setLabel("//foo:foo/FooTest").setKind("java_test").build();
-    assertThat(new TargetNameHeuristic().matchesSource(project, target, source, null)).isTrue();
+    assertThat(new TargetNameHeuristic().matchesSource(project, target, null, source, null))
+        .isTrue();
   }
 
   @Test
@@ -62,7 +64,8 @@
     File source = new File("java/com/foo/BarFooTest.java");
     TargetIdeInfo target =
         TargetIdeInfo.builder().setLabel("//foo:FooTest").setKind("java_test").build();
-    assertThat(new TargetNameHeuristic().matchesSource(project, target, source, null)).isFalse();
+    assertThat(new TargetNameHeuristic().matchesSource(project, target, null, source, null))
+        .isFalse();
   }
 
   @Test
@@ -70,7 +73,8 @@
     File source = new File("java/com/foo/FooTest.java");
     TargetIdeInfo target =
         TargetIdeInfo.builder().setLabel("//foo:bar/FooTest").setKind("java_test").build();
-    assertThat(new TargetNameHeuristic().matchesSource(project, target, source, null)).isFalse();
+    assertThat(new TargetNameHeuristic().matchesSource(project, target, null, source, null))
+        .isFalse();
   }
 
   @Test
@@ -78,7 +82,8 @@
     File source = new File("java/com/foo/FooTest.java");
     TargetIdeInfo target =
         TargetIdeInfo.builder().setLabel("//foo:ForTest").setKind("java_test").build();
-    assertThat(new TargetNameHeuristic().matchesSource(project, target, source, null)).isFalse();
+    assertThat(new TargetNameHeuristic().matchesSource(project, target, null, source, null))
+        .isFalse();
   }
 
   @Test
@@ -88,8 +93,9 @@
         ImmutableList.of(
             TargetIdeInfo.builder().setLabel("//foo:FirstTest").setKind("java_test").build(),
             TargetIdeInfo.builder().setLabel("//bar:OtherTest").setKind("java_test").build());
-    Label match = TestTargetHeuristic.chooseTestTargetForSourceFile(project, source, targets, null);
-    assertThat(match).isEqualTo(new Label("//foo:FirstTest"));
+    Label match =
+        TestTargetHeuristic.chooseTestTargetForSourceFile(project, null, source, targets, null);
+    assertThat(match).isEqualTo(Label.create("//foo:FirstTest"));
   }
 
   @Test
@@ -99,8 +105,9 @@
         ImmutableList.of(
             TargetIdeInfo.builder().setLabel("//bar:FirstTest").setKind("java_test").build(),
             TargetIdeInfo.builder().setLabel("//foo:FooTest").setKind("java_test").build());
-    Label match = TestTargetHeuristic.chooseTestTargetForSourceFile(project, source, targets, null);
-    assertThat(match).isEqualTo(new Label("//foo:FooTest"));
+    Label match =
+        TestTargetHeuristic.chooseTestTargetForSourceFile(project, null, source, targets, null);
+    assertThat(match).isEqualTo(Label.create("//foo:FooTest"));
   }
 
   @Test
@@ -111,7 +118,8 @@
             TargetIdeInfo.builder().setLabel("//bar:OtherTest").setKind("java_test").build(),
             TargetIdeInfo.builder().setLabel("//foo:FooTest").setKind("java_test").build(),
             TargetIdeInfo.builder().setLabel("//bar/foo:FooTest").setKind("java_test").build());
-    Label match = TestTargetHeuristic.chooseTestTargetForSourceFile(project, source, targets, null);
-    assertThat(match).isEqualTo(new Label("//foo:FooTest"));
+    Label match =
+        TestTargetHeuristic.chooseTestTargetForSourceFile(project, null, source, targets, null);
+    assertThat(match).isEqualTo(Label.create("//foo:FooTest"));
   }
 }
diff --git a/base/tests/unittests/com/google/idea/blaze/base/run/TestSizeHeuristicTest.java b/base/tests/unittests/com/google/idea/blaze/base/run/TestSizeHeuristicTest.java
index 34a41d4..9df7417 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/run/TestSizeHeuristicTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/run/TestSizeHeuristicTest.java
@@ -51,7 +51,8 @@
             .setKind("java_test")
             .setTestInfo(TestIdeInfo.builder().setTestSize(TestSize.MEDIUM))
             .build();
-    assertThat(new TestSizeHeuristic().matchesSource(project, target, source, TestSize.MEDIUM))
+    assertThat(
+            new TestSizeHeuristic().matchesSource(project, target, null, source, TestSize.MEDIUM))
         .isTrue();
   }
 
@@ -64,7 +65,7 @@
             .setKind("java_test")
             .setTestInfo(TestIdeInfo.builder().setTestSize(TestSize.MEDIUM))
             .build();
-    assertThat(new TestSizeHeuristic().matchesSource(project, target, source, TestSize.SMALL))
+    assertThat(new TestSizeHeuristic().matchesSource(project, target, null, source, TestSize.SMALL))
         .isFalse();
   }
 
@@ -77,7 +78,7 @@
             .setKind("java_test")
             .setTestInfo(TestIdeInfo.builder().setTestSize(TestSize.SMALL))
             .build();
-    assertThat(new TestSizeHeuristic().matchesSource(project, target, source, null)).isTrue();
+    assertThat(new TestSizeHeuristic().matchesSource(project, target, null, source, null)).isTrue();
 
     target =
         TargetIdeInfo.builder()
@@ -85,7 +86,8 @@
             .setKind("java_test")
             .setTestInfo(TestIdeInfo.builder().setTestSize(TestSize.MEDIUM))
             .build();
-    assertThat(new TestSizeHeuristic().matchesSource(project, target, source, null)).isFalse();
+    assertThat(new TestSizeHeuristic().matchesSource(project, target, null, source, null))
+        .isFalse();
   }
 
   @Test
@@ -109,8 +111,9 @@
                 .setTestInfo(TestIdeInfo.builder().setTestSize(TestSize.ENORMOUS))
                 .build());
     Label match =
-        TestTargetHeuristic.chooseTestTargetForSourceFile(project, source, rules, TestSize.SMALL);
-    assertThat(match).isEqualTo(new Label("//foo:test1"));
+        TestTargetHeuristic.chooseTestTargetForSourceFile(
+            project, null, source, rules, TestSize.SMALL);
+    assertThat(match).isEqualTo(Label.create("//foo:test1"));
   }
 
   @Test
@@ -129,8 +132,9 @@
                 .setTestInfo(TestIdeInfo.builder().setTestSize(TestSize.SMALL))
                 .build());
     Label match =
-        TestTargetHeuristic.chooseTestTargetForSourceFile(project, source, rules, TestSize.SMALL);
-    assertThat(match).isEqualTo(new Label("//foo:test2"));
+        TestTargetHeuristic.chooseTestTargetForSourceFile(
+            project, null, source, rules, TestSize.SMALL);
+    assertThat(match).isEqualTo(Label.create("//foo:test2"));
   }
 
   @Test
@@ -154,7 +158,8 @@
                 .setTestInfo(TestIdeInfo.builder().setTestSize(TestSize.SMALL))
                 .build());
     Label match =
-        TestTargetHeuristic.chooseTestTargetForSourceFile(project, source, rules, TestSize.SMALL);
-    assertThat(match).isEqualTo(new Label("//foo:test2"));
+        TestTargetHeuristic.chooseTestTargetForSourceFile(
+            project, null, source, rules, TestSize.SMALL);
+    assertThat(match).isEqualTo(Label.create("//foo:test2"));
   }
 }
diff --git a/base/tests/unittests/com/google/idea/blaze/base/run/TestTargetSourcesHeuristicTest.java b/base/tests/unittests/com/google/idea/blaze/base/run/TestTargetSourcesHeuristicTest.java
index 37ec7ae..0663264 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/run/TestTargetSourcesHeuristicTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/run/TestTargetSourcesHeuristicTest.java
@@ -58,7 +58,7 @@
     File source = workspaceRoot.fileForPath(new WorkspacePath("java/com/foo/FooTest.java"));
     TargetIdeInfo target =
         TargetIdeInfo.builder().setLabel("//foo:test").setKind("java_test").build();
-    assertThat(new TestTargetSourcesHeuristic().matchesSource(project, target, source, null))
+    assertThat(new TestTargetSourcesHeuristic().matchesSource(project, target, null, source, null))
         .isFalse();
   }
 
@@ -71,7 +71,7 @@
             .setKind("java_test")
             .addSource(sourceRoot("java/com/bar/OtherTest.java"))
             .build();
-    assertThat(new TestTargetSourcesHeuristic().matchesSource(project, target, source, null))
+    assertThat(new TestTargetSourcesHeuristic().matchesSource(project, target, null, source, null))
         .isFalse();
   }
 
@@ -85,7 +85,7 @@
             .addSource(sourceRoot("java/com/bar/OtherTest.java"))
             .addSource(sourceRoot("java/com/foo/FooTest.java"))
             .build();
-    assertThat(new TestTargetSourcesHeuristic().matchesSource(project, target, source, null))
+    assertThat(new TestTargetSourcesHeuristic().matchesSource(project, target, null, source, null))
         .isTrue();
   }
 
@@ -100,8 +100,9 @@
                 .addSource(sourceRoot("java/com/bar/OtherTest.java"))
                 .build(),
             TargetIdeInfo.builder().setLabel("//foo:test2").setKind("java_test").build());
-    Label match = TestTargetHeuristic.chooseTestTargetForSourceFile(project, source, rules, null);
-    assertThat(match).isEqualTo(new Label("//foo:test1"));
+    Label match =
+        TestTargetHeuristic.chooseTestTargetForSourceFile(project, null, source, rules, null);
+    assertThat(match).isEqualTo(Label.create("//foo:test1"));
   }
 
   @Test
@@ -119,8 +120,9 @@
                 .setKind("java_test")
                 .addSource(sourceRoot("java/com/foo/FooTest.java"))
                 .build());
-    Label match = TestTargetHeuristic.chooseTestTargetForSourceFile(project, source, rules, null);
-    assertThat(match).isEqualTo(new Label("//foo:test2"));
+    Label match =
+        TestTargetHeuristic.chooseTestTargetForSourceFile(project, null, source, rules, null);
+    assertThat(match).isEqualTo(Label.create("//foo:test2"));
   }
 
   private static ArtifactLocation sourceRoot(String relativePath) {
diff --git a/base/tests/unittests/com/google/idea/blaze/base/run/filter/BlazeTargetFilterTest.java b/base/tests/unittests/com/google/idea/blaze/base/run/filter/BlazeTargetFilterTest.java
new file mode 100644
index 0000000..4563886
--- /dev/null
+++ b/base/tests/unittests/com/google/idea/blaze/base/run/filter/BlazeTargetFilterTest.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.run.filter;
+
+import static com.google.common.truth.Truth.assertThat;
+import static com.google.idea.blaze.base.run.filter.BlazeTargetFilter.TARGET_PATTERN;
+
+import java.util.regex.Matcher;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit tests for {@link BlazeTargetFilter}. */
+@RunWith(JUnit4.class)
+public class BlazeTargetFilterTest {
+
+  @Test
+  public void testSimpleTarget() {
+    String line = "Something //package:target_name something else";
+    Matcher matcher = TARGET_PATTERN.matcher(line);
+    assertThat(matcher.find()).isTrue();
+    assertThat(matcher.group()).isEqualTo("//package:target_name");
+  }
+
+  @Test
+  public void testExternalWorkspaceTarget() {
+    String line = "Something @ext//package:target_name something else";
+    Matcher matcher = TARGET_PATTERN.matcher(line);
+    assertThat(matcher.find()).isTrue();
+    assertThat(matcher.group()).isEqualTo("@ext//package:target_name");
+  }
+
+  @Test
+  public void testQuotedTarget() {
+    String line = "Something '//package:target_name' something else";
+    Matcher matcher = TARGET_PATTERN.matcher(line);
+    assertThat(matcher.find()).isTrue();
+    assertThat(matcher.group()).isEqualTo("//package:target_name");
+  }
+
+  @Test
+  public void testUnusualCharsInTarget() {
+    String line = "Something //Package-._$():T0+,=~#target_@name something else";
+    Matcher matcher = TARGET_PATTERN.matcher(line);
+    assertThat(matcher.find()).isTrue();
+    assertThat(matcher.group()).isEqualTo("//Package-._$():T0+,=~#target_@name");
+  }
+}
diff --git a/base/tests/unittests/com/google/idea/blaze/base/run/state/BlazeCommandRunConfigurationCommonStateTest.java b/base/tests/unittests/com/google/idea/blaze/base/run/state/BlazeCommandRunConfigurationCommonStateTest.java
index e94bedf..5aa8521 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/run/state/BlazeCommandRunConfigurationCommonStateTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/run/state/BlazeCommandRunConfigurationCommonStateTest.java
@@ -37,7 +37,7 @@
 @RunWith(JUnit4.class)
 public class BlazeCommandRunConfigurationCommonStateTest extends BlazeTestCase {
   private static final BlazeImportSettings DUMMY_IMPORT_SETTINGS =
-      new BlazeImportSettings("", "", "", "", "", Blaze.BuildSystem.Blaze);
+      new BlazeImportSettings("", "", "", "", Blaze.BuildSystem.Blaze);
   private static final BlazeCommandName COMMAND = BlazeCommandName.fromString("command");
 
   private BlazeCommandRunConfigurationCommonState state;
@@ -57,10 +57,10 @@
 
   @Test
   public void readAndWriteShouldMatch() throws Exception {
-    state.setCommand(COMMAND);
-    state.setBlazeFlags(ImmutableList.of("--flag1", "--flag2"));
-    state.setExeFlags(ImmutableList.of("--exeFlag1"));
-    state.setBlazeBinary("/usr/bin/blaze");
+    state.getCommandState().setCommand(COMMAND);
+    state.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
+    state.getExeFlagsState().setRawFlags(ImmutableList.of("--exeFlag1"));
+    state.getBlazeBinaryState().setBlazeBinary("/usr/bin/blaze");
 
     Element element = new Element("test");
     state.writeExternal(element);
@@ -68,10 +68,12 @@
         new BlazeCommandRunConfigurationCommonState(Blaze.getBuildSystem(project));
     readState.readExternal(element);
 
-    assertThat(readState.getCommand()).isEqualTo(COMMAND);
-    assertThat(readState.getBlazeFlags()).containsExactly("--flag1", "--flag2").inOrder();
-    assertThat(readState.getExeFlags()).containsExactly("--exeFlag1");
-    assertThat(readState.getBlazeBinary()).isEqualTo("/usr/bin/blaze");
+    assertThat(readState.getCommandState().getCommand()).isEqualTo(COMMAND);
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .containsExactly("--flag1", "--flag2")
+        .inOrder();
+    assertThat(readState.getExeFlagsState().getRawFlags()).containsExactly("--exeFlag1");
+    assertThat(readState.getBlazeBinaryState().getBlazeBinary()).isEqualTo("/usr/bin/blaze");
   }
 
   @Test
@@ -82,16 +84,24 @@
         new BlazeCommandRunConfigurationCommonState(Blaze.getBuildSystem(project));
     readState.readExternal(element);
 
-    assertThat(readState.getCommand()).isEqualTo(state.getCommand());
-    assertThat(readState.getBlazeFlags()).isEqualTo(state.getBlazeFlags());
-    assertThat(readState.getExeFlags()).isEqualTo(state.getExeFlags());
-    assertThat(readState.getBlazeBinary()).isEqualTo(state.getBlazeBinary());
+    assertThat(readState.getCommandState().getCommand())
+        .isEqualTo(state.getCommandState().getCommand());
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(state.getBlazeFlagsState().getRawFlags());
+    assertThat(readState.getExeFlagsState().getRawFlags())
+        .isEqualTo(state.getExeFlagsState().getRawFlags());
+    assertThat(readState.getBlazeBinaryState().getBlazeBinary())
+        .isEqualTo(state.getBlazeBinaryState().getBlazeBinary());
   }
 
   @Test
   public void readShouldOmitEmptyFlags() throws Exception {
-    state.setBlazeFlags(Lists.newArrayList("hi ", "", "I'm", " ", "\t", "Josh\r\n", "\n"));
-    state.setExeFlags(Lists.newArrayList("hi ", "", "I'm", " ", "\t", "Josh\r\n", "\n"));
+    state
+        .getBlazeFlagsState()
+        .setRawFlags(Lists.newArrayList("hi ", "", "I'm", " ", "\t", "Josh\r\n", "\n"));
+    state
+        .getExeFlagsState()
+        .setRawFlags(Lists.newArrayList("hi ", "", "I'm", " ", "\t", "Josh\r\n", "\n"));
 
     Element element = new Element("test");
     state.writeExternal(element);
@@ -99,18 +109,22 @@
         new BlazeCommandRunConfigurationCommonState(Blaze.getBuildSystem(project));
     readState.readExternal(element);
 
-    assertThat(readState.getBlazeFlags()).containsExactly("hi", "I'm", "Josh").inOrder();
-    assertThat(readState.getExeFlags()).containsExactly("hi", "I'm", "Josh").inOrder();
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .containsExactly("hi", "I'm", "Josh")
+        .inOrder();
+    assertThat(readState.getExeFlagsState().getRawFlags())
+        .containsExactly("hi", "I'm", "Josh")
+        .inOrder();
   }
 
   @Test
   public void repeatedWriteShouldNotChangeElement() throws Exception {
     final XMLOutputter xmlOutputter = new XMLOutputter(Format.getCompactFormat());
 
-    state.setCommand(COMMAND);
-    state.setBlazeFlags(ImmutableList.of("--flag1", "--flag2"));
-    state.setExeFlags(ImmutableList.of("--exeFlag1"));
-    state.setBlazeBinary("/usr/bin/blaze");
+    state.getCommandState().setCommand(COMMAND);
+    state.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
+    state.getExeFlagsState().setRawFlags(ImmutableList.of("--exeFlag1"));
+    state.getBlazeBinaryState().setBlazeBinary("/usr/bin/blaze");
 
     Element firstWrite = new Element("test");
     state.writeExternal(firstWrite);
@@ -125,20 +139,24 @@
   public void editorApplyToAndResetFromShouldMatch() throws Exception {
     RunConfigurationStateEditor editor = state.getEditor(project);
 
-    state.setCommand(COMMAND);
-    state.setBlazeFlags(ImmutableList.of("--flag1", "--flag2"));
-    state.setExeFlags(ImmutableList.of("--exeFlag1", "--exeFlag2"));
-    state.setBlazeBinary("/usr/bin/blaze");
+    state.getCommandState().setCommand(COMMAND);
+    state.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
+    state.getExeFlagsState().setRawFlags(ImmutableList.of("--exeFlag1", "--exeFlag2"));
+    state.getBlazeBinaryState().setBlazeBinary("/usr/bin/blaze");
 
     editor.resetEditorFrom(state);
     BlazeCommandRunConfigurationCommonState readState =
         new BlazeCommandRunConfigurationCommonState(Blaze.getBuildSystem(project));
     editor.applyEditorTo(readState);
 
-    assertThat(readState.getCommand()).isEqualTo(state.getCommand());
-    assertThat(readState.getBlazeFlags()).isEqualTo(state.getBlazeFlags());
-    assertThat(readState.getExeFlags()).isEqualTo(state.getExeFlags());
-    assertThat(readState.getBlazeBinary()).isEqualTo(state.getBlazeBinary());
+    assertThat(readState.getCommandState().getCommand())
+        .isEqualTo(state.getCommandState().getCommand());
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(state.getBlazeFlagsState().getRawFlags());
+    assertThat(readState.getExeFlagsState().getRawFlags())
+        .isEqualTo(state.getExeFlagsState().getRawFlags());
+    assertThat(readState.getBlazeBinaryState().getBlazeBinary())
+        .isEqualTo(state.getBlazeBinaryState().getBlazeBinary());
   }
 
   @Test
@@ -150,9 +168,13 @@
         new BlazeCommandRunConfigurationCommonState(Blaze.getBuildSystem(project));
     editor.applyEditorTo(readState);
 
-    assertThat(readState.getCommand()).isEqualTo(state.getCommand());
-    assertThat(readState.getBlazeFlags()).isEqualTo(state.getBlazeFlags());
-    assertThat(readState.getExeFlags()).isEqualTo(state.getExeFlags());
-    assertThat(readState.getBlazeBinary()).isEqualTo(state.getBlazeBinary());
+    assertThat(readState.getCommandState().getCommand())
+        .isEqualTo(state.getCommandState().getCommand());
+    assertThat(readState.getBlazeFlagsState().getRawFlags())
+        .isEqualTo(state.getBlazeFlagsState().getRawFlags());
+    assertThat(readState.getExeFlagsState().getRawFlags())
+        .isEqualTo(state.getExeFlagsState().getRawFlags());
+    assertThat(readState.getBlazeBinaryState().getBlazeBinary())
+        .isEqualTo(state.getBlazeBinaryState().getBlazeBinary());
   }
 }
diff --git a/base/tests/unittests/com/google/idea/blaze/base/run/state/RunConfigurationFlagStateTest.java b/base/tests/unittests/com/google/idea/blaze/base/run/state/RunConfigurationFlagStateTest.java
index 730ac3b..ec3daeb 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/run/state/RunConfigurationFlagStateTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/run/state/RunConfigurationFlagStateTest.java
@@ -32,26 +32,26 @@
     // not putting them back when converting back to a string.
     ImmutableList<String> flags = ImmutableList.of("--flag=\\\"Hello_world!\\\"", "--flag2");
     RunConfigurationFlagsState state = new RunConfigurationFlagsState("tag", "field");
-    state.setFlags(flags);
+    state.setRawFlags(flags);
 
     RunConfigurationStateEditor editor = state.getEditor(null);
     editor.resetEditorFrom(state);
     editor.applyEditorTo(state);
 
-    assertThat(state.getFlags()).isEqualTo(flags);
+    assertThat(state.getRawFlags()).isEqualTo(flags);
   }
 
   @Test
   public void testQuotesRetainedAfterReserialization() {
     ImmutableList<String> flags = ImmutableList.of("\"--flag=test\"");
     RunConfigurationFlagsState state = new RunConfigurationFlagsState("tag", "field");
-    state.setFlags(flags);
+    state.setRawFlags(flags);
 
     RunConfigurationStateEditor editor = state.getEditor(null);
     editor.resetEditorFrom(state);
     editor.applyEditorTo(state);
 
-    assertThat(state.getFlags()).isEqualTo(flags);
+    assertThat(state.getRawFlags()).isEqualTo(flags);
   }
 
   @Test
@@ -64,12 +64,12 @@
             "--test_filter=com.google.idea.blaze.base.run.state.RunConfigurationFlagStateTest#",
             "--define=ij_product=intellij-latest");
     RunConfigurationFlagsState state = new RunConfigurationFlagsState("tag", "field");
-    state.setFlags(flags);
+    state.setRawFlags(flags);
 
     RunConfigurationStateEditor editor = state.getEditor(null);
     editor.resetEditorFrom(state);
     editor.applyEditorTo(state);
 
-    assertThat(state.getFlags()).isEqualTo(flags);
+    assertThat(state.getRawFlags()).isEqualTo(flags);
   }
 }
diff --git a/base/tests/unittests/com/google/idea/blaze/base/run/testlogs/BlazeCommandLogParserTest.java b/base/tests/unittests/com/google/idea/blaze/base/run/testlogs/BlazeCommandLogParserTest.java
index e3e63ad..cc7ca2c 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/run/testlogs/BlazeCommandLogParserTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/run/testlogs/BlazeCommandLogParserTest.java
@@ -31,13 +31,23 @@
   @Test
   public void testParseTestXmlLine() {
     assertThat(BlazeCommandLogParser.parseTestTarget("//path/to:target    PASSED in 5.3s"))
-        .isEqualTo(new Label("//path/to:target"));
+        .isEqualTo(Label.create("//path/to:target"));
 
     assertThat(BlazeCommandLogParser.parseTestTarget("//path/to:target    FAILED in 5.3s"))
-        .isEqualTo(new Label("//path/to:target"));
+        .isEqualTo(Label.create("//path/to:target"));
 
     assertThat(BlazeCommandLogParser.parseTestTarget("//path/to:target (cached) PASSED in 5.3s"))
-        .isEqualTo(new Label("//path/to:target"));
+        .isEqualTo(Label.create("//path/to:target"));
+  }
+
+  @Test
+  public void testParseFailedTarget() {
+    assertThat(BlazeCommandLogParser.parseBuildFailure("Target //path/to:target failed to build"))
+        .isEqualTo(Label.create("//path/to:target"));
+    assertThat(BlazeCommandLogParser.parseTestTarget("Target //path/to:target failed to build"))
+        .isNull();
+    assertThat(BlazeCommandLogParser.parseBuildFailure("//path/to:target    FAILED in 5.3s"))
+        .isNull();
   }
 
   @Test
@@ -62,8 +72,8 @@
             "Executed 1 out of 3 test: 2 test passes.");
     assertThat(BlazeCommandLogParser.parseTestTargets(lines.stream()))
         .containsExactly(
-            new Label("//base:integration_tests"),
-            new Label("//base:unit_tests"),
-            new Label("//golang:unit_tests"));
+            Label.create("//base:integration_tests"),
+            Label.create("//base:unit_tests"),
+            Label.create("//golang:unit_tests"));
   }
 }
diff --git a/base/tests/unittests/com/google/idea/blaze/base/run/testmap/TestMapTest.java b/base/tests/unittests/com/google/idea/blaze/base/run/testmap/TestMapTest.java
index 8a855ae..a43534a 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/run/testmap/TestMapTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/run/testmap/TestMapTest.java
@@ -69,7 +69,7 @@
     ImmutableMultimap<TargetKey, TargetKey> reverseDependencies =
         ReverseDependencyMap.createRdepsMap(targetMap);
     assertThat(testMap.targetsForSourceFile(reverseDependencies, new File("/test/Test.java")))
-        .containsExactly(new Label("//test:test"));
+        .containsExactly(Label.create("//test:test"));
   }
 
   @Test
@@ -95,7 +95,7 @@
     ImmutableMultimap<TargetKey, TargetKey> reverseDependencies =
         ReverseDependencyMap.createRdepsMap(targetMap);
     assertThat(testMap.targetsForSourceFile(reverseDependencies, new File("/test/Test.java")))
-        .containsExactly(new Label("//test:test"));
+        .containsExactly(Label.create("//test:test"));
   }
 
   @Test
@@ -127,7 +127,7 @@
     ImmutableMultimap<TargetKey, TargetKey> reverseDependencies =
         ReverseDependencyMap.createRdepsMap(targetMap);
     assertThat(testMap.targetsForSourceFile(reverseDependencies, new File("/test/Test.java")))
-        .containsExactly(new Label("//test:test"), new Label("//test:test2"));
+        .containsExactly(Label.create("//test:test"), Label.create("//test:test2"));
   }
 
   @Test
@@ -165,7 +165,7 @@
     ImmutableMultimap<TargetKey, TargetKey> reverseDependencies =
         ReverseDependencyMap.createRdepsMap(targetMap);
     assertThat(testMap.targetsForSourceFile(reverseDependencies, new File("/test/Test.java")))
-        .containsExactly(new Label("//test:test"), new Label("//test:test2"))
+        .containsExactly(Label.create("//test:test"), Label.create("//test:test2"))
         .inOrder();
   }
 
@@ -204,7 +204,7 @@
     ImmutableMultimap<TargetKey, TargetKey> reverseDependencies =
         ReverseDependencyMap.createRdepsMap(targetMap);
     assertThat(testMap.targetsForSourceFile(reverseDependencies, new File("/test/Test.java")))
-        .containsExactly(new Label("//test:test"), new Label("//test:test2"));
+        .containsExactly(Label.create("//test:test"), Label.create("//test:test2"));
   }
 
   @Test
@@ -237,7 +237,7 @@
     ImmutableMultimap<TargetKey, TargetKey> reverseDependencies =
         ReverseDependencyMap.createRdepsMap(targetMap);
     assertThat(testMap.targetsForSourceFile(reverseDependencies, new File("/test/Test.java")))
-        .containsExactly(new Label("//test:test"));
+        .containsExactly(Label.create("//test:test"));
   }
 
   private ArtifactLocation sourceRoot(String relativePath) {
diff --git a/base/tests/unittests/com/google/idea/blaze/base/sync/LanguageSupportTest.java b/base/tests/unittests/com/google/idea/blaze/base/sync/LanguageSupportTest.java
index af61e7f..fdc880e 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/sync/LanguageSupportTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/sync/LanguageSupportTest.java
@@ -81,7 +81,7 @@
                     .build())
             .build();
     WorkspaceLanguageSettings workspaceLanguageSettings =
-        LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
     errorCollector.assertNoIssues();
     assertThat(workspaceLanguageSettings)
         .isEqualTo(
@@ -98,7 +98,9 @@
                     .add(ScalarSection.builder(WorkspaceTypeSection.KEY).set(WorkspaceType.C))
                     .build())
             .build();
-    LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+    WorkspaceLanguageSettings settings =
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
+    LanguageSupport.validateLanguageSettings(context, settings);
     errorCollector.assertIssues("Workspace type 'c' is not supported by this plugin");
   }
 
@@ -127,7 +129,9 @@
                             .add(LanguageClass.PYTHON))
                     .build())
             .build();
-    LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+    WorkspaceLanguageSettings settings =
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
+    LanguageSupport.validateLanguageSettings(context, settings);
     errorCollector.assertIssues("Language 'python' is not supported by this plugin");
   }
 
@@ -155,7 +159,7 @@
                     .build())
             .build();
     WorkspaceLanguageSettings workspaceLanguageSettings =
-        LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
     assertThat(workspaceLanguageSettings)
         .isEqualTo(
             new WorkspaceLanguageSettings(
diff --git a/base/tests/unittests/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterfaceAspectsImplTest.java b/base/tests/unittests/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterfaceAspectsImplTest.java
index b064721..249783c 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterfaceAspectsImplTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/sync/aspects/BlazeIdeInterfaceAspectsImplTest.java
@@ -16,16 +16,12 @@
 package com.google.idea.blaze.base.sync.aspects;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
 import com.google.idea.blaze.base.BlazeTestCase;
 import com.google.idea.blaze.base.TestUtils;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.io.FileAttributeProvider;
 import com.google.idea.blaze.base.model.primitives.Label;
-import com.google.idea.blaze.base.model.primitives.LanguageClass;
-import com.google.idea.blaze.base.model.primitives.WorkspaceType;
-import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.common.experiments.ExperimentService;
 import com.google.idea.common.experiments.MockExperimentService;
 import com.google.repackaged.devtools.intellij.ideinfo.IntellijIdeInfo;
@@ -74,11 +70,7 @@
                     .setJavaPackage("package"))
             .build();
 
-    WorkspaceLanguageSettings workspaceLanguageSettings =
-        new WorkspaceLanguageSettings(
-            WorkspaceType.ANDROID, ImmutableSet.of(LanguageClass.ANDROID));
-    TargetIdeInfo target =
-        IdeInfoFromProtobuf.makeTargetIdeInfo(workspaceLanguageSettings, ideProto);
+    TargetIdeInfo target = IdeInfoFromProtobuf.makeTargetIdeInfo(ideProto);
     TestUtils.assertIsSerializable(target);
   }
 
@@ -88,7 +80,7 @@
     state.fileToTargetMapKey =
         ImmutableMap.of(
             new File("fileName"),
-            TargetIdeInfo.builder().setLabel(new Label("//test:test")).build().key);
+            TargetIdeInfo.builder().setLabel(Label.create("//test:test")).build().key);
     state.fileState = ImmutableMap.of();
     state.targetMap =
         new TargetMap(ImmutableMap.of()); // Tested separately in testRuleIdeInfoIsSerializable
diff --git a/base/tests/unittests/com/google/idea/blaze/base/sync/aspects/UnfilteredCompilerOptionsTest.java b/base/tests/unittests/com/google/idea/blaze/base/sync/aspects/UnfilteredCompilerOptionsTest.java
index fb09872..343f562 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/sync/aspects/UnfilteredCompilerOptionsTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/sync/aspects/UnfilteredCompilerOptionsTest.java
@@ -18,7 +18,6 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
 import com.google.idea.blaze.base.BlazeTestCase;
 import java.util.List;
 import org.junit.Test;
@@ -41,13 +40,17 @@
             "sys3/inc1",
             "-isystm",
             "sys4/inc1");
-    List<String> sysIncludes = Lists.newArrayList();
-    List<String> flags = Lists.newArrayList();
-    UnfilteredCompilerOptions.splitUnfilteredCompilerOptions(unfilteredOptions, sysIncludes, flags);
+    UnfilteredCompilerOptions compilerOptions =
+        UnfilteredCompilerOptions.builder()
+            .registerSingleOrSplitOption("-isystem")
+            .build(unfilteredOptions);
 
-    assertThat(sysIncludes).containsExactly("sys/inc1", "sys2/inc1", "sys3/inc1");
+    List<String> sysIncludes = compilerOptions.getExtractedOptionValues("-isystem");
+    List<String> flags = compilerOptions.getUninterpretedOptions();
 
-    assertThat(flags).containsExactly("-VER2", "-isystm", "sys4/inc1");
+    assertThat(sysIncludes).containsExactly("sys/inc1", "sys2/inc1", "sys3/inc1").inOrder();
+
+    assertThat(flags).containsExactly("-VER2", "-isystm", "sys4/inc1").inOrder();
   }
 
   @Test
@@ -55,12 +58,47 @@
     ImmutableList<String> unfilteredOptions =
         ImmutableList.of(
             "-isystem", "sys/inc1", "-VER2", "-isystemsys2/inc1", "-isystem", "sys3/inc1");
-    List<String> sysIncludes = Lists.newArrayList();
-    List<String> flags = Lists.newArrayList();
-    UnfilteredCompilerOptions.splitUnfilteredCompilerOptions(unfilteredOptions, sysIncludes, flags);
+    UnfilteredCompilerOptions compilerOptions =
+        UnfilteredCompilerOptions.builder()
+            .registerSingleOrSplitOption("-isystem")
+            .build(unfilteredOptions);
 
-    assertThat(sysIncludes).containsExactly("sys/inc1", "sys2/inc1", "sys3/inc1");
+    List<String> sysIncludes = compilerOptions.getExtractedOptionValues("-isystem");
+    List<String> flags = compilerOptions.getUninterpretedOptions();
+    assertThat(sysIncludes).containsExactly("sys/inc1", "sys2/inc1", "sys3/inc1").inOrder();
 
-    assertThat(flags).containsExactly("-VER2");
+    assertThat(flags).containsExactly("-VER2").inOrder();
+  }
+
+  @Test
+  public void testMultipleFlagsToExtract() {
+    ImmutableList<String> unfilteredOptions =
+        ImmutableList.of(
+            "-I",
+            "foo/headers1",
+            "-fno-exceptions",
+            "-Werror",
+            "-DMACRO1=1",
+            "-D",
+            "MACRO2",
+            "-Ifoo/headers2",
+            "-I=sysroot_header",
+            "-Wall",
+            "-I",
+            "foo/headers3");
+    UnfilteredCompilerOptions compilerOptions =
+        UnfilteredCompilerOptions.builder()
+            .registerSingleOrSplitOption("-I")
+            .registerSingleOrSplitOption("-D")
+            .build(unfilteredOptions);
+
+    List<String> defines = compilerOptions.getExtractedOptionValues("-D");
+    List<String> includes = compilerOptions.getExtractedOptionValues("-I");
+    List<String> flags = compilerOptions.getUninterpretedOptions();
+    assertThat(includes)
+        .containsExactly("foo/headers1", "foo/headers2", "=sysroot_header", "foo/headers3")
+        .inOrder();
+    assertThat(defines).containsExactly("MACRO1=1", "MACRO2").inOrder();
+    assertThat(flags).containsExactly("-fno-exceptions", "-Werror", "-Wall").inOrder();
   }
 }
diff --git a/base/tests/unittests/com/google/idea/blaze/base/sync/projectview/RelatedWorkspacePathFinderTest.java b/base/tests/unittests/com/google/idea/blaze/base/sync/projectview/RelatedWorkspacePathFinderTest.java
new file mode 100644
index 0000000..15a6d84
--- /dev/null
+++ b/base/tests/unittests/com/google/idea/blaze/base/sync/projectview/RelatedWorkspacePathFinderTest.java
@@ -0,0 +1,192 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.projectview;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.io.FileAttributeProvider;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolverImpl;
+import java.io.File;
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit tests for {@link RelatedWorkspacePathFinder} */
+@RunWith(JUnit4.class)
+public class RelatedWorkspacePathFinderTest {
+
+  private static final File WORKSPACE_ROOT = new File("/workspace");
+
+  private MockFileAttributeProvider files;
+  private RelatedWorkspacePathFinder relatedPathFinder;
+  private WorkspacePathResolver workspacePathResolver;
+
+  @Before
+  public void setUp() throws IOException {
+    files = new MockFileAttributeProvider();
+    relatedPathFinder = new RelatedWorkspacePathFinder(files);
+    workspacePathResolver = new WorkspacePathResolverImpl(new WorkspaceRoot(WORKSPACE_ROOT));
+  }
+
+  @Test
+  public void initialJavaDirectory() throws Exception {
+    files.mkdirs(new File(WORKSPACE_ROOT, "java/com/google"));
+    files.mkdirs(new File(WORKSPACE_ROOT, "javatests/com/google"));
+
+    WorkspacePath initialPath = new WorkspacePath("java/com/google");
+    ImmutableSet<WorkspacePath> relatedPaths =
+        relatedPathFinder.findRelatedWorkspaceDirectories(workspacePathResolver, initialPath);
+
+    assertThat(relatedPaths).hasSize(1);
+    assertThat(relatedPaths).containsExactly(new WorkspacePath("javatests/com/google"));
+  }
+
+  @Test
+  public void middleJavaDirectory() throws Exception {
+    files.mkdirs(new File(WORKSPACE_ROOT, "srcs/java/com/google"));
+    files.mkdirs(new File(WORKSPACE_ROOT, "srcs/javatests/com/google"));
+
+    WorkspacePath initialPath = new WorkspacePath("srcs/java/com/google");
+    ImmutableSet<WorkspacePath> relatedPaths =
+        relatedPathFinder.findRelatedWorkspaceDirectories(workspacePathResolver, initialPath);
+
+    assertThat(relatedPaths).hasSize(1);
+    assertThat(relatedPaths).containsExactly(new WorkspacePath("srcs/javatests/com/google"));
+  }
+
+  @Test
+  public void finalJavaDirectory() throws Exception {
+    files.mkdirs(new File(WORKSPACE_ROOT, "srcs/java"));
+    files.mkdirs(new File(WORKSPACE_ROOT, "srcs/javatests"));
+
+    WorkspacePath initialPath = new WorkspacePath("srcs/java");
+    ImmutableSet<WorkspacePath> relatedPaths =
+        relatedPathFinder.findRelatedWorkspaceDirectories(workspacePathResolver, initialPath);
+
+    assertThat(relatedPaths).hasSize(1);
+    assertThat(relatedPaths).containsExactly(new WorkspacePath("srcs/javatests"));
+  }
+
+  @Test
+  public void noJavaDirectory() throws Exception {
+    files.mkdirs(new File(WORKSPACE_ROOT, "srcs/com/google"));
+
+    WorkspacePath initialPath = new WorkspacePath("srcs/com/google");
+    ImmutableSet<WorkspacePath> relatedPaths =
+        relatedPathFinder.findRelatedWorkspaceDirectories(workspacePathResolver, initialPath);
+
+    assertThat(relatedPaths).isEmpty();
+  }
+
+  @Test
+  public void javatestsDirectoryDoesNotExist() throws Exception {
+    files.mkdirs(new File(WORKSPACE_ROOT, "java/com/google"));
+
+    WorkspacePath initialPath = new WorkspacePath("java/com/google");
+    ImmutableSet<WorkspacePath> relatedPaths =
+        relatedPathFinder.findRelatedWorkspaceDirectories(workspacePathResolver, initialPath);
+
+    assertThat(relatedPaths).isEmpty();
+  }
+
+  @Test
+  public void javaInMiddleOfWord() throws Exception {
+    files.mkdirs(new File(WORKSPACE_ROOT, "srcs/cooljavastuff/com/google"));
+    files.mkdirs(new File(WORKSPACE_ROOT, "srcs/cooljavatestsstuff/com/google"));
+
+    WorkspacePath initialPath = new WorkspacePath("java/com/google");
+    ImmutableSet<WorkspacePath> relatedPaths =
+        relatedPathFinder.findRelatedWorkspaceDirectories(workspacePathResolver, initialPath);
+
+    assertThat(relatedPaths).isEmpty();
+  }
+
+  @Test
+  public void javatestsExistsButSubdirectoryDoesNotExist() throws Exception {
+    files.mkdirs(new File(WORKSPACE_ROOT, "java/com/google"));
+    files.mkdirs(new File(WORKSPACE_ROOT, "javatests/com"));
+
+    WorkspacePath initialPath = new WorkspacePath("java/com/google");
+    ImmutableSet<WorkspacePath> relatedPaths =
+        relatedPathFinder.findRelatedWorkspaceDirectories(workspacePathResolver, initialPath);
+
+    assertThat(relatedPaths).isEmpty();
+  }
+
+  @Test
+  public void onlyReplacesFirstFoundJavaPath() throws Exception {
+    files.mkdirs(new File(WORKSPACE_ROOT, "java/src/java"));
+    files.mkdirs(new File(WORKSPACE_ROOT, "javatests/src/java"));
+    files.mkdirs(new File(WORKSPACE_ROOT, "javatests/src/javatests"));
+
+    WorkspacePath initialPath = new WorkspacePath("java/src/java");
+    ImmutableSet<WorkspacePath> relatedPaths =
+        relatedPathFinder.findRelatedWorkspaceDirectories(workspacePathResolver, initialPath);
+
+    assertThat(relatedPaths).hasSize(1);
+    assertThat(relatedPaths).containsExactly(new WorkspacePath("javatests/src/java"));
+  }
+
+  @Test
+  public void skipsFirstJavaIfMatchingJavatestsIsNotFound() throws Exception {
+    files.mkdirs(new File(WORKSPACE_ROOT, "java/src/java"));
+    files.mkdirs(new File(WORKSPACE_ROOT, "java/src/javatests"));
+
+    WorkspacePath initialPath = new WorkspacePath("java/src/java");
+    ImmutableSet<WorkspacePath> relatedPaths =
+        relatedPathFinder.findRelatedWorkspaceDirectories(workspacePathResolver, initialPath);
+
+    assertThat(relatedPaths).hasSize(1);
+    assertThat(relatedPaths).containsExactly(new WorkspacePath("java/src/javatests"));
+  }
+
+  @Test
+  public void javatestsIsNotRelatedToJava() throws Exception {
+    files.mkdirs(new File(WORKSPACE_ROOT, "java/com/google"));
+    files.mkdirs(new File(WORKSPACE_ROOT, "javatests/com/google"));
+
+    WorkspacePath initialPath = new WorkspacePath("javatests/com/google");
+    ImmutableSet<WorkspacePath> relatedPaths =
+        relatedPathFinder.findRelatedWorkspaceDirectories(workspacePathResolver, initialPath);
+
+    assertThat(relatedPaths).isEmpty();
+  }
+
+  private static class MockFileAttributeProvider extends FileAttributeProvider {
+
+    private final Set<File> existingFiles = new HashSet<>();
+
+    @Override
+    public boolean exists(File file) {
+      return existingFiles.contains(file);
+    }
+
+    void mkdirs(File file) {
+      while (file != null && !existingFiles.contains(file)) {
+        existingFiles.add(file);
+        file = file.getParentFile();
+      }
+    }
+  }
+}
diff --git a/base/tests/unittests/com/google/idea/blaze/base/sync/sharding/PartitionTargetsTest.java b/base/tests/unittests/com/google/idea/blaze/base/sync/sharding/PartitionTargetsTest.java
new file mode 100644
index 0000000..7da1a7a
--- /dev/null
+++ b/base/tests/unittests/com/google/idea/blaze/base/sync/sharding/PartitionTargetsTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.sharding;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Test that targets are correctly partitioned in {@link BlazeBuildTargetSharder#shardTargets}. */
+@RunWith(JUnit4.class)
+public class PartitionTargetsTest {
+
+  @Test
+  public void testShardSizeRespected() {
+    List<TargetExpression> targets =
+        ImmutableList.of(
+            TargetExpression.fromString("//java/com/google:one"),
+            TargetExpression.fromString("//java/com/google:two"),
+            TargetExpression.fromString("//java/com/google:three"),
+            TargetExpression.fromString("//java/com/google:four"),
+            TargetExpression.fromString("//java/com/google:five"));
+    ShardedTargetList shards = BlazeBuildTargetSharder.shardTargets(targets, 2);
+    assertThat(shards.shardedTargets).hasSize(3);
+    assertThat(shards.shardedTargets.get(0)).hasSize(2);
+    assertThat(shards.shardedTargets.get(1)).hasSize(2);
+    assertThat(shards.shardedTargets.get(2)).hasSize(1);
+
+    shards = BlazeBuildTargetSharder.shardTargets(targets, 4);
+    assertThat(shards.shardedTargets).hasSize(2);
+    assertThat(shards.shardedTargets.get(0)).hasSize(4);
+    assertThat(shards.shardedTargets.get(1)).hasSize(1);
+
+    shards = BlazeBuildTargetSharder.shardTargets(targets, 100);
+    assertThat(shards.shardedTargets).hasSize(1);
+    assertThat(shards.shardedTargets.get(0)).hasSize(5);
+  }
+
+  @Test
+  public void testAllSubsequentExcludedTargetsAppendedToShards() {
+    List<TargetExpression> targets =
+        ImmutableList.of(
+            TargetExpression.fromString("//java/com/google:one"),
+            TargetExpression.fromString("-//java/com/google:two"),
+            TargetExpression.fromString("//java/com/google:three"),
+            TargetExpression.fromString("-//java/com/google:four"),
+            TargetExpression.fromString("//java/com/google:five"),
+            TargetExpression.fromString("-//java/com/google:six"));
+    ShardedTargetList shards = BlazeBuildTargetSharder.shardTargets(targets, 3);
+    assertThat(shards.shardedTargets).hasSize(2);
+    assertThat(shards.shardedTargets.get(0)).hasSize(5);
+    assertThat(shards.shardedTargets.get(0))
+        .isEqualTo(
+            ImmutableList.of(
+                TargetExpression.fromString("//java/com/google:one"),
+                TargetExpression.fromString("-//java/com/google:two"),
+                TargetExpression.fromString("//java/com/google:three"),
+                TargetExpression.fromString("-//java/com/google:four"),
+                TargetExpression.fromString("-//java/com/google:six")));
+    assertThat(shards.shardedTargets.get(1)).hasSize(3);
+    assertThat(shards.shardedTargets.get(1))
+        .containsExactly(
+            TargetExpression.fromString("-//java/com/google:four"),
+            TargetExpression.fromString("//java/com/google:five"),
+            TargetExpression.fromString("-//java/com/google:six"))
+        .inOrder();
+
+    shards = BlazeBuildTargetSharder.shardTargets(targets, 1);
+    assertThat(shards.shardedTargets).hasSize(6);
+    assertThat(shards.shardedTargets.get(0))
+        .containsExactly(
+            TargetExpression.fromString("//java/com/google:one"),
+            TargetExpression.fromString("-//java/com/google:two"),
+            TargetExpression.fromString("-//java/com/google:four"),
+            TargetExpression.fromString("-//java/com/google:six"))
+        .inOrder();
+  }
+}
diff --git a/base/tests/unittests/com/google/idea/blaze/base/sync/sharding/QueryResultLineProcessorTest.java b/base/tests/unittests/com/google/idea/blaze/base/sync/sharding/QueryResultLineProcessorTest.java
new file mode 100644
index 0000000..a984e94
--- /dev/null
+++ b/base/tests/unittests/com/google/idea/blaze/base/sync/sharding/QueryResultLineProcessorTest.java
@@ -0,0 +1,107 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.sharding;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.BlazeTestCase;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit tests for {@link QueryResultLineProcessor}. */
+@RunWith(JUnit4.class)
+public class QueryResultLineProcessorTest extends BlazeTestCase {
+
+  @Test
+  public void testRecognizesStandardResultLines() {
+    ImmutableList.Builder<TargetExpression> output = ImmutableList.builder();
+    QueryResultLineProcessor processor = new QueryResultLineProcessor(output, x -> true);
+
+    processor.processLine("css_library rule //java/com/google/foo/styles:global");
+    processor.processLine("java_library rule //java/com/google/bar/console:runtime_deps");
+
+    ImmutableList<TargetExpression> parsedTargets = output.build();
+    assertThat(parsedTargets)
+        .containsExactly(
+            TargetExpression.fromString("//java/com/google/foo/styles:global"),
+            TargetExpression.fromString("//java/com/google/bar/console:runtime_deps"));
+  }
+
+  @Test
+  public void testIgnoresNonRules() {
+    ImmutableList.Builder<TargetExpression> output = ImmutableList.builder();
+    QueryResultLineProcessor processor = new QueryResultLineProcessor(output, x -> true);
+
+    processor.processLine("generated file //java/com/google/foo:libthrowable_utils.jar");
+    processor.processLine("source file //java/com/google/foo:BUILD");
+    processor.processLine("package group //java/com/google/foo:packages");
+
+    assertThat(output.build()).isEmpty();
+  }
+
+  @Test
+  public void testFilterRuleTypes() {
+    ImmutableSet<String> acceptedRuleTypes =
+        ImmutableSet.of("java_library", "custom_type", "sh_test");
+    ImmutableList.Builder<TargetExpression> output = ImmutableList.builder();
+    QueryResultLineProcessor processor =
+        new QueryResultLineProcessor(output, t -> acceptedRuleTypes.contains(t.ruleType));
+
+    processor.processLine("css_library rule //java/com/google/foo/styles:global");
+    processor.processLine("java_library rule //java/com/google/bar/console:runtime_deps");
+    processor.processLine("java_test rule //java/com/google/bar/console:test1");
+    processor.processLine("test_suite rule //java/com/google/bar/console:all_tests");
+    processor.processLine("custom_type rule //java/com/google/bar/console:custom");
+    processor.processLine("sh_test rule //java/com/google/bar/console:sh_test");
+
+    assertThat(output.build())
+        .containsExactly(
+            TargetExpression.fromString("//java/com/google/bar/console:runtime_deps"),
+            TargetExpression.fromString("//java/com/google/bar/console:custom"),
+            TargetExpression.fromString("//java/com/google/bar/console:sh_test"));
+  }
+
+  @Test
+  public void testFilterRuleTypesRetainingExplicitlySpecifiedTargets() {
+    ImmutableSet<String> acceptedRuleTypes =
+        ImmutableSet.of("java_library", "custom_type", "sh_test");
+    ImmutableSet<String> explicitTargets = ImmutableSet.of("//java/com/google/foo/styles:global");
+
+    ImmutableList.Builder<TargetExpression> output = ImmutableList.builder();
+    QueryResultLineProcessor processor =
+        new QueryResultLineProcessor(
+            output,
+            t -> explicitTargets.contains(t.label) || acceptedRuleTypes.contains(t.ruleType));
+
+    processor.processLine("css_library rule //java/com/google/foo/styles:global");
+    processor.processLine("java_library rule //java/com/google/bar/console:runtime_deps");
+    processor.processLine("java_test rule //java/com/google/bar/console:test1");
+    processor.processLine("test_suite rule //java/com/google/bar/console:all_tests");
+    processor.processLine("custom_type rule //java/com/google/bar/console:custom");
+    processor.processLine("sh_test rule //java/com/google/bar/console:sh_test");
+
+    assertThat(output.build())
+        .containsExactly(
+            TargetExpression.fromString("//java/com/google/foo/styles:global"),
+            TargetExpression.fromString("//java/com/google/bar/console:runtime_deps"),
+            TargetExpression.fromString("//java/com/google/bar/console:custom"),
+            TargetExpression.fromString("//java/com/google/bar/console:sh_test"));
+  }
+}
diff --git a/base/tests/unittests/com/google/idea/blaze/base/sync/sharding/WildcardTargetPatternTest.java b/base/tests/unittests/com/google/idea/blaze/base/sync/sharding/WildcardTargetPatternTest.java
new file mode 100644
index 0000000..e3d78b8
--- /dev/null
+++ b/base/tests/unittests/com/google/idea/blaze/base/sync/sharding/WildcardTargetPatternTest.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.base.sync.sharding;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit tests for {@link WildcardTargetPattern}. */
+@RunWith(JUnit4.class)
+public class WildcardTargetPatternTest {
+
+  @Test
+  public void testRecursiveWildcardPattern() {
+    TargetExpression target = TargetExpression.fromString("//java/com/google/...");
+    WildcardTargetPattern wildcardPattern = WildcardTargetPattern.fromExpression(target);
+    assertThat(wildcardPattern).isNotNull();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google"))).isTrue();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google/foo"))).isTrue();
+    assertThat(wildcardPattern.isRecursive()).isTrue();
+    assertThat(wildcardPattern.getBasePackage()).isEqualTo(new WorkspacePath("java/com/google"));
+    assertThat(wildcardPattern.rulesOnly()).isTrue();
+  }
+
+  @Test
+  public void testRecursiveWildcardPatternAlternativeFormat() {
+    TargetExpression target = TargetExpression.fromString("//java/com/google/...:all");
+    WildcardTargetPattern wildcardPattern = WildcardTargetPattern.fromExpression(target);
+    assertThat(wildcardPattern).isNotNull();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google"))).isTrue();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google/foo"))).isTrue();
+    assertThat(wildcardPattern.isRecursive()).isTrue();
+    assertThat(wildcardPattern.getBasePackage()).isEqualTo(new WorkspacePath("java/com/google"));
+    assertThat(wildcardPattern.rulesOnly()).isTrue();
+  }
+
+  @Test
+  public void testRecursiveWildcardPatternAllTargets() {
+    TargetExpression target = TargetExpression.fromString("//java/com/google/...:all-targets");
+    WildcardTargetPattern wildcardPattern = WildcardTargetPattern.fromExpression(target);
+    assertThat(wildcardPattern).isNotNull();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google"))).isTrue();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google/foo"))).isTrue();
+    assertThat(wildcardPattern.isRecursive()).isTrue();
+    assertThat(wildcardPattern.getBasePackage()).isEqualTo(new WorkspacePath("java/com/google"));
+    assertThat(wildcardPattern.rulesOnly()).isFalse();
+  }
+
+  @Test
+  public void testRecursiveWildcardPatternAllTargetsAlternativeFormat() {
+    TargetExpression target = TargetExpression.fromString("//java/com/google/...:*");
+    WildcardTargetPattern wildcardPattern = WildcardTargetPattern.fromExpression(target);
+    assertThat(wildcardPattern).isNotNull();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google"))).isTrue();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google/foo"))).isTrue();
+    assertThat(wildcardPattern.isRecursive()).isTrue();
+    assertThat(wildcardPattern.getBasePackage()).isEqualTo(new WorkspacePath("java/com/google"));
+    assertThat(wildcardPattern.rulesOnly()).isFalse();
+  }
+
+  @Test
+  public void testNonRecursiveAllTargetsWildcardPattern() {
+    TargetExpression target = TargetExpression.fromString("//java/com/google:*");
+    WildcardTargetPattern wildcardPattern = WildcardTargetPattern.fromExpression(target);
+    assertThat(wildcardPattern).isNotNull();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google"))).isTrue();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google/foo"))).isFalse();
+    assertThat(wildcardPattern.isRecursive()).isFalse();
+    assertThat(wildcardPattern.getBasePackage()).isEqualTo(new WorkspacePath("java/com/google"));
+    assertThat(wildcardPattern.rulesOnly()).isFalse();
+  }
+
+  @Test
+  public void testNonRecursiveWildcardPattern() {
+    TargetExpression target = TargetExpression.fromString("//java/com/google:all");
+    WildcardTargetPattern wildcardPattern = WildcardTargetPattern.fromExpression(target);
+    assertThat(wildcardPattern).isNotNull();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google"))).isTrue();
+    assertThat(wildcardPattern.coversPackage(new WorkspacePath("java/com/google/foo"))).isFalse();
+    assertThat(wildcardPattern.isRecursive()).isFalse();
+    assertThat(wildcardPattern.getBasePackage()).isEqualTo(new WorkspacePath("java/com/google"));
+    assertThat(wildcardPattern.rulesOnly()).isTrue();
+  }
+
+  @Test
+  public void testNonWildcardPattern() {
+    TargetExpression target = TargetExpression.fromString("//java/com/google:single_target");
+    WildcardTargetPattern wildcardPattern = WildcardTargetPattern.fromExpression(target);
+    assertThat(wildcardPattern).isNull();
+  }
+
+  @Test
+  public void testNonWildcardImplicitTargetName() {
+    TargetExpression target = TargetExpression.fromString("//java/com/google/foo");
+    WildcardTargetPattern wildcardPattern = WildcardTargetPattern.fromExpression(target);
+    assertThat(wildcardPattern).isNull();
+  }
+}
diff --git a/base/tests/unittests/com/google/idea/blaze/base/sync/workspace/ArtifactLocationDecoderTest.java b/base/tests/unittests/com/google/idea/blaze/base/sync/workspace/ArtifactLocationDecoderTest.java
index eb02cba..495f9dc 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/sync/workspace/ArtifactLocationDecoderTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/sync/workspace/ArtifactLocationDecoderTest.java
@@ -18,9 +18,10 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.idea.blaze.base.BlazeTestCase;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
-import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
-import java.io.File;
+import com.google.idea.blaze.base.sync.aspects.IdeInfoFromProtobuf;
+import com.google.repackaged.devtools.intellij.ideinfo.IntellijIdeInfo;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -29,8 +30,8 @@
 @RunWith(JUnit4.class)
 public class ArtifactLocationDecoderTest extends BlazeTestCase {
 
-  private static final String EXECUTION_ROOT = "/path/to/_blaze_user/1234bf129e/root";
   private static final String OUTPUT_BASE = "/path/to/_blaze_user/1234bf129e";
+  private static final String EXECUTION_ROOT = OUTPUT_BASE + "/execroot/my_proj";
 
   @Test
   public void testGeneratedArtifact() throws Exception {
@@ -43,11 +44,11 @@
 
     ArtifactLocationDecoder decoder =
         new ArtifactLocationDecoderImpl(
-            new BlazeRoots(
-                new File(EXECUTION_ROOT),
-                new ExecutionRootPath("root/blaze-out/crosstool/bin"),
-                new ExecutionRootPath("root/blaze-out/crosstool/genfiles"),
-                new File(OUTPUT_BASE)),
+            BlazeInfo.createMockBlazeInfo(
+                OUTPUT_BASE,
+                EXECUTION_ROOT,
+                EXECUTION_ROOT + "/blaze-out/crosstool/bin",
+                EXECUTION_ROOT + "/blaze-out/crosstool/genfiles"),
             null);
 
     assertThat(decoder.decode(artifactLocation).getPath())
@@ -55,24 +56,115 @@
   }
 
   @Test
-  public void testExternalArtifact() throws Exception {
+  public void testExternalSourceArtifactOldFormat() throws Exception {
     ArtifactLocation artifactLocation =
-        ArtifactLocation.builder()
-            .setRelativePath("external/com/google/Bla.java")
-            .setIsSource(true)
-            .setIsExternal(true)
-            .build();
+        IdeInfoFromProtobuf.makeArtifactLocation(
+            IntellijIdeInfo.ArtifactLocation.newBuilder()
+                .setRelativePath("external/repo_name/com/google/Bla.java")
+                .setIsSource(true)
+                .setIsExternal(true)
+                .build());
+
+    assertThat(artifactLocation.getRelativePath()).isEqualTo("com/google/Bla.java");
+    assertThat(artifactLocation.getExecutionRootRelativePath())
+        .isEqualTo("external/repo_name/com/google/Bla.java");
 
     ArtifactLocationDecoder decoder =
         new ArtifactLocationDecoderImpl(
-            new BlazeRoots(
-                new File(EXECUTION_ROOT),
-                new ExecutionRootPath("root/blaze-out/crosstool/bin"),
-                new ExecutionRootPath("root/blaze-out/crosstool/genfiles"),
-                new File(OUTPUT_BASE)),
+            BlazeInfo.createMockBlazeInfo(
+                OUTPUT_BASE,
+                EXECUTION_ROOT,
+                EXECUTION_ROOT + "/blaze-out/crosstool/bin",
+                EXECUTION_ROOT + "/blaze-out/crosstool/genfiles"),
             null);
 
     assertThat(decoder.decode(artifactLocation).getPath())
-        .isEqualTo(OUTPUT_BASE + "/external/com/google/Bla.java");
+        .isEqualTo(EXECUTION_ROOT + "/external/repo_name/com/google/Bla.java");
+  }
+
+  @Test
+  public void testExternalDerivedArtifactOldFormat() throws Exception {
+    ArtifactLocation artifactLocation =
+        IdeInfoFromProtobuf.makeArtifactLocation(
+            IntellijIdeInfo.ArtifactLocation.newBuilder()
+                .setRelativePath("external/repo_name/com/google/Bla.java")
+                .setRootExecutionPathFragment("blaze-out/crosstool/bin")
+                .setIsSource(false)
+                .setIsExternal(true)
+                .build());
+
+    assertThat(artifactLocation.getRelativePath()).isEqualTo("com/google/Bla.java");
+    assertThat(artifactLocation.getExecutionRootRelativePath())
+        .isEqualTo("blaze-out/crosstool/bin/external/repo_name/com/google/Bla.java");
+
+    ArtifactLocationDecoder decoder =
+        new ArtifactLocationDecoderImpl(
+            BlazeInfo.createMockBlazeInfo(
+                OUTPUT_BASE,
+                EXECUTION_ROOT,
+                EXECUTION_ROOT + "/blaze-out/crosstool/bin",
+                EXECUTION_ROOT + "/blaze-out/crosstool/genfiles"),
+            null);
+
+    assertThat(decoder.decode(artifactLocation).getPath())
+        .isEqualTo(
+            EXECUTION_ROOT + "/blaze-out/crosstool/bin/external/repo_name/com/google/Bla.java");
+  }
+
+  @Test
+  public void testExternalSourceArtifactNewFormat() throws Exception {
+    ArtifactLocation artifactLocation =
+        IdeInfoFromProtobuf.makeArtifactLocation(
+            IntellijIdeInfo.ArtifactLocation.newBuilder()
+                .setRelativePath("com/google/Bla.java")
+                .setRootExecutionPathFragment("../repo_name")
+                .setIsSource(true)
+                .setIsExternal(true)
+                .setIsNewExternalVersion(true)
+                .build());
+
+    assertThat(artifactLocation.getRelativePath()).isEqualTo("com/google/Bla.java");
+    assertThat(artifactLocation.getExecutionRootRelativePath())
+        .isEqualTo("../repo_name/com/google/Bla.java");
+
+    ArtifactLocationDecoder decoder =
+        new ArtifactLocationDecoderImpl(
+            BlazeInfo.createMockBlazeInfo(
+                OUTPUT_BASE,
+                EXECUTION_ROOT,
+                EXECUTION_ROOT + "/blaze-out/crosstool/bin",
+                EXECUTION_ROOT + "/blaze-out/crosstool/genfiles"),
+            null);
+
+    assertThat(decoder.decode(artifactLocation).getPath())
+        .isEqualTo(OUTPUT_BASE + "/execroot/repo_name/com/google/Bla.java");
+  }
+
+  @Test
+  public void testExternalDerivedArtifactNewFormat() throws Exception {
+    ArtifactLocation artifactLocation =
+        IdeInfoFromProtobuf.makeArtifactLocation(
+            IntellijIdeInfo.ArtifactLocation.newBuilder()
+                .setRelativePath("com/google/Bla.java")
+                .setRootExecutionPathFragment("../repo_name/blaze-out/crosstool/bin")
+                .setIsSource(false)
+                .setIsNewExternalVersion(true)
+                .build());
+
+    assertThat(artifactLocation.getRelativePath()).isEqualTo("com/google/Bla.java");
+    assertThat(artifactLocation.getExecutionRootRelativePath())
+        .isEqualTo("../repo_name/blaze-out/crosstool/bin/com/google/Bla.java");
+
+    ArtifactLocationDecoder decoder =
+        new ArtifactLocationDecoderImpl(
+            BlazeInfo.createMockBlazeInfo(
+                OUTPUT_BASE,
+                EXECUTION_ROOT,
+                EXECUTION_ROOT + "/blaze-out/crosstool/bin",
+                EXECUTION_ROOT + "/blaze-out/crosstool/genfiles"),
+            null);
+
+    assertThat(decoder.decode(artifactLocation).getPath())
+        .isEqualTo(OUTPUT_BASE + "/execroot/repo_name/blaze-out/crosstool/bin/com/google/Bla.java");
   }
 }
diff --git a/base/tests/unittests/com/google/idea/blaze/base/targetmaps/ReverseDependencyMapTest.java b/base/tests/unittests/com/google/idea/blaze/base/targetmaps/ReverseDependencyMapTest.java
index 574194c..9f0b306 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/targetmaps/ReverseDependencyMapTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/targetmaps/ReverseDependencyMapTest.java
@@ -61,8 +61,8 @@
         ReverseDependencyMap.createRdepsMap(targetMap);
     assertThat(reverseDependencies)
         .containsEntry(
-            TargetKey.forPlainTarget(new Label("//l:l2")),
-            TargetKey.forPlainTarget(new Label("//l:l1")));
+            TargetKey.forPlainTarget(Label.create("//l:l2")),
+            TargetKey.forPlainTarget(Label.create("//l:l1")));
   }
 
   @Test
@@ -93,12 +93,12 @@
         ReverseDependencyMap.createRdepsMap(targetMap);
     assertThat(reverseDependencies)
         .containsEntry(
-            TargetKey.forPlainTarget(new Label("//l:l2")),
-            TargetKey.forPlainTarget(new Label("//l:l1")));
+            TargetKey.forPlainTarget(Label.create("//l:l2")),
+            TargetKey.forPlainTarget(Label.create("//l:l1")));
     assertThat(reverseDependencies)
         .containsEntry(
-            TargetKey.forPlainTarget(new Label("//l:l3")),
-            TargetKey.forPlainTarget(new Label("//l:l1")));
+            TargetKey.forPlainTarget(Label.create("//l:l3")),
+            TargetKey.forPlainTarget(Label.create("//l:l1")));
   }
 
   @Test
@@ -129,12 +129,12 @@
         ReverseDependencyMap.createRdepsMap(targetMap);
     assertThat(reverseDependencies)
         .containsEntry(
-            TargetKey.forPlainTarget(new Label("//l:l3")),
-            TargetKey.forPlainTarget(new Label("//l:l1")));
+            TargetKey.forPlainTarget(Label.create("//l:l3")),
+            TargetKey.forPlainTarget(Label.create("//l:l1")));
     assertThat(reverseDependencies)
         .containsEntry(
-            TargetKey.forPlainTarget(new Label("//l:l3")),
-            TargetKey.forPlainTarget(new Label("//l:l2")));
+            TargetKey.forPlainTarget(Label.create("//l:l3")),
+            TargetKey.forPlainTarget(Label.create("//l:l2")));
   }
 
   @Test
@@ -177,20 +177,20 @@
         ReverseDependencyMap.createRdepsMap(targetMap);
     assertThat(reverseDependencies)
         .containsEntry(
-            TargetKey.forPlainTarget(new Label("//l:l3")),
-            TargetKey.forPlainTarget(new Label("//l:l1")));
+            TargetKey.forPlainTarget(Label.create("//l:l3")),
+            TargetKey.forPlainTarget(Label.create("//l:l1")));
     assertThat(reverseDependencies)
         .containsEntry(
-            TargetKey.forPlainTarget(new Label("//l:l3")),
-            TargetKey.forPlainTarget(new Label("//l:l2")));
+            TargetKey.forPlainTarget(Label.create("//l:l3")),
+            TargetKey.forPlainTarget(Label.create("//l:l2")));
     assertThat(reverseDependencies)
         .containsEntry(
-            TargetKey.forPlainTarget(new Label("//l:l3")),
-            TargetKey.forPlainTarget(new Label("//l:l4")));
+            TargetKey.forPlainTarget(Label.create("//l:l3")),
+            TargetKey.forPlainTarget(Label.create("//l:l4")));
     assertThat(reverseDependencies)
         .containsEntry(
-            TargetKey.forPlainTarget(new Label("//l:l4")),
-            TargetKey.forPlainTarget(new Label("//l:l5")));
+            TargetKey.forPlainTarget(Label.create("//l:l4")),
+            TargetKey.forPlainTarget(Label.create("//l:l5")));
   }
 
   private static ArtifactLocation sourceRoot(String relativePath) {
diff --git a/base/tests/unittests/com/google/idea/blaze/base/targetmaps/TransitiveDependencyMapTest.java b/base/tests/unittests/com/google/idea/blaze/base/targetmaps/TransitiveDependencyMapTest.java
index 922cbd1..6aa4f43 100644
--- a/base/tests/unittests/com/google/idea/blaze/base/targetmaps/TransitiveDependencyMapTest.java
+++ b/base/tests/unittests/com/google/idea/blaze/base/targetmaps/TransitiveDependencyMapTest.java
@@ -53,8 +53,8 @@
 
   @Test
   public void testGetSimpleDependency() {
-    TargetKey simpleA = TargetKey.forPlainTarget(new Label("//com/google/example/simple:a"));
-    TargetKey simpleB = TargetKey.forPlainTarget(new Label("//com/google/example/simple:b"));
+    TargetKey simpleA = TargetKey.forPlainTarget(Label.create("//com/google/example/simple:a"));
+    TargetKey simpleB = TargetKey.forPlainTarget(Label.create("//com/google/example/simple:b"));
 
     assertThat(transitiveDependencyMap.getTransitiveDependencies(simpleA)).containsExactly(simpleB);
     assertThat(transitiveDependencyMap.getTransitiveDependencies(simpleB)).isEmpty();
@@ -62,10 +62,10 @@
 
   @Test
   public void testGetChainDependencies() {
-    TargetKey chainA = TargetKey.forPlainTarget(new Label("//com/google/example/chain:a"));
-    TargetKey chainB = TargetKey.forPlainTarget(new Label("//com/google/example/chain:b"));
-    TargetKey chainC = TargetKey.forPlainTarget(new Label("//com/google/example/chain:c"));
-    TargetKey chainD = TargetKey.forPlainTarget(new Label("//com/google/example/chain:d"));
+    TargetKey chainA = TargetKey.forPlainTarget(Label.create("//com/google/example/chain:a"));
+    TargetKey chainB = TargetKey.forPlainTarget(Label.create("//com/google/example/chain:b"));
+    TargetKey chainC = TargetKey.forPlainTarget(Label.create("//com/google/example/chain:c"));
+    TargetKey chainD = TargetKey.forPlainTarget(Label.create("//com/google/example/chain:d"));
 
     assertThat(transitiveDependencyMap.getTransitiveDependencies(chainA))
         .containsExactly(chainB, chainC, chainD);
@@ -77,13 +77,15 @@
 
   @Test
   public void testGetDiamondDependencies() {
-    TargetKey diamondA = TargetKey.forPlainTarget(new Label("//com/google/example/diamond:a"));
-    TargetKey diamondB = TargetKey.forPlainTarget(new Label("//com/google/example/diamond:b"));
-    TargetKey diamondBB = TargetKey.forPlainTarget(new Label("//com/google/example/diamond:bb"));
-    TargetKey diamondBBB = TargetKey.forPlainTarget(new Label("//com/google/example/diamond:bbb"));
-    TargetKey diamondC = TargetKey.forPlainTarget(new Label("//com/google/example/diamond:c"));
-    TargetKey diamondCC = TargetKey.forPlainTarget(new Label("//com/google/example/diamond:cc"));
-    TargetKey diamondCCC = TargetKey.forPlainTarget(new Label("//com/google/example/diamond:ccc"));
+    TargetKey diamondA = TargetKey.forPlainTarget(Label.create("//com/google/example/diamond:a"));
+    TargetKey diamondB = TargetKey.forPlainTarget(Label.create("//com/google/example/diamond:b"));
+    TargetKey diamondBB = TargetKey.forPlainTarget(Label.create("//com/google/example/diamond:bb"));
+    TargetKey diamondBBB =
+        TargetKey.forPlainTarget(Label.create("//com/google/example/diamond:bbb"));
+    TargetKey diamondC = TargetKey.forPlainTarget(Label.create("//com/google/example/diamond:c"));
+    TargetKey diamondCC = TargetKey.forPlainTarget(Label.create("//com/google/example/diamond:cc"));
+    TargetKey diamondCCC =
+        TargetKey.forPlainTarget(Label.create("//com/google/example/diamond:ccc"));
 
     assertThat(transitiveDependencyMap.getTransitiveDependencies(diamondA))
         .containsExactly(diamondB, diamondBB, diamondBBB, diamondC, diamondCC, diamondCCC);
@@ -100,24 +102,24 @@
 
   @Test
   public void testGetDependencyForNonExistentTarget() {
-    TargetKey bogus = TargetKey.forPlainTarget(new Label("//com/google/fake:target"));
+    TargetKey bogus = TargetKey.forPlainTarget(Label.create("//com/google/fake:target"));
     assertThat(transitiveDependencyMap.getTransitiveDependencies(bogus)).isEmpty();
   }
 
   private static TargetMap buildTargetMap() {
-    Label simpleA = new Label("//com/google/example/simple:a");
-    Label simpleB = new Label("//com/google/example/simple:b");
-    Label chainA = new Label("//com/google/example/chain:a");
-    Label chainB = new Label("//com/google/example/chain:b");
-    Label chainC = new Label("//com/google/example/chain:c");
-    Label chainD = new Label("//com/google/example/chain:d");
-    Label diamondA = new Label("//com/google/example/diamond:a");
-    Label diamondB = new Label("//com/google/example/diamond:b");
-    Label diamondBB = new Label("//com/google/example/diamond:bb");
-    Label diamondBBB = new Label("//com/google/example/diamond:bbb");
-    Label diamondC = new Label("//com/google/example/diamond:c");
-    Label diamondCC = new Label("//com/google/example/diamond:cc");
-    Label diamondCCC = new Label("//com/google/example/diamond:ccc");
+    Label simpleA = Label.create("//com/google/example/simple:a");
+    Label simpleB = Label.create("//com/google/example/simple:b");
+    Label chainA = Label.create("//com/google/example/chain:a");
+    Label chainB = Label.create("//com/google/example/chain:b");
+    Label chainC = Label.create("//com/google/example/chain:c");
+    Label chainD = Label.create("//com/google/example/chain:d");
+    Label diamondA = Label.create("//com/google/example/diamond:a");
+    Label diamondB = Label.create("//com/google/example/diamond:b");
+    Label diamondBB = Label.create("//com/google/example/diamond:bb");
+    Label diamondBBB = Label.create("//com/google/example/diamond:bbb");
+    Label diamondC = Label.create("//com/google/example/diamond:c");
+    Label diamondCC = Label.create("//com/google/example/diamond:cc");
+    Label diamondCCC = Label.create("//com/google/example/diamond:ccc");
     return TargetMapBuilder.builder()
         .addTarget(TargetIdeInfo.builder().setLabel(simpleA).addDependency(simpleB))
         .addTarget(TargetIdeInfo.builder().setLabel(simpleB))
diff --git a/base/tests/utils/integration/com/google/idea/blaze/base/BlazeIntegrationTestCase.java b/base/tests/utils/integration/com/google/idea/blaze/base/BlazeIntegrationTestCase.java
index 8027d58..9080df7 100644
--- a/base/tests/utils/integration/com/google/idea/blaze/base/BlazeIntegrationTestCase.java
+++ b/base/tests/utils/integration/com/google/idea/blaze/base/BlazeIntegrationTestCase.java
@@ -23,6 +23,7 @@
 import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
 import com.google.idea.blaze.base.settings.BlazeImportSettings;
 import com.google.idea.blaze.base.settings.BlazeImportSettingsManager;
+import com.google.idea.blaze.base.sync.SyncCache;
 import com.google.idea.testing.EdtRule;
 import com.google.idea.testing.IntellijTestSetupRule;
 import com.google.idea.testing.ServiceHelper;
@@ -115,7 +116,6 @@
                 workspaceRoot.toString(),
                 "test-project",
                 projectDataDirectory.getPath(),
-                "location-hash",
                 workspaceRoot.fileForPath(new WorkspacePath("project-view-file")).getPath(),
                 buildSystem()));
 
@@ -136,6 +136,7 @@
 
   @After
   public final void tearDown() throws Exception {
+    SyncCache.getInstance(getProject()).clear();
     testFixture.tearDown();
     testFixture = null;
   }
diff --git a/base/tests/utils/integration/com/google/idea/blaze/base/TestFileSystem.java b/base/tests/utils/integration/com/google/idea/blaze/base/TestFileSystem.java
index cf15e9f..f01b053 100644
--- a/base/tests/utils/integration/com/google/idea/blaze/base/TestFileSystem.java
+++ b/base/tests/utils/integration/com/google/idea/blaze/base/TestFileSystem.java
@@ -46,6 +46,11 @@
     this.tempDirTestFixture = tempDirTestFixture;
   }
 
+  /** Returns the root directory of the file system */
+  public String getRootDir() {
+    return LightPlatformTestCase.getSourceRoot().getPath();
+  }
+
   /** Creates an empty file in the temp file system */
   public VirtualFile createFile(String filePath) {
     filePath = makePathRelativeToTestFixture(filePath);
@@ -140,7 +145,7 @@
     if (!FileUtil.isAbsolute(filePath)) {
       return filePath;
     }
-    String tempDirPath = LightPlatformTestCase.getSourceRoot().getPath();
+    String tempDirPath = getRootDir();
     assertThat(FileUtil.isAncestor(tempDirPath, filePath, true)).isTrue();
     return FileUtil.getRelativePath(tempDirPath, filePath, File.separatorChar);
   }
diff --git a/base/tests/utils/integration/com/google/idea/blaze/base/lang/buildfile/BuildFileIntegrationTestCase.java b/base/tests/utils/integration/com/google/idea/blaze/base/lang/buildfile/BuildFileIntegrationTestCase.java
index 44ce8c1..7810b88 100644
--- a/base/tests/utils/integration/com/google/idea/blaze/base/lang/buildfile/BuildFileIntegrationTestCase.java
+++ b/base/tests/utils/integration/com/google/idea/blaze/base/lang/buildfile/BuildFileIntegrationTestCase.java
@@ -36,7 +36,10 @@
   @Before
   public final void doSetup() {
     BlazeProjectDataManager mockProjectDataManager =
-        new MockBlazeProjectDataManager(MockBlazeProjectDataBuilder.builder(workspaceRoot).build());
+        new MockBlazeProjectDataManager(
+            MockBlazeProjectDataBuilder.builder(workspaceRoot)
+                .setOutputBase(fileSystem.getRootDir() + "/output_base")
+                .build());
     registerProjectService(BlazeProjectDataManager.class, mockProjectDataManager);
     editorTest = new EditorTestHelper(getProject(), testFixture);
   }
diff --git a/base/tests/utils/integration/com/google/idea/blaze/base/run/producer/BlazeRunConfigurationProducerTestCase.java b/base/tests/utils/integration/com/google/idea/blaze/base/run/producer/BlazeRunConfigurationProducerTestCase.java
index 0b34e07..434bd3a 100644
--- a/base/tests/utils/integration/com/google/idea/blaze/base/run/producer/BlazeRunConfigurationProducerTestCase.java
+++ b/base/tests/utils/integration/com/google/idea/blaze/base/run/producer/BlazeRunConfigurationProducerTestCase.java
@@ -24,7 +24,6 @@
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
 import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState;
-import com.google.idea.blaze.base.sync.SyncCache;
 import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
 import com.intellij.execution.Location;
 import com.intellij.execution.PsiLocation;
@@ -42,7 +41,6 @@
 import com.intellij.psi.PsiFile;
 import com.intellij.testFramework.MapDataContext;
 import javax.annotation.Nullable;
-import org.junit.After;
 import org.junit.Before;
 
 /** Run configuration producer integration test base */
@@ -79,11 +77,6 @@
     registerApplicationComponent(DataManager.class, dataManager);
   }
 
-  @After
-  public final void doTearDown() {
-    SyncCache.getInstance(getProject()).clear();
-  }
-
   protected PsiFile createAndIndexFile(WorkspacePath path, String... contents) {
     PsiFile file = workspace.createPsiFile(path, contents);
     editorTest.openFileInEditor(file); // open file to trigger update of indices
@@ -101,7 +94,7 @@
   protected static BlazeCommandName getCommandType(BlazeCommandRunConfiguration config) {
     BlazeCommandRunConfigurationCommonState handlerState =
         config.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
-    return handlerState != null ? handlerState.getCommand() : null;
+    return handlerState != null ? handlerState.getCommandState().getCommand() : null;
   }
 
   protected ConfigurationContext createContextFromPsi(PsiElement element) {
diff --git a/base/tests/utils/integration/com/google/idea/blaze/base/sync/BlazeSyncIntegrationTestCase.java b/base/tests/utils/integration/com/google/idea/blaze/base/sync/BlazeSyncIntegrationTestCase.java
index e6b8453..a227d50 100644
--- a/base/tests/utils/integration/com/google/idea/blaze/base/sync/BlazeSyncIntegrationTestCase.java
+++ b/base/tests/utils/integration/com/google/idea/blaze/base/sync/BlazeSyncIntegrationTestCase.java
@@ -27,11 +27,11 @@
 import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.idea.blaze.base.BlazeIntegrationTestCase;
 import com.google.idea.blaze.base.command.info.BlazeInfo;
+import com.google.idea.blaze.base.command.info.BlazeInfoRunner;
 import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.model.BlazeVersionData;
 import com.google.idea.blaze.base.model.SyncState;
-import com.google.idea.blaze.base.model.primitives.TargetExpression;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.projectview.ProjectViewManager;
@@ -45,10 +45,13 @@
 import com.google.idea.blaze.base.settings.BlazeImportSettings;
 import com.google.idea.blaze.base.settings.BlazeImportSettingsManager;
 import com.google.idea.blaze.base.sync.aspects.BlazeIdeInterface;
+import com.google.idea.blaze.base.sync.aspects.BuildResult;
 import com.google.idea.blaze.base.sync.data.BlazeDataStorage;
 import com.google.idea.blaze.base.sync.projectstructure.ModuleEditorImpl;
 import com.google.idea.blaze.base.sync.projectstructure.ModuleEditorProvider;
+import com.google.idea.blaze.base.sync.projectstructure.ModuleFinder;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
+import com.google.idea.blaze.base.sync.sharding.ShardedTargetList;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.google.idea.blaze.base.sync.workspace.WorkingSet;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
@@ -81,7 +84,7 @@
 
   private MockProjectViewManager projectViewManager;
   private MockBlazeVcsHandler vcsHandler;
-  private MockBlazeInfo blazeInfoData;
+  private MockBlazeInfoRunner blazeInfoData;
   private MockBlazeIdeInterface blazeIdeInterface;
 
   protected ErrorCollector errorCollector;
@@ -109,17 +112,33 @@
     }
   }
 
+  // Since MockModuleEditor does not actually commit modules, the normal ModuleManager
+  // won't find modules we've created. This helps look up modules for later stages of Sync.
+  // We could override ModuleManager, but that has a wide interface and there are a lot of
+  // changes across API versions.
+  private class MockModuleFinder implements ModuleFinder {
+
+    MockModuleFinder() {}
+
+    @Nullable
+    @Override
+    public Module findModuleByName(String name) {
+      return getModuleCreatedDuringSync(name);
+    }
+  }
+
   @Before
   public void doSetup() throws Exception {
     projectViewManager = new MockProjectViewManager();
     vcsHandler = new MockBlazeVcsHandler();
-    blazeInfoData = new MockBlazeInfo();
+    blazeInfoData = new MockBlazeInfoRunner();
     blazeIdeInterface = new MockBlazeIdeInterface();
     registerProjectService(ProjectViewManager.class, projectViewManager);
     registerExtension(BlazeVcsHandler.EP_NAME, vcsHandler);
-    registerApplicationService(BlazeInfo.class, blazeInfoData);
+    registerApplicationService(BlazeInfoRunner.class, blazeInfoData);
     registerApplicationService(BlazeIdeInterface.class, blazeIdeInterface);
     registerApplicationService(ModuleEditorProvider.class, MockModuleEditor::new);
+    registerProjectService(ModuleFinder.class, new MockModuleFinder());
 
     errorCollector = new ErrorCollector();
     context = new BlazeContext();
@@ -147,7 +166,7 @@
   }
 
   /** The modules created during sync */
-  protected Module getModuleCreatedDuringSync(String module) {
+  private Module getModuleCreatedDuringSync(String module) {
     ModifiableRootModel modifiableRootModel = modules.get(module);
     return modifiableRootModel != null ? modifiableRootModel.getModule() : null;
   }
@@ -269,7 +288,7 @@
     }
   }
 
-  private static class MockBlazeInfo extends BlazeInfo {
+  private static class MockBlazeInfoRunner extends BlazeInfoRunner {
     private final Map<String, String> results = Maps.newHashMap();
 
     @Override
@@ -293,12 +312,13 @@
     }
 
     @Override
-    public ListenableFuture<ImmutableMap<String, String>> runBlazeInfo(
+    public ListenableFuture<BlazeInfo> runBlazeInfo(
         @Nullable BlazeContext context,
+        BuildSystem buildSystem,
         String binaryPath,
         WorkspaceRoot workspaceRoot,
         List<String> blazeFlags) {
-      return Futures.immediateFuture(ImmutableMap.copyOf(results));
+      return Futures.immediateFuture(new BlazeInfo(buildSystem, ImmutableMap.copyOf(results)));
     }
 
     public void setResults(Map<String, String> results) {
@@ -317,7 +337,7 @@
         WorkspaceRoot workspaceRoot,
         ProjectViewSet projectViewSet,
         BlazeVersionData blazeVersionData,
-        List<TargetExpression> targets,
+        ShardedTargetList shardedTargets,
         WorkspaceLanguageSettings workspaceLanguageSettings,
         ArtifactLocationDecoder artifactLocationDecoder,
         SyncState.Builder syncStateBuilder,
@@ -333,7 +353,7 @@
         WorkspaceRoot workspaceRoot,
         ProjectViewSet projectViewSet,
         BlazeVersionData blazeVersionData,
-        List<TargetExpression> targets) {
+        ShardedTargetList shardedTargets) {
       return BuildResult.SUCCESS;
     }
 
@@ -344,7 +364,7 @@
         WorkspaceRoot workspaceRoot,
         ProjectViewSet projectViewSet,
         BlazeVersionData blazeVersionData,
-        List<TargetExpression> targets) {
+        ShardedTargetList shardedTargets) {
       return BuildResult.SUCCESS;
     }
   }
diff --git a/base/tests/utils/unit/com/google/idea/blaze/base/BlazeTestCase.java b/base/tests/utils/unit/com/google/idea/blaze/base/BlazeTestCase.java
index 874fd28..020ee9f 100644
--- a/base/tests/utils/unit/com/google/idea/blaze/base/BlazeTestCase.java
+++ b/base/tests/utils/unit/com/google/idea/blaze/base/BlazeTestCase.java
@@ -69,7 +69,7 @@
 
   protected Project project;
   private ExtensionsAreaImpl extensionsArea;
-  private Disposable testDisposable;
+  protected Disposable testDisposable;
 
   private static class RootDisposable implements Disposable {
     @Override
diff --git a/base/tests/utils/unit/com/google/idea/blaze/base/TestUtils.java b/base/tests/utils/unit/com/google/idea/blaze/base/TestUtils.java
index e0f2d47..02aaf29 100644
--- a/base/tests/utils/unit/com/google/idea/blaze/base/TestUtils.java
+++ b/base/tests/utils/unit/com/google/idea/blaze/base/TestUtils.java
@@ -17,7 +17,6 @@
 
 import static org.junit.Assert.fail;
 
-import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
 import com.intellij.mock.MockApplicationEx;
 import com.intellij.mock.MockProject;
@@ -29,6 +28,7 @@
 import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.vfs.encoding.EncodingManager;
 import com.intellij.openapi.vfs.encoding.EncodingManagerImpl;
+import com.intellij.util.PlatformUtils;
 import com.intellij.util.pico.DefaultPicoContainer;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -36,6 +36,7 @@
 import java.io.ObjectOutputStream;
 import java.io.Serializable;
 import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import javax.annotation.Nullable;
 import org.jetbrains.annotations.NotNull;
@@ -45,7 +46,7 @@
 public class TestUtils {
 
   static class BlazeMockApplication extends MockApplicationEx {
-    private final ListeningExecutorService executor = MoreExecutors.sameThreadExecutor();
+    private final ExecutorService executor = MoreExecutors.newDirectExecutorService();
 
     public BlazeMockApplication(@NotNull Disposable parentDisposable) {
       super(parentDisposable);
@@ -119,4 +120,22 @@
       }
     }
   }
+
+  /**
+   * Sets the platform prefix system property, reverting to the previous value when the supplied
+   * parent disposable is disposed.
+   */
+  public static void setPlatformPrefix(Disposable parentDisposable, String platformPrefix) {
+    String prevValue = System.getProperty(PlatformUtils.PLATFORM_PREFIX_KEY);
+    System.setProperty(PlatformUtils.PLATFORM_PREFIX_KEY, platformPrefix);
+    Disposer.register(
+        parentDisposable,
+        () -> {
+          if (prevValue != null) {
+            System.setProperty(PlatformUtils.PLATFORM_PREFIX_KEY, prevValue);
+          } else {
+            System.clearProperty(PlatformUtils.PLATFORM_PREFIX_KEY);
+          }
+        });
+  }
 }
diff --git a/base/tests/utils/unit/com/google/idea/blaze/base/async/executor/MockBlazeExecutor.java b/base/tests/utils/unit/com/google/idea/blaze/base/async/executor/MockBlazeExecutor.java
index 3e970b4..34caa8b 100644
--- a/base/tests/utils/unit/com/google/idea/blaze/base/async/executor/MockBlazeExecutor.java
+++ b/base/tests/utils/unit/com/google/idea/blaze/base/async/executor/MockBlazeExecutor.java
@@ -23,7 +23,7 @@
 /** Used in tests. */
 public class MockBlazeExecutor extends BlazeExecutor {
 
-  private final ListeningExecutorService executor = MoreExecutors.sameThreadExecutor();
+  private final ListeningExecutorService executor = MoreExecutors.newDirectExecutorService();
 
   @Override
   public <T> ListenableFuture<T> submit(final Callable<T> callable) {
diff --git a/base/tests/utils/unit/com/google/idea/blaze/base/model/MockBlazeProjectDataBuilder.java b/base/tests/utils/unit/com/google/idea/blaze/base/model/MockBlazeProjectDataBuilder.java
index 28b4b9c..8e104a7 100644
--- a/base/tests/utils/unit/com/google/idea/blaze/base/model/MockBlazeProjectDataBuilder.java
+++ b/base/tests/utils/unit/com/google/idea/blaze/base/model/MockBlazeProjectDataBuilder.java
@@ -18,18 +18,16 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetKey;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
-import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoderImpl;
-import com.google.idea.blaze.base.sync.workspace.BlazeRoots;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolverImpl;
-import java.io.File;
 
 /**
  * Use to build mock project data for tests.
@@ -42,8 +40,8 @@
 
   private long syncTime = 0;
   private TargetMap targetMap;
-  private ImmutableMap<String, String> blazeInfo;
-  private BlazeRoots blazeRoots;
+  private String outputBase;
+  private BlazeInfo blazeInfo;
   private BlazeVersionData blazeVersionData;
   private WorkspacePathResolver workspacePathResolver;
   private ArtifactLocationDecoder artifactLocationDecoder;
@@ -69,13 +67,13 @@
     return this;
   }
 
-  public MockBlazeProjectDataBuilder setBlazeInfo(ImmutableMap<String, String> blazeInfo) {
-    this.blazeInfo = blazeInfo;
+  public MockBlazeProjectDataBuilder setOutputBase(String outputBase) {
+    this.outputBase = outputBase;
     return this;
   }
 
-  public MockBlazeProjectDataBuilder setBlazeRoots(BlazeRoots blazeRoots) {
-    this.blazeRoots = blazeRoots;
+  public MockBlazeProjectDataBuilder setBlazeInfo(BlazeInfo blazeInfo) {
+    this.blazeInfo = blazeInfo;
     return this;
   }
 
@@ -116,16 +114,16 @@
   public BlazeProjectData build() {
     TargetMap targetMap =
         this.targetMap != null ? this.targetMap : new TargetMap(ImmutableMap.of());
-    ImmutableMap<String, String> blazeInfo =
-        this.blazeInfo != null ? this.blazeInfo : ImmutableMap.of();
-    BlazeRoots blazeRoots =
-        this.blazeRoots != null
-            ? this.blazeRoots
-            : new BlazeRoots(
-                new File(workspaceRoot.directory().getParentFile(), "exec_root"),
-                new ExecutionRootPath("bin"),
-                new ExecutionRootPath("gen"),
-                null);
+    BlazeInfo blazeInfo = this.blazeInfo;
+    if (blazeInfo == null) {
+      String outputBase = this.outputBase != null ? this.outputBase : "/usr/workspace/1234";
+      blazeInfo =
+          BlazeInfo.createMockBlazeInfo(
+              outputBase,
+              outputBase + "/execroot",
+              outputBase + "/execroot/bin",
+              outputBase + "/execroot/gen");
+    }
     BlazeVersionData blazeVersionData =
         this.blazeVersionData != null ? this.blazeVersionData : new BlazeVersionData();
     WorkspacePathResolver workspacePathResolver =
@@ -135,7 +133,7 @@
     ArtifactLocationDecoder artifactLocationDecoder =
         this.artifactLocationDecoder != null
             ? this.artifactLocationDecoder
-            : new ArtifactLocationDecoderImpl(blazeRoots, workspacePathResolver);
+            : new ArtifactLocationDecoderImpl(blazeInfo, workspacePathResolver);
     WorkspaceLanguageSettings workspaceLanguageSettings =
         this.workspaceLanguageSettings != null
             ? this.workspaceLanguageSettings
@@ -149,13 +147,11 @@
         syncTime,
         targetMap,
         blazeInfo,
-        blazeRoots,
         blazeVersionData,
         workspacePathResolver,
         artifactLocationDecoder,
         workspaceLanguageSettings,
         syncState,
-        reverseDependencies,
-        null);
+        reverseDependencies);
   }
 }
diff --git a/base/tests/utils/unit/com/google/idea/blaze/base/prefetch/MockPrefetchService.java b/base/tests/utils/unit/com/google/idea/blaze/base/prefetch/MockPrefetchService.java
index 8dbac18..bedd5d9 100644
--- a/base/tests/utils/unit/com/google/idea/blaze/base/prefetch/MockPrefetchService.java
+++ b/base/tests/utils/unit/com/google/idea/blaze/base/prefetch/MockPrefetchService.java
@@ -18,6 +18,7 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.intellij.openapi.project.Project;
 import java.io.File;
 import java.util.Collection;
@@ -32,7 +33,7 @@
 
   @Override
   public ListenableFuture<?> prefetchProjectFiles(
-      Project project, BlazeProjectData blazeProjectData) {
+      Project project, ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
     return Futures.immediateFuture(null);
   }
 }
diff --git a/build_defs/BUILD b/build_defs/BUILD
index 3c8b0b3..19ad33f 100644
--- a/build_defs/BUILD
+++ b/build_defs/BUILD
@@ -25,3 +25,13 @@
     name = "api_version_txt",
     srcs = ["api_version_txt.py"],
 )
+
+py_binary(
+    name = "append_optional_xml_elements",
+    srcs = ["append_optional_xml_elements.py"],
+)
+
+py_binary(
+    name = "package_meta_inf_files",
+    srcs = ["package_meta_inf_files.py"],
+)
diff --git a/build_defs/append_optional_xml_elements.py b/build_defs/append_optional_xml_elements.py
new file mode 100755
index 0000000..c987fe1
--- /dev/null
+++ b/build_defs/append_optional_xml_elements.py
@@ -0,0 +1,46 @@
+"""Appends XML elements specifying optional dependencies to a plugin XML file.
+"""
+
+import argparse
+from itertools import izip
+from xml.dom.minidom import parse
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument(
+    "--plugin_xml", help="The main plugin xml file", required=True)
+parser.add_argument("--output", help="The output file.")
+parser.add_argument(
+    "optional_xml_files",
+    nargs="+",
+    help="Sequence of module, module xml... pairs")
+
+
+def pairwise(t):
+  it = iter(t)
+  return izip(it, it)
+
+
+def main():
+
+  args = parser.parse_args()
+  dom = parse(args.plugin_xml)
+
+  plugin_xml = dom.documentElement
+
+  for module, optional_xml in pairwise(args.optional_xml_files):
+    depends_element = dom.createElement("depends")
+    depends_element.setAttribute("optional", "true")
+    depends_element.setAttribute("config-file", optional_xml)
+    depends_element.appendChild(dom.createTextNode(module))
+    plugin_xml.appendChild(depends_element)
+
+  if args.output:
+    with file(args.output, "w") as f:
+      f.write(dom.toxml())
+  else:
+    print dom.toxml()
+
+
+if __name__ == "__main__":
+  main()
diff --git a/build_defs/build_defs.bzl b/build_defs/build_defs.bzl
index b695241..5325028 100644
--- a/build_defs/build_defs.bzl
+++ b/build_defs/build_defs.bzl
@@ -2,6 +2,7 @@
 """
 
 load(":intellij_plugin_debug_target.bzl", "intellij_plugin_debug_target")
+load(":intellij_plugin.bzl", "intellij_plugin", "optional_plugin_xml")
 
 def merged_plugin_xml(name, srcs, **kwargs):
   """Merges N plugin.xml files together."""
@@ -178,72 +179,7 @@
       tools = [api_version_txt_tool],
       **kwargs)
 
-def intellij_plugin(name, deps, plugin_xml, meta_inf_files=[], jar_name=None, **kwargs):
-  """Creates an intellij plugin from the given deps and plugin.xml.
-
-  Args:
-    name: The name of the target
-    deps: Any java dependencies rolled up into the plugin jar.
-    plugin_xml: An xml file to be placed in META-INF/plugin.jar
-    meta_inf_files: Any further files to be placed in META-INF/plugin.jar
-    jar_name: The name of the final plugin jar, or <name>.jar if None
-    **kwargs: Any further arguments to be passed to the final target
-  """
-  zip_tool = "//third_party:zip"
-  binary_name = name + "_binary"
-  deploy_jar = binary_name + "_deploy.jar"
-  native.java_binary(
-      name = binary_name,
-      runtime_deps = deps,
-      create_executable = 0,
-  )
-  cmd = [
-      "cp $(location {deploy_jar}) $@".format(deploy_jar=deploy_jar),
-      "chmod +w $@",
-      "mkdir -p META-INF",
-      "cp $(location {plugin_xml}) META-INF/plugin.xml".format(plugin_xml=plugin_xml),
-  ]
-  srcs = meta_inf_files + [
-      plugin_xml,
-      deploy_jar,
-  ]
-
-  for meta_inf_file in meta_inf_files:
-    cmd.append("meta_inf_files='$(locations {meta_inf_file})'".format(meta_inf_file=meta_inf_file))
-    cmd.append("for f in $$meta_inf_files; do cp $$f META-INF/; done")
-  cmd.append("$(location {zip_tool}) -u $@ META-INF/* >/dev/null".format(zip_tool=zip_tool))
-  cmd.append("rm -rf META-INF")
-
-  jar_name = jar_name or (name + ".jar")
-  native.genrule(
-      name = name + "_genrule",
-      srcs = srcs,
-      tools = [zip_tool],
-      outs = [jar_name],
-      cmd = " ; ".join(cmd),
-  )
-
-  # included (with tag) as a hack so that IJwB can recognize this is an intellij plugin
-  native.java_import(
-      name = name,
-      jars = [name + ".jar"],
-      tags = ["intellij-plugin"],
-      **kwargs)
-
-def plugin_bundle(name, plugins):
-  """Communicates to IJwB a set of plugins which should be loaded together in a run configuration.
-
-  Args:
-    name: the name of this target
-    plugins: the 'intellij_plugin' targets to be bundled
-  """
-  native.java_library(
-      name = name,
-      exports = plugins,
-      tags = ["intellij-plugin-bundle"],
-  )
-
-def repackaged_jar(name, deps, rules, launcher=None, **kwargs):
+def repackaged_jar(name, deps, rules, **kwargs):
   """Repackages classes in a jar, to avoid collisions in the classpath.
 
   Args:
@@ -255,25 +191,18 @@
           FindClass(JNIEnv *, const char *) with hard-coded native string
           literals that jarjar doesn't rewrite.
         - com.google.errorprone packages (rewriting will throw off blaze build).
-    launcher: The launcher arg to pass to java_binary
     **kwargs: Any additional arguments to pass to the final target.
   """
-  java_binary_name = name + "_deploy_jar"
+  java_binary_name = name + "_orig"
   out = name + ".jar"
   native.java_binary(
       name = java_binary_name,
       create_executable = 0,
       stamp = 0,
-      launcher = launcher,
-      runtime_deps = deps,
-  )
-  _repackage_jar(name, java_binary_name, out, rules, **kwargs)
+      runtime_deps = deps)
+  _repackaged_jar(name, java_binary_name, out, rules, **kwargs)
 
-def repackage_jar(name, src_rule, out, rules, **kwargs):
-  print("repackage_jar is deprecated. Please switch to repackaged_jar.")
-  _repackage_jar(name,  src_rule, out, rules, **kwargs)
-
-def _repackage_jar(name, src_rule, out, rules, **kwargs):
+def _repackaged_jar(name, src_rule, out, rules, **kwargs):
   """Repackages classes in a jar, to avoid collisions in the classpath."""
   repackage_tool = "@jarjar//jar"
   deploy_jar = "{src_rule}_deploy.jar".format(src_rule=src_rule)
@@ -290,7 +219,7 @@
       repackage_tool = repackage_tool,
       deploy_jar = deploy_jar,
   ))
-  genrule_name = name + "_gen"
+  genrule_name = name + "_repackaged"
   native.genrule(
       name = genrule_name,
       srcs = [deploy_jar],
@@ -302,3 +231,9 @@
       name = name,
       jars = [out],
       **kwargs)
+
+def beta_gensignature(name, srcs, stable, stable_version, beta_version):
+  if stable_version == beta_version:
+    native.alias(name = name, actual = stable)
+  else:
+    native.gensignature(name = name, srcs = srcs)
diff --git a/build_defs/intellij_plugin.bzl b/build_defs/intellij_plugin.bzl
new file mode 100644
index 0000000..207435d
--- /dev/null
+++ b/build_defs/intellij_plugin.bzl
@@ -0,0 +1,220 @@
+"""IntelliJ plugin target rule.
+
+Creates a plugin jar with the given plugin xml and any
+optional plugin xmls.
+
+To provide optional plugin xmls, use the 'optional_plugin_xml'
+rule. These will be renamed, put in the META-INF directory,
+and the main plugin xml stamped with optional plugin dependencies
+that point to the correct META-INF optional plugin xmls.
+
+optional_plugin_xml(
+  name = "optional_python_xml",
+  plugin_xml = "my_optional_python_plugin.xml",
+  module = "com.idea.python.module.id",
+)
+
+intellij_plugin(
+  name = "my_plugin",
+  plugin_xml = ["my_plugin.xml"],
+  optional_plugin_xmls = [":optional_python_xml"],
+  deps = [
+    ":code_deps",
+  ],
+)
+
+"""
+
+optional_plugin_xml_provider = provider()
+
+def _optional_plugin_xml_impl(ctx):
+  attr = ctx.attr
+  optional_plugin_xmls = []
+  if ctx.file.plugin_xml:
+    optional_plugin_xmls.append(struct(
+        plugin_xml = ctx.file.plugin_xml,
+        module = attr.module,
+    ))
+  return struct(
+      optional_plugin_xml_data = optional_plugin_xml_provider(
+          optional_plugin_xmls = optional_plugin_xmls,
+      ),
+  )
+
+optional_plugin_xml = rule(
+    implementation = _optional_plugin_xml_impl,
+    attrs = {
+        "plugin_xml": attr.label(mandatory=True, allow_single_file=[".xml"]),
+        "module": attr.string(mandatory=True),
+    },
+)
+
+def _merge_optional_plugin_xmls(ctx):
+  # Collect optional plugin xmls
+  module_to_xmls = {}
+  for target in ctx.attr.optional_plugin_xmls:
+    if not hasattr(target, "optional_plugin_xml_data"):
+      fail("optional_plugin_xmls only accepts optional_plugin_xml targets")
+    for xml in target.optional_plugin_xml_data.optional_plugin_xmls:
+      module = xml.module
+      plugin_xmls = module_to_xmls.setdefault(module, [])
+      plugin_xmls.append(xml.plugin_xml)
+
+  # Merge xmls with the same module dependency
+  module_to_merged_xmls = {}
+  for module, plugin_xmls in module_to_xmls.items():
+    merged_name = "merged_xml_for_" + module + "_" + ctx.label.name + ".xml"
+    merged_file = ctx.new_file(merged_name)
+    ctx.action(
+        executable = ctx.executable._merge_xml_binary,
+        arguments = ["--output", merged_file.path] + [plugin_xml.path for plugin_xml in plugin_xmls],
+        inputs = list(plugin_xmls),
+        outputs = [merged_file],
+        progress_message = "Merging optional xmls",
+        mnemonic = "MergeOptionalXmls",
+    )
+    module_to_merged_xmls[module] = merged_file
+  return module_to_merged_xmls
+
+def _add_optional_dependencies_to_plugin_xml(ctx, modules):
+  input_plugin_xml_file = ctx.file.plugin_xml
+  if not modules:
+    return input_plugin_xml_file
+
+  # Add optional dependencies into the plugin xml
+  args = []
+  final_plugin_xml_file = ctx.new_file("final_plugin_xml_" + ctx.label.name + ".xml")
+  args.extend(["--plugin_xml", input_plugin_xml_file.path])
+  args.extend(["--output", final_plugin_xml_file.path])
+  for module in modules:
+    args.append(module)
+    args.append(_filename_for_module_dependency(module))
+  ctx.action(
+      executable = ctx.executable._append_optional_xml_elements,
+      arguments = args,
+      inputs = [input_plugin_xml_file],
+      outputs = [final_plugin_xml_file],
+      progress_message = "Adding optional dependencies to final plugin xml",
+      mnemonic = "AddModuleDependencies",
+  )
+  return final_plugin_xml_file
+
+def _only_file(target):
+  return list(target.files)[0]
+
+def _filename_for_module_dependency(module):
+  """A unique filename for the optional xml dependency for a given module."""
+  return "optional-" + module + ".xml"
+
+def _package_meta_inf_files(ctx, final_plugin_xml_file, module_to_merged_xmls):
+  jar_name = ctx.attr.jar_name
+  jar_file = ctx.new_file(jar_name)
+
+  args = []
+  args.extend(["--deploy_jar", ctx.file.deploy_jar.path])
+  args.extend(["--output", jar_file.path])
+  args.extend([final_plugin_xml_file.path, "plugin.xml"])
+  for module, merged_xml in module_to_merged_xmls.items():
+    args.append(merged_xml.path)
+    args.append(_filename_for_module_dependency(module))
+  ctx.action(
+      executable = ctx.executable._package_meta_inf_files,
+      arguments = args,
+      inputs = [ctx.file.deploy_jar, final_plugin_xml_file] + module_to_merged_xmls.values(),
+      outputs = [jar_file],
+      mnemonic = "PackagePluginJar",
+      progress_message = "Packaging plugin jar",
+  )
+  return jar_file
+
+def _intellij_plugin_jar_impl(ctx):
+  module_to_merged_xmls = _merge_optional_plugin_xmls(ctx)
+  final_plugin_xml_file = _add_optional_dependencies_to_plugin_xml(ctx, module_to_merged_xmls.keys())
+  jar_file = _package_meta_inf_files(ctx, final_plugin_xml_file, module_to_merged_xmls)
+  files = set([jar_file])
+  return struct(
+      files = files,
+  )
+
+_intellij_plugin_jar = rule(
+    implementation = _intellij_plugin_jar_impl,
+    attrs = {
+        "deploy_jar": attr.label(mandatory=True, allow_single_file=[".jar"]),
+        "plugin_xml": attr.label(mandatory=True, allow_single_file=[".xml"]),
+        "optional_plugin_xmls": attr.label_list(),
+        "jar_name": attr.string(mandatory=True),
+        "_merge_xml_binary": attr.label(
+            default = Label("//build_defs:merge_xml"),
+            executable = True,
+            cfg = "host",
+        ),
+        "_append_optional_xml_elements": attr.label(
+            default = Label("//build_defs:append_optional_xml_elements"),
+            executable = True,
+            cfg = "host",
+        ),
+        "_package_meta_inf_files": attr.label(
+            default = Label("//build_defs:package_meta_inf_files"),
+            executable = True,
+            cfg = "host",
+        ),
+    },
+)
+
+def intellij_plugin(name, deps, plugin_xml, optional_plugin_xmls=[], jar_name=None, **kwargs):
+  """Creates an intellij plugin from the given deps and plugin.xml.
+
+  Args:
+    name: The name of the target
+    deps: Any java dependencies rolled up into the plugin jar.
+    plugin_xml: An xml file to be placed in META-INF/plugin.jar
+    optional_plugin_xmls: A list of optional_plugin_xml targets.
+    jar_name: The name of the final plugin jar, or <name>.jar if None
+    **kwargs: Any further arguments to be passed to the final target
+  """
+  binary_name = name + "_binary"
+  deploy_jar = binary_name + "_deploy.jar"
+  native.java_binary(
+      name = binary_name,
+      runtime_deps = deps,
+      create_executable = 0,
+  )
+  jar_target_name =  name + "_intellij_plugin_jar"
+  _intellij_plugin_jar(
+      name = jar_target_name,
+      deploy_jar = deploy_jar,
+      jar_name = jar_name or (name + ".jar"),
+      plugin_xml = plugin_xml,
+      optional_plugin_xmls = optional_plugin_xmls,
+  )
+  # included (with tag) as a hack so that IJwB can recognize this is an intellij plugin
+  native.java_import(
+      name = name,
+      jars = [jar_target_name],
+      tags = ["intellij-plugin"],
+      **kwargs)
+
+def _append_optional_dependencies(name, plugin_xml, module_to_merged_xml):
+  """Appends optional dependency xml elements to plugin xml."""
+  append_elements_tool = "//build_defs:append_optional_xml_elements"
+  args = [
+      "./$(location {append_elements_tool})",
+      "--plugin_xml=$(location {plugin_xml})",
+      "--optional_xml_files={merged_optional_xml_files}",
+  ]
+  dictionary = {k: _filename_for_module_dependency(k) for k in module_to_merged_xml.keys()}
+  cmd = " ".join(args).format(
+      append_elements_tool=append_elements_tool,
+      plugin_xml=plugin_xml,
+      merged_optional_xml_files='"%s"' % str(dictionary).replace('"', '\\"'),
+  ) + "> $@"
+
+  srcs = module_to_merged_xml.values() + [plugin_xml]
+
+  native.genrule(
+      name = name,
+      srcs = srcs,
+      outs = [name + ".xml"],
+      cmd = cmd,
+      tools = [append_elements_tool],
+  )
diff --git a/build_defs/intellij_plugin_debug_target.bzl b/build_defs/intellij_plugin_debug_target.bzl
index 484a6fe..37ec6f6 100644
--- a/build_defs/intellij_plugin_debug_target.bzl
+++ b/build_defs/intellij_plugin_debug_target.bzl
@@ -28,6 +28,8 @@
 
 """
 
+SUFFIX = ".intellij-plugin-debug-target-deploy-info"
+
 def _trim_start(path, prefix):
   return path[len(prefix):] if path.startswith(prefix) else path
 
@@ -86,12 +88,29 @@
     implementation = _intellij_plugin_debug_target_aspect_impl,
 )
 
+def _build_deploy_info_file(deploy_file):
+  return struct(
+      execution_path = deploy_file.src.path,
+      deploy_location = deploy_file.deploy_location,
+  )
+
 def _intellij_plugin_debug_target_impl(ctx):
   files = set()
   deploy_files = []
   for target in ctx.attr.deps:
     files = files | target.files
     deploy_files.extend(target.aspect_intellij_plugin_deploy_info.deploy_files)
+  deploy_info = struct(
+      deploy_files = [_build_deploy_info_file(f) for f in deploy_files]
+  )
+  output = ctx.new_file(ctx.label.name + SUFFIX)
+  ctx.file_action(output, deploy_info.to_proto())
+
+  # We've already consumed any dependent intellij_plugin_debug_targets into our own,
+  # do not build or report these
+  files = set([f for f in files if not f.path.endswith(SUFFIX)])
+  files = files | set([output])
+
   return struct(
       files = files,
       intellij_plugin_deploy_info = struct(
diff --git a/build_defs/merge_xml.py b/build_defs/merge_xml.py
index b5840e6..2c58164 100755
--- a/build_defs/merge_xml.py
+++ b/build_defs/merge_xml.py
@@ -1,9 +1,22 @@
 """Merges multiple xml files with the same top element tags into a single file.
 """
 
+import argparse
 import sys
 from xml.dom.minidom import parse
 
+parser = argparse.ArgumentParser()
+
+parser.add_argument(
+    "--output",
+    help="The file to output to. If none, prints to stdout.",
+    required=False,)
+
+parser.add_argument(
+    "xmls",
+    nargs="+",
+    help="The xml files to merge",)
+
 
 def AppendFileToTree(filepath, tree):
   """Reads XML from a file and appends XML content to the tree.
@@ -30,12 +43,16 @@
 
 
 if __name__ == "__main__":
-  if len(sys.argv) < 2:
-    print "Need xml filename(s) to be checked as parameter"
+  args = parser.parse_args()
+  if not args.xmls:
     sys.exit(2)
 
-  dom = parse(sys.argv[1])
-  for filename in sys.argv[2:]:
+  dom = parse(args.xmls[0])
+  for filename in args.xmls[1:]:
     AppendFileToTree(filename, dom)
 
-  print dom.toxml()
+  if args.output:
+    with file(args.output, "w") as f:
+      f.write(dom.toxml())
+  else:
+    print dom.toxml()
diff --git a/build_defs/package_meta_inf_files.py b/build_defs/package_meta_inf_files.py
new file mode 100644
index 0000000..c261974
--- /dev/null
+++ b/build_defs/package_meta_inf_files.py
@@ -0,0 +1,44 @@
+"""Adds a list of files into the META-INF directory of the passed deploy jar.
+"""
+
+import argparse
+from itertools import izip
+import shutil
+import zipfile
+
+# Set to Jan 1 1980, the earliest date supported by zipfile
+ZIP_DATE = (1980, 1, 1, 0, 0, 0)
+
+parser = argparse.ArgumentParser()
+
+parser.add_argument(
+    "--deploy_jar",
+    required=True,
+    help="The deploy jar to modify.",)
+parser.add_argument(
+    "--output",
+    required=True,
+    help="The output file.",)
+parser.add_argument(
+    "meta_inf_files",
+    nargs="+",
+    help="Sequence of input file, final file name pairs",)
+
+
+def pairwise(t):
+  it = iter(t)
+  return izip(it, it)
+
+
+def main():
+  args = parser.parse_args()
+
+  shutil.copyfile(args.deploy_jar, args.output)
+  output_jar = zipfile.ZipFile(args.output, "a")
+  for meta_inf_file, name in pairwise(args.meta_inf_files):
+    with file(meta_inf_file) as f:
+      zip_info = zipfile.ZipInfo("META-INF/" + name, ZIP_DATE)
+      output_jar.writestr(zip_info, f.read())
+
+if __name__ == "__main__":
+  main()
diff --git a/clwb/BUILD b/clwb/BUILD
index fbd119b..e420e93 100644
--- a/clwb/BUILD
+++ b/clwb/BUILD
@@ -10,6 +10,7 @@
     "merged_plugin_xml",
     "stamped_plugin_xml",
 )
+load("//intellij_platform_sdk:build_defs.bzl", "select_for_plugin_api")
 load("//:version.bzl", "VERSION")
 
 merged_plugin_xml(
@@ -18,8 +19,8 @@
         "src/META-INF/clwb.xml",
         "//base:plugin_xml",
         "//cpp:plugin_xml",
+        "//python:plugin_xml",
     ],
-    visibility = ["//visibility:public"],
 )
 
 merged_plugin_xml(
@@ -32,6 +33,7 @@
 
 stamped_plugin_xml(
     name = "stamped_plugin_xml",
+    changelog_file = "//:changelog",
     include_product_code_in_stamp = True,
     plugin_id = "com.google.idea.bazel.clwb",
     plugin_name = "CLion with Bazel",
@@ -43,7 +45,12 @@
 java_library(
     name = "clwb_lib",
     srcs = glob(["src/**/*.java"]),
-    visibility = ["//visibility:public"],
+    runtime_deps = [
+        "//terminal",
+    ] + select_for_plugin_api({
+        "clion-2016.3.2": [],
+        "default": ["//python"],
+    }),
     deps = [
         "//base",
         "//common/experiments",
@@ -54,8 +61,14 @@
     ],
 )
 
+OPTIONAL_PLUGIN_XMLS = [
+    "//python:optional_xml",
+    "//terminal:optional_xml",
+]
+
 intellij_plugin(
     name = "clwb_bazel",
+    optional_plugin_xmls = OPTIONAL_PLUGIN_XMLS,
     plugin_xml = ":stamped_plugin_xml",
     deps = [
         ":clwb_lib",
diff --git a/clwb/clwb.bazelproject b/clwb/clwb.bazelproject
index 76911c2..b083707 100644
--- a/clwb/clwb.bazelproject
+++ b/clwb/clwb.bazelproject
@@ -3,7 +3,6 @@
   -ijwb
   -aswb
   -plugin_dev
-  -cpp/src/com/google/idea/blaze/cpp/versioned/v145
 
 targets:
   //clwb:clwb_bazel
diff --git a/clwb/src/META-INF/clwb.xml b/clwb/src/META-INF/clwb.xml
index 32e7b0a..1b79d3c 100644
--- a/clwb/src/META-INF/clwb.xml
+++ b/clwb/src/META-INF/clwb.xml
@@ -73,6 +73,11 @@
     <component>
       <implementation-class>com.google.idea.blaze.clwb.run.producers.NonBlazeProducerSuppressor</implementation-class>
     </component>
+    <component>
+      <interface-class>com.jetbrains.cidr.cpp.cmake.workspace.CMakeWorkspace</interface-class>
+      <implementation-class>com.google.idea.blaze.plugin.CMakeWorkspaceOverride</implementation-class>
+      <option name="overrides" value="true"/>
+    </component>
   </project-components>
 
 </idea-plugin>
diff --git a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrDebuggableConfigurationFactory.java b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrDebuggableConfigurationFactory.java
index 5e740f3..55b0592 100644
--- a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrDebuggableConfigurationFactory.java
+++ b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrDebuggableConfigurationFactory.java
@@ -55,9 +55,9 @@
     Kind kind = blazeConfig.getKindForTarget();
     if (state != null) {
       if (kind != null && Kind.isTestRule(kind.toString())) {
-        state.setCommand(BlazeCommandName.TEST);
+        state.getCommandState().setCommand(BlazeCommandName.TEST);
       } else {
-        state.setCommand(BlazeCommandName.RUN);
+        state.getCommandState().setCommand(BlazeCommandName.RUN);
       }
     }
     blazeConfig.setGeneratedName();
diff --git a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrLauncher.java b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrLauncher.java
index f5ca00e..473400b 100644
--- a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrLauncher.java
+++ b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrLauncher.java
@@ -102,16 +102,17 @@
 
     BlazeCommand.Builder command =
         BlazeCommand.builder(
-                Blaze.getBuildSystemProvider(project).getBinaryPath(), handlerState.getCommand())
+                Blaze.getBuildSystemProvider(project).getBinaryPath(),
+                handlerState.getCommandState().getCommand())
             .addTargets(configuration.getTarget())
             .addBlazeFlags(BlazeFlags.buildFlags(project, ProjectViewSet.builder().build()))
             .addBlazeFlags(testHandlerFlags)
-            .addBlazeFlags(handlerState.getBlazeFlags())
-            .addExeFlags(handlerState.getExeFlags());
+            .addBlazeFlags(handlerState.getBlazeFlagsState().getExpandedFlags())
+            .addExeFlags(handlerState.getExeFlagsState().getExpandedFlags());
 
     command.addBlazeFlags(
         DistributedExecutorSupport.getBlazeFlags(
-            project, handlerState.getRunOnDistributedExecutor()));
+            project, handlerState.getRunOnDistributedExecutorState().runOnDistributedExecutor));
 
     state.setConsoleBuilder(createConsoleBuilder(testEventsHandler));
 
@@ -153,7 +154,7 @@
     GeneralCommandLine commandLine = new GeneralCommandLine(runner.executableToDebug.getPath());
     File workingDir = workspaceRoot.directory();
     commandLine.setWorkDirectory(workingDir);
-    commandLine.addParameters(handlerState.getExeFlags());
+    commandLine.addParameters(handlerState.getExeFlagsState().getExpandedFlags());
 
     TrivialInstaller installer = new TrivialInstaller(commandLine);
     ImmutableList<String> startupCommands = getGdbStartupCommands(workingDir);
@@ -189,8 +190,8 @@
   }
 
   private boolean useTestUi() {
-    return BlazeCommandName.TEST.equals(handlerState.getCommand())
-        && !handlerState.getRunOnDistributedExecutor();
+    return BlazeCommandName.TEST.equals(handlerState.getCommandState().getCommand())
+        && !handlerState.getRunOnDistributedExecutorState().runOnDistributedExecutor;
   }
 
   private final class GoogleTestConsoleBuilder extends CidrConsoleBuilderAdapter {
diff --git a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationHandler.java b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationHandler.java
index c5ded30..6a6f411 100644
--- a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationHandler.java
+++ b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationHandler.java
@@ -78,7 +78,7 @@
   @Override
   @Nullable
   public String getCommandName() {
-    BlazeCommandName command = state.getCommand();
+    BlazeCommandName command = state.getCommandState().getCommand();
     return command != null ? command.toString() : null;
   }
 
diff --git a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java
index c1008cd..42a78c7 100644
--- a/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java
+++ b/clwb/src/com/google/idea/blaze/clwb/run/BlazeCidrRunConfigurationRunner.java
@@ -127,7 +127,7 @@
                             BlazeCommandName.BUILD)
                         .addTargets(configuration.getTarget())
                         .addBlazeFlags(BlazeFlags.buildFlags(project, projectViewSet))
-                        .addBlazeFlags(handlerState.getBlazeFlags())
+                        .addBlazeFlags(handlerState.getBlazeFlagsState().getExpandedFlags())
                         .addBlazeFlags(buildResultHelper.getBuildFlags());
 
                 // If we are trying to debug, make sure we are building in debug mode.
diff --git a/clwb/src/com/google/idea/blaze/clwb/run/RunConfigurationUtils.java b/clwb/src/com/google/idea/blaze/clwb/run/RunConfigurationUtils.java
index 10e7c7f..21845ca 100644
--- a/clwb/src/com/google/idea/blaze/clwb/run/RunConfigurationUtils.java
+++ b/clwb/src/com/google/idea/blaze/clwb/run/RunConfigurationUtils.java
@@ -34,7 +34,7 @@
     if (handlerState == null) {
       return false;
     }
-    BlazeCommandName command = handlerState.getCommand();
+    BlazeCommandName command = handlerState.getCommandState().getCommand();
     return kind != null
         && command != null
         && ((kind == Kind.CC_TEST && command.equals(BlazeCommandName.TEST))
diff --git a/clwb/src/com/google/idea/blaze/clwb/run/producers/BlazeCidrTestConfigurationProducer.java b/clwb/src/com/google/idea/blaze/clwb/run/producers/BlazeCidrTestConfigurationProducer.java
index b901eb0..cf7f91f 100644
--- a/clwb/src/com/google/idea/blaze/clwb/run/producers/BlazeCidrTestConfigurationProducer.java
+++ b/clwb/src/com/google/idea/blaze/clwb/run/producers/BlazeCidrTestConfigurationProducer.java
@@ -78,16 +78,16 @@
     if (handlerState == null) {
       return false;
     }
-    handlerState.setCommand(BlazeCommandName.TEST);
+    handlerState.getCommandState().setCommand(BlazeCommandName.TEST);
 
     ImmutableList.Builder<String> flags = ImmutableList.builder();
     String testFilter = test.getTestFilterFlag();
     if (testFilter != null) {
       flags.add(testFilter);
     }
-    flags.addAll(handlerState.getBlazeFlags());
+    flags.addAll(handlerState.getBlazeFlagsState().getRawFlags());
 
-    handlerState.setBlazeFlags(flags.build());
+    handlerState.getBlazeFlagsState().setRawFlags(flags.build());
     configuration.setName(
         String.format(
             "%s test: %s",
@@ -103,7 +103,7 @@
     if (handlerState == null) {
       return false;
     }
-    if (!Objects.equals(handlerState.getCommand(), BlazeCommandName.TEST)) {
+    if (!Objects.equals(handlerState.getCommandState().getCommand(), BlazeCommandName.TEST)) {
       return false;
     }
     PsiElement element = selectedPsiElement(context);
diff --git a/clwb/src/com/google/idea/blaze/clwb/run/producers/NonBlazeProducerSuppressor.java b/clwb/src/com/google/idea/blaze/clwb/run/producers/NonBlazeProducerSuppressor.java
index 8f163a7..189ba34 100644
--- a/clwb/src/com/google/idea/blaze/clwb/run/producers/NonBlazeProducerSuppressor.java
+++ b/clwb/src/com/google/idea/blaze/clwb/run/producers/NonBlazeProducerSuppressor.java
@@ -15,20 +15,15 @@
  */
 package com.google.idea.blaze.clwb.run.producers;
 
-import com.google.common.collect.ImmutableList;
 import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.sdkcompat.clion.CMakeConfigurationProducersList;
 import com.intellij.execution.RunConfigurationProducerService;
-import com.intellij.execution.actions.RunConfigurationProducer;
 import com.intellij.openapi.components.AbstractProjectComponent;
 import com.intellij.openapi.project.Project;
-import com.jetbrains.cidr.cpp.execution.testing.CMakeGoogleTestRunConfigurationProducer;
-import java.util.Collection;
 
 /** Suppresses certain non-Blaze configuration producers in Blaze projects. */
 public class NonBlazeProducerSuppressor extends AbstractProjectComponent {
 
-  private static final Collection<Class<? extends RunConfigurationProducer<?>>>
-      PRODUCERS_TO_SUPPRESS = ImmutableList.of(CMakeGoogleTestRunConfigurationProducer.class);
 
   public NonBlazeProducerSuppressor(Project project) {
     super(project);
@@ -44,6 +39,7 @@
   private static void suppressProducers(Project project) {
     RunConfigurationProducerService producerService =
         RunConfigurationProducerService.getInstance(project);
-    PRODUCERS_TO_SUPPRESS.forEach(producerService::addIgnoredProducer);
+    CMakeConfigurationProducersList.PRODUCERS_TO_SUPPRESS.forEach(
+        producerService::addIgnoredProducer);
   }
 }
diff --git a/clwb/src/com/google/idea/blaze/clwb/run/test/BlazeCppTestLocator.java b/clwb/src/com/google/idea/blaze/clwb/run/test/BlazeCppTestLocator.java
index 283e78d..cd02fc0 100644
--- a/clwb/src/com/google/idea/blaze/clwb/run/test/BlazeCppTestLocator.java
+++ b/clwb/src/com/google/idea/blaze/clwb/run/test/BlazeCppTestLocator.java
@@ -18,13 +18,13 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
 import com.google.idea.blaze.base.run.smrunner.SmRunnerUtils;
+import com.google.idea.sdkcompat.cidr.CidrGoogleTestUtilAdapter;
 import com.intellij.execution.Location;
 import com.intellij.execution.testframework.sm.runner.SMTestLocator;
 import com.intellij.openapi.project.Project;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.util.CommonProcessors;
-import com.jetbrains.cidr.execution.testing.CidrTestUtil;
 import com.jetbrains.cidr.lang.psi.OCMacroCall;
 import com.jetbrains.cidr.lang.psi.OCStruct;
 import com.jetbrains.cidr.lang.symbols.OCSymbol;
@@ -96,9 +96,11 @@
     }
     OCSymbol<?> symbol;
     if (method != null) {
-      symbol = CidrTestUtil.findGoogleTestSymbol(project, suite, method);
+      symbol = CidrGoogleTestUtilAdapter.findGoogleTestSymbol(project, suite, method);
     } else if (instantiation != null) {
-      symbol = CidrTestUtil.findGoogleTestInstantiationSymbol(project, suite, instantiation);
+      symbol =
+          CidrGoogleTestUtilAdapter.findGoogleTestInstantiationSymbol(
+              project, suite, instantiation);
     } else {
       symbol = findSuiteSymbol(project, suite);
     }
@@ -120,7 +122,7 @@
           @Override
           protected boolean accept(OCSymbol symbol) {
             return symbol instanceof OCStructSymbol
-                && CidrTestUtil.isGoogleTestClass((OCStructSymbol) symbol);
+                && CidrGoogleTestUtilAdapter.isGoogleTestClass((OCStructSymbol) symbol);
           }
         };
     OCGlobalProjectSymbolsCache.processTopLevelAndMemberSymbols(project, processor, suite);
@@ -128,7 +130,7 @@
       return (OCStructSymbol) processor.getFoundValue();
     }
     Collection<OCStructSymbol> symbolsForSuite =
-        CidrTestUtil.findGoogleTestSymbolsForSuiteSorted(project, suite);
+        CidrGoogleTestUtilAdapter.findGoogleTestSymbolsForSuiteSorted(project, suite);
     return Iterables.getFirst(symbolsForSuite, null);
   }
 }
diff --git a/clwb/src/com/google/idea/blaze/clwb/run/test/GoogleTestLocation.java b/clwb/src/com/google/idea/blaze/clwb/run/test/GoogleTestLocation.java
index ebf41c1..84e036a 100644
--- a/clwb/src/com/google/idea/blaze/clwb/run/test/GoogleTestLocation.java
+++ b/clwb/src/com/google/idea/blaze/clwb/run/test/GoogleTestLocation.java
@@ -16,12 +16,12 @@
 package com.google.idea.blaze.clwb.run.test;
 
 import com.google.idea.blaze.base.command.BlazeFlags;
+import com.google.idea.sdkcompat.cidr.CidrGoogleTestUtilAdapter;
 import com.intellij.execution.Location;
 import com.intellij.execution.PsiLocation;
 import com.intellij.openapi.util.Couple;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.util.PsiTreeUtil;
-import com.jetbrains.cidr.execution.testing.CidrTestUtil;
 import com.jetbrains.cidr.lang.psi.OCFile;
 import com.jetbrains.cidr.lang.psi.OCFunctionDefinition;
 import com.jetbrains.cidr.lang.psi.OCMacroCall;
@@ -71,8 +71,8 @@
     OCStructSymbol parentSymbol;
     if (parent instanceof OCStruct
         && ((parentSymbol = ((OCStruct) parent).getSymbol()) != null)
-        && CidrTestUtil.isGoogleTestClass(parentSymbol)) {
-      Couple<String> name = CidrTestUtil.extractGoogleTestName(parentSymbol);
+        && CidrGoogleTestUtilAdapter.isGoogleTestClass(parentSymbol)) {
+      Couple<String> name = CidrGoogleTestUtilAdapter.extractGoogleTestName(parentSymbol);
       if (name != null) {
         return createFromClassAndMethod(parent, name.first, name.second);
       }
@@ -85,9 +85,10 @@
         if (resolvedOwner != null) {
           OCSymbol<?> owner = resolvedOwner.getDefinitionSymbol();
           if (owner instanceof OCStructSymbol
-              && CidrTestUtil.isGoogleTestClass((OCStructSymbol) owner)) {
+              && CidrGoogleTestUtilAdapter.isGoogleTestClass((OCStructSymbol) owner)) {
             OCStruct struct = (OCStruct) owner.locateDefinition();
-            Couple<String> name = CidrTestUtil.extractGoogleTestName((OCStructSymbol) owner);
+            Couple<String> name =
+                CidrGoogleTestUtilAdapter.extractGoogleTestName((OCStructSymbol) owner);
             if (name != null) {
               return createFromClassAndMethod(struct, name.first, name.second);
             }
@@ -100,7 +101,7 @@
     // if we're still here, let's test for a macro and, as a last resort, a file.
     parent = PsiTreeUtil.getNonStrictParentOfType(element, OCMacroCall.class, OCFile.class);
     if (parent instanceof OCMacroCall) {
-      OCMacroCall gtestMacro = CidrTestUtil.findGoogleTestMacros(parent);
+      OCMacroCall gtestMacro = CidrGoogleTestUtilAdapter.findGoogleTestMacros(parent);
       if (gtestMacro != null) {
         List<OCMacroCallArgument> arguments = gtestMacro.getArguments();
         if (arguments.size() >= 2) {
@@ -112,20 +113,21 @@
           boolean isSuite =
               isFirstArgument(PsiTreeUtil.getParentOfType(element, OCMacroCallArgument.class))
                   || isFirstArgument(element.getPrevSibling());
-          String suiteName = CidrTestUtil.extractArgumentValue(suiteArg);
-          String testName = CidrTestUtil.extractArgumentValue(testArg);
+          String suiteName = CidrGoogleTestUtilAdapter.extractArgumentValue(suiteArg);
+          String testName = CidrGoogleTestUtilAdapter.extractArgumentValue(testArg);
           OCStructSymbol symbol =
-              CidrTestUtil.findGoogleTestSymbol(element.getProject(), suiteName, testName);
+              CidrGoogleTestUtilAdapter.findGoogleTestSymbol(
+                  element.getProject(), suiteName, testName);
           if (symbol != null) {
             OCStruct targetElement = (OCStruct) symbol.locateDefinition();
             return createFromClassAndMethod(targetElement, suiteName, isSuite ? null : testName);
           }
         }
       }
-      Couple<String> suite = CidrTestUtil.extractFullSuiteNameFromMacro(parent);
+      Couple<String> suite = CidrGoogleTestUtilAdapter.extractFullSuiteNameFromMacro(parent);
       if (suite != null) {
         Collection<OCStructSymbol> res =
-            CidrTestUtil.findGoogleTestSymbolsForSuiteRandomly(
+            CidrGoogleTestUtilAdapter.findGoogleTestSymbolsForSuiteRandomly(
                 element.getProject(), suite.first, true);
         if (res.size() != 0) {
           OCStruct struct = (OCStruct) res.iterator().next().locateDefinition();
diff --git a/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeEditProjectViewImportWizardStep.java b/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeEditProjectViewImportWizardStep.java
index 2998d4a..9c974de 100644
--- a/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeEditProjectViewImportWizardStep.java
+++ b/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeEditProjectViewImportWizardStep.java
@@ -82,6 +82,7 @@
   public void onWizardFinished() throws CommitStepException {
     try {
       getProjectBuilder().commit();
+      control.commit();
     } catch (BlazeProjectCommitException e) {
       throw new CommitStepException(e.getMessage());
     }
@@ -89,6 +90,6 @@
 
   @Override
   public String getHelpId() {
-    return "docs/project-views.md";
+    return "docs/project-views";
   }
 }
diff --git a/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectBuildSystemBinaryStep.java b/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectBuildSystemBinaryStep.java
index 808fb63..6797e1e 100644
--- a/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectBuildSystemBinaryStep.java
+++ b/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectBuildSystemBinaryStep.java
@@ -28,8 +28,7 @@
 import javax.swing.JPanel;
 import org.jetbrains.annotations.NotNull;
 
-class BlazeSelectBuildSystemBinaryStep extends
-    com.google.idea.blaze.clwb.wizard2.ProjectImportWizardStep {
+class BlazeSelectBuildSystemBinaryStep extends ProjectImportWizardStep {
 
   private final JPanel component = new JPanel(new BorderLayout());
   private SelectBazelBinaryControl control;
diff --git a/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectProjectViewImportWizardStep.java b/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectProjectViewImportWizardStep.java
index 9c99539..720091b 100644
--- a/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectProjectViewImportWizardStep.java
+++ b/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectProjectViewImportWizardStep.java
@@ -76,6 +76,6 @@
 
   @Override
   public String getHelpId() {
-    return "docs/project-views.md";
+    return "docs/project-views";
   }
 }
diff --git a/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectWorkspaceImportWizardStep.java b/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectWorkspaceImportWizardStep.java
index 2b1666e..3d719bb 100644
--- a/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectWorkspaceImportWizardStep.java
+++ b/clwb/src/com/google/idea/blaze/clwb/wizard2/BlazeSelectWorkspaceImportWizardStep.java
@@ -25,8 +25,7 @@
 import javax.swing.JPanel;
 import org.jetbrains.annotations.NotNull;
 
-class BlazeSelectWorkspaceImportWizardStep extends
-    com.google.idea.blaze.clwb.wizard2.ProjectImportWizardStep {
+class BlazeSelectWorkspaceImportWizardStep extends ProjectImportWizardStep {
 
   private final JPanel component = new JPanel(new BorderLayout());
   private BlazeSelectWorkspaceControl control;
@@ -75,6 +74,6 @@
 
   @Override
   public String getHelpId() {
-    return "docs/import-project.md";
+    return "docs/import-project";
   }
 }
diff --git a/clwb/src/com/google/idea/blaze/plugin/CMakeOpenProjectActionOverride.java b/clwb/src/com/google/idea/blaze/plugin/CMakeOpenProjectActionOverride.java
new file mode 100644
index 0000000..8eb2d4e
--- /dev/null
+++ b/clwb/src/com/google/idea/blaze/plugin/CMakeOpenProjectActionOverride.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.plugin;
+
+import com.intellij.ide.IdeBundle;
+import com.intellij.ide.actions.OpenProjectFileChooserDescriptor;
+import com.intellij.ide.impl.ProjectUtil;
+import com.intellij.openapi.actionSystem.AnActionEvent;
+import com.intellij.openapi.actionSystem.CommonDataKeys;
+import com.intellij.openapi.application.ReadAction;
+import com.intellij.openapi.fileChooser.FileChooser;
+import com.intellij.openapi.fileChooser.FileChooserDescriptor;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.vfs.VfsUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.project.ProjectKt;
+import com.jetbrains.cidr.cpp.OpenCPPProjectAction;
+import com.jetbrains.cidr.cpp.cmake.CMakeProjectOpenProcessor;
+
+/** Replace {@link OpenCPPProjectAction} with a version that supports non-CMake projects. */
+public class CMakeOpenProjectActionOverride extends OpenCPPProjectAction {
+
+  @Override
+  public void actionPerformed(AnActionEvent e) {
+    FileChooserDescriptor descriptor = new OpenProjectFileChooserDescriptor(true, false);
+    Project project = e.getData(CommonDataKeys.PROJECT);
+    FileChooser.chooseFiles(
+        descriptor,
+        project,
+        VfsUtil.getUserHomeDir(),
+        files -> openProjectFile(project, files.get(0)));
+  }
+
+  private static VirtualFile getProjectFile(VirtualFile virtualFile) {
+    return ReadAction.compute(
+        () -> {
+          VirtualFile cmakeFile = CMakeProjectOpenProcessor.findSupportedSubFile(virtualFile);
+          if (cmakeFile != null) {
+            return cmakeFile;
+          }
+          return ProjectKt.getProjectStoreDirectory(virtualFile);
+        });
+  }
+
+  private static void openProjectFile(Project project, VirtualFile file) {
+    VirtualFile projectFile = getProjectFile(file);
+    if (projectFile != null) {
+      ProjectUtil.openOrImport(projectFile.getPath(), null, false);
+      return;
+    }
+    String message = IdeBundle.message("error.dir.contains.no.project", file.getPresentableUrl());
+    Messages.showInfoMessage(project, message, IdeBundle.message("title.cannot.open.project"));
+  }
+}
diff --git a/clwb/src/com/google/idea/blaze/plugin/CMakeWorkspaceOverride.java b/clwb/src/com/google/idea/blaze/plugin/CMakeWorkspaceOverride.java
new file mode 100644
index 0000000..7a2c2ca
--- /dev/null
+++ b/clwb/src/com/google/idea/blaze/plugin/CMakeWorkspaceOverride.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.plugin;
+
+import com.google.idea.blaze.base.settings.Blaze;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleManager;
+import com.intellij.openapi.module.ModuleType;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ModuleRootManager;
+import com.intellij.openapi.roots.impl.storage.ClasspathStorage;
+import com.jetbrains.cidr.cpp.CPPModuleType;
+import com.jetbrains.cidr.cpp.cmake.workspace.CMakeWorkspace;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * Suppress {@link CMakeWorkspace#projectOpened} for non-CMake projects. Remove this if the <a
+ * href="https://youtrack.jetbrains.com/issue/CPP-9632">upstream bug</a> is fixed.
+ */
+public class CMakeWorkspaceOverride extends CMakeWorkspace {
+
+  private final boolean isBlazeProject;
+
+  public CMakeWorkspaceOverride(Project project) {
+    super(project);
+    isBlazeProject = Blaze.isBlazeProject(project);
+  }
+
+  @Override
+  public void projectOpened() {
+    if (!isBlazeProject) {
+      super.projectOpened();
+      return;
+    }
+    removeClasspathStorageFromModules(myProject);
+  }
+
+  /**
+   * A hacky way of removing the classpath ID. {@link ClasspathStorage} doesn't have a method for
+   * removing the existing storage type, but #setStorageType will silently do this if it's passed an
+   * unrecognized type.
+   */
+  private static void removeClasspathStorageFromModules(Project project) {
+    String dummyClasspathId = "classpath.id.which.does.not.exist";
+    for (Module cppModule : getCppModules(project)) {
+      ClasspathStorage.setStorageType(ModuleRootManager.getInstance(cppModule), dummyClasspathId);
+    }
+  }
+
+  private static List<Module> getCppModules(Project project) {
+    ModuleType<?> type = CPPModuleType.getInstance();
+    return Arrays.stream(ModuleManager.getInstance(project).getModules())
+        .filter(module -> type.equals(ModuleType.get(module)))
+        .collect(Collectors.toList());
+  }
+}
diff --git a/clwb/src/com/google/idea/blaze/plugin/ClwbSpecificInitializer.java b/clwb/src/com/google/idea/blaze/plugin/ClwbSpecificInitializer.java
index 086bbbf..75b3b7b 100644
--- a/clwb/src/com/google/idea/blaze/plugin/ClwbSpecificInitializer.java
+++ b/clwb/src/com/google/idea/blaze/plugin/ClwbSpecificInitializer.java
@@ -32,5 +32,6 @@
     for (String actionId : CMakeActionList.CMAKE_ACTION_IDS) {
       BlazeActionRemover.hideAction(actionId);
     }
+    BlazeActionRemover.replaceAction("OpenCPPProject", new CMakeOpenProjectActionOverride());
   }
 }
diff --git a/common/actionhelper/src/com/google/idea/common/actionhelper/ActionPresentationHelper.java b/common/actionhelper/src/com/google/idea/common/actionhelper/ActionPresentationHelper.java
index c90dd03..048b0f1 100644
--- a/common/actionhelper/src/com/google/idea/common/actionhelper/ActionPresentationHelper.java
+++ b/common/actionhelper/src/com/google/idea/common/actionhelper/ActionPresentationHelper.java
@@ -15,24 +15,30 @@
  */
 package com.google.idea.common.actionhelper;
 
+import com.google.common.collect.Iterables;
 import com.intellij.openapi.actionSystem.ActionPlaces;
 import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.actionSystem.Presentation;
 import com.intellij.openapi.vfs.VirtualFile;
-import java.util.List;
+import java.util.Collection;
 import javax.annotation.Nullable;
 
 /** Helps setting the presentation enabled/visible/text states. */
 public class ActionPresentationHelper {
 
   private final AnActionEvent event;
+
   private boolean enabled = true;
   private boolean visible = true;
   private boolean disableWithoutSubject;
+  private boolean hideInContextMenuIfDisabled;
+
   private boolean hasSubject;
   private String text;
   private String subjectText;
-  private boolean hideInContextMenuIfDisabled;
+  private boolean useTextMnemonic;
+
+  private String description;
 
   /** Converts a subject to a string */
   @FunctionalInterface
@@ -54,7 +60,7 @@
     return this;
   }
 
-  /** Hides the action if the condition is true. */
+  /** Hides the action if the condition is true. If the action is hidden, it is also disabled. */
   public ActionPresentationHelper hideIf(boolean hideCondition) {
     this.visible = this.visible && !hideCondition;
     return this;
@@ -77,6 +83,18 @@
     return this;
   }
 
+  /** Use & or _ in the presentation text as a mnemonic shortcut. */
+  public ActionPresentationHelper useTextMnemonic() {
+    this.useTextMnemonic = true;
+    return this;
+  }
+
+  /** Sets the description of the presentation. */
+  public ActionPresentationHelper setDescription(String description) {
+    this.description = description;
+    return this;
+  }
+
   /**
    * Sets the text depending on the subject.
    *
@@ -128,7 +146,7 @@
       String noSubjectText,
       String singleSubjectText,
       String multipleSubjectText,
-      List<VirtualFile> files) {
+      Collection<VirtualFile> files) {
     return setTextWithSubjects(
         noSubjectText,
         singleSubjectText,
@@ -149,7 +167,7 @@
       String noSubjectText,
       String singleSubjectText,
       String multipleSubjectText,
-      List<T> subjects,
+      Collection<T> subjects,
       SubjectToString<T> subjectToString) {
     if (subjects.size() > 1) {
       this.text = noSubjectText;
@@ -157,7 +175,7 @@
       this.hasSubject = true;
       return this;
     } else {
-      T subject = !subjects.isEmpty() ? subjects.get(0) : null;
+      T subject = !subjects.isEmpty() ? Iterables.getOnlyElement(subjects) : null;
       return setTextWithSubject(noSubjectText, singleSubjectText, subject, subjectToString);
     }
   }
@@ -167,7 +185,7 @@
   }
 
   public void commit() {
-    boolean enabled = this.enabled;
+    boolean enabled = this.enabled && this.visible;
     if (disableWithoutSubject) {
       enabled = enabled && hasSubject;
     }
@@ -182,7 +200,11 @@
 
     String text = enabled && hasSubject ? subjectText : this.text;
     if (text != null) {
-      presentation.setText(text, false);
+      presentation.setText(text, useTextMnemonic);
+    }
+
+    if (description != null) {
+      presentation.setDescription(description);
     }
   }
 }
diff --git a/common/experiments/src/com/google/idea/common/experiments/WebExperimentSyncer.java b/common/experiments/src/com/google/idea/common/experiments/WebExperimentSyncer.java
index 43ab2b4..1f1b6e0 100644
--- a/common/experiments/src/com/google/idea/common/experiments/WebExperimentSyncer.java
+++ b/common/experiments/src/com/google/idea/common/experiments/WebExperimentSyncer.java
@@ -96,7 +96,7 @@
     experimentValues = loadCache();
     ListenableFuture<String> response = executor.submit(new WebExperimentsDownloader());
     response.addListener(
-        new WebExperimentsResultProcessor(response), MoreExecutors.sameThreadExecutor());
+        new WebExperimentsResultProcessor(response), MoreExecutors.directExecutor());
   }
 
   private void scheduleNextRefresh(boolean refreshWasSuccessful) {
@@ -105,7 +105,7 @@
     ListenableScheduledFuture<String> refreshResults =
         executor.schedule(new WebExperimentsDownloader(), delayInMinutes, TimeUnit.MINUTES);
     refreshResults.addListener(
-        new WebExperimentsResultProcessor(refreshResults), MoreExecutors.sameThreadExecutor());
+        new WebExperimentsResultProcessor(refreshResults), MoreExecutors.directExecutor());
   }
 
   private class WebExperimentsDownloader implements Callable<String> {
diff --git a/common/formatter/src/com/google/idea/common/formatter/DelegatingCodeStyleManager.java b/common/formatter/src/com/google/idea/common/formatter/DelegatingCodeStyleManager.java
index 354fea4..b5ab232 100644
--- a/common/formatter/src/com/google/idea/common/formatter/DelegatingCodeStyleManager.java
+++ b/common/formatter/src/com/google/idea/common/formatter/DelegatingCodeStyleManager.java
@@ -15,7 +15,7 @@
  */
 package com.google.idea.common.formatter;
 
-import com.google.idea.sdkcompat.codestyle.CodeStyleManagerSdkCompatAdapter;
+import com.google.idea.sdkcompat.codestyle.DelegatingCodeStyleManagerSdkCompatAdapter;
 import com.intellij.lang.ASTNode;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.fileTypes.FileType;
@@ -32,12 +32,11 @@
 import javax.annotation.Nullable;
 
 /** A delegating {@link CodeStyleManager}. */
-public abstract class DelegatingCodeStyleManager extends CodeStyleManagerSdkCompatAdapter {
-
-  private final CodeStyleManager delegate;
+public abstract class DelegatingCodeStyleManager
+    extends DelegatingCodeStyleManagerSdkCompatAdapter {
 
   public DelegatingCodeStyleManager(CodeStyleManager delegate) {
-    this.delegate = delegate;
+    super(delegate);
   }
 
   @Override
diff --git a/cpp/BUILD b/cpp/BUILD
index c157efc..bbf1c7e 100644
--- a/cpp/BUILD
+++ b/cpp/BUILD
@@ -1,18 +1,10 @@
 licenses(["notice"])  # Apache 2.0
 
-load("//intellij_platform_sdk:build_defs.bzl", "select_for_plugin_api")
-
 java_library(
     name = "cpp",
     srcs = glob(
         ["src/**/*.java"],
-        exclude = [
-            "src/com/google/idea/blaze/cpp/versioned/**",
-        ],
-    ) + select_for_plugin_api({
-        "android-studio-145.1617.8": [":api_v145_sources"],
-        "default": [":api_v162_sources"],
-    }),
+    ),
     visibility = ["//visibility:public"],
     deps = [
         "//base",
@@ -29,18 +21,6 @@
     visibility = ["//visibility:public"],
 )
 
-filegroup(
-    name = "api_v145_sources",
-    srcs = glob(["src/com/google/idea/blaze/cpp/versioned/v145/**"]),
-    visibility = ["//visibility:private"],
-)
-
-filegroup(
-    name = "api_v162_sources",
-    srcs = glob(["src/com/google/idea/blaze/cpp/versioned/v162/**"]),
-    visibility = ["//visibility:private"],
-)
-
 load(
     "//testing:test_defs.bzl",
     "intellij_unit_test_suite",
@@ -54,6 +34,7 @@
         ":cpp",
         "//base:unit_test_utils",
         "//intellij_platform_sdk:plugin_api_for_tests",
+        "//sdkcompat",
         "@jsr305_annotations//jar",
         "@junit//jar",
     ],
diff --git a/cpp/src/META-INF/blaze-cpp.xml b/cpp/src/META-INF/blaze-cpp.xml
index aa0fb37..158f6d8 100644
--- a/cpp/src/META-INF/blaze-cpp.xml
+++ b/cpp/src/META-INF/blaze-cpp.xml
@@ -17,6 +17,14 @@
   <depends>com.intellij.modules.cidr.lang</depends>
   <depends>com.intellij.modules.cidr.debugger</depends>
 
+  <application-components>
+    <component>
+      <implementation-class>
+        com.google.idea.blaze.cpp.CidrSymbolBuilderSuppressor
+      </implementation-class>
+    </component>
+  </application-components>
+
   <extensions defaultExtensionNs="com.google.idea.blaze">
     <SyncPlugin implementation="com.google.idea.blaze.cpp.BlazeCSyncPlugin"/>
     <PrefetchFileSource implementation="com.google.idea.blaze.cpp.CPrefetchFileSource"/>
diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeCSyncPlugin.java b/cpp/src/com/google/idea/blaze/cpp/BlazeCSyncPlugin.java
index 4168385..aa1736e 100644
--- a/cpp/src/com/google/idea/blaze/cpp/BlazeCSyncPlugin.java
+++ b/cpp/src/com/google/idea/blaze/cpp/BlazeCSyncPlugin.java
@@ -89,7 +89,7 @@
     VirtualFile execRoot =
         VirtualFileSystemProvider.getInstance()
             .getSystem()
-            .refreshAndFindFileByIoFile(blazeProjectData.blazeRoots.executionRoot);
+            .refreshAndFindFileByIoFile(blazeProjectData.blazeInfo.getExecutionRoot());
     if (execRoot != null) {
       VfsUtil.markDirtyAndRefresh(false, true, true, execRoot);
     }
diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeCompilerMacros.java b/cpp/src/com/google/idea/blaze/cpp/BlazeCompilerMacros.java
index 28eba21..654a8e2 100644
--- a/cpp/src/com/google/idea/blaze/cpp/BlazeCompilerMacros.java
+++ b/cpp/src/com/google/idea/blaze/cpp/BlazeCompilerMacros.java
@@ -15,7 +15,6 @@
  */
 package com.google.idea.blaze.cpp;
 
-import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
@@ -62,17 +61,20 @@
 
     // Combine the info we got from Blaze with the info we get from IntelliJ's methods.
     ImmutableSet.Builder<String> allDefinesBuilder = ImmutableSet.builder();
-    // IntelliJ expects a string of "#define [VAR_NAME]\n#define [VAR_NAME2]\n..."
+    // IntelliJ expects a string of "#define [VAR_NAME] [VALUE]\n#define [VAR_NAME2] [VALUE]\n...",
+    // where VALUE is optional.
     for (String globalDefine : globalDefines) {
-      allDefinesBuilder.add("#define " + globalDefine);
-    }
-    if (compilerInfo != null) {
-      String[] split = compilerInfo.defines.split("\n");
-      for (String s : split) {
-        allDefinesBuilder.add(s);
+      String[] split = globalDefine.split("=", 2);
+      if (split.length == 1) {
+        allDefinesBuilder.add("#define " + split[0]);
+      } else {
+        allDefinesBuilder.add("#define " + split[0] + " " + split[1]);
       }
     }
-    final String allDefines = Joiner.on("\n").join(allDefinesBuilder.build());
+    String allDefines = String.join("\n", allDefinesBuilder.build());
+    if (compilerInfo != null) {
+      allDefines += "\n" + compilerInfo.defines;
+    }
 
     Map<String, String> allFeatures = Maps.newHashMap();
     allFeatures.putAll(globalFeatures);
diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeCompilerSettings.java b/cpp/src/com/google/idea/blaze/cpp/BlazeCompilerSettings.java
index 966b37c..ccc178d 100644
--- a/cpp/src/com/google/idea/blaze/cpp/BlazeCompilerSettings.java
+++ b/cpp/src/com/google/idea/blaze/cpp/BlazeCompilerSettings.java
@@ -15,21 +15,19 @@
  */
 package com.google.idea.blaze.cpp;
 
-import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableList;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.sdkcompat.cidr.CidrSwitchBuilderAdapter;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.jetbrains.cidr.lang.OCLanguageKind;
 import com.jetbrains.cidr.lang.toolchains.CidrCompilerSwitches;
-import com.jetbrains.cidr.lang.toolchains.CidrSwitchBuilder;
 import com.jetbrains.cidr.lang.toolchains.CidrToolEnvironment;
 import com.jetbrains.cidr.lang.toolchains.DefaultCidrToolEnvironment;
 import com.jetbrains.cidr.lang.workspace.compiler.OCCompilerKind;
 import com.jetbrains.cidr.lang.workspace.compiler.OCCompilerSettings;
 import java.io.File;
 import java.util.List;
-import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 
 final class BlazeCompilerSettings extends OCCompilerSettings {
@@ -56,7 +54,10 @@
 
   @Override
   public OCCompilerKind getCompiler(OCLanguageKind languageKind) {
-    return null;
+    if (languageKind == OCLanguageKind.C || languageKind == OCLanguageKind.CPP) {
+      return OCCompilerKind.CLANG;
+    }
+    return OCCompilerKind.UNKNOWN;
   }
 
   @Override
@@ -89,25 +90,10 @@
     if (lang == OCLanguageKind.CPP) {
       return cppCompilerSwitches;
     }
-    return new CidrSwitchBuilder().build();
+    return new CidrSwitchBuilderAdapter().build();
   }
 
   private static CidrCompilerSwitches getCompilerSwitches(List<String> allCompilerFlags) {
-    // Explanation of hack:
-    // - this list of switches is currently only used in one place -- GCCCompiler.tryRunGCC.
-    // - list is written to an argument file, whitespace-separated, then passed as a @file arg to
-    // clang.
-    // In this context, escaped whitespace within a single arg is not handled.
-    // Currently, the only way (short of using reflection) to ensure unescaped whitespace
-    // is to have CidrSwitchBuilder treat whitespace as a delimiter between args.
-    allCompilerFlags =
-        allCompilerFlags
-            .stream()
-            .map(flag -> flag.replace("\\ ", " "))
-            .collect(Collectors.toList());
-
-    return new CidrSwitchBuilder()
-        .addAll(Joiner.on(" ").join(allCompilerFlags), CidrSwitchBuilder.Format.FILE_ARGS)
-        .build();
+    return new CidrSwitchBuilderAdapter().addAllRaw(allCompilerFlags).build();
   }
 }
diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java b/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java
index 2fea837..d01798e 100644
--- a/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java
+++ b/cpp/src/com/google/idea/blaze/cpp/BlazeConfigurationResolver.java
@@ -17,15 +17,16 @@
 
 import static java.nio.charset.StandardCharsets.UTF_8;
 
+import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.idea.blaze.base.async.executor.BlazeExecutor;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.CToolchainIdeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetKey;
@@ -33,6 +34,7 @@
 import com.google.idea.blaze.base.io.FileAttributeProvider;
 import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
+import com.google.idea.blaze.base.model.primitives.Kind;
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.scope.BlazeContext;
@@ -51,16 +53,20 @@
 import com.intellij.openapi.vfs.VfsUtilCore;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.jetbrains.cidr.lang.workspace.OCResolveConfiguration;
+import com.jetbrains.cidr.toolchains.CompilerInfoCache;
 import java.io.File;
 import java.io.IOException;
 import java.io.PrintWriter;
-import java.util.Comparator;
+import java.util.AbstractMap.SimpleImmutableEntry;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.ExecutionException;
+import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 
 final class BlazeConfigurationResolver {
@@ -86,12 +92,21 @@
 
   public void update(BlazeContext context, BlazeProjectData blazeProjectData) {
     ImmutableMap<TargetKey, CToolchainIdeInfo> toolchainLookupMap =
-        BlazeResolveConfiguration.buildToolchainLookupMap(
-            context, blazeProjectData.targetMap, blazeProjectData.reverseDependencies);
+        BlazeResolveConfiguration.buildToolchainLookupMap(context, blazeProjectData.targetMap);
     ImmutableMap<File, VirtualFile> headerRoots =
         collectHeaderRoots(context, blazeProjectData, toolchainLookupMap);
+    ImmutableMap<CToolchainIdeInfo, BlazeCompilerSettings> compilerSettings =
+        buildCompilerSettingsMap(
+            context, project, toolchainLookupMap, blazeProjectData.workspacePathResolver);
+    CompilerInfoCache compilerInfoCache = new CompilerInfoCache();
     resolveConfigurations =
-        buildBlazeConfigurationMap(context, blazeProjectData, toolchainLookupMap, headerRoots);
+        buildBlazeConfigurationMap(
+            context,
+            blazeProjectData,
+            toolchainLookupMap,
+            headerRoots,
+            compilerSettings,
+            compilerInfoCache);
   }
 
   private ImmutableMap<File, VirtualFile> collectHeaderRoots(
@@ -116,7 +131,7 @@
         new ExecutionRootPathResolver(
             Blaze.getBuildSystem(project),
             WorkspaceRoot.fromProject(project),
-            projectData.blazeRoots.executionRoot,
+            projectData.blazeInfo.getExecutionRoot(),
             projectData.workspacePathResolver);
     ConcurrentMap<File, VirtualFile> rootsMap = Maps.newConcurrentMap();
     List<ListenableFuture<Void>> futures = Lists.newArrayListWithCapacity(rootPaths.size());
@@ -130,7 +145,7 @@
                   VirtualFile vf = getVirtualFile(file);
                   if (vf != null) {
                     rootsMap.put(file, vf);
-                  } else if (!projectData.blazeRoots.isOutputArtifact(path)
+                  } else if (!isOutputArtifact(projectData.blazeInfo, path)
                       && FileAttributeProvider.getInstance().exists(file)) {
                     // If it's not a blaze output file, we expect it to always resolve.
                     LOG.info(String.format("Unresolved header root %s", file.getAbsolutePath()));
@@ -152,17 +167,24 @@
     return ImmutableMap.of();
   }
 
+  private static boolean isOutputArtifact(BlazeInfo blazeInfo, ExecutionRootPath path) {
+    return ExecutionRootPath.isAncestor(blazeInfo.getBlazeGenfilesExecutionRootPath(), path, false)
+        || ExecutionRootPath.isAncestor(blazeInfo.getBlazeBinExecutionRootPath(), path, false);
+  }
+
   private static Set<ExecutionRootPath> collectExecutionRootPaths(
       TargetMap targetMap, ImmutableMap<TargetKey, CToolchainIdeInfo> toolchainLookupMap) {
     Set<ExecutionRootPath> paths = Sets.newHashSet();
     for (TargetIdeInfo target : targetMap.targets()) {
       if (target.cIdeInfo != null) {
+        paths.addAll(target.cIdeInfo.localIncludeDirectories);
         paths.addAll(target.cIdeInfo.transitiveSystemIncludeDirectories);
         paths.addAll(target.cIdeInfo.transitiveIncludeDirectories);
         paths.addAll(target.cIdeInfo.transitiveQuoteIncludeDirectories);
       }
     }
-    for (CToolchainIdeInfo toolchain : toolchainLookupMap.values()) {
+    Set<CToolchainIdeInfo> toolchains = new LinkedHashSet<>(toolchainLookupMap.values());
+    for (CToolchainIdeInfo toolchain : toolchains) {
       paths.addAll(toolchain.builtInIncludeDirectories);
       paths.addAll(toolchain.unfilteredToolchainSystemIncludes);
     }
@@ -183,7 +205,9 @@
       BlazeContext parentContext,
       BlazeProjectData blazeProjectData,
       ImmutableMap<TargetKey, CToolchainIdeInfo> toolchainLookupMap,
-      ImmutableMap<File, VirtualFile> headerRoots) {
+      ImmutableMap<File, VirtualFile> headerRoots,
+      ImmutableMap<CToolchainIdeInfo, BlazeCompilerSettings> compilerSettings,
+      CompilerInfoCache compilerInfoCache) {
     // Type specification needed to avoid incorrect type inference during command line build.
     return Scope.push(
         parentContext,
@@ -191,11 +215,11 @@
             context -> {
               context.push(new TimingScope("Build C configuration map"));
 
-              ConcurrentMap<CToolchainIdeInfo, File> compilerWrapperCache = Maps.newConcurrentMap();
               List<ListenableFuture<MapEntry>> mapEntryFutures = Lists.newArrayList();
 
               for (TargetIdeInfo target : blazeProjectData.targetMap.targets()) {
-                if (target.kind.getLanguageClass() == LanguageClass.C) {
+                if (target.kind.getLanguageClass() == LanguageClass.C
+                    && target.kind != Kind.CC_TOOLCHAIN) {
                   ListenableFuture<MapEntry> future =
                       submit(
                           () ->
@@ -203,8 +227,9 @@
                                   target,
                                   toolchainLookupMap,
                                   headerRoots,
-                                  compilerWrapperCache,
-                                  blazeProjectData));
+                                  compilerSettings,
+                                  blazeProjectData,
+                                  compilerInfoCache));
                   mapEntryFutures.add(future);
                 }
               }
@@ -243,67 +268,116 @@
       TargetIdeInfo target,
       ImmutableMap<TargetKey, CToolchainIdeInfo> toolchainLookupMap,
       ImmutableMap<File, VirtualFile> headerRoots,
-      ConcurrentMap<CToolchainIdeInfo, File> compilerWrapperCache,
-      BlazeProjectData blazeProjectData) {
+      ImmutableMap<CToolchainIdeInfo, BlazeCompilerSettings> compilerSettingsMap,
+      BlazeProjectData blazeProjectData,
+      CompilerInfoCache compilerInfoCache) {
     TargetKey targetKey = target.key;
-
     CToolchainIdeInfo toolchainIdeInfo = toolchainLookupMap.get(targetKey);
-    if (toolchainIdeInfo != null) {
-      File compilerWrapper =
-          findOrCreateCompilerWrapperScript(
-              compilerWrapperCache,
-              toolchainIdeInfo,
-              blazeProjectData.workspacePathResolver,
-              targetKey);
-      if (compilerWrapper != null) {
-        BlazeResolveConfiguration config =
-            BlazeResolveConfiguration.createConfigurationForTarget(
-                project,
-                new ExecutionRootPathResolver(
-                    Blaze.getBuildSystem(project),
-                    WorkspaceRoot.fromProject(project),
-                    blazeProjectData.blazeRoots.executionRoot,
-                    blazeProjectData.workspacePathResolver),
-                blazeProjectData.workspacePathResolver,
-                headerRoots,
-                blazeProjectData.targetMap.get(targetKey),
-                toolchainIdeInfo,
-                compilerWrapper);
-        if (config != null) {
-          return new MapEntry(targetKey, config);
+    if (toolchainIdeInfo == null) {
+      return null;
+    }
+    BlazeCompilerSettings compilerSettings = compilerSettingsMap.get(toolchainIdeInfo);
+    if (compilerSettings == null) {
+      return null;
+    }
+    BlazeResolveConfiguration config =
+        BlazeResolveConfiguration.createConfigurationForTarget(
+            project,
+            new ExecutionRootPathResolver(
+                Blaze.getBuildSystem(project),
+                WorkspaceRoot.fromProject(project),
+                blazeProjectData.blazeInfo.getExecutionRoot(),
+                blazeProjectData.workspacePathResolver),
+            blazeProjectData.workspacePathResolver,
+            headerRoots,
+            blazeProjectData.targetMap.get(targetKey),
+            toolchainIdeInfo,
+            compilerSettings,
+            compilerInfoCache);
+    if (config == null) {
+      return null;
+    }
+    return new MapEntry(targetKey, config);
+  }
+
+  private static ImmutableMap<CToolchainIdeInfo, BlazeCompilerSettings> buildCompilerSettingsMap(
+      BlazeContext context,
+      Project project,
+      ImmutableMap<TargetKey, CToolchainIdeInfo> toolchainLookupMap,
+      WorkspacePathResolver workspacePathResolver) {
+    Set<CToolchainIdeInfo> toolchains =
+        toolchainLookupMap.values().stream().distinct().collect(Collectors.toSet());
+    List<ListenableFuture<Map.Entry<CToolchainIdeInfo, BlazeCompilerSettings>>>
+        compilerSettingsFutures = new ArrayList<>();
+    for (CToolchainIdeInfo toolchain : toolchains) {
+      compilerSettingsFutures.add(
+          submit(
+              () -> {
+                BlazeCompilerSettings settings =
+                    createBlazeCompilerSettings(project, toolchain, workspacePathResolver);
+                if (settings == null) {
+                  return null;
+                }
+                return new SimpleImmutableEntry<>(toolchain, settings);
+              }));
+    }
+    ImmutableMap.Builder<CToolchainIdeInfo, BlazeCompilerSettings> compilerSettingsMap =
+        ImmutableMap.builder();
+    try {
+      List<Map.Entry<CToolchainIdeInfo, BlazeCompilerSettings>> createdSettings =
+          Futures.allAsList(compilerSettingsFutures).get();
+      for (Map.Entry<CToolchainIdeInfo, BlazeCompilerSettings> createdSetting : createdSettings) {
+        if (createdSetting != null) {
+          compilerSettingsMap.put(createdSetting);
         }
       }
+    } catch (InterruptedException e) {
+      Thread.currentThread().interrupt();
+      context.setCancelled();
+    } catch (ExecutionException e) {
+      IssueOutput.error("Could not build C compiler settings map: " + e).submit(context);
+      LOG.error("Could not build C compiler settings map", e);
     }
-    return null;
+    return compilerSettingsMap.build();
   }
 
   @Nullable
-  private static File findOrCreateCompilerWrapperScript(
-      Map<CToolchainIdeInfo, File> compilerWrapperCache,
+  private static BlazeCompilerSettings createBlazeCompilerSettings(
+      Project project,
       CToolchainIdeInfo toolchainIdeInfo,
-      WorkspacePathResolver workspacePathResolver,
-      TargetKey targetKey) {
-    File compilerWrapper = compilerWrapperCache.get(toolchainIdeInfo);
+      WorkspacePathResolver workspacePathResolver) {
+    File compilerWrapper = getCompilerWrapper(toolchainIdeInfo, workspacePathResolver);
     if (compilerWrapper == null) {
-      File cppExecutable = toolchainIdeInfo.cppExecutable.getAbsoluteOrRelativeFile();
-      if (cppExecutable != null && !cppExecutable.isAbsolute()) {
-        cppExecutable = workspacePathResolver.resolveToFile(cppExecutable.getPath());
-      }
-      if (cppExecutable == null) {
-        String errorMessage =
-            String.format(
-                "Unable to find compiler executable: %s for rule %s",
-                toolchainIdeInfo.cppExecutable.toString(), targetKey);
-        LOG.warn(errorMessage);
-        compilerWrapper = null;
-      } else {
-        compilerWrapper = createCompilerExecutableWrapper(cppExecutable);
-        if (compilerWrapper != null) {
-          compilerWrapperCache.put(toolchainIdeInfo, compilerWrapper);
-        }
-      }
+      return null;
     }
-    return compilerWrapper;
+    ImmutableList.Builder<String> cFlagsBuilder = ImmutableList.builder();
+    cFlagsBuilder.addAll(toolchainIdeInfo.baseCompilerOptions);
+    cFlagsBuilder.addAll(toolchainIdeInfo.cCompilerOptions);
+    cFlagsBuilder.addAll(toolchainIdeInfo.unfilteredCompilerOptions);
+
+    ImmutableList.Builder<String> cppFlagsBuilder = ImmutableList.builder();
+    cppFlagsBuilder.addAll(toolchainIdeInfo.baseCompilerOptions);
+    cppFlagsBuilder.addAll(toolchainIdeInfo.cppCompilerOptions);
+    cppFlagsBuilder.addAll(toolchainIdeInfo.unfilteredCompilerOptions);
+    return new BlazeCompilerSettings(
+        project, compilerWrapper, compilerWrapper, cFlagsBuilder.build(), cppFlagsBuilder.build());
+  }
+
+  @Nullable
+  private static File getCompilerWrapper(
+      CToolchainIdeInfo toolchainIdeInfo, WorkspacePathResolver workspacePathResolver) {
+    File cppExecutable = toolchainIdeInfo.cppExecutable.getAbsoluteOrRelativeFile();
+    if (cppExecutable != null && !cppExecutable.isAbsolute()) {
+      cppExecutable = workspacePathResolver.resolveToFile(cppExecutable.getPath());
+    }
+    if (cppExecutable == null) {
+      LOG.warn(
+          String.format(
+              "Unable to find compiler executable: %s for toolchain %s",
+              toolchainIdeInfo.cppExecutable.toString(), toolchainIdeInfo));
+      return null;
+    }
+    return createCompilerExecutableWrapper(cppExecutable);
   }
 
   /**
@@ -362,24 +436,21 @@
   @Nullable
   public OCResolveConfiguration getConfigurationForFile(VirtualFile sourceFile) {
     SourceToTargetMap sourceToTargetMap = SourceToTargetMap.getInstance(project);
-    List<TargetKey> targetsForSourceFile =
-        Lists.newArrayList(
-            sourceToTargetMap.getRulesForSourceFile(VfsUtilCore.virtualToIoFile(sourceFile)));
+    ImmutableCollection<TargetKey> targetsForSourceFile =
+        sourceToTargetMap.getRulesForSourceFile(VfsUtilCore.virtualToIoFile(sourceFile));
     if (targetsForSourceFile.isEmpty()) {
       return null;
     }
 
-    // If a source file is in two different targets,
-    // we can't possibly show how it will be interpreted in both contexts at the same time
-    // in the IDE, so just pick the first target after we sort.
-    targetsForSourceFile.sort(Comparator.comparing(TargetKey::toString));
-    TargetKey targetKey = Iterables.getFirst(targetsForSourceFile, null);
+    // If a source file is in two different targets, we can't possibly show how it will be
+    // interpreted in both contexts at the same time in the IDE, so just pick the "first" target.
+    TargetKey targetKey = targetsForSourceFile.stream().min(TargetKey::compareTo).orElse(null);
     assert (targetKey != null);
 
     return resolveConfigurations.get(targetKey);
   }
 
-  public List<? extends OCResolveConfiguration> getAllConfigurations() {
-    return ImmutableList.copyOf(resolveConfigurations.values());
+  ImmutableList<? extends OCResolveConfiguration> getAllConfigurations() {
+    return resolveConfigurations.values().asList();
   }
 }
diff --git a/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfigurationTemporaryBase.java b/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfiguration.java
similarity index 66%
rename from cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfigurationTemporaryBase.java
rename to cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfiguration.java
index 2b04ff2..6581b12 100644
--- a/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfigurationTemporaryBase.java
+++ b/cpp/src/com/google/idea/blaze/cpp/BlazeResolveConfiguration.java
@@ -18,9 +18,8 @@
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Lists;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.idea.blaze.base.ideinfo.CIdeInfo;
 import com.google.idea.blaze.base.ideinfo.CToolchainIdeInfo;
@@ -28,13 +27,18 @@
 import com.google.idea.blaze.base.ideinfo.TargetKey;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
+import com.google.idea.blaze.base.model.primitives.Kind;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.scope.Scope;
+import com.google.idea.blaze.base.scope.output.IssueOutput;
 import com.google.idea.blaze.base.scope.scopes.TimingScope;
 import com.google.idea.blaze.base.sync.workspace.ExecutionRootPathResolver;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.google.idea.sdkcompat.cidr.OCResolveConfigurationAdapter;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.Pair;
 import com.intellij.openapi.util.UserDataHolderBase;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.jetbrains.cidr.lang.OCFileTypeHelpers;
@@ -52,22 +56,20 @@
 import com.jetbrains.cidr.lang.workspace.headerRoots.IncludedHeadersRoot;
 import com.jetbrains.cidr.toolchains.CompilerInfoCache;
 import java.io.File;
-import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 
-/**
- * This is a temporary base class to deal with API changes between v145 (Android Studio) and v162
- * (CLion). Once Android Studio's API has caught up, the features in versioned/v162 can be merged,
- * this class be renamed BlazeResolveConfiguration, and it can be made final.
- */
-abstract class BlazeResolveConfigurationTemporaryBase extends UserDataHolderBase
-    implements OCResolveConfiguration {
+final class BlazeResolveConfiguration extends UserDataHolderBase
+    implements OCResolveConfigurationAdapter {
 
-  public static final Logger LOG = Logger.getInstance(BlazeResolveConfiguration.class);
-
+  private static final Logger logger = Logger.getInstance(BlazeResolveConfiguration.class);
   private final ExecutionRootPathResolver executionRootPathResolver;
   private final WorkspacePathResolver workspacePathResolver;
 
@@ -78,10 +80,13 @@
   private final ImmutableList<HeadersSearchRoot> cLibraryIncludeRoots;
   private final ImmutableList<HeadersSearchRoot> cppLibraryIncludeRoots;
   private final HeaderRoots projectIncludeRoots;
+  private final ConcurrentMap<Pair<OCLanguageKind, VirtualFile>, HeaderRoots> libraryIncludeRoots =
+      new ConcurrentHashMap<>();
 
   private final CompilerInfoCache compilerInfoCache;
   private final BlazeCompilerMacros compilerMacros;
   private final BlazeCompilerSettings compilerSettings;
+  private final CToolchainIdeInfo toolchainIdeInfo;
 
   @Nullable
   public static BlazeResolveConfiguration createConfigurationForTarget(
@@ -91,7 +96,8 @@
       ImmutableMap<File, VirtualFile> headerRoots,
       TargetIdeInfo target,
       CToolchainIdeInfo toolchainIdeInfo,
-      File compilerWrapper) {
+      BlazeCompilerSettings compilerSettings,
+      CompilerInfoCache compilerInfoCache) {
     CIdeInfo cIdeInfo = target.cIdeInfo;
     if (cIdeInfo == null) {
       return null;
@@ -104,19 +110,14 @@
 
     ImmutableSet.Builder<ExecutionRootPath> userIncludesBuilder = ImmutableSet.builder();
     userIncludesBuilder.addAll(cIdeInfo.transitiveIncludeDirectories);
+    userIncludesBuilder.addAll(cIdeInfo.localIncludeDirectories);
 
     ImmutableSet.Builder<ExecutionRootPath> userQuoteIncludesBuilder = ImmutableSet.builder();
     userQuoteIncludesBuilder.addAll(cIdeInfo.transitiveQuoteIncludeDirectories);
 
-    ImmutableList.Builder<String> cFlagsBuilder = ImmutableList.builder();
-    cFlagsBuilder.addAll(toolchainIdeInfo.baseCompilerOptions);
-    cFlagsBuilder.addAll(toolchainIdeInfo.cCompilerOptions);
-    cFlagsBuilder.addAll(toolchainIdeInfo.unfilteredCompilerOptions);
-
-    ImmutableList.Builder<String> cppFlagsBuilder = ImmutableList.builder();
-    cppFlagsBuilder.addAll(toolchainIdeInfo.baseCompilerOptions);
-    cppFlagsBuilder.addAll(toolchainIdeInfo.cppCompilerOptions);
-    cppFlagsBuilder.addAll(toolchainIdeInfo.unfilteredCompilerOptions);
+    ImmutableList.Builder<String> defines = ImmutableList.builder();
+    defines.addAll(cIdeInfo.transitiveDefines);
+    defines.addAll(cIdeInfo.localDefines);
 
     ImmutableMap<String, String> features = ImmutableMap.of();
 
@@ -131,53 +132,80 @@
         userQuoteIncludesBuilder.build(),
         userIncludesBuilder.build(),
         userIncludesBuilder.build(),
-        cIdeInfo.transitiveDefines,
+        defines.build(),
         features,
-        compilerWrapper,
-        compilerWrapper,
-        cFlagsBuilder.build(),
-        cppFlagsBuilder.build());
+        compilerSettings,
+        compilerInfoCache,
+        toolchainIdeInfo);
   }
 
-  public static ImmutableMap<TargetKey, CToolchainIdeInfo> buildToolchainLookupMap(
-      BlazeContext context,
-      TargetMap targetMap,
-      ImmutableMultimap<TargetKey, TargetKey> reverseDependencies) {
+  static ImmutableMap<TargetKey, CToolchainIdeInfo> buildToolchainLookupMap(
+      BlazeContext context, TargetMap targetMap) {
     return Scope.push(
         context,
         childContext -> {
           childContext.push(new TimingScope("Build toolchain lookup map"));
 
-          List<TargetKey> seeds = Lists.newArrayList();
+          Map<TargetKey, CToolchainIdeInfo> toolchains = Maps.newLinkedHashMap();
           for (TargetIdeInfo target : targetMap.targets()) {
             CToolchainIdeInfo cToolchainIdeInfo = target.cToolchainIdeInfo;
             if (cToolchainIdeInfo != null) {
-              seeds.add(target.key);
+              toolchains.put(target.key, cToolchainIdeInfo);
             }
           }
 
-          Map<TargetKey, CToolchainIdeInfo> lookupTable = Maps.newHashMap();
-          for (TargetKey seed : seeds) {
-            CToolchainIdeInfo toolchainInfo = targetMap.get(seed).cToolchainIdeInfo;
-            LOG.assertTrue(toolchainInfo != null);
-            List<TargetKey> worklist = Lists.newArrayList(reverseDependencies.get(seed));
-            while (!worklist.isEmpty()) {
-              // We should never see a label depend on two different toolchains.
-              TargetKey l = worklist.remove(0);
-              CToolchainIdeInfo previousValue = lookupTable.putIfAbsent(l, toolchainInfo);
-              // Don't propagate the toolchain twice.
-              if (previousValue == null) {
-                worklist.addAll(reverseDependencies.get(l));
-              } else {
-                LOG.assertTrue(previousValue.equals(toolchainInfo));
+          ImmutableMap.Builder<TargetKey, CToolchainIdeInfo> lookupTable = ImmutableMap.builder();
+          for (TargetIdeInfo target : targetMap.targets()) {
+            if (target.kind.getLanguageClass() != LanguageClass.C
+                || target.kind == Kind.CC_TOOLCHAIN) {
+              continue;
+            }
+            List<TargetKey> toolchainDeps =
+                target
+                    .dependencies
+                    .stream()
+                    .map(dep -> dep.targetKey)
+                    .filter(toolchains::containsKey)
+                    .collect(Collectors.toList());
+            if (toolchainDeps.size() != 1) {
+              issueToolchainWarning(context, target, toolchainDeps);
+            }
+            if (!toolchainDeps.isEmpty()) {
+              TargetKey toolchainKey = toolchainDeps.get(0);
+              CToolchainIdeInfo toolchainInfo = toolchains.get(toolchainKey);
+              lookupTable.put(target.key, toolchainInfo);
+            } else {
+              CToolchainIdeInfo arbitraryToolchain = Iterables.getFirst(toolchains.values(), null);
+              if (arbitraryToolchain != null) {
+                lookupTable.put(target.key, arbitraryToolchain);
               }
             }
           }
-          return ImmutableMap.copyOf(lookupTable);
+          return lookupTable.build();
         });
   }
 
-  public BlazeResolveConfigurationTemporaryBase(
+  private static void issueToolchainWarning(
+      BlazeContext context, TargetIdeInfo target, List<TargetKey> toolchainDeps) {
+    String warningMessage =
+        String.format(
+            "cc target %s does not depend on exactly 1 cc toolchain. " + " Found %d toolchains.",
+            target.key, toolchainDeps.size());
+    if (usesAppleCcToolchain(target)) {
+      logger.warn(warningMessage + " (apple_cc_toolchain)");
+    } else {
+      IssueOutput.warn(warningMessage).submit(context);
+    }
+  }
+
+  private static boolean usesAppleCcToolchain(TargetIdeInfo target) {
+    return target
+        .dependencies
+        .stream()
+        .anyMatch(dep -> dep.targetKey.label.toString().startsWith("//tools/osx/crosstool"));
+  }
+
+  public BlazeResolveConfiguration(
       Project project,
       ExecutionRootPathResolver executionRootPathResolver,
       WorkspacePathResolver workspacePathResolver,
@@ -190,14 +218,14 @@
       ImmutableCollection<ExecutionRootPath> cppIncludeDirs,
       ImmutableCollection<String> defines,
       ImmutableMap<String, String> features,
-      File cCompilerExecutable,
-      File cppCompilerExecutable,
-      ImmutableList<String> cCompilerFlags,
-      ImmutableList<String> cppCompilerFlags) {
+      BlazeCompilerSettings compilerSettings,
+      CompilerInfoCache compilerInfoCache,
+      CToolchainIdeInfo toolchainIdeInfo) {
     this.executionRootPathResolver = executionRootPathResolver;
     this.workspacePathResolver = workspacePathResolver;
     this.project = project;
     this.targetKey = targetKey;
+    this.toolchainIdeInfo = toolchainIdeInfo;
 
     ImmutableList.Builder<HeadersSearchRoot> cIncludeRootsBuilder = ImmutableList.builder();
     collectHeaderRoots(headerRoots, cIncludeRootsBuilder, cIncludeDirs, true /* isUserHeader */);
@@ -217,11 +245,8 @@
         headerRoots, quoteIncludeRootsBuilder, quoteIncludeDirs, true /* isUserHeader */);
     this.projectIncludeRoots = new HeaderRoots(quoteIncludeRootsBuilder.build());
 
-    this.compilerSettings =
-        new BlazeCompilerSettings(
-            project, cCompilerExecutable, cppCompilerExecutable, cCompilerFlags, cppCompilerFlags);
-
-    this.compilerInfoCache = new CompilerInfoCache();
+    this.compilerSettings = compilerSettings;
+    this.compilerInfoCache = compilerInfoCache;
     this.compilerMacros =
         new BlazeCompilerMacros(project, compilerInfoCache, compilerSettings, defines, features);
   }
@@ -242,12 +267,6 @@
 
   @Nullable
   @Override
-  public VirtualFile getPrecompiledHeader() {
-    return null;
-  }
-
-  @Nullable
-  @Override
   public OCLanguageKind getDeclaredLanguageKind(VirtualFile sourceOrHeaderFile) {
     String fileName = sourceOrHeaderFile.getName();
     if (OCFileTypeHelpers.isSourceFile(fileName)) {
@@ -268,8 +287,7 @@
 
   @Nullable
   private VirtualFile getSourceFileForHeaderFile(VirtualFile headerFile) {
-    ArrayList<VirtualFile> roots =
-        new ArrayList<>(OCImportGraph.getAllHeaderRoots(project, headerFile));
+    Collection<VirtualFile> roots = OCImportGraph.getAllHeaderRoots(project, headerFile);
 
     final String headerNameWithoutExtension = headerFile.getNameWithoutExtension();
     for (VirtualFile root : roots) {
@@ -281,11 +299,6 @@
   }
 
   @Override
-  public OCLanguageKind getPrecompiledLanguageKind() {
-    return getMaximumLanguageKind();
-  }
-
-  @Override
   public OCLanguageKind getMaximumLanguageKind() {
     return OCLanguageKind.CPP;
   }
@@ -302,21 +315,27 @@
     if (languageKind == null) {
       languageKind = getLanguageKind(sourceFile);
     }
+    Pair<OCLanguageKind, VirtualFile> cacheKey = Pair.create(languageKind, sourceFile);
+    return libraryIncludeRoots.computeIfAbsent(
+        cacheKey,
+        key -> {
+          OCLanguageKind lang = key.first;
+          VirtualFile source = key.second;
+          ImmutableSet.Builder<HeadersSearchRoot> roots = ImmutableSet.builder();
+          if (lang == OCLanguageKind.C) {
+            roots.addAll(cLibraryIncludeRoots);
+          } else {
+            roots.addAll(cppLibraryIncludeRoots);
+          }
 
-    ImmutableSet.Builder<HeadersSearchRoot> roots = ImmutableSet.builder();
-    if (languageKind == OCLanguageKind.C) {
-      roots.addAll(cLibraryIncludeRoots);
-    } else {
-      roots.addAll(cppLibraryIncludeRoots);
-    }
-
-    CidrCompilerResult<CompilerInfoCache.Entry> compilerInfoCacheHolder =
-        compilerInfoCache.getCompilerInfoCache(project, compilerSettings, languageKind, sourceFile);
-    CompilerInfoCache.Entry compilerInfo = compilerInfoCacheHolder.getResult();
-    if (compilerInfo != null) {
-      roots.addAll(compilerInfo.headerSearchPaths);
-    }
-    return new HeaderRoots(roots.build().asList());
+          CidrCompilerResult<CompilerInfoCache.Entry> compilerInfoCacheHolder =
+              compilerInfoCache.getCompilerInfoCache(project, compilerSettings, lang, source);
+          CompilerInfoCache.Entry compilerInfo = compilerInfoCacheHolder.getResult();
+          if (compilerInfo != null) {
+            roots.addAll(compilerInfo.headerSearchPaths);
+          }
+          return new HeaderRoots(roots.build().asList());
+        });
   }
 
   private void collectHeaderRoots(
@@ -346,10 +365,9 @@
     return compilerSettings;
   }
 
-  @Nullable
   @Override
   public Object getIndexingCluster() {
-    return null;
+    return toolchainIdeInfo;
   }
 
   @Override
@@ -376,4 +394,35 @@
     BlazeResolveConfiguration that = (BlazeResolveConfiguration) obj;
     return compareTo(that) == 0;
   }
+
+  /* This function is part of the v162/v163 plugin APIs. */
+  @Nullable
+  @Override
+  public VirtualFile getPrecompiledHeader() {
+    return null;
+  }
+
+  /* This function is part of the v162/v163 plugin APIs. */
+  @Override
+  public OCLanguageKind getPrecompiledLanguageKind() {
+    return getMaximumLanguageKind();
+  }
+
+  /* This function is part of the v171 plugin API. */
+  @Override
+  public Set<VirtualFile> getPrecompiledHeaders() {
+    return ImmutableSet.of();
+  }
+
+  /* This function is part of the v171 plugin API. */
+  @Override
+  public List<VirtualFile> getPrecompiledHeaders(OCLanguageKind kind, VirtualFile sourceFile) {
+    return ImmutableList.of();
+  }
+
+  /* This function is part of the v171 plugin API. */
+  @Override
+  public Collection<VirtualFile> getSources() {
+    return ImmutableList.of();
+  }
 }
diff --git a/cpp/src/com/google/idea/blaze/cpp/CPrefetchFileSource.java b/cpp/src/com/google/idea/blaze/cpp/CPrefetchFileSource.java
index ff0b0ed..4e63e71 100644
--- a/cpp/src/com/google/idea/blaze/cpp/CPrefetchFileSource.java
+++ b/cpp/src/com/google/idea/blaze/cpp/CPrefetchFileSource.java
@@ -18,6 +18,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.prefetch.PrefetchFileSource;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.intellij.openapi.project.Project;
 import java.io.File;
 import java.util.Collection;
@@ -27,7 +28,10 @@
 public class CPrefetchFileSource implements PrefetchFileSource {
   @Override
   public void addFilesToPrefetch(
-      Project project, BlazeProjectData blazeProjectData, Collection<File> files) {}
+      Project project,
+      ProjectViewSet projectViewSet,
+      BlazeProjectData blazeProjectData,
+      Collection<File> files) {}
 
   @Override
   public Set<String> prefetchSrcFileExtensions() {
diff --git a/cpp/src/com/google/idea/blaze/cpp/CidrSymbolBuilderSuppressor.java b/cpp/src/com/google/idea/blaze/cpp/CidrSymbolBuilderSuppressor.java
new file mode 100644
index 0000000..1abc384
--- /dev/null
+++ b/cpp/src/com/google/idea/blaze/cpp/CidrSymbolBuilderSuppressor.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.cpp;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.settings.Blaze;
+import com.intellij.openapi.components.ApplicationComponent;
+import com.intellij.openapi.extensions.ExtensionPoint;
+import com.intellij.openapi.extensions.Extensions;
+import com.intellij.openapi.extensions.LoadingOrder;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.startup.StartupActivity;
+
+/**
+ * cidr-lang usually registers some StartupActivity instances that get run on project open to
+ * rebuild symbols. This causes problems with blaze projects because this happens before the project
+ * configuration has been set up. CLwB/ASwB trigger a symbol rebuild after the startup sync.
+ */
+public class CidrSymbolBuilderSuppressor implements ApplicationComponent {
+  private static final ImmutableList<Class<? extends StartupActivity>>
+      STARTUP_ACTIVITIES_TO_SUPPRESS =
+          ImmutableList.of(
+              com.jetbrains.cidr.lang.symbols.symtable.OCInitialTablesBuildingActivity.class,
+              com.jetbrains.cidr.modulemap.resolve.ModuleMapInitialBuildingActivity.class);
+
+  private void addFiltersToStartupActivities() {
+    ExtensionPoint<StartupActivity> ep =
+        Extensions.getRootArea().getExtensionPoint(StartupActivity.POST_STARTUP_ACTIVITY);
+    for (Class<? extends StartupActivity> startupActivity : STARTUP_ACTIVITIES_TO_SUPPRESS) {
+      StartupActivity startupActivityInstance =
+          StartupActivity.POST_STARTUP_ACTIVITY.findExtension(startupActivity);
+      Preconditions.checkNotNull(startupActivityInstance);
+      StartupActivity replacementStartupActivity =
+          new BlazeSuppressStartupActivity(startupActivityInstance);
+      ep.registerExtension(
+          replacementStartupActivity, LoadingOrder.before(startupActivity.getSimpleName()));
+      ep.unregisterExtension(startupActivityInstance);
+    }
+  }
+
+  @Override
+  public void initComponent() {
+    addFiltersToStartupActivities();
+  }
+
+  @Override
+  public void disposeComponent() {}
+
+  @Override
+  public String getComponentName() {
+    return "CidrSymbolBuilderSuppressor";
+  }
+
+  private static class BlazeSuppressStartupActivity implements StartupActivity {
+    final StartupActivity original;
+
+    private BlazeSuppressStartupActivity(StartupActivity original) {
+      this.original = original;
+    }
+
+    @Override
+    public void runActivity(Project project) {
+      if (!Blaze.isBlazeProject(project)) {
+        original.runActivity(project);
+      }
+    }
+  }
+}
diff --git a/cpp/src/com/google/idea/blaze/cpp/versioned/v145/BlazeResolveConfiguration.java b/cpp/src/com/google/idea/blaze/cpp/versioned/v145/BlazeResolveConfiguration.java
deleted file mode 100644
index b2d63a0..0000000
--- a/cpp/src/com/google/idea/blaze/cpp/versioned/v145/BlazeResolveConfiguration.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.cpp;
-
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.idea.blaze.base.ideinfo.TargetKey;
-import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
-import com.google.idea.blaze.base.sync.workspace.ExecutionRootPathResolver;
-import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.jetbrains.cidr.execution.CidrBuildTarget;
-import com.jetbrains.cidr.execution.CidrBuildTargetWithConfigurations;
-import com.jetbrains.cidr.execution.CidrTargetHolder;
-import java.io.File;
-import java.util.List;
-import javax.annotation.Nullable;
-import javax.swing.Icon;
-
-final class BlazeResolveConfiguration extends BlazeResolveConfigurationTemporaryBase
-    implements CidrTargetHolder {
-
-  public BlazeResolveConfiguration(
-      Project project,
-      ExecutionRootPathResolver executionRootPathResolver,
-      WorkspacePathResolver workspacePathResolver,
-      ImmutableMap<File, VirtualFile> headerRoots,
-      TargetKey targetKey,
-      ImmutableCollection<ExecutionRootPath> cSystemIncludeDirs,
-      ImmutableCollection<ExecutionRootPath> cppSystemIncludeDirs,
-      ImmutableCollection<ExecutionRootPath> quoteIncludeDirs,
-      ImmutableCollection<ExecutionRootPath> cIncludeDirs,
-      ImmutableCollection<ExecutionRootPath> cppIncludeDirs,
-      ImmutableCollection<String> defines,
-      ImmutableMap<String, String> features,
-      File cCompilerExecutable,
-      File cppCompilerExecutable,
-      ImmutableList<String> cCompilerFlags,
-      ImmutableList<String> cppCompilerFlags) {
-    super(
-        project,
-        executionRootPathResolver,
-        workspacePathResolver,
-        headerRoots,
-        targetKey,
-        cSystemIncludeDirs,
-        cppSystemIncludeDirs,
-        quoteIncludeDirs,
-        cIncludeDirs,
-        cppIncludeDirs,
-        defines,
-        features,
-        cCompilerExecutable,
-        cppCompilerExecutable,
-        cCompilerFlags,
-        cppCompilerFlags);
-  }
-
-  /** Workaround for b/30301958. TODO: Remove this once we move to CLion 162.1531.1 or later */
-  @Override
-  public CidrBuildTarget getTarget() {
-    return new CidrBuildTargetWithConfigurations() {
-      @Override
-      public String getName() {
-        return targetKey.toString();
-      }
-
-      @Override
-      public String getProjectName() {
-        return project.getName();
-      }
-
-      @Nullable
-      @Override
-      public Icon getIcon() {
-        return null;
-      }
-
-      @Override
-      public boolean isExecutable() {
-        return false;
-      }
-
-      @Override
-      public List getBuildConfigurations() {
-        return ImmutableList.of();
-      }
-    };
-  }
-}
diff --git a/cpp/src/com/google/idea/blaze/cpp/versioned/v162/BlazeResolveConfiguration.java b/cpp/src/com/google/idea/blaze/cpp/versioned/v162/BlazeResolveConfiguration.java
deleted file mode 100644
index 959936b..0000000
--- a/cpp/src/com/google/idea/blaze/cpp/versioned/v162/BlazeResolveConfiguration.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.cpp;
-
-import com.google.common.collect.ImmutableCollection;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableMap;
-import com.google.idea.blaze.base.ideinfo.TargetKey;
-import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
-import com.google.idea.blaze.base.sync.workspace.ExecutionRootPathResolver;
-import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
-import com.intellij.openapi.project.Project;
-import com.intellij.openapi.vfs.VirtualFile;
-import java.io.File;
-
-final class BlazeResolveConfiguration extends BlazeResolveConfigurationTemporaryBase {
-
-  public BlazeResolveConfiguration(
-      Project project,
-      ExecutionRootPathResolver executionRootPathResolver,
-      WorkspacePathResolver workspacePathResolver,
-      ImmutableMap<File, VirtualFile> headerRoots,
-      TargetKey targetKey,
-      ImmutableCollection<ExecutionRootPath> cSystemIncludeDirs,
-      ImmutableCollection<ExecutionRootPath> cppSystemIncludeDirs,
-      ImmutableCollection<ExecutionRootPath> quoteIncludeDirs,
-      ImmutableCollection<ExecutionRootPath> cIncludeDirs,
-      ImmutableCollection<ExecutionRootPath> cppIncludeDirs,
-      ImmutableCollection<String> defines,
-      ImmutableMap<String, String> features,
-      File cCompilerExecutable,
-      File cppCompilerExecutable,
-      ImmutableList<String> cCompilerFlags,
-      ImmutableList<String> cppCompilerFlags) {
-    super(
-        project,
-        executionRootPathResolver,
-        workspacePathResolver,
-        headerRoots,
-        targetKey,
-        cSystemIncludeDirs,
-        cppSystemIncludeDirs,
-        quoteIncludeDirs,
-        cIncludeDirs,
-        cppIncludeDirs,
-        defines,
-        features,
-        cCompilerExecutable,
-        cppCompilerExecutable,
-        cCompilerFlags,
-        cppCompilerFlags);
-  }
-}
diff --git a/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeCompilerSettingsTest.java b/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeCompilerSettingsTest.java
index 317d838..a1e748c 100644
--- a/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeCompilerSettingsTest.java
+++ b/cpp/tests/unittests/com/google/idea/blaze/cpp/BlazeCompilerSettingsTest.java
@@ -19,6 +19,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.idea.blaze.base.BlazeTestCase;
+import com.google.idea.sdkcompat.cidr.CidrCompilerSwitchesAdapter;
 import com.jetbrains.cidr.lang.OCLanguageKind;
 import com.jetbrains.cidr.lang.toolchains.CidrCompilerSwitches;
 import java.io.File;
@@ -39,43 +40,7 @@
         new BlazeCompilerSettings(getProject(), cppExe, cppExe, cFlags, cFlags);
 
     CidrCompilerSwitches compilerSwitches = settings.getCompilerSwitches(OCLanguageKind.C, null);
-    List<String> commandLineArgs = compilerSwitches.getFileArgs();
+    List<String> commandLineArgs = CidrCompilerSwitchesAdapter.getFileArgs(compilerSwitches);
     assertThat(commandLineArgs).containsExactly("-fast", "-slow");
   }
-
-  @Test
-  public void testCompilerSwitchesWithUnescapedSpaces() {
-    File cppExe = new File("bin/cpp");
-    ImmutableList<String> cFlags = ImmutableList.of("-f ast", "-slo w");
-    BlazeCompilerSettings settings =
-        new BlazeCompilerSettings(getProject(), cppExe, cppExe, cFlags, cFlags);
-
-    CidrCompilerSwitches compilerSwitches = settings.getCompilerSwitches(OCLanguageKind.C, null);
-    List<String> fileArgs = compilerSwitches.getFileArgs();
-    assertThat(fileArgs).containsExactly("-f", "ast", "-slo", "w");
-  }
-
-  @Test
-  public void testCompilerSwitchesWithEscapedSpaces() {
-    File cppExe = new File("bin/cpp");
-    ImmutableList<String> cFlags = ImmutableList.of("-f\\ ast", "-slo\\ w");
-    BlazeCompilerSettings settings =
-        new BlazeCompilerSettings(getProject(), cppExe, cppExe, cFlags, cFlags);
-
-    CidrCompilerSwitches compilerSwitches = settings.getCompilerSwitches(OCLanguageKind.C, null);
-    List<String> fileArgs = compilerSwitches.getFileArgs();
-    assertThat(fileArgs).containsExactly("-f", "ast", "-slo", "w");
-  }
-
-  @Test
-  public void testCompilerSwitchesWithUnescapedAndEscapedSpaces() {
-    File cppExe = new File("bin/cpp");
-    ImmutableList<String> cFlags = ImmutableList.of("-f ast", "-slo\\ w");
-    BlazeCompilerSettings settings =
-        new BlazeCompilerSettings(getProject(), cppExe, cppExe, cFlags, cFlags);
-
-    CidrCompilerSwitches compilerSwitches = settings.getCompilerSwitches(OCLanguageKind.C, null);
-    List<String> fileArgs = compilerSwitches.getFileArgs();
-    assertThat(fileArgs).containsExactly("-f", "ast", "-slo", "w");
-  }
 }
diff --git a/golang/src/com/google/idea/blaze/golang/sync/BlazeGoSyncPlugin.java b/golang/src/com/google/idea/blaze/golang/sync/BlazeGoSyncPlugin.java
index 7f2a5c7..d65c8e6 100644
--- a/golang/src/com/google/idea/blaze/golang/sync/BlazeGoSyncPlugin.java
+++ b/golang/src/com/google/idea/blaze/golang/sync/BlazeGoSyncPlugin.java
@@ -23,6 +23,7 @@
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.plugin.PluginUtils;
 import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.scope.output.IssueOutput;
@@ -34,10 +35,7 @@
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.blaze.golang.sdk.GoSdkUtil;
 import com.google.idea.sdkcompat.transactions.Transactions;
-import com.intellij.ide.plugins.IdeaPluginDescriptor;
-import com.intellij.ide.plugins.PluginManager;
 import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.extensions.PluginId;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleType;
 import com.intellij.openapi.module.ModuleTypeManager;
@@ -51,10 +49,7 @@
 import com.intellij.openapi.roots.ProjectRootManager;
 import com.intellij.openapi.roots.libraries.Library;
 import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
-import com.intellij.openapi.updateSettings.impl.pluginsAdvertisement.PluginsAdvertiser;
-import com.intellij.openapi.util.EmptyRunnable;
 import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.pom.NavigatableAdapter;
 import java.util.List;
 import java.util.Set;
 import javax.annotation.Nullable;
@@ -155,7 +150,8 @@
 
   @Nullable
   @Override
-  public LibrarySource getLibrarySource(BlazeProjectData blazeProjectData) {
+  public LibrarySource getLibrarySource(
+      ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
     if (!blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.GO)) {
       return null;
     }
@@ -164,41 +160,22 @@
 
   @Override
   public boolean validateProjectView(
+      @Nullable Project project,
       BlazeContext context,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings) {
     if (!workspaceLanguageSettings.isLanguageActive(LanguageClass.GO)) {
       return true;
     }
-    if (!isPluginEnabled()) {
+    if (!PluginUtils.isPluginEnabled(GO_PLUGIN_ID)) {
       IssueOutput.error("Go plugin needed for Go language support.")
-          .navigatable(
-              new NavigatableAdapter() {
-                @Override
-                public void navigate(boolean requestFocus) {
-                  if (isPluginInstalled()) {
-                    PluginManager.enablePlugin(GO_PLUGIN_ID);
-                  } else {
-                    PluginsAdvertiser.installAndEnablePlugins(
-                        ImmutableSet.of(GO_PLUGIN_ID), EmptyRunnable.INSTANCE);
-                  }
-                }
-              })
+          .navigatable(PluginUtils.installOrEnablePluginNavigable(GO_PLUGIN_ID))
           .submit(context);
       return false;
     }
     return true;
   }
 
-  private static boolean isPluginInstalled() {
-    return PluginManager.isPluginInstalled(PluginId.getId(GO_PLUGIN_ID));
-  }
-
-  private static boolean isPluginEnabled() {
-    IdeaPluginDescriptor plugin = PluginManager.getPlugin(PluginId.getId(GO_PLUGIN_ID));
-    return plugin != null && plugin.isEnabled();
-  }
-
   @Override
   public void updateProjectSdk(
       Project project,
diff --git a/golang/tests/unittests/com/google/idea/blaze/golang/sync/BlazeGoSyncPluginTest.java b/golang/tests/unittests/com/google/idea/blaze/golang/sync/BlazeGoSyncPluginTest.java
index e563a27..fe0cf37 100644
--- a/golang/tests/unittests/com/google/idea/blaze/golang/sync/BlazeGoSyncPluginTest.java
+++ b/golang/tests/unittests/com/google/idea/blaze/golang/sync/BlazeGoSyncPluginTest.java
@@ -71,7 +71,7 @@
                     .build())
             .build();
     WorkspaceLanguageSettings workspaceLanguageSettings =
-        LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
     errorCollector.assertNoIssues();
     assertThat(workspaceLanguageSettings)
         .isEqualTo(
@@ -109,7 +109,9 @@
                     .add(ListSection.builder(AdditionalLanguagesSection.KEY).add(LanguageClass.GO))
                     .build())
             .build();
-    LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+    WorkspaceLanguageSettings workspaceLanguageSettings =
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
+    LanguageSupport.validateLanguageSettings(context, workspaceLanguageSettings);
     errorCollector.assertIssueContaining(
         "Language 'go' is not supported for this plugin with workspace type: 'java'");
   }
diff --git a/ijwb/BUILD b/ijwb/BUILD
index 55b2b72..ea9be4f 100644
--- a/ijwb/BUILD
+++ b/ijwb/BUILD
@@ -20,8 +20,9 @@
         "//golang:plugin_xml",
         "//java:plugin_xml",
         "//plugin_dev:plugin_xml",
+        "//python:plugin_xml",
+        "//scala:plugin_xml",
     ],
-    visibility = ["//visibility:public"],
 )
 
 merged_plugin_xml(
@@ -34,6 +35,7 @@
 
 stamped_plugin_xml(
     name = "stamped_plugin_xml",
+    changelog_file = "//:changelog",
     include_product_code_in_stamp = True,
     plugin_id = "com.google.idea.bazel.ijwb",
     plugin_name = "IntelliJ with Bazel",
@@ -45,21 +47,33 @@
 java_library(
     name = "ijwb_lib",
     srcs = glob(["src/**/*.java"]),
-    visibility = ["//visibility:public"],
     exports = [
         "//plugin_dev",
     ],
+    runtime_deps = [
+        "//golang",
+        "//python",
+        "//terminal",
+    ],
     deps = [
         "//base",
-        "//golang",
         "//intellij_platform_sdk:plugin_api",
         "//java",
+        "//scala",
+        "//sdkcompat",
         "@jsr305_annotations//jar",
     ],
 )
 
+OPTIONAL_PLUGIN_XMLS = [
+    "//scala:optional_xml",
+    "//python:optional_xml",
+    "//terminal:optional_xml",
+]
+
 intellij_plugin(
     name = "ijwb_bazel",
+    optional_plugin_xmls = OPTIONAL_PLUGIN_XMLS,
     plugin_xml = ":stamped_plugin_xml",
     deps = [
         ":ijwb_lib",
diff --git a/ijwb/src/META-INF/ijwb.xml b/ijwb/src/META-INF/ijwb.xml
index e4dc577..805e46e 100644
--- a/ijwb/src/META-INF/ijwb.xml
+++ b/ijwb/src/META-INF/ijwb.xml
@@ -26,7 +26,7 @@
     <SyncPlugin implementation="com.google.idea.blaze.ijwb.javascript.BlazeJavascriptSyncPlugin"/>
     <SyncPlugin implementation="com.google.idea.blaze.ijwb.typescript.BlazeTypescriptSyncPlugin"/>
     <SyncPlugin implementation="com.google.idea.blaze.ijwb.dart.BlazeDartSyncPlugin"/>
-    <java.JavaSyncAugmenter implementation="com.google.idea.blaze.ijwb.android.BlazeAndroidLiteJavaSyncAugmenter"/>
+    <JavaSyncAugmenter implementation="com.google.idea.blaze.ijwb.android.BlazeAndroidLiteJavaSyncAugmenter"/>
   </extensions>
 
 </idea-plugin>
diff --git a/ijwb/src/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteJavaSyncAugmenter.java b/ijwb/src/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteJavaSyncAugmenter.java
index 69ec1d8..c7a5e99 100644
--- a/ijwb/src/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteJavaSyncAugmenter.java
+++ b/ijwb/src/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteJavaSyncAugmenter.java
@@ -47,12 +47,12 @@
     // Add R.java jars
     LibraryArtifact resourceJar = androidIdeInfo.resourceJar;
     if (resourceJar != null) {
-      jars.add(new BlazeJarLibrary(resourceJar, target.key));
+      jars.add(new BlazeJarLibrary(resourceJar));
     }
 
     LibraryArtifact idlJar = androidIdeInfo.idlJar;
     if (idlJar != null) {
-      genJars.add(new BlazeJarLibrary(idlJar, target.key));
+      genJars.add(new BlazeJarLibrary(idlJar));
     }
   }
 }
diff --git a/ijwb/src/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteSyncPlugin.java b/ijwb/src/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteSyncPlugin.java
index 4a9612d..5f3e545 100644
--- a/ijwb/src/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteSyncPlugin.java
+++ b/ijwb/src/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteSyncPlugin.java
@@ -15,11 +15,26 @@
  */
 package com.google.idea.blaze.ijwb.android;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.ideinfo.AndroidSdkIdeInfo;
+import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
+import com.google.idea.blaze.base.ideinfo.LibraryArtifact;
+import com.google.idea.blaze.base.ideinfo.TargetMap;
+import com.google.idea.blaze.base.model.BlazeLibrary;
+import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
+import com.google.idea.blaze.base.sync.libraries.LibrarySource;
+import com.google.idea.blaze.java.sync.model.BlazeJarLibrary;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
 import java.util.Set;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
 
 /** Rudimentary support for android in IntelliJ. */
 public class BlazeAndroidLiteSyncPlugin extends BlazeSyncPlugin.Adapter {
@@ -33,4 +48,50 @@
         return ImmutableSet.of();
     }
   }
+
+  @Nullable
+  @Override
+  public LibrarySource getLibrarySource(
+      ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
+    if (!blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.ANDROID)) {
+      return null;
+    }
+    BlazeLibrary sdkLibrary = getSdkLibrary(blazeProjectData);
+    if (sdkLibrary == null) {
+      return null;
+    }
+    return new LibrarySource.Adapter() {
+      @Override
+      public Collection<? extends BlazeLibrary> getLibraries() {
+        return ImmutableList.of(sdkLibrary);
+      }
+    };
+  }
+
+  @Nullable
+  private static BlazeLibrary getSdkLibrary(BlazeProjectData blazeProjectData) {
+    List<AndroidSdkIdeInfo> sdkTargets = androidSdkTargets(blazeProjectData.targetMap);
+    if (sdkTargets.isEmpty()) {
+      return null;
+    }
+    // for now, just add the first one found
+    // TODO: warn if there's more than one
+    ArtifactLocation sdk =
+        sdkTargets
+            .stream()
+            .map(info -> info.androidJar)
+            .filter(Objects::nonNull)
+            .findFirst()
+            .orElse(null);
+    return sdk != null ? new BlazeJarLibrary(new LibraryArtifact(null, sdk, null)) : null;
+  }
+
+  private static List<AndroidSdkIdeInfo> androidSdkTargets(TargetMap targetMap) {
+    return targetMap
+        .targets()
+        .stream()
+        .map(target -> target.androidSdkIdeInfo)
+        .filter(Objects::nonNull)
+        .collect(Collectors.toList());
+  }
 }
diff --git a/ijwb/src/com/google/idea/blaze/ijwb/dart/BlazeDartLibrarySource.java b/ijwb/src/com/google/idea/blaze/ijwb/dart/BlazeDartLibrarySource.java
index 8772ee3..0bfbbf0 100644
--- a/ijwb/src/com/google/idea/blaze/ijwb/dart/BlazeDartLibrarySource.java
+++ b/ijwb/src/com/google/idea/blaze/ijwb/dart/BlazeDartLibrarySource.java
@@ -16,6 +16,7 @@
 package com.google.idea.blaze.ijwb.dart;
 
 import com.google.idea.blaze.base.sync.libraries.LibrarySource;
+import com.google.idea.sdkcompat.dart.DartSdkCompatUtils;
 import com.intellij.openapi.roots.libraries.Library;
 import java.util.function.Predicate;
 import javax.annotation.Nullable;
@@ -28,7 +29,7 @@
   public Predicate<Library> getGcRetentionFilter() {
     return library -> {
       String libraryName = library.getName();
-      return libraryName != null && libraryName.equals(BlazeDartSyncPlugin.DART_SDK_LIBRARY_NAME);
+      return libraryName != null && libraryName.equals(DartSdkCompatUtils.DART_SDK_LIBRARY_NAME);
     };
   }
 }
diff --git a/ijwb/src/com/google/idea/blaze/ijwb/dart/BlazeDartSyncPlugin.java b/ijwb/src/com/google/idea/blaze/ijwb/dart/BlazeDartSyncPlugin.java
index f0049d7..6bc8f5b 100644
--- a/ijwb/src/com/google/idea/blaze/ijwb/dart/BlazeDartSyncPlugin.java
+++ b/ijwb/src/com/google/idea/blaze/ijwb/dart/BlazeDartSyncPlugin.java
@@ -20,17 +20,17 @@
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.plugin.PluginUtils;
 import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.scope.output.IssueOutput;
 import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
 import com.google.idea.blaze.base.sync.libraries.LibrarySource;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
-import com.google.idea.blaze.ijwb.ide.IdeCheck;
+import com.google.idea.sdkcompat.dart.DartSdkCompatUtils;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.ModifiableRootModel;
-import com.intellij.openapi.roots.impl.libraries.ApplicationLibraryTable;
 import com.intellij.openapi.roots.libraries.Library;
 import java.util.Set;
 import javax.annotation.Nullable;
@@ -38,7 +38,6 @@
 /** Supports dart. */
 public class BlazeDartSyncPlugin extends BlazeSyncPlugin.Adapter {
 
-  static final String DART_SDK_LIBRARY_NAME = "Dart SDK";
   private static final String DART_PLUGIN_ID = "Dart";
 
   @Override
@@ -61,8 +60,7 @@
       return;
     }
 
-    Library dartSdkLibrary =
-        ApplicationLibraryTable.getApplicationTable().getLibraryByName(DART_SDK_LIBRARY_NAME);
+    Library dartSdkLibrary = DartSdkCompatUtils.findDartLibrary(project);
     if (dartSdkLibrary != null) {
       if (workspaceModifiableModel.findLibraryOrderEntry(dartSdkLibrary) == null) {
         workspaceModifiableModel.addLibraryEntry(dartSdkLibrary);
@@ -78,14 +76,17 @@
 
   @Override
   public boolean validateProjectView(
+      @Nullable Project project,
       BlazeContext context,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings) {
     if (!workspaceLanguageSettings.isLanguageActive(LanguageClass.DART)) {
       return true;
     }
-    if (!IdeCheck.isPluginEnabled(DART_PLUGIN_ID)) {
-      IssueOutput.error("Dart plugin needed for Dart language support.").submit(context);
+    if (!PluginUtils.isPluginEnabled(DART_PLUGIN_ID)) {
+      IssueOutput.error("Dart plugin needed for Dart language support.")
+          .navigatable(PluginUtils.installOrEnablePluginNavigable(DART_PLUGIN_ID))
+          .submit(context);
       return false;
     }
     return true;
@@ -93,7 +94,8 @@
 
   @Nullable
   @Override
-  public LibrarySource getLibrarySource(BlazeProjectData blazeProjectData) {
+  public LibrarySource getLibrarySource(
+      ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
     if (!blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.DART)) {
       return null;
     }
diff --git a/ijwb/src/com/google/idea/blaze/ijwb/ide/IdeCheck.java b/ijwb/src/com/google/idea/blaze/ijwb/ide/IdeCheck.java
deleted file mode 100644
index 617b9a7..0000000
--- a/ijwb/src/com/google/idea/blaze/ijwb/ide/IdeCheck.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright 2016 The Bazel Authors. All rights reserved.
- *
- * 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.idea.blaze.ijwb.ide;
-
-import com.intellij.ide.plugins.IdeaPluginDescriptor;
-import com.intellij.ide.plugins.PluginManager;
-import com.intellij.openapi.extensions.PluginId;
-
-/** IDE and plugin checks. */
-public class IdeCheck {
-  public static boolean isPluginEnabled(String pluginIdString) {
-    PluginId pluginId = PluginId.getId(pluginIdString);
-    if (!PluginManager.isPluginInstalled(pluginId)) {
-      return false;
-    }
-    IdeaPluginDescriptor plugin = PluginManager.getPlugin(pluginId);
-    if (plugin == null) {
-      return false;
-    }
-    return plugin.isEnabled();
-  }
-}
diff --git a/ijwb/src/com/google/idea/blaze/ijwb/javascript/BlazeJavascriptSyncPlugin.java b/ijwb/src/com/google/idea/blaze/ijwb/javascript/BlazeJavascriptSyncPlugin.java
index c684726..a7c376a 100644
--- a/ijwb/src/com/google/idea/blaze/ijwb/javascript/BlazeJavascriptSyncPlugin.java
+++ b/ijwb/src/com/google/idea/blaze/ijwb/javascript/BlazeJavascriptSyncPlugin.java
@@ -22,6 +22,7 @@
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.plugin.PluginUtils;
 import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.scope.output.IssueOutput;
@@ -46,6 +47,8 @@
 /** Allows people to use a javascript-only workspace. */
 public class BlazeJavascriptSyncPlugin extends BlazeSyncPlugin.Adapter {
 
+  private static final String JAVASCRIPT_PLUGIN_ID = "JavaScript";
+
   @Nullable
   @Override
   public ModuleType getWorkspaceModuleType(WorkspaceType workspaceType) {
@@ -57,12 +60,16 @@
 
   @Override
   public ImmutableList<WorkspaceType> getSupportedWorkspaceTypes() {
-    return ImmutableList.of(WorkspaceType.JAVASCRIPT);
+    return PlatformUtils.isIdeaUltimate()
+        ? ImmutableList.of(WorkspaceType.JAVASCRIPT)
+        : ImmutableList.of();
   }
 
   @Override
   public Set<LanguageClass> getSupportedLanguagesInWorkspace(WorkspaceType workspaceType) {
-    return ImmutableSet.of(LanguageClass.JAVASCRIPT);
+    return PlatformUtils.isIdeaUltimate()
+        ? ImmutableSet.of(LanguageClass.JAVASCRIPT)
+        : ImmutableSet.of();
   }
 
   @Nullable
@@ -114,7 +121,8 @@
 
   @Nullable
   @Override
-  public LibrarySource getLibrarySource(BlazeProjectData blazeProjectData) {
+  public LibrarySource getLibrarySource(
+      ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
     if (!blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.JAVASCRIPT)) {
       return null;
     }
@@ -123,16 +131,25 @@
 
   @Override
   public boolean validateProjectView(
+      @Nullable Project project,
       BlazeContext context,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings) {
     if (!workspaceLanguageSettings.isLanguageActive(LanguageClass.JAVASCRIPT)) {
       return true;
     }
-    if (!ApplicationManager.getApplication().isUnitTestMode() && !PlatformUtils.isIdeaUltimate()) {
+    if (!PlatformUtils.isIdeaUltimate()) {
       IssueOutput.error("IntelliJ Ultimate needed for Javascript support.").submit(context);
       return false;
     }
+    if (!ApplicationManager.getApplication().isUnitTestMode()
+        && !PluginUtils.isPluginEnabled(JAVASCRIPT_PLUGIN_ID)) {
+      IssueOutput.error(
+              "Javascript support is disabled: please install/enable the JetBrains Javascript "
+                  + "plugin, then restart the IDE")
+          .submit(context);
+      return false;
+    }
     return true;
   }
 }
diff --git a/ijwb/src/com/google/idea/blaze/ijwb/typescript/BlazeTypescriptSyncPlugin.java b/ijwb/src/com/google/idea/blaze/ijwb/typescript/BlazeTypescriptSyncPlugin.java
index d6ab6a7..8d8ab1a 100644
--- a/ijwb/src/com/google/idea/blaze/ijwb/typescript/BlazeTypescriptSyncPlugin.java
+++ b/ijwb/src/com/google/idea/blaze/ijwb/typescript/BlazeTypescriptSyncPlugin.java
@@ -22,6 +22,7 @@
 import com.google.idea.blaze.base.command.BlazeCommand;
 import com.google.idea.blaze.base.command.BlazeCommandName;
 import com.google.idea.blaze.base.command.BlazeFlags;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
 import com.google.idea.blaze.base.issueparser.IssueOutputLineProcessor;
 import com.google.idea.blaze.base.model.BlazeProjectData;
@@ -42,7 +43,6 @@
 import com.google.idea.blaze.base.sync.libraries.LibrarySource;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
-import com.google.idea.blaze.base.sync.workspace.BlazeRoots;
 import com.google.idea.blaze.base.sync.workspace.WorkingSet;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import com.intellij.openapi.module.Module;
@@ -51,7 +51,9 @@
 import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable;
 import com.intellij.openapi.roots.libraries.Library;
 import com.intellij.util.PlatformUtils;
+import java.util.ArrayList;
 import java.util.Collection;
+import java.util.LinkedHashSet;
 import java.util.Set;
 import javax.annotation.Nullable;
 
@@ -62,7 +64,9 @@
 
   @Override
   public Set<LanguageClass> getSupportedLanguagesInWorkspace(WorkspaceType workspaceType) {
-    return ImmutableSet.of(LanguageClass.TYPESCRIPT);
+    return PlatformUtils.isIdeaUltimate()
+        ? ImmutableSet.of(LanguageClass.TYPESCRIPT)
+        : ImmutableSet.of();
   }
 
   @Override
@@ -72,7 +76,7 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings,
-      BlazeRoots blazeRoots,
+      BlazeInfo blazeInfo,
       @Nullable WorkingSet workingSet,
       WorkspacePathResolver workspacePathResolver,
       ArtifactLocationDecoder artifactLocationDecoder,
@@ -83,8 +87,8 @@
       return;
     }
 
-    Label tsConfig = projectViewSet.getScalarValue(TsConfigRuleSection.KEY);
-    if (tsConfig == null) {
+    Set<Label> tsConfigTargets = getTsConfigTargets(projectViewSet);
+    if (tsConfigTargets.isEmpty()) {
       invalidProjectViewError(context);
       return;
     }
@@ -99,7 +103,7 @@
               BlazeCommand.builder(
                       Blaze.getBuildSystemProvider(project).getSyncBinaryPath(),
                       BlazeCommandName.RUN)
-                  .addTargets(tsConfig)
+                  .addTargets(new ArrayList<>(tsConfigTargets))
                   .addBlazeFlags(BlazeFlags.buildFlags(project, projectViewSet))
                   .build();
 
@@ -145,6 +149,7 @@
 
   @Override
   public boolean validateProjectView(
+      @Nullable Project project,
       BlazeContext context,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings) {
@@ -155,9 +160,8 @@
       return false;
     }
 
-    // Must have either both typescript and ts_config_rule or neither
-    Label tsConfig = projectViewSet.getScalarValue(TsConfigRuleSection.KEY);
-    if (typescriptActive ^ (tsConfig != null)) {
+    // Must have either both typescript and ts_config_rules or neither
+    if (typescriptActive ^ !getTsConfigTargets(projectViewSet).isEmpty()) {
       invalidProjectViewError(context);
       return false;
     }
@@ -167,19 +171,29 @@
 
   private void invalidProjectViewError(BlazeContext context) {
     IssueOutput.error(
-            "For Typescript support you must add both additional_languages: "
-                + "typescript and the ts_config_rule attribute.")
+            "For Typescript support you must add both `additional_languages`: "
+                + "typescript and the `ts_config_rules` attribute.")
         .submit(context);
   }
 
+  private static Set<Label> getTsConfigTargets(ProjectViewSet projectViewSet) {
+    Label oldSectionType = projectViewSet.getScalarValue(TsConfigRuleSection.KEY);
+    Set<Label> labels = new LinkedHashSet<>(projectViewSet.listItems(TsConfigRulesSection.KEY));
+    if (oldSectionType != null) {
+      labels.add(oldSectionType);
+    }
+    return labels;
+  }
+
   @Override
   public Collection<SectionParser> getSections() {
-    return ImmutableList.of(TsConfigRuleSection.PARSER);
+    return ImmutableList.of(TsConfigRuleSection.PARSER, TsConfigRulesSection.PARSER);
   }
 
   @Nullable
   @Override
-  public LibrarySource getLibrarySource(BlazeProjectData blazeProjectData) {
+  public LibrarySource getLibrarySource(
+      ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
     if (!blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.TYPESCRIPT)) {
       return null;
     }
diff --git a/ijwb/src/com/google/idea/blaze/ijwb/typescript/TsConfigRuleSection.java b/ijwb/src/com/google/idea/blaze/ijwb/typescript/TsConfigRuleSection.java
index aa3caff..e0f0d5b 100644
--- a/ijwb/src/com/google/idea/blaze/ijwb/typescript/TsConfigRuleSection.java
+++ b/ijwb/src/com/google/idea/blaze/ijwb/typescript/TsConfigRuleSection.java
@@ -28,6 +28,7 @@
 import javax.annotation.Nullable;
 
 /** Points to the ts_config rule. */
+@Deprecated
 public class TsConfigRuleSection {
   public static final SectionKey<Label, ScalarSection<Label>> KEY = SectionKey.of("ts_config_rule");
   public static final SectionParser PARSER = new TsConfigRuleSectionParser();
@@ -45,7 +46,7 @@
         parseContext.addErrors(errors);
         return null;
       }
-      return new Label(rest);
+      return Label.create(rest);
     }
 
     @Override
@@ -57,5 +58,16 @@
     public ItemType getItemType() {
       return ItemType.Label;
     }
+
+    @Override
+    public boolean isDeprecated() {
+      return true;
+    }
+
+    @Nullable
+    @Override
+    public String getDeprecationMessage() {
+      return "Use `ts_config_rules` instead, which allows specifying multiple `ts_config` targets.";
+    }
   }
 }
diff --git a/ijwb/src/com/google/idea/blaze/ijwb/typescript/TsConfigRulesSection.java b/ijwb/src/com/google/idea/blaze/ijwb/typescript/TsConfigRulesSection.java
new file mode 100644
index 0000000..8de392a
--- /dev/null
+++ b/ijwb/src/com/google/idea/blaze/ijwb/typescript/TsConfigRulesSection.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.ijwb.typescript;
+
+import com.google.idea.blaze.base.model.primitives.Label;
+import com.google.idea.blaze.base.projectview.section.LabelSectionParser;
+import com.google.idea.blaze.base.projectview.section.ListSection;
+import com.google.idea.blaze.base.projectview.section.SectionKey;
+import com.google.idea.blaze.base.projectview.section.SectionParser;
+
+/** Points to 'ts_config' rules. */
+public class TsConfigRulesSection {
+  public static final SectionKey<Label, ListSection<Label>> KEY = SectionKey.of("ts_config_rules");
+  public static final SectionParser PARSER = new LabelSectionParser(KEY);
+}
diff --git a/ijwb/tests/integrationtests/com/google/idea/blaze/ijwb/javascript/JavascriptSyncTest.java b/ijwb/tests/integrationtests/com/google/idea/blaze/ijwb/javascript/JavascriptSyncTest.java
index 5174f96..def1b77 100644
--- a/ijwb/tests/integrationtests/com/google/idea/blaze/ijwb/javascript/JavascriptSyncTest.java
+++ b/ijwb/tests/integrationtests/com/google/idea/blaze/ijwb/javascript/JavascriptSyncTest.java
@@ -18,12 +18,14 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.TestUtils;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.sync.BlazeSyncIntegrationTestCase;
 import com.google.idea.blaze.base.sync.BlazeSyncParams;
 import com.intellij.openapi.roots.ContentEntry;
 import com.intellij.openapi.roots.SourceFolder;
 import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.util.PlatformUtils;
 import javax.annotation.Nullable;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -35,6 +37,7 @@
 
   @Test
   public void testSimpleTestSourcesIdentified() {
+    TestUtils.setPlatformPrefix(getTestRootDisposable(), PlatformUtils.IDEA_PREFIX);
     setProjectView(
         "directories:",
         "  common/jslayout/calendar",
@@ -75,6 +78,7 @@
 
   @Test
   public void testTestSourcesMissingFromDirectoriesSectionAreAdded() {
+    TestUtils.setPlatformPrefix(getTestRootDisposable(), PlatformUtils.IDEA_PREFIX);
     setProjectView(
         "directories:",
         "  common/jslayout",
@@ -107,6 +111,7 @@
 
   @Test
   public void testTestSourceChildrenAreNotAddedAsSourceFolders() {
+    TestUtils.setPlatformPrefix(getTestRootDisposable(), PlatformUtils.IDEA_PREFIX);
     // child directories of test sources are always test sources, so they should never
     // appear as separate SourceFolders.
     setProjectView(
@@ -144,6 +149,26 @@
     assertThat(testRoot.isTestSource()).isTrue();
   }
 
+  @Test
+  public void testUsefulErrorMessageInCommunityEdition() {
+    TestUtils.setPlatformPrefix(getTestRootDisposable(), PlatformUtils.IDEA_CE_PREFIX);
+    setProjectView(
+        "directories:",
+        "  common/jslayout",
+        "targets:",
+        "  //common/jslayout/...:all",
+        "workspace_type: javascript");
+
+    workspace.createDirectory(new WorkspacePath("common/jslayout"));
+
+    BlazeSyncParams syncParams =
+        new BlazeSyncParams.Builder("Full Sync", BlazeSyncParams.SyncMode.FULL)
+            .addProjectViewTargets(true)
+            .build();
+    runBlazeSync(syncParams);
+    errorCollector.assertIssues("IntelliJ Ultimate needed for Javascript support.");
+  }
+
   @Nullable
   private static SourceFolder findSourceFolder(ContentEntry entry, VirtualFile file) {
     for (SourceFolder sourceFolder : entry.getSourceFolders()) {
diff --git a/ijwb/tests/integrationtests/com/google/idea/blaze/ijwb/lang/projectview/ProjectViewCompletionTest.java b/ijwb/tests/integrationtests/com/google/idea/blaze/ijwb/lang/projectview/ProjectViewCompletionTest.java
new file mode 100644
index 0000000..401f132
--- /dev/null
+++ b/ijwb/tests/integrationtests/com/google/idea/blaze/ijwb/lang/projectview/ProjectViewCompletionTest.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.ijwb.lang.projectview;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.base.Joiner;
+import com.google.idea.blaze.base.BlazeIntegrationTestCase;
+import com.google.idea.blaze.base.EditorTestHelper;
+import com.google.idea.blaze.base.model.MockBlazeProjectDataBuilder;
+import com.google.idea.blaze.base.model.MockBlazeProjectDataManager;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.sync.projectview.LanguageSupport;
+import com.intellij.psi.PsiFile;
+import java.util.stream.Collectors;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Project view completion tests requiring IJwB's sync plugins to be present. */
+@RunWith(JUnit4.class)
+public class ProjectViewCompletionTest extends BlazeIntegrationTestCase {
+
+  protected EditorTestHelper editorTest;
+
+  @Before
+  public final void doSetup() {
+    BlazeProjectDataManager mockProjectDataManager =
+        new MockBlazeProjectDataManager(MockBlazeProjectDataBuilder.builder(workspaceRoot).build());
+    registerProjectService(BlazeProjectDataManager.class, mockProjectDataManager);
+    editorTest = new EditorTestHelper(getProject(), testFixture);
+  }
+
+  private PsiFile setInput(String... fileContents) {
+    return testFixture.configureByText(".blazeproject", Joiner.on("\n").join(fileContents));
+  }
+
+  @Test
+  public void testAdditionalLanguagesCompletion() {
+    setInput("additional_languages:", "  <caret>");
+
+    String[] types = editorTest.getCompletionItemsAsStrings();
+
+    assertThat(types)
+        .asList()
+        .containsAllIn(
+            LanguageSupport.availableAdditionalLanguages(WorkspaceType.JAVA)
+                .stream()
+                .map(LanguageClass::getName)
+                .collect(Collectors.toList()));
+  }
+}
diff --git a/ijwb/tests/unittests/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteSyncPluginTest.java b/ijwb/tests/unittests/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteSyncPluginTest.java
index 9f3dfd9..aa90aa5 100644
--- a/ijwb/tests/unittests/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteSyncPluginTest.java
+++ b/ijwb/tests/unittests/com/google/idea/blaze/ijwb/android/BlazeAndroidLiteSyncPluginTest.java
@@ -87,7 +87,7 @@
                     .build())
             .build();
     WorkspaceLanguageSettings workspaceLanguageSettings =
-        LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
     errorCollector.assertNoIssues();
     assertThat(workspaceLanguageSettings)
         .isEqualTo(
diff --git a/ijwb/tests/unittests/com/google/idea/blaze/ijwb/dart/BlazeDartSyncPluginTest.java b/ijwb/tests/unittests/com/google/idea/blaze/ijwb/dart/BlazeDartSyncPluginTest.java
index 2c00838..d8a27e3 100644
--- a/ijwb/tests/unittests/com/google/idea/blaze/ijwb/dart/BlazeDartSyncPluginTest.java
+++ b/ijwb/tests/unittests/com/google/idea/blaze/ijwb/dart/BlazeDartSyncPluginTest.java
@@ -86,7 +86,7 @@
                     .build())
             .build();
     WorkspaceLanguageSettings workspaceLanguageSettings =
-        LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
     errorCollector.assertNoIssues();
     assertThat(workspaceLanguageSettings)
         .isEqualTo(
diff --git a/ijwb/tests/unittests/com/google/idea/blaze/ijwb/javascript/BlazeJavascriptSyncPluginTest.java b/ijwb/tests/unittests/com/google/idea/blaze/ijwb/javascript/BlazeJavascriptSyncPluginTest.java
index b90851e..da42baf 100644
--- a/ijwb/tests/unittests/com/google/idea/blaze/ijwb/javascript/BlazeJavascriptSyncPluginTest.java
+++ b/ijwb/tests/unittests/com/google/idea/blaze/ijwb/javascript/BlazeJavascriptSyncPluginTest.java
@@ -19,6 +19,7 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.idea.blaze.base.BlazeTestCase;
+import com.google.idea.blaze.base.TestUtils;
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
 import com.google.idea.blaze.base.projectview.ProjectView;
@@ -34,7 +35,7 @@
 import com.google.idea.blaze.base.sync.projectview.LanguageSupport;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.intellij.openapi.extensions.impl.ExtensionPointImpl;
-import org.jetbrains.annotations.NotNull;
+import com.intellij.util.PlatformUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -47,8 +48,7 @@
   private BlazeContext context;
 
   @Override
-  protected void initTest(
-      @NotNull Container applicationServices, @NotNull Container projectServices) {
+  protected void initTest(Container applicationServices, Container projectServices) {
     super.initTest(applicationServices, projectServices);
 
     ExtensionPointImpl<BlazeSyncPlugin> ep =
@@ -60,7 +60,8 @@
   }
 
   @Test
-  public void testJavascriptLanguageAvailable() {
+  public void testJavascriptLanguageAvailableForUltimateEdition() {
+    TestUtils.setPlatformPrefix(testDisposable, PlatformUtils.IDEA_PREFIX);
     ProjectViewSet projectViewSet =
         ProjectViewSet.builder()
             .add(
@@ -74,7 +75,7 @@
                     .build())
             .build();
     WorkspaceLanguageSettings workspaceLanguageSettings =
-        LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
     errorCollector.assertNoIssues();
     assertThat(workspaceLanguageSettings)
         .isEqualTo(
@@ -82,4 +83,22 @@
                 WorkspaceType.JAVASCRIPT,
                 ImmutableSet.of(LanguageClass.JAVASCRIPT, LanguageClass.GENERIC)));
   }
+
+  @Test
+  public void testJavascriptWorkspaceTypeUnavailableForCommunityEdition() {
+    TestUtils.setPlatformPrefix(testDisposable, PlatformUtils.IDEA_CE_PREFIX);
+    ProjectViewSet projectViewSet =
+        ProjectViewSet.builder()
+            .add(
+                ProjectView.builder()
+                    .add(
+                        ScalarSection.builder(WorkspaceTypeSection.KEY)
+                            .set(WorkspaceType.JAVASCRIPT))
+                    .build())
+            .build();
+    WorkspaceLanguageSettings workspaceLanguageSettings =
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
+    LanguageSupport.validateLanguageSettings(context, workspaceLanguageSettings);
+    errorCollector.assertIssues("Workspace type 'javascript' is not supported by this plugin");
+  }
 }
diff --git a/ijwb/tests/unittests/com/google/idea/blaze/ijwb/typescript/BlazeTypescriptSyncPluginTest.java b/ijwb/tests/unittests/com/google/idea/blaze/ijwb/typescript/BlazeTypescriptSyncPluginTest.java
index e39fa49..1975ae8 100644
--- a/ijwb/tests/unittests/com/google/idea/blaze/ijwb/typescript/BlazeTypescriptSyncPluginTest.java
+++ b/ijwb/tests/unittests/com/google/idea/blaze/ijwb/typescript/BlazeTypescriptSyncPluginTest.java
@@ -20,6 +20,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import com.google.idea.blaze.base.BlazeTestCase;
+import com.google.idea.blaze.base.TestUtils;
 import com.google.idea.blaze.base.model.primitives.LanguageClass;
 import com.google.idea.blaze.base.model.primitives.WorkspaceType;
 import com.google.idea.blaze.base.projectview.ProjectView;
@@ -35,6 +36,7 @@
 import com.google.idea.blaze.base.sync.projectview.LanguageSupport;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.intellij.openapi.extensions.impl.ExtensionPointImpl;
+import com.intellij.util.PlatformUtils;
 import java.util.Set;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Test;
@@ -75,7 +77,8 @@
   }
 
   @Test
-  public void testTypescriptLanguageAvailable() {
+  public void testTypescriptLanguageAvailableInUltimateEdition() {
+    TestUtils.setPlatformPrefix(testDisposable, PlatformUtils.IDEA_PREFIX);
     ProjectViewSet projectViewSet =
         ProjectViewSet.builder()
             .add(
@@ -87,7 +90,7 @@
                     .build())
             .build();
     WorkspaceLanguageSettings workspaceLanguageSettings =
-        LanguageSupport.createWorkspaceLanguageSettings(context, projectViewSet);
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
     errorCollector.assertNoIssues();
     assertThat(workspaceLanguageSettings)
         .isEqualTo(
@@ -96,4 +99,23 @@
                 ImmutableSet.of(
                     LanguageClass.TYPESCRIPT, LanguageClass.GENERIC, LanguageClass.JAVA)));
   }
+
+  @Test
+  public void testTypescriptNotLanguageAvailableInCommunityEdition() {
+    TestUtils.setPlatformPrefix(testDisposable, PlatformUtils.IDEA_CE_PREFIX);
+    ProjectViewSet projectViewSet =
+        ProjectViewSet.builder()
+            .add(
+                ProjectView.builder()
+                    .add(ScalarSection.builder(WorkspaceTypeSection.KEY).set(WorkspaceType.JAVA))
+                    .add(
+                        ListSection.builder(AdditionalLanguagesSection.KEY)
+                            .add(LanguageClass.TYPESCRIPT))
+                    .build())
+            .build();
+    WorkspaceLanguageSettings workspaceLanguageSettings =
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
+    LanguageSupport.validateLanguageSettings(context, workspaceLanguageSettings);
+    errorCollector.assertIssues("Language 'typescript' is not supported by this plugin");
+  }
 }
diff --git a/intellij_platform_sdk/BUILD b/intellij_platform_sdk/BUILD
index 88f4b35..d20389e 100644
--- a/intellij_platform_sdk/BUILD
+++ b/intellij_platform_sdk/BUILD
@@ -16,6 +16,21 @@
     },
 )
 
+config_setting(
+    name = "intellij-beta",
+    values = {
+        "define": "ij_product=intellij-beta",
+    },
+)
+
+# IntelliJ CE 2017.1.1
+config_setting(
+    name = "intellij-2017.1.1",
+    values = {
+        "define": "ij_product=intellij-2017.1.1",
+    },
+)
+
 # IntelliJ CE 2016.3.1
 config_setting(
     name = "intellij-2016.3.1",
@@ -24,14 +39,6 @@
     },
 )
 
-# IntelliJ CE 2016.2.4
-config_setting(
-    name = "intellij-162.2032.8",
-    values = {
-        "define": "ij_product=intellij-162.2032.8",
-    },
-)
-
 config_setting(
     name = "android-studio-latest",
     values = {
@@ -39,14 +46,6 @@
     },
 )
 
-# Android Studio 2.2.0.7
-config_setting(
-    name = "android-studio-145.1617.8",
-    values = {
-        "define": "ij_product=android-studio-145.1617.8",
-    },
-)
-
 config_setting(
     name = "android-studio-beta",
     values = {
@@ -54,27 +53,19 @@
     },
 )
 
-# Android Studio 2.3.0.3
+# Android Studio 2.3.0.8
 config_setting(
-    name = "android-studio-2.3.0.3",
+    name = "android-studio-2.3.0.8",
     values = {
-        "define": "ij_product=android-studio-2.3.0.3",
+        "define": "ij_product=android-studio-2.3.0.8",
     },
 )
 
-# Android Studio 2.3.0.4
+# Android Studio 2.3.1.0
 config_setting(
-    name = "android-studio-2.3.0.4",
+    name = "android-studio-2.3.1.0",
     values = {
-        "define": "ij_product=android-studio-2.3.0.4",
-    },
-)
-
-# Android Studio 2.3.0.6
-config_setting(
-    name = "android-studio-2.3.0.6",
-    values = {
-        "define": "ij_product=android-studio-2.3.0.6",
+        "define": "ij_product=android-studio-2.3.1.0",
     },
 )
 
@@ -85,6 +76,21 @@
     },
 )
 
+config_setting(
+    name = "clion-beta",
+    values = {
+        "define": "ij_product=clion-beta",
+    },
+)
+
+# CLion 2017.1.1
+config_setting(
+    name = "clion-2017.1.1",
+    values = {
+        "define": "ij_product=clion-2017.1.1",
+    },
+)
+
 # CLion 2016.3.2
 config_setting(
     name = "clion-2016.3.2",
@@ -186,6 +192,28 @@
     ),
 )
 
+# IntelliJ tasks plugin
+java_library(
+    name = "tasks",
+    neverlink = 1,
+    exports = select_from_plugin_api_directory(
+        android_studio = [":tasks"],
+        clion = [":tasks"],
+        intellij = [":tasks"],
+    ),
+)
+
+# terminal plugin
+java_library(
+    name = "terminal",
+    neverlink = 1,
+    exports = select_from_plugin_api_directory(
+        android_studio = [],
+        clion = [":terminal"],
+        intellij = [":terminal"],
+    ),
+)
+
 # Bundled plugins required by integration tests
 java_library(
     name = "bundled_plugins",
@@ -203,13 +231,10 @@
 java_library(
     name = "missing_test_classes",
     srcs = select_for_plugin_api({
-        "android-studio-2.3.0.3": [
+        "android-studio-2.3.0.8": [
             "missing/tests/com/jetbrains/cidr/modulemap/resolve/MockModuleMapManagerImpl.java",
         ],
-        "android-studio-2.3.0.4": [
-            "missing/tests/com/jetbrains/cidr/modulemap/resolve/MockModuleMapManagerImpl.java",
-        ],
-        "android-studio-2.3.0.6": [
+        "android-studio-2.3.1.0": [
             "missing/tests/com/jetbrains/cidr/modulemap/resolve/MockModuleMapManagerImpl.java",
         ],
         "default": [],
diff --git a/intellij_platform_sdk/BUILD.clion b/intellij_platform_sdk/BUILD.clion
index c83e150..d43b8a1 100644
--- a/intellij_platform_sdk/BUILD.clion
+++ b/intellij_platform_sdk/BUILD.clion
@@ -15,6 +15,16 @@
     jars = glob(["clion-*/plugins/hg4idea/lib/hg4idea.jar"]),
 )
 
+java_import(
+    name = "terminal",
+    jars = glob(["clion-*/plugins/terminal/lib/terminal.jar"]),
+)
+
+java_import(
+    name = "python",
+    jars = glob(["clion-*/plugins/python/lib/python.jar"]),
+)
+
 # The plugins required by CLwB. Presumably there will be some, when we write
 # some integration tests.
 java_import(
diff --git a/intellij_platform_sdk/BUILD.idea b/intellij_platform_sdk/BUILD.idea
index 32a92ad..4133e09 100644
--- a/intellij_platform_sdk/BUILD.idea
+++ b/intellij_platform_sdk/BUILD.idea
@@ -25,6 +25,11 @@
     jars = glob(["plugins/junit/lib/*.jar"]),
 )
 
+java_import(
+    name = "terminal",
+    jars = ["plugins/terminal/lib/terminal.jar"],
+)
+
 # The plugins required by IJwB. We need to include them
 # when running integration tests.
 java_import(
diff --git a/intellij_platform_sdk/build_defs.bzl b/intellij_platform_sdk/build_defs.bzl
index 357308a..5c1bbda 100644
--- a/intellij_platform_sdk/build_defs.bzl
+++ b/intellij_platform_sdk/build_defs.bzl
@@ -2,32 +2,30 @@
 
 # The current indirect ij_product mapping (eg. "intellij-latest")
 INDIRECT_IJ_PRODUCTS = {
-    "intellij-latest": "intellij-2016.3.1",
-    "android-studio-latest": "android-studio-145.1617.8",
-    "android-studio-beta": "android-studio-2.3.0.6",
-    "clion-latest": "clion-2016.3.2",
+    "intellij-latest": "intellij-2017.1.1",
+    "intellij-beta": "intellij-2017.1.1",
+    "android-studio-latest": "android-studio-2.3.1.0",
+    "android-studio-beta": "android-studio-2.3.1.0",
+    "clion-latest": "clion-2017.1.1",
+    "clion-beta": "clion-2017.1.1",
 }
 
 DIRECT_IJ_PRODUCTS = {
+    "intellij-2017.1.1": struct(
+        ide="intellij",
+        directory="intellij_ce_2017_1_1",
+    ),
     "intellij-2016.3.1": struct(
         ide="intellij",
         directory="intellij_ce_2016_3_1",
     ),
-    "intellij-162.2032.8": struct(
-        ide="intellij",
-        directory="IC_162_2032_8",
-    ),
-    "android-studio-145.1617.8": struct(
+    "android-studio-2.3.0.8": struct(
         ide="android-studio",
-        directory="AI_145_1617_8",
+        directory="android_studio_2_3_0_8",
     ),
-    "android-studio-2.3.0.4": struct(
+    "android-studio-2.3.1.0": struct(
         ide="android-studio",
-        directory="android_studio_2_3_0_4",
-    ),
-    "android-studio-2.3.0.6": struct(
-        ide="android-studio",
-        directory="android_studio_2_3_0_6",
+        directory="android_studio_2_3_1_0",
     ),
     "clion-162.1967.7": struct(
         ide="clion",
@@ -37,15 +35,12 @@
         ide="clion",
         directory="clion_2016_3_2",
     ),
+    "clion-2017.1.1": struct(
+        ide="clion",
+        directory="clion_2017_1_1",
+    ),
 }
 
-# BUILD_VARS for each IDE corresponding to indirect ij_products, eg. "intellij-latest"
-
-
-
-
-
-
 def select_for_plugin_api(params):
   """Selects for a plugin_api.
 
@@ -99,7 +94,7 @@
 
   return select(select_params)
 
-def select_for_ide(intellij=None, android_studio=None, clion=None, default=None):
+def select_for_ide(intellij=None, android_studio=None, clion=None, default=[]):
   """Selects for the supported IDEs.
 
   Args:
@@ -108,7 +103,7 @@
       clion: Files to use for CLion. If None will use default.
       default: Files to use for any IDEs not passed.
   Returns:
-      A select statement on all plugin_apis, sorted into IDEs.
+      A select statement on all plugin_apis to lists of files, sorted into IDEs.
 
   Example:
     java_library(
diff --git a/java/BUILD b/java/BUILD
index 20786ea..fb36558 100644
--- a/java/BUILD
+++ b/java/BUILD
@@ -1,13 +1,27 @@
 licenses(["notice"])  # Apache 2.0
 
+load(
+    "//build_defs:build_defs.bzl",
+    "merged_plugin_xml",
+    "stamped_plugin_xml",
+    "intellij_plugin",
+)
+load(
+    "//testing:test_defs.bzl",
+    "intellij_integration_test_suite",
+    "intellij_unit_test_suite",
+)
+
 java_library(
     name = "java",
     srcs = glob(["src/**/*.java"]),
     visibility = ["//visibility:public"],
-    deps = [
-        "//base",
+    runtime_deps = [
         "//common/actionhelper",
         "//common/experiments",
+    ],
+    deps = [
+        "//base",
         "//intellij_platform_sdk:junit",
         "//intellij_platform_sdk:plugin_api",
         "//proto:proto_deps",
@@ -22,13 +36,6 @@
     visibility = ["//visibility:public"],
 )
 
-load(
-    "//build_defs:build_defs.bzl",
-    "merged_plugin_xml",
-    "stamped_plugin_xml",
-    "intellij_plugin",
-)
-
 merged_plugin_xml(
     name = "merged_plugin_xml",
     srcs = [
@@ -54,12 +61,6 @@
     ],
 )
 
-load(
-    "//testing:test_defs.bzl",
-    "intellij_integration_test_suite",
-    "intellij_unit_test_suite",
-)
-
 intellij_unit_test_suite(
     name = "unit_tests",
     srcs = glob(["tests/unittests/**/*.java"]),
diff --git a/java/src/META-INF/blaze-java.xml b/java/src/META-INF/blaze-java.xml
index bf8b3cf..e22c895 100644
--- a/java/src/META-INF/blaze-java.xml
+++ b/java/src/META-INF/blaze-java.xml
@@ -69,9 +69,10 @@
     <BlazeUserSettingsContributor implementation="com.google.idea.blaze.java.settings.BlazeJavaUserSettingsContributor$BlazeJavaUserSettingsProvider"/>
     <FileCache implementation="com.google.idea.blaze.java.libraries.JarCache$FileCacheAdapter"/>
     <PrefetchFileSource implementation="com.google.idea.blaze.java.sync.JavaPrefetchFileSource"/>
-    <SyncListener implementation="com.google.idea.blaze.java.syncstatus.SyncStatusHelper$UpdateSyncStatusMap"/>
     <BlazeTestEventsHandler implementation="com.google.idea.blaze.java.run.BlazeJavaTestEventsHandler"/>
     <AttributeSpecificStringLiteralReferenceProvider implementation="com.google.idea.blaze.java.lang.build.references.JavaClassQualifiedNameReference"/>
+    <JavaLikeLanguage implementation="com.google.idea.blaze.java.sync.source.JavaLikeLanguage$Java"/>
+    <TestTargetHeuristic implementation="com.google.idea.blaze.java.run.JUnitTestHeuristic" order="before TestSizeHeuristic"/>
   </extensions>
 
   <extensions defaultExtensionNs="com.intellij">
@@ -111,7 +112,6 @@
     <attachSourcesProvider implementation="com.google.idea.blaze.java.libraries.AddLibraryTargetDirectoryToProjectViewAttachSourcesProvider"/>
     <attachSourcesProvider implementation="com.google.idea.blaze.java.libraries.BlazeAttachSourceProvider"/>
     <applicationService serviceImplementation="com.google.idea.blaze.java.settings.BlazeJavaUserSettings"/>
-    <projectService serviceImplementation="com.google.idea.blaze.java.syncstatus.SyncStatusHelper"/>
     <psi.referenceContributor language="BUILD" implementation="com.google.idea.blaze.java.lang.build.references.JavaClassReferenceContributor"/>
   </extensions>
 
@@ -122,7 +122,11 @@
   </project-components>
 
   <extensionPoints>
-    <extensionPoint qualifiedName="com.google.idea.blaze.java.JavaSyncAugmenter"
+    <extensionPoint qualifiedName="com.google.idea.blaze.JavaSyncAugmenter"
                     interface="com.google.idea.blaze.java.sync.BlazeJavaSyncAugmenter"/>
+    <extensionPoint qualifiedName="com.google.idea.blaze.JavaLikeLanguage"
+                    interface="com.google.idea.blaze.java.sync.source.JavaLikeLanguage"/>
+    <extensionPoint qualifiedName="com.google.idea.blaze.JUnitParameterizedClassHeuristic"
+                    interface="com.google.idea.blaze.java.run.producers.JUnitParameterizedClassHeuristic"/>
   </extensionPoints>
 </idea-plugin>
diff --git a/java/src/com/google/idea/blaze/java/lang/build/BuildFileSafeDeleteProcessor.java b/java/src/com/google/idea/blaze/java/lang/build/BuildFileSafeDeleteProcessor.java
index 63b2017..be94716 100644
--- a/java/src/com/google/idea/blaze/java/lang/build/BuildFileSafeDeleteProcessor.java
+++ b/java/src/com/google/idea/blaze/java/lang/build/BuildFileSafeDeleteProcessor.java
@@ -28,7 +28,6 @@
 import com.intellij.usageView.UsageInfo;
 import com.intellij.util.IncorrectOperationException;
 import java.util.Collection;
-import java.util.Iterator;
 import java.util.List;
 import javax.annotation.Nullable;
 import org.jetbrains.annotations.NotNull;
@@ -55,12 +54,7 @@
       @NotNull PsiElement[] allElementsToDelete,
       @NotNull List<UsageInfo> result) {
     NonCodeUsageSearchInfo superResult = super.findUsages(element, allElementsToDelete, result);
-    Iterator<UsageInfo> iter = result.iterator();
-    while (iter.hasNext()) {
-      if (ignoreUsage(iter.next())) {
-        iter.remove();
-      }
-    }
+    result.removeIf(BuildFileSafeDeleteProcessor::ignoreUsage);
     return superResult;
   }
 
diff --git a/java/src/com/google/idea/blaze/java/libraries/AddLibraryTargetDirectoryToProjectViewAction.java b/java/src/com/google/idea/blaze/java/libraries/AddLibraryTargetDirectoryToProjectViewAction.java
index ec05bb7..c5e45c6 100644
--- a/java/src/com/google/idea/blaze/java/libraries/AddLibraryTargetDirectoryToProjectViewAction.java
+++ b/java/src/com/google/idea/blaze/java/libraries/AddLibraryTargetDirectoryToProjectViewAction.java
@@ -21,6 +21,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
 import com.google.idea.blaze.base.actions.BlazeProjectAction;
+import com.google.idea.blaze.base.ideinfo.JavaIdeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetKey;
 import com.google.idea.blaze.base.model.BlazeProjectData;
@@ -86,7 +87,7 @@
     if (blazeLibrary == null) {
       return null;
     }
-    TargetKey originatingTarget = blazeLibrary.originatingTarget;
+    TargetKey originatingTarget = findOriginatingTargetForLibrary(blazeProjectData, blazeLibrary);
     if (originatingTarget == null) {
       return null;
     }
@@ -123,6 +124,21 @@
     return workspacePath;
   }
 
+  @Nullable
+  private static TargetKey findOriginatingTargetForLibrary(
+      BlazeProjectData blazeProjectData, BlazeJarLibrary library) {
+    for (TargetIdeInfo target : blazeProjectData.targetMap.targets()) {
+      JavaIdeInfo javaIdeInfo = target.javaIdeInfo;
+      if (javaIdeInfo == null) {
+        continue;
+      }
+      if (javaIdeInfo.jars.contains(library.libraryArtifact)) {
+        return target.key;
+      }
+    }
+    return null;
+  }
+
   static void addDirectoriesToProjectView(Project project, List<Library> libraries) {
     Set<WorkspacePath> workspacePaths = Sets.newHashSet();
     for (Library library : libraries) {
diff --git a/java/src/com/google/idea/blaze/java/libraries/JarCache.java b/java/src/com/google/idea/blaze/java/libraries/JarCache.java
index 8617b8c..66eafaa 100644
--- a/java/src/com/google/idea/blaze/java/libraries/JarCache.java
+++ b/java/src/com/google/idea/blaze/java/libraries/JarCache.java
@@ -78,8 +78,12 @@
   }
 
   public void onSync(
-      BlazeContext context, BlazeProjectData projectData, BlazeSyncParams.SyncMode syncMode) {
-    Collection<BlazeLibrary> libraries = BlazeLibraryCollector.getLibraries(projectData);
+      BlazeContext context,
+      ProjectViewSet projectViewSet,
+      BlazeProjectData projectData,
+      BlazeSyncParams.SyncMode syncMode) {
+    Collection<BlazeLibrary> libraries =
+        BlazeLibraryCollector.getLibraries(projectViewSet, projectData);
     boolean fullRefresh = syncMode == SyncMode.FULL;
     boolean removeMissingFiles = syncMode == SyncMode.INCREMENTAL;
     boolean enabled = updateEnabled();
@@ -326,7 +330,7 @@
         ProjectViewSet projectViewSet,
         BlazeProjectData projectData,
         BlazeSyncParams.SyncMode syncMode) {
-      getInstance(project).onSync(context, projectData, syncMode);
+      getInstance(project).onSync(context, projectViewSet, projectData, syncMode);
     }
 
     @Override
diff --git a/java/src/com/google/idea/blaze/java/run/BlazeJavaDebuggerRunner.java b/java/src/com/google/idea/blaze/java/run/BlazeJavaDebuggerRunner.java
index 33a6540..140b08d 100644
--- a/java/src/com/google/idea/blaze/java/run/BlazeJavaDebuggerRunner.java
+++ b/java/src/com/google/idea/blaze/java/run/BlazeJavaDebuggerRunner.java
@@ -17,7 +17,7 @@
 
 import com.google.idea.blaze.base.model.primitives.Kind;
 import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
-import com.google.idea.sdkcompat.debugger.GenericDebuggerRunnerSdkCompatAdapter;
+import com.intellij.debugger.impl.GenericDebuggerRunner;
 import com.intellij.execution.ExecutionException;
 import com.intellij.execution.configurations.JavaParameters;
 import com.intellij.execution.configurations.RemoteConnection;
@@ -30,7 +30,7 @@
 import javax.annotation.Nullable;
 
 /** A runner that adapts the GenericDebuggerRunner to work with Blaze run configurations. */
-public class BlazeJavaDebuggerRunner extends GenericDebuggerRunnerSdkCompatAdapter {
+public class BlazeJavaDebuggerRunner extends GenericDebuggerRunner {
 
   // wait 10 minutes for the blaze build to complete before connecting
   private static final long POLL_TIMEOUT_MILLIS = 10 * 60 * 1000;
diff --git a/java/src/com/google/idea/blaze/java/run/BlazeJavaRunConfigurationFactory.java b/java/src/com/google/idea/blaze/java/run/BlazeJavaRunConfigurationFactory.java
index 3b7c1b5..3daee7a 100644
--- a/java/src/com/google/idea/blaze/java/run/BlazeJavaRunConfigurationFactory.java
+++ b/java/src/com/google/idea/blaze/java/run/BlazeJavaRunConfigurationFactory.java
@@ -50,7 +50,7 @@
     BlazeCommandRunConfigurationCommonState state =
         blazeConfig.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
     if (state != null) {
-      state.setCommand(BlazeCommandName.RUN);
+      state.getCommandState().setCommand(BlazeCommandName.RUN);
     }
     blazeConfig.setGeneratedName();
   }
diff --git a/java/src/com/google/idea/blaze/java/run/BlazeJavaRunConfigurationHandler.java b/java/src/com/google/idea/blaze/java/run/BlazeJavaRunConfigurationHandler.java
index 479b964..109d56e 100644
--- a/java/src/com/google/idea/blaze/java/run/BlazeJavaRunConfigurationHandler.java
+++ b/java/src/com/google/idea/blaze/java/run/BlazeJavaRunConfigurationHandler.java
@@ -72,7 +72,7 @@
   @Override
   @Nullable
   public String getCommandName() {
-    BlazeCommandName command = state.getCommand();
+    BlazeCommandName command = state.getCommandState().getCommand();
     return command != null ? command.toString() : null;
   }
 
diff --git a/java/src/com/google/idea/blaze/java/run/BlazeJavaRunProfileState.java b/java/src/com/google/idea/blaze/java/run/BlazeJavaRunProfileState.java
index b047b41..e7c4773 100644
--- a/java/src/com/google/idea/blaze/java/run/BlazeJavaRunProfileState.java
+++ b/java/src/com/google/idea/blaze/java/run/BlazeJavaRunProfileState.java
@@ -154,8 +154,8 @@
     BlazeCommandRunConfigurationCommonState state =
         configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
     return state != null
-        && BlazeCommandName.TEST.equals(state.getCommand())
-        && !state.getRunOnDistributedExecutor();
+        && BlazeCommandName.TEST.equals(state.getCommandState().getCommand())
+        && !state.getRunOnDistributedExecutorState().runOnDistributedExecutor;
   }
 
   @Override
@@ -183,18 +183,18 @@
     assert handlerState != null;
 
     String binaryPath =
-        handlerState.getBlazeBinary() != null
-            ? handlerState.getBlazeBinary()
+        handlerState.getBlazeBinaryState().getBlazeBinary() != null
+            ? handlerState.getBlazeBinaryState().getBlazeBinary()
             : Blaze.getBuildSystemProvider(project).getBinaryPath();
 
-    BlazeCommandName blazeCommand = handlerState.getCommand();
+    BlazeCommandName blazeCommand = handlerState.getCommandState().getCommand();
     assert blazeCommand != null;
     BlazeCommand.Builder command =
         BlazeCommand.builder(binaryPath, blazeCommand)
             .addTargets(configuration.getTarget())
             .addBlazeFlags(BlazeFlags.buildFlags(project, projectViewSet))
             .addBlazeFlags(extraBlazeFlags)
-            .addBlazeFlags(handlerState.getBlazeFlags());
+            .addBlazeFlags(handlerState.getBlazeFlagsState().getExpandedFlags());
 
     if (debug) {
       Kind kind = configuration.getKindForTarget();
@@ -205,11 +205,12 @@
         command.addBlazeFlags(BlazeFlags.JAVA_TEST_DEBUG);
       }
     } else {
-      boolean runDistributed = handlerState.getRunOnDistributedExecutor();
+      boolean runDistributed =
+          handlerState.getRunOnDistributedExecutorState().runOnDistributedExecutor;
       command.addBlazeFlags(DistributedExecutorSupport.getBlazeFlags(project, runDistributed));
     }
 
-    command.addExeFlags(handlerState.getExeFlags());
+    command.addExeFlags(handlerState.getExeFlagsState().getExpandedFlags());
     return command.build();
   }
 }
diff --git a/java/src/com/google/idea/blaze/java/run/BlazeJavaTestRunConfigurationFactory.java b/java/src/com/google/idea/blaze/java/run/BlazeJavaTestRunConfigurationFactory.java
index 007aba3..9b9aad8 100644
--- a/java/src/com/google/idea/blaze/java/run/BlazeJavaTestRunConfigurationFactory.java
+++ b/java/src/com/google/idea/blaze/java/run/BlazeJavaTestRunConfigurationFactory.java
@@ -50,7 +50,7 @@
     BlazeCommandRunConfigurationCommonState state =
         blazeConfig.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
     if (state != null) {
-      state.setCommand(BlazeCommandName.TEST);
+      state.getCommandState().setCommand(BlazeCommandName.TEST);
     }
     blazeConfig.setGeneratedName();
   }
diff --git a/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java b/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java
new file mode 100644
index 0000000..dae9416
--- /dev/null
+++ b/java/src/com/google/idea/blaze/java/run/JUnitTestHeuristic.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.java.run;
+
+import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
+import com.google.idea.blaze.base.ideinfo.TestIdeInfo.TestSize;
+import com.google.idea.blaze.base.run.TestTargetHeuristic;
+import com.google.idea.blaze.java.run.producers.BlazeJUnitTestFilterFlags.JUnitVersion;
+import com.intellij.execution.junit.JUnitUtil;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiClassOwner;
+import com.intellij.psi.PsiFile;
+import java.io.File;
+import javax.annotation.Nullable;
+
+/** Matches junit test sources to test targets with junit3/junit4 in their name. */
+public class JUnitTestHeuristic implements TestTargetHeuristic {
+
+  @Override
+  public boolean matchesSource(
+      Project project,
+      TargetIdeInfo target,
+      @Nullable PsiFile sourcePsiFile,
+      File sourceFile,
+      @Nullable TestSize testSize) {
+    JUnitVersion sourceVersion = junitVersion(sourcePsiFile);
+    if (sourceVersion == null) {
+      return false;
+    }
+    String targetName = target.key.label.targetName().toString().toLowerCase();
+    switch (sourceVersion) {
+      case JUNIT_4:
+        return targetName.contains("junit4");
+      case JUNIT_3:
+        return targetName.contains("junit3");
+    }
+    return false;
+  }
+
+  @Nullable
+  private JUnitVersion junitVersion(@Nullable PsiFile psiFile) {
+    if (!(psiFile instanceof PsiClassOwner)) {
+      return null;
+    }
+    for (PsiClass psiClass : ((PsiClassOwner) psiFile).getClasses()) {
+      if (JUnitUtil.isJUnit4TestClass(psiClass)) {
+        return JUnitVersion.JUNIT_4;
+      }
+    }
+    for (PsiClass psiClass : ((PsiClassOwner) psiFile).getClasses()) {
+      if (JUnitUtil.isJUnit3TestClass(psiClass)) {
+        return JUnitVersion.JUNIT_3;
+      }
+    }
+    return null;
+  }
+}
diff --git a/java/src/com/google/idea/blaze/java/run/RunUtil.java b/java/src/com/google/idea/blaze/java/run/RunUtil.java
index 2f36e20..3985700 100644
--- a/java/src/com/google/idea/blaze/java/run/RunUtil.java
+++ b/java/src/com/google/idea/blaze/java/run/RunUtil.java
@@ -48,7 +48,8 @@
     Collection<TargetIdeInfo> targets =
         TestTargetFinder.getInstance(project).testTargetsForSourceFile(testFile);
     Label testLabel =
-        TestTargetHeuristic.chooseTestTargetForSourceFile(project, testFile, targets, testSize);
+        TestTargetHeuristic.chooseTestTargetForSourceFile(
+            project, testClass.getContainingFile(), testFile, targets, testSize);
     if (testLabel == null) {
       return null;
     }
diff --git a/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java b/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java
index 8c9963d..79090d1 100644
--- a/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java
+++ b/java/src/com/google/idea/blaze/java/run/producers/BlazeJUnitTestFilterFlags.java
@@ -78,7 +78,8 @@
   }
 
   private static boolean isParameterized(PsiClass testClass) {
-    return PsiMemberParameterizedLocation.getParameterizedLocation(testClass, null) != null;
+    return PsiMemberParameterizedLocation.getParameterizedLocation(testClass, null) != null
+        || JUnitParameterizedClassHeuristic.isParameterizedTest(testClass);
   }
 
   private static String methodFilter(PsiMethod method, boolean parameterizedClass) {
diff --git a/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducer.java b/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducer.java
index 7e6ca2f..d9fb30b 100644
--- a/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducer.java
+++ b/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaAbstractTestCaseConfigurationProducer.java
@@ -94,6 +94,9 @@
       return null;
     }
     location = JavaExecutionUtil.stepIntoSingleClass(location);
+    if (location == null) {
+      return null;
+    }
     PsiClass psiClass =
         PsiTreeUtil.getParentOfType(location.getPsiElement(), PsiClass.class, false);
     if (!isAbstractClass(psiClass)) {
@@ -193,10 +196,10 @@
     if (handlerState == null) {
       return;
     }
-    handlerState.setCommand(BlazeCommandName.TEST);
+    handlerState.getCommandState().setCommand(BlazeCommandName.TEST);
 
     // remove old test filter flag if present
-    List<String> flags = new ArrayList<>(handlerState.getBlazeFlags());
+    List<String> flags = new ArrayList<>(handlerState.getBlazeFlagsState().getRawFlags());
     flags.removeIf((flag) -> flag.startsWith(BlazeFlags.TEST_FILTER));
 
     String testFilter =
@@ -206,7 +209,7 @@
       return;
     }
     flags.add(BlazeFlags.TEST_FILTER + "=" + testFilter);
-    handlerState.setBlazeFlags(flags);
+    handlerState.getBlazeFlagsState().setRawFlags(flags);
 
     BlazeConfigurationNameBuilder nameBuilder = new BlazeConfigurationNameBuilder(configuration);
     nameBuilder.setTargetString(configName(subClass, method));
diff --git a/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaMainClassRunConfigurationProducer.java b/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaMainClassRunConfigurationProducer.java
index 73827e8..0399176 100644
--- a/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaMainClassRunConfigurationProducer.java
+++ b/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaMainClassRunConfigurationProducer.java
@@ -81,7 +81,7 @@
     if (handlerState == null) {
       return false;
     }
-    handlerState.setCommand(BlazeCommandName.RUN);
+    handlerState.getCommandState().setCommand(BlazeCommandName.RUN);
     configuration.setGeneratedName();
     return true;
   }
@@ -94,7 +94,7 @@
     if (handlerState == null) {
       return false;
     }
-    if (!Objects.equals(handlerState.getCommand(), BlazeCommandName.RUN)) {
+    if (!Objects.equals(handlerState.getCommandState().getCommand(), BlazeCommandName.RUN)) {
       return false;
     }
     PsiClass mainClass = getMainClass(context);
diff --git a/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducer.java b/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducer.java
index 20d6b74..1609e30 100644
--- a/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducer.java
+++ b/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducer.java
@@ -15,6 +15,7 @@
  */
 package com.google.idea.blaze.java.run.producers;
 
+import com.google.common.collect.ImmutableList;
 import com.google.idea.blaze.base.command.BlazeCommandName;
 import com.google.idea.blaze.base.command.BlazeFlags;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
@@ -36,8 +37,13 @@
 import com.intellij.psi.PsiMethod;
 import com.intellij.psi.PsiModifier;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
 import org.jetbrains.annotations.NotNull;
 
 /** Producer for run configurations related to Java test classes in Blaze. */
@@ -90,17 +96,17 @@
     if (handlerState == null) {
       return false;
     }
-    String testFilter = BlazeJUnitTestFilterFlags.testFilterForClass(testClass);
+    String testFilter = getTestFilter(testClass);
     if (testFilter == null) {
       return false;
     }
-    handlerState.setCommand(BlazeCommandName.TEST);
+    handlerState.getCommandState().setCommand(BlazeCommandName.TEST);
 
     // remove old test filter flag if present
-    List<String> flags = new ArrayList<>(handlerState.getBlazeFlags());
+    List<String> flags = new ArrayList<>(handlerState.getBlazeFlagsState().getRawFlags());
     flags.removeIf((flag) -> flag.startsWith(BlazeFlags.TEST_FILTER));
     flags.add(BlazeFlags.TEST_FILTER + "=" + testFilter);
-    handlerState.setBlazeFlags(flags);
+    handlerState.getBlazeFlagsState().setRawFlags(flags);
 
     BlazeConfigurationNameBuilder nameBuilder = new BlazeConfigurationNameBuilder(configuration);
     nameBuilder.setTargetString(testClass.getName());
@@ -148,13 +154,25 @@
     if (handlerState == null) {
       return false;
     }
-    if (!Objects.equals(handlerState.getCommand(), BlazeCommandName.TEST)) {
+    if (!Objects.equals(handlerState.getCommandState().getCommand(), BlazeCommandName.TEST)) {
       return false;
     }
-    String filter = BlazeJUnitTestFilterFlags.testFilterForClass(testClass);
+    String filter = getTestFilter(testClass);
     if (filter == null) {
       return false;
     }
     return Objects.equals(BlazeFlags.TEST_FILTER + "=" + filter, handlerState.getTestFilterFlag());
   }
+
+  @Nullable
+  private static String getTestFilter(PsiClass testClass) {
+    Set<PsiClass> innerTestClasses = ProducerUtils.getInnerTestClasses(testClass);
+    if (innerTestClasses.isEmpty()) {
+      return BlazeJUnitTestFilterFlags.testFilterForClass(testClass);
+    }
+    innerTestClasses.add(testClass);
+    Map<PsiClass, Collection<Location<?>>> methodsPerClass =
+        innerTestClasses.stream().collect(Collectors.toMap(c -> c, c -> ImmutableList.of()));
+    return BlazeJUnitTestFilterFlags.testFilterForClassesAndMethods(methodsPerClass);
+  }
 }
diff --git a/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducer.java b/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducer.java
index 071d5fb..b1cabb3 100644
--- a/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducer.java
+++ b/java/src/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducer.java
@@ -91,13 +91,16 @@
     if (handlerState == null) {
       return false;
     }
-    handlerState.setCommand(BlazeCommandName.TEST);
+    handlerState.getCommandState().setCommand(BlazeCommandName.TEST);
 
     // remove old test filter flag if present
-    List<String> flags = new ArrayList<>(handlerState.getBlazeFlags());
+    List<String> flags = new ArrayList<>(handlerState.getBlazeFlagsState().getRawFlags());
     flags.removeIf((flag) -> flag.startsWith(BlazeFlags.TEST_FILTER));
     flags.add(methodInfo.testFilterFlag);
-    handlerState.setBlazeFlags(flags);
+    if (!flags.contains(BlazeFlags.DISABLE_TEST_SHARDING)) {
+      flags.add(BlazeFlags.DISABLE_TEST_SHARDING);
+    }
+    handlerState.getBlazeFlagsState().setRawFlags(flags);
 
     BlazeConfigurationNameBuilder nameBuilder = new BlazeConfigurationNameBuilder(configuration);
     nameBuilder.setTargetString(
@@ -117,7 +120,7 @@
     if (handlerState == null) {
       return false;
     }
-    if (!Objects.equals(handlerState.getCommand(), BlazeCommandName.TEST)) {
+    if (!Objects.equals(handlerState.getCommandState().getCommand(), BlazeCommandName.TEST)) {
       return false;
     }
 
@@ -126,7 +129,7 @@
       return false;
     }
 
-    List<String> flags = handlerState.getBlazeFlags();
+    List<String> flags = handlerState.getBlazeFlagsState().getRawFlags();
     return flags.contains(methodInfo.testFilterFlag);
   }
 
diff --git a/java/src/com/google/idea/blaze/java/run/producers/JUnitConfigurationUtil.java b/java/src/com/google/idea/blaze/java/run/producers/JUnitConfigurationUtil.java
index b994e36..f316d6e 100644
--- a/java/src/com/google/idea/blaze/java/run/producers/JUnitConfigurationUtil.java
+++ b/java/src/com/google/idea/blaze/java/run/producers/JUnitConfigurationUtil.java
@@ -18,8 +18,6 @@
 import com.intellij.execution.Location;
 import com.intellij.execution.actions.ConfigurationContext;
 import com.intellij.execution.junit.JUnitUtil;
-import com.intellij.execution.junit2.PsiMemberParameterizedLocation;
-import com.intellij.execution.junit2.info.MethodLocation;
 import com.intellij.execution.testframework.TestsUIUtil;
 import com.intellij.openapi.actionSystem.CommonDataKeys;
 import com.intellij.openapi.actionSystem.DataContext;
@@ -33,14 +31,11 @@
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiFile;
 import com.intellij.psi.PsiManager;
-import com.intellij.psi.PsiMember;
 import com.intellij.psi.PsiMethod;
 import com.intellij.psi.PsiModifier;
 import com.intellij.psi.PsiPackage;
 import com.intellij.psi.search.PsiElementProcessor;
-import com.intellij.psi.util.ClassUtil;
 import java.util.ArrayList;
-import java.util.LinkedHashSet;
 import java.util.List;
 
 /**
@@ -48,10 +43,6 @@
  * isMultipleElementsSelected.
  */
 public class JUnitConfigurationUtil {
-  protected static boolean isTestClass(PsiClass psiClass) {
-    return JUnitUtil.isTestClass(psiClass);
-  }
-
   protected static boolean isTestMethod(boolean checkAbstract, PsiElement psiElement) {
     return JUnitUtil.getTestMethod(psiElement, checkAbstract) != null;
   }
@@ -61,14 +52,13 @@
     if (TestsUIUtil.isMultipleSelectionImpossible(dataContext)) {
       return false;
     }
-    final LinkedHashSet<String> classes = new LinkedHashSet<String>();
     final PsiElementProcessor.CollectElementsWithLimit<PsiElement> processor =
         new PsiElementProcessor.CollectElementsWithLimit<PsiElement>(2);
-    final PsiElement[] locationElements = collectLocationElements(classes, dataContext);
+    final PsiElement[] locationElements = collectLocationElements(dataContext);
     if (locationElements != null) {
       collectTestMembers(locationElements, false, false, processor);
     } else {
-      collectContextElements(dataContext, false, false, classes, processor);
+      collectContextElements(dataContext, false, false, processor);
     }
     return processor.getCollection().size() > 1;
   }
@@ -83,14 +73,14 @@
         final PsiClass[] classes = ((PsiClassOwner) psiElement).getClasses();
         for (PsiClass aClass : classes) {
           if ((!checkIsTest && aClass.hasModifierProperty(PsiModifier.PUBLIC)
-                  || checkIsTest && isTestClass(aClass))
+                  || checkIsTest && JUnitUtil.isTestClass(aClass))
               && !collectingProcessor.execute(aClass)) {
             return;
           }
         }
       } else if (psiElement instanceof PsiClass) {
         if ((!checkIsTest && ((PsiClass) psiElement).hasModifierProperty(PsiModifier.PUBLIC)
-                || checkIsTest && isTestClass((PsiClass) psiElement))
+                || checkIsTest && JUnitUtil.isTestClass((PsiClass) psiElement))
             && !collectingProcessor.execute(psiElement)) {
           return;
         }
@@ -122,14 +112,10 @@
       DataContext dataContext,
       boolean checkAbstract,
       boolean checkIsTest,
-      LinkedHashSet<String> classes,
       PsiElementProcessor.CollectElements<PsiElement> processor) {
     PsiElement[] elements = LangDataKeys.PSI_ELEMENT_ARRAY.getData(dataContext);
     if (elements != null) {
       collectTestMembers(elements, checkAbstract, checkIsTest, processor);
-      for (PsiElement psiClass : processor.getCollection()) {
-        classes.add(getQName(psiClass));
-      }
       return true;
     } else {
       final VirtualFile[] files = CommonDataKeys.VIRTUAL_FILE_ARRAY.getData(dataContext);
@@ -142,9 +128,6 @@
             if (psiFile instanceof PsiClassOwner) {
               collectTestMembers(
                   ((PsiClassOwner) psiFile).getClasses(), checkAbstract, checkIsTest, processor);
-              for (PsiElement psiMember : processor.getCollection()) {
-                classes.add(((PsiClass) psiMember).getQualifiedName());
-              }
             }
           }
           return true;
@@ -154,41 +137,16 @@
     return false;
   }
 
-  private static PsiElement[] collectLocationElements(
-      LinkedHashSet<String> classes, DataContext dataContext) {
+  private static PsiElement[] collectLocationElements(DataContext dataContext) {
     final Location<?>[] locations = Location.DATA_KEYS.getData(dataContext);
     if (locations != null) {
       List<PsiElement> elements = new ArrayList<PsiElement>();
       for (Location<?> location : locations) {
         final PsiElement psiElement = location.getPsiElement();
-        classes.add(getQName(psiElement, location));
         elements.add(psiElement);
       }
       return elements.toArray(new PsiElement[elements.size()]);
     }
     return null;
   }
-
-  public static String getQName(PsiElement psiMember) {
-    return getQName(psiMember, null);
-  }
-
-  public static String getQName(PsiElement psiMember, Location location) {
-    if (psiMember instanceof PsiClass) {
-      return ClassUtil.getJVMClassName((PsiClass) psiMember);
-    } else if (psiMember instanceof PsiMember) {
-      final PsiClass containingClass =
-          location instanceof MethodLocation
-              ? ((MethodLocation) location).getContainingClass()
-              : location instanceof PsiMemberParameterizedLocation
-                  ? ((PsiMemberParameterizedLocation) location).getContainingClass()
-                  : ((PsiMember) psiMember).getContainingClass();
-      assert containingClass != null;
-      return ClassUtil.getJVMClassName(containingClass) + "," + ((PsiMember) psiMember).getName();
-    } else if (psiMember instanceof PsiPackage) {
-      return ((PsiPackage) psiMember).getQualifiedName();
-    }
-    assert false;
-    return null;
-  }
 }
diff --git a/java/src/com/google/idea/blaze/java/run/producers/JUnitParameterizedClassHeuristic.java b/java/src/com/google/idea/blaze/java/run/producers/JUnitParameterizedClassHeuristic.java
new file mode 100644
index 0000000..cc995c5
--- /dev/null
+++ b/java/src/com/google/idea/blaze/java/run/producers/JUnitParameterizedClassHeuristic.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.java.run.producers;
+
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.psi.PsiClass;
+
+/** A heuristic to recognize JUnit test runner classes which have parameterized test cases. */
+public interface JUnitParameterizedClassHeuristic {
+
+  ExtensionPointName<JUnitParameterizedClassHeuristic> EP_NAME =
+      ExtensionPointName.create("com.google.idea.blaze.JUnitParameterizedClassHeuristic");
+
+  static boolean isParameterizedTest(PsiClass psiClass) {
+    for (JUnitParameterizedClassHeuristic heuristic : EP_NAME.getExtensions()) {
+      if (heuristic.isParameterized(psiClass)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  boolean isParameterized(PsiClass psiClass);
+}
diff --git a/java/src/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestConfigurationProducer.java b/java/src/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestConfigurationProducer.java
index df62114..b2f5e83 100644
--- a/java/src/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestConfigurationProducer.java
+++ b/java/src/com/google/idea/blaze/java/run/producers/MultipleJavaClassesTestConfigurationProducer.java
@@ -16,6 +16,7 @@
 package com.google.idea.blaze.java.run.producers;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import com.google.idea.blaze.base.command.BlazeCommandName;
 import com.google.idea.blaze.base.command.BlazeFlags;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
@@ -45,9 +46,12 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 
@@ -78,15 +82,15 @@
     if (handlerState == null) {
       return false;
     }
-    handlerState.setCommand(BlazeCommandName.TEST);
+    handlerState.getCommandState().setCommand(BlazeCommandName.TEST);
 
     // remove old test filter flag if present
-    List<String> flags = new ArrayList<>(handlerState.getBlazeFlags());
+    List<String> flags = new ArrayList<>(handlerState.getBlazeFlagsState().getRawFlags());
     flags.removeIf((flag) -> flag.startsWith(BlazeFlags.TEST_FILTER));
     if (location.testFilter != null) {
       flags.add(location.testFilter);
     }
-    handlerState.setBlazeFlags(flags);
+    handlerState.getBlazeFlagsState().setRawFlags(flags);
 
     if (location.description != null) {
       BlazeConfigurationNameBuilder nameBuilder = new BlazeConfigurationNameBuilder(configuration);
@@ -112,7 +116,7 @@
     if (handlerState == null) {
       return false;
     }
-    return BlazeCommandName.TEST.equals(handlerState.getCommand())
+    return BlazeCommandName.TEST.equals(handlerState.getCommandState().getCommand())
         && location.label.equals(configuration.getTarget())
         && Objects.equals(location.testFilter, handlerState.getTestFilterFlag());
   }
@@ -129,25 +133,29 @@
       TargetIdeInfo target = getTestTargetIfUnique(dir);
       return target != null ? TestLocation.fromDirectory(target.key.label, dir) : null;
     }
-    List<PsiClass> testClasses = selectedTestClasses(context);
+    Set<PsiClass> testClasses = selectedTestClasses(context);
     if (testClasses.size() < 2) {
       return null;
     }
     TargetIdeInfo target = getTestTargetIfUnique(testClasses);
-    return target != null ? TestLocation.fromClasses(target.key.label, testClasses) : null;
+    if (target == null) {
+      return null;
+    }
+    testClasses = ProducerUtils.includeInnerTestClasses(testClasses);
+    return TestLocation.fromClasses(target.key.label, testClasses);
   }
 
-  private static List<PsiClass> selectedTestClasses(ConfigurationContext context) {
+  private static Set<PsiClass> selectedTestClasses(ConfigurationContext context) {
     DataContext dataContext = context.getDataContext();
     PsiElement[] elements = LangDataKeys.PSI_ELEMENT_ARRAY.getData(dataContext);
     if (elements == null) {
-      return ImmutableList.of();
+      return ImmutableSet.of();
     }
     return Arrays.stream(elements)
         .map(JUnitUtil::getTestClass)
         .filter(Objects::nonNull)
         .filter(testClass -> !testClass.hasModifierProperty(PsiModifier.ABSTRACT))
-        .collect(Collectors.toList());
+        .collect(Collectors.toSet());
   }
 
   @Nullable
@@ -155,12 +163,12 @@
     if (BlazePackage.hasBlazePackageChild(directory)) {
       return null;
     }
-    List<PsiClass> classes = new ArrayList<>();
+    Set<PsiClass> classes = new HashSet<>();
     addClassesInDirectory(directory, classes);
     return getTestTargetIfUnique(classes);
   }
 
-  private static void addClassesInDirectory(PsiDirectory directory, List<PsiClass> list) {
+  private static void addClassesInDirectory(PsiDirectory directory, Set<PsiClass> list) {
     Collections.addAll(list, JavaDirectoryService.getInstance().getClasses(directory));
     for (PsiDirectory child : directory.getSubdirectories()) {
       addClassesInDirectory(child, list);
@@ -168,7 +176,7 @@
   }
 
   @Nullable
-  private static TargetIdeInfo getTestTargetIfUnique(List<PsiClass> classes) {
+  private static TargetIdeInfo getTestTargetIfUnique(Set<PsiClass> classes) {
     TargetIdeInfo testTarget = null;
     for (PsiClass psiClass : classes) {
       TargetIdeInfo target = testTargetForClass(psiClass);
@@ -195,18 +203,20 @@
 
   private static class TestLocation {
     @Nullable
-    static TestLocation fromClasses(Label label, List<PsiClass> classes) {
+    static TestLocation fromClasses(Label label, Set<PsiClass> classes) {
       Map<PsiClass, Collection<Location<?>>> methodsPerClass =
           classes.stream().collect(Collectors.toMap(c -> c, c -> ImmutableList.of()));
       String filter = BlazeJUnitTestFilterFlags.testFilterForClassesAndMethods(methodsPerClass);
       if (filter == null) {
         return null;
       }
-      String name = classes.get(0).getName();
+      PsiClass sampleClass =
+          classes.stream().min(Comparator.comparing(PsiClass::getName)).orElse(null);
+      String name = sampleClass.getName();
       if (classes.size() > 1) {
         name += String.format(" and %s others", classes.size() - 1);
       }
-      return new TestLocation(label, classes.get(0), filter, name);
+      return new TestLocation(label, sampleClass, filter, name);
     }
 
     @Nullable
diff --git a/java/src/com/google/idea/blaze/java/run/producers/NonBlazeProducerSuppressor.java b/java/src/com/google/idea/blaze/java/run/producers/NonBlazeProducerSuppressor.java
index 3d64ef8..4260daa 100644
--- a/java/src/com/google/idea/blaze/java/run/producers/NonBlazeProducerSuppressor.java
+++ b/java/src/com/google/idea/blaze/java/run/producers/NonBlazeProducerSuppressor.java
@@ -72,7 +72,7 @@
         return (Class<RunConfigurationProducer<?>>) clazz;
       }
       return null;
-    } catch (ClassNotFoundException ignored) {
+    } catch (ClassNotFoundException | NoClassDefFoundError ignored) {
       return null;
     }
   }
diff --git a/java/src/com/google/idea/blaze/java/run/producers/ProducerUtils.java b/java/src/com/google/idea/blaze/java/run/producers/ProducerUtils.java
index e7d809a..5690c02 100644
--- a/java/src/com/google/idea/blaze/java/run/producers/ProducerUtils.java
+++ b/java/src/com/google/idea/blaze/java/run/producers/ProducerUtils.java
@@ -21,17 +21,15 @@
 import com.intellij.execution.junit2.info.MethodLocation;
 import com.intellij.psi.PsiClass;
 import com.intellij.psi.PsiMethod;
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Iterator;
+import java.util.Set;
+import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 import org.jetbrains.annotations.NotNull;
 
-/**
- * Copy of {@link org.jetbrains.plugins.gradle.execution.test.runner.TestRunnerUtils}.
- *
- * <p>
- *
- * <p>Do not modify.
- */
+/** Utility methods for java test run configuration producers. */
 public class ProducerUtils {
   @Nullable
   public static Location<PsiMethod> getMethodLocation(@NotNull Location contextLocation) {
@@ -63,4 +61,19 @@
     }
     return null;
   }
+
+  /** For any test classes with nested inner test classes, also add the inner classes to the set. */
+  static Set<PsiClass> includeInnerTestClasses(Set<PsiClass> testClasses) {
+    Set<PsiClass> result = new HashSet<>(testClasses);
+    for (PsiClass psiClass : testClasses) {
+      result.addAll(getInnerTestClasses(psiClass));
+    }
+    return result;
+  }
+
+  static Set<PsiClass> getInnerTestClasses(PsiClass psiClass) {
+    return Arrays.stream(psiClass.getInnerClasses())
+        .filter(JUnitUtil::isTestClass)
+        .collect(Collectors.toSet());
+  }
 }
diff --git a/java/src/com/google/idea/blaze/java/sync/BlazeJavaSyncAugmenter.java b/java/src/com/google/idea/blaze/java/sync/BlazeJavaSyncAugmenter.java
index 7c4aa21..0fbe869 100644
--- a/java/src/com/google/idea/blaze/java/sync/BlazeJavaSyncAugmenter.java
+++ b/java/src/com/google/idea/blaze/java/sync/BlazeJavaSyncAugmenter.java
@@ -25,7 +25,7 @@
 /** Augments the java importer */
 public interface BlazeJavaSyncAugmenter {
   ExtensionPointName<BlazeJavaSyncAugmenter> EP_NAME =
-      ExtensionPointName.create("com.google.idea.blaze.java.JavaSyncAugmenter");
+      ExtensionPointName.create("com.google.idea.blaze.JavaSyncAugmenter");
 
   /**
    * Adds extra libraries for this source rule.
diff --git a/java/src/com/google/idea/blaze/java/sync/BlazeJavaSyncPlugin.java b/java/src/com/google/idea/blaze/java/sync/BlazeJavaSyncPlugin.java
index b971b94..1d31d91 100644
--- a/java/src/com/google/idea/blaze/java/sync/BlazeJavaSyncPlugin.java
+++ b/java/src/com/google/idea/blaze/java/sync/BlazeJavaSyncPlugin.java
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
 import com.google.idea.blaze.base.ideinfo.LibraryArtifact;
 import com.google.idea.blaze.base.ideinfo.TargetMap;
@@ -41,7 +42,6 @@
 import com.google.idea.blaze.base.sync.libraries.LibrarySource;
 import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
-import com.google.idea.blaze.base.sync.workspace.BlazeRoots;
 import com.google.idea.blaze.base.sync.workspace.WorkingSet;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
 import com.google.idea.blaze.java.projectview.ExcludeLibrarySection;
@@ -109,7 +109,7 @@
       WorkspaceRoot workspaceRoot,
       ProjectViewSet projectViewSet,
       WorkspaceLanguageSettings workspaceLanguageSettings,
-      BlazeRoots blazeRoots,
+      BlazeInfo blazeInfo,
       @Nullable WorkingSet workingSet,
       WorkspacePathResolver workspacePathResolver,
       ArtifactLocationDecoder artifactLocationDecoder,
@@ -249,7 +249,8 @@
 
   @Nullable
   @Override
-  public LibrarySource getLibrarySource(BlazeProjectData blazeProjectData) {
+  public LibrarySource getLibrarySource(
+      ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
     if (!blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.JAVA)) {
       return null;
     }
diff --git a/java/src/com/google/idea/blaze/java/sync/DuplicateSourceDetector.java b/java/src/com/google/idea/blaze/java/sync/DuplicateSourceDetector.java
index 10db930..d03fc00 100644
--- a/java/src/com/google/idea/blaze/java/sync/DuplicateSourceDetector.java
+++ b/java/src/com/google/idea/blaze/java/sync/DuplicateSourceDetector.java
@@ -24,7 +24,7 @@
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.scope.output.PerformanceWarning;
 import java.util.Collection;
-import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Set;
 
@@ -64,12 +64,7 @@
       return;
     }
 
-    Collections.sort(
-        duplicates,
-        (lhs, rhs) ->
-            lhs.artifactLocation
-                .getRelativePath()
-                .compareTo(rhs.artifactLocation.getRelativePath()));
+    duplicates.sort(Comparator.comparing(lhs -> lhs.artifactLocation.getRelativePath()));
 
     context.output(new PerformanceWarning("Duplicate sources detected:"));
     for (Duplicate duplicate : duplicates) {
diff --git a/java/src/com/google/idea/blaze/java/sync/JavaPrefetchFileSource.java b/java/src/com/google/idea/blaze/java/sync/JavaPrefetchFileSource.java
index 7e3255f..c39eb64 100644
--- a/java/src/com/google/idea/blaze/java/sync/JavaPrefetchFileSource.java
+++ b/java/src/com/google/idea/blaze/java/sync/JavaPrefetchFileSource.java
@@ -19,6 +19,7 @@
 import com.google.idea.blaze.base.model.BlazeLibrary;
 import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.prefetch.PrefetchFileSource;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.sync.libraries.BlazeLibraryCollector;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.google.idea.blaze.java.libraries.JarCache;
@@ -35,7 +36,10 @@
 public class JavaPrefetchFileSource implements PrefetchFileSource {
   @Override
   public void addFilesToPrefetch(
-      Project project, BlazeProjectData blazeProjectData, Collection<File> files) {
+      Project project,
+      ProjectViewSet projectViewSet,
+      BlazeProjectData blazeProjectData,
+      Collection<File> files) {
     BlazeJavaSyncData syncData = blazeProjectData.syncState.get(BlazeJavaSyncData.class);
     if (syncData == null) {
       return;
@@ -47,7 +51,8 @@
     boolean attachSourcesByDefault =
         BlazeJavaUserSettings.getInstance().getAttachSourcesByDefault();
     SourceJarManager sourceJarManager = SourceJarManager.getInstance(project);
-    Collection<BlazeLibrary> libraries = BlazeLibraryCollector.getLibraries(blazeProjectData);
+    Collection<BlazeLibrary> libraries =
+        BlazeLibraryCollector.getLibraries(projectViewSet, blazeProjectData);
     ArtifactLocationDecoder artifactLocationDecoder = blazeProjectData.artifactLocationDecoder;
     for (BlazeLibrary library : libraries) {
       if (!(library instanceof BlazeJarLibrary)) {
diff --git a/java/src/com/google/idea/blaze/java/sync/importer/BlazeJavaWorkspaceImporter.java b/java/src/com/google/idea/blaze/java/sync/importer/BlazeJavaWorkspaceImporter.java
index 2e8df7f..c089e53 100644
--- a/java/src/com/google/idea/blaze/java/sync/importer/BlazeJavaWorkspaceImporter.java
+++ b/java/src/com/google/idea/blaze/java/sync/importer/BlazeJavaWorkspaceImporter.java
@@ -167,10 +167,7 @@
       List<LibraryArtifact> allJars = Lists.newArrayList();
       allJars.addAll(javaIdeInfo.jars);
       Collection<BlazeJarLibrary> libraries =
-          allJars
-              .stream()
-              .map(library -> new BlazeJarLibrary(library, target.key))
-              .collect(Collectors.toList());
+          allJars.stream().map(BlazeJarLibrary::new).collect(Collectors.toList());
 
       targetKeyToLibrary.putAll(target.key, libraries);
       for (BlazeJarLibrary library : libraries) {
@@ -189,7 +186,7 @@
               protoLibraryLegacyInfo.jarsV1,
               protoLibraryLegacyInfo.jarsMutable,
               protoLibraryLegacyInfo.jarsImmutable)) {
-        addLibraryToJdeps(jdepsPathToLibrary, new BlazeJarLibrary(libraryArtifact, target.key));
+        addLibraryToJdeps(jdepsPathToLibrary, new BlazeJarLibrary(libraryArtifact));
       }
     }
 
@@ -303,7 +300,7 @@
 
       if (libraries != null) {
         for (LibraryArtifact libraryArtifact : libraries) {
-          BlazeJarLibrary library = new BlazeJarLibrary(libraryArtifact, targetKey);
+          BlazeJarLibrary library = new BlazeJarLibrary(libraryArtifact);
           result.put(library.key, library);
         }
       }
@@ -374,14 +371,10 @@
       }
     }
     workspaceBuilder.generatedJarsFromSourceTargets.addAll(
-        javaIdeInfo
-            .generatedJars
-            .stream()
-            .map(libraryArtifact -> new BlazeJarLibrary(libraryArtifact, targetKey))
-            .collect(Collectors.toList()));
+        javaIdeInfo.generatedJars.stream().map(BlazeJarLibrary::new).collect(Collectors.toList()));
     if (javaIdeInfo.filteredGenJar != null) {
       workspaceBuilder.generatedJarsFromSourceTargets.add(
-          new BlazeJarLibrary(javaIdeInfo.filteredGenJar, targetKey));
+          new BlazeJarLibrary(javaIdeInfo.filteredGenJar));
     }
 
     for (BlazeJavaSyncAugmenter augmenter : augmenters) {
diff --git a/java/src/com/google/idea/blaze/java/sync/importer/JavaSourceFilter.java b/java/src/com/google/idea/blaze/java/sync/importer/JavaSourceFilter.java
index 579eede..474b729 100644
--- a/java/src/com/google/idea/blaze/java/sync/importer/JavaSourceFilter.java
+++ b/java/src/com/google/idea/blaze/java/sync/importer/JavaSourceFilter.java
@@ -25,10 +25,12 @@
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
 import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.sync.projectview.ProjectViewTargetImportFilter;
+import com.google.idea.blaze.java.sync.source.JavaLikeLanguage;
 import com.intellij.openapi.project.Project;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
 /** Segments java rules into source/libraries */
@@ -59,14 +61,11 @@
             .collect(Collectors.toList());
 
     targetToJavaSources = Maps.newHashMap();
+    Predicate<ArtifactLocation> isSourceFile = JavaLikeLanguage.getSourceFileMatcher();
     for (TargetIdeInfo target : javaTargets) {
-      List<ArtifactLocation> javaSources =
-          target
-              .sources
-              .stream()
-              .filter(source -> source.getRelativePath().endsWith(".java"))
-              .collect(Collectors.toList());
-      targetToJavaSources.put(target.key, javaSources);
+      List<ArtifactLocation> javaLikeSources =
+          target.sources.stream().filter(isSourceFile).collect(Collectors.toList());
+      targetToJavaSources.put(target.key, javaLikeSources);
     }
 
     sourceTargets = Lists.newArrayList();
diff --git a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java
index 3d0b128..d5ff52c 100644
--- a/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java
+++ b/java/src/com/google/idea/blaze/java/sync/model/BlazeJarLibrary.java
@@ -17,7 +17,6 @@
 
 import com.google.common.base.Objects;
 import com.google.idea.blaze.base.ideinfo.LibraryArtifact;
-import com.google.idea.blaze.base.ideinfo.TargetKey;
 import com.google.idea.blaze.base.model.BlazeLibrary;
 import com.google.idea.blaze.base.model.LibraryKey;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
@@ -33,16 +32,13 @@
 /** An immutable reference to a .jar required by a rule. */
 @Immutable
 public final class BlazeJarLibrary extends BlazeLibrary {
-  private static final long serialVersionUID = 2L;
+  private static final long serialVersionUID = 3L;
 
   public final LibraryArtifact libraryArtifact;
 
-  public final TargetKey originatingTarget;
-
-  public BlazeJarLibrary(LibraryArtifact libraryArtifact, TargetKey originatingTarget) {
+  public BlazeJarLibrary(LibraryArtifact libraryArtifact) {
     super(LibraryKey.fromJarFile(libraryArtifact.jarForIntellijLibrary()));
     this.libraryArtifact = libraryArtifact;
-    this.originatingTarget = originatingTarget;
   }
 
   @Override
@@ -68,7 +64,7 @@
 
   @Override
   public int hashCode() {
-    return Objects.hashCode(super.hashCode(), libraryArtifact, originatingTarget);
+    return Objects.hashCode(super.hashCode(), libraryArtifact);
   }
 
   @Override
@@ -82,8 +78,6 @@
 
     BlazeJarLibrary that = (BlazeJarLibrary) other;
 
-    return super.equals(other)
-        && Objects.equal(libraryArtifact, that.libraryArtifact)
-        && Objects.equal(originatingTarget, that.originatingTarget);
+    return super.equals(other) && Objects.equal(libraryArtifact, that.libraryArtifact);
   }
 }
diff --git a/java/src/com/google/idea/blaze/java/sync/projectstructure/JavaSourceFolderProvider.java b/java/src/com/google/idea/blaze/java/sync/projectstructure/JavaSourceFolderProvider.java
index 3f7b512..acbf755 100644
--- a/java/src/com/google/idea/blaze/java/sync/projectstructure/JavaSourceFolderProvider.java
+++ b/java/src/com/google/idea/blaze/java/sync/projectstructure/JavaSourceFolderProvider.java
@@ -28,6 +28,8 @@
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vfs.VirtualFileManager;
 import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
 import javax.annotation.Nullable;
 import org.jetbrains.jps.model.JpsElement;
 import org.jetbrains.jps.model.java.JavaResourceRootType;
@@ -57,16 +59,20 @@
 
   @Override
   public ImmutableMap<File, SourceFolder> initializeSourceFolders(ContentEntry contentEntry) {
-    ImmutableMap.Builder<File, SourceFolder> output = ImmutableMap.builder();
+    Map<File, SourceFolder> map = new HashMap<>();
     BlazeContentEntry javaContentEntry =
         blazeContentEntries.get(UrlUtil.urlToFile(contentEntry.getUrl()));
     if (javaContentEntry != null) {
       for (BlazeSourceDirectory sourceDirectory : javaContentEntry.sources) {
+        File file = sourceDirectory.getDirectory();
+        if (map.containsKey(file)) {
+          continue;
+        }
         SourceFolder sourceFolder = addSourceFolderToContentEntry(contentEntry, sourceDirectory);
-        output.put(UrlUtil.urlToFile(sourceFolder.getUrl()), sourceFolder);
+        map.put(file, sourceFolder);
       }
     }
-    return output.build();
+    return ImmutableMap.copyOf(map);
   }
 
   @Override
@@ -99,8 +105,10 @@
     if (Strings.isNullOrEmpty(relativePath)) {
       return parentPackagePrefix;
     }
-
-    return parentPackagePrefix + "." + relativePath.replaceAll(File.separator, ".");
+    relativePath = relativePath.replaceAll(File.separator, ".");
+    return Strings.isNullOrEmpty(parentPackagePrefix)
+        ? relativePath
+        : parentPackagePrefix + "." + relativePath;
   }
 
   @VisibleForTesting
diff --git a/java/src/com/google/idea/blaze/java/sync/source/JavaLikeLanguage.java b/java/src/com/google/idea/blaze/java/sync/source/JavaLikeLanguage.java
new file mode 100644
index 0000000..f6c791a
--- /dev/null
+++ b/java/src/com/google/idea/blaze/java/sync/source/JavaLikeLanguage.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.java.sync.source;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
+import com.intellij.openapi.extensions.ExtensionPointName;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Set;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+/**
+ * For languages similar to Java to reuse certain parts of the Java plugin. E.g., package prefix
+ * calculation.
+ */
+public interface JavaLikeLanguage {
+  ExtensionPointName<JavaLikeLanguage> EP_NAME =
+      ExtensionPointName.create("com.google.idea.blaze.JavaLikeLanguage");
+
+  static Predicate<ArtifactLocation> getSourceFileMatcher() {
+    final Set<String> fileExtensions =
+        Arrays.stream(EP_NAME.getExtensions())
+            .map(JavaLikeLanguage::getFileExtensions)
+            .flatMap(Collection::stream)
+            .collect(Collectors.toSet());
+    return artifactLocation ->
+        fileExtensions
+            .stream()
+            .anyMatch(extension -> artifactLocation.getRelativePath().endsWith(extension));
+  }
+
+  Set<String> getFileExtensions();
+
+  /** Java is itself a Java-like language. */
+  class Java implements JavaLikeLanguage {
+    @Override
+    public Set<String> getFileExtensions() {
+      return ImmutableSet.of(".java");
+    }
+  }
+}
diff --git a/java/src/com/google/idea/blaze/java/sync/source/JavaSourcePackageReader.java b/java/src/com/google/idea/blaze/java/sync/source/JavaSourcePackageReader.java
index 64e1cb5..a29b5bc 100644
--- a/java/src/com/google/idea/blaze/java/sync/source/JavaSourcePackageReader.java
+++ b/java/src/com/google/idea/blaze/java/sync/source/JavaSourcePackageReader.java
@@ -42,8 +42,8 @@
 
   private static final Logger logger = Logger.getInstance(SourceDirectoryCalculator.class);
 
-  private static final Pattern JAVA_PACKAGE_PATTERN =
-      Pattern.compile("^\\s*package\\s+([\\w\\.]+);");
+  // Package declaration of java-like languages.
+  private static final Pattern PACKAGE_PATTERN = Pattern.compile("^\\s*package\\s+([\\w\\.]+)");
 
   @Override
   @Nullable
@@ -61,7 +61,7 @@
       String javaLine;
 
       while ((javaLine = javaReader.readLine()) != null) {
-        Matcher packageMatch = JAVA_PACKAGE_PATTERN.matcher(javaLine);
+        Matcher packageMatch = PACKAGE_PATTERN.matcher(javaLine);
         if (packageMatch.find()) {
           return packageMatch.group(1);
         }
diff --git a/java/src/com/google/idea/blaze/java/sync/source/PackageManifestReader.java b/java/src/com/google/idea/blaze/java/sync/source/PackageManifestReader.java
index 52fced0..cadef54 100644
--- a/java/src/com/google/idea/blaze/java/sync/source/PackageManifestReader.java
+++ b/java/src/com/google/idea/blaze/java/sync/source/PackageManifestReader.java
@@ -15,6 +15,7 @@
  */
 package com.google.idea.blaze.java.sync.source;
 
+import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -29,11 +30,13 @@
 import com.google.idea.blaze.base.prefetch.PrefetchService;
 import com.google.idea.blaze.base.scope.BlazeContext;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
+import com.google.repackaged.devtools.build.lib.ideinfo.androidstudio.PackageManifestOuterClass;
 import com.google.repackaged.devtools.build.lib.ideinfo.androidstudio.PackageManifestOuterClass.JavaSourcePackage;
 import com.google.repackaged.devtools.build.lib.ideinfo.androidstudio.PackageManifestOuterClass.PackageManifest;
 import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.text.StringUtil;
 import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.IOException;
@@ -111,7 +114,7 @@
     return manifestMap;
   }
 
-  protected Map<ArtifactLocation, String> parseManifestFile(File packageManifest) {
+  private static Map<ArtifactLocation, String> parseManifestFile(File packageManifest) {
     Map<ArtifactLocation, String> outputMap = Maps.newHashMap();
     InputStreamProvider inputStreamProvider = InputStreamProvider.getInstance();
 
@@ -119,14 +122,7 @@
       try (BufferedInputStream bufferedInputStream = new BufferedInputStream(input)) {
         PackageManifest proto = PackageManifest.parseFrom(bufferedInputStream);
         for (JavaSourcePackage source : proto.getSourcesList()) {
-          ArtifactLocation artifactLocation =
-              ArtifactLocation.builder()
-                  .setRootExecutionPathFragment(
-                      source.getArtifactLocation().getRootExecutionPathFragment())
-                  .setRelativePath(source.getArtifactLocation().getRelativePath())
-                  .setIsSource(source.getArtifactLocation().getIsSource())
-                  .build();
-          outputMap.put(artifactLocation, source.getPackageString());
+          outputMap.put(fromProto(source.getArtifactLocation()), source.getPackageString());
         }
       }
       return outputMap;
@@ -135,4 +131,26 @@
       return outputMap;
     }
   }
+
+  private static ArtifactLocation fromProto(PackageManifestOuterClass.ArtifactLocation location) {
+    String relativePath = location.getRelativePath();
+    String rootExecutionPathFragment = location.getRootExecutionPathFragment();
+    if (!location.getIsNewExternalVersion() && location.getIsExternal()) {
+      // fix up incorrect paths created with older aspect version
+      // Note: bazel always uses the '/' separator here, even on windows.
+      List<String> components = StringUtil.split(relativePath, "/");
+      if (components.size() > 2) {
+        relativePath = Joiner.on('/').join(components.subList(2, components.size()));
+        String prefix = components.get(0) + "/" + components.get(1);
+        rootExecutionPathFragment =
+            rootExecutionPathFragment.isEmpty() ? prefix : rootExecutionPathFragment + "/" + prefix;
+      }
+    }
+    return ArtifactLocation.builder()
+        .setRootExecutionPathFragment(rootExecutionPathFragment)
+        .setRelativePath(relativePath)
+        .setIsSource(location.getIsSource())
+        .setIsExternal(location.getIsExternal())
+        .build();
+  }
 }
diff --git a/java/src/com/google/idea/blaze/java/sync/source/SourceDirectoryCalculator.java b/java/src/com/google/idea/blaze/java/sync/source/SourceDirectoryCalculator.java
index e1e4203..14afec5 100644
--- a/java/src/com/google/idea/blaze/java/sync/source/SourceDirectoryCalculator.java
+++ b/java/src/com/google/idea/blaze/java/sync/source/SourceDirectoryCalculator.java
@@ -50,10 +50,12 @@
 import java.io.File;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
+import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import javax.annotation.Nullable;
 
@@ -72,7 +74,7 @@
 
   private static final JavaPackageReader generatedFileJavaPackageReader =
       new FilePathJavaPackageReader();
-  private final ListeningExecutorService executorService = MoreExecutors.sameThreadExecutor();
+  private final ListeningExecutorService executorService = MoreExecutors.newDirectExecutorService();
   private final ListeningExecutorService packageReaderExecutorService =
       MoreExecutors.listeningDecorator(new TransientExecutor(16));
 
@@ -132,7 +134,7 @@
               result.add(new BlazeContentEntry(contentRoot, sourceDirectories));
             }
           }
-          Collections.sort(result, (lhs, rhs) -> lhs.contentRoot.compareTo(rhs.contentRoot));
+          result.sort(Comparator.comparing(lhs -> lhs.contentRoot));
         });
     return ImmutableList.copyOf(result);
   }
@@ -197,10 +199,11 @@
       Collection<SourceArtifact> sourceArtifacts,
       Collection<JavaPackageReader> javaPackageReaders) {
 
-    // Split out java files
+    // Split out java-like files
+    Predicate<ArtifactLocation> isSourceFile = JavaLikeLanguage.getSourceFileMatcher();
     List<SourceArtifact> javaArtifacts = Lists.newArrayList();
     for (SourceArtifact sourceArtifact : sourceArtifacts) {
-      if (isJavaFile(sourceArtifact.artifactLocation)) {
+      if (isSourceFile.test(sourceArtifact.artifactLocation)) {
         javaArtifacts.add(sourceArtifact);
       }
     }
@@ -518,8 +521,4 @@
       this.directoryName = directoryName;
     }
   }
-
-  private static boolean isJavaFile(ArtifactLocation artifactLocation) {
-    return artifactLocation.getRelativePath().endsWith(".java");
-  }
 }
diff --git a/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusClassNodeDecorator.java b/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusClassNodeDecorator.java
index 01d7f40..6ffabc2 100644
--- a/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusClassNodeDecorator.java
+++ b/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusClassNodeDecorator.java
@@ -48,7 +48,7 @@
     }
 
     Project project = node.getProject();
-    if (SyncStatusHelper.getInstance(project).isUnsynced(virtualFile)) {
+    if (SyncStatusHelper.isUnsynced(project, virtualFile)) {
       data.clearText();
       data.addText(psiClass.getName(), SimpleTextAttributes.GRAY_ATTRIBUTES);
       data.addText(" (unsynced)", SimpleTextAttributes.GRAY_ATTRIBUTES);
diff --git a/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusEditorTabColorProvider.java b/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusEditorTabColorProvider.java
index b3e3b2e..26b97fa 100644
--- a/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusEditorTabColorProvider.java
+++ b/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusEditorTabColorProvider.java
@@ -31,8 +31,7 @@
   @Nullable
   @Override
   public Color getEditorTabColor(@NotNull Project project, @NotNull VirtualFile file) {
-    if (file.getName().endsWith(".java")
-        && SyncStatusHelper.getInstance(project).isUnsynced(file)) {
+    if (file.getName().endsWith(".java") && SyncStatusHelper.isUnsynced(project, file)) {
       return UNSYNCED_COLOR;
     }
     return null;
diff --git a/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusEditorTabTitleProvider.java b/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusEditorTabTitleProvider.java
index 6597752..43af36c 100644
--- a/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusEditorTabTitleProvider.java
+++ b/java/src/com/google/idea/blaze/java/syncstatus/BlazeJavaSyncStatusEditorTabTitleProvider.java
@@ -25,7 +25,7 @@
   @Nullable
   @Override
   public String getEditorTabTitle(Project project, VirtualFile file) {
-    if (file.getName().endsWith("java") && SyncStatusHelper.getInstance(project).isUnsynced(file)) {
+    if (file.getName().endsWith("java") && SyncStatusHelper.isUnsynced(project, file)) {
       return file.getPresentableName() + " (unsynced)";
     }
     return null;
diff --git a/java/src/com/google/idea/blaze/java/syncstatus/SyncStatusHelper.java b/java/src/com/google/idea/blaze/java/syncstatus/SyncStatusHelper.java
index ff6365c..c79888d 100644
--- a/java/src/com/google/idea/blaze/java/syncstatus/SyncStatusHelper.java
+++ b/java/src/com/google/idea/blaze/java/syncstatus/SyncStatusHelper.java
@@ -17,15 +17,9 @@
 
 import com.google.common.collect.ImmutableSet;
 import com.google.idea.blaze.base.model.BlazeProjectData;
-import com.google.idea.blaze.base.projectview.ProjectViewSet;
-import com.google.idea.blaze.base.scope.BlazeContext;
-import com.google.idea.blaze.base.settings.BlazeImportSettings;
-import com.google.idea.blaze.base.sync.BlazeSyncParams.SyncMode;
-import com.google.idea.blaze.base.sync.SyncListener;
-import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.sync.SyncCache;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.google.idea.blaze.java.sync.model.BlazeJavaSyncData;
-import com.intellij.openapi.components.ServiceManager;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.ProjectFileIndex;
 import com.intellij.openapi.vfs.VirtualFile;
@@ -34,27 +28,16 @@
 
 class SyncStatusHelper {
 
-  static SyncStatusHelper getInstance(Project project) {
-    return ServiceManager.getService(project, SyncStatusHelper.class);
-  }
-
-  private final Project project;
-  private Set<File> syncedJavaFiles = null;
-
-  SyncStatusHelper(Project project) {
-    this.project = project;
-  }
-
-  boolean isUnsynced(VirtualFile virtualFile) {
+  static boolean isUnsynced(Project project, VirtualFile virtualFile) {
     if (!virtualFile.isInLocalFileSystem()) {
       return false;
     }
     if (ProjectFileIndex.SERVICE.getInstance(project).getModuleForFile(virtualFile) == null) {
       return false;
     }
-    if (syncedJavaFiles == null) {
-      syncedJavaFiles = refresh();
-    }
+    Set<File> syncedJavaFiles =
+        SyncCache.getInstance(project)
+            .get(SyncStatusHelper.class, SyncStatusHelper::getSyncedJavaFiles);
     if (syncedJavaFiles == null) {
       return false;
     }
@@ -62,33 +45,14 @@
     return !syncedJavaFiles.contains(file);
   }
 
-  Set<File> refresh() {
-    BlazeProjectData blazeProjectData =
-        BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
-    if (blazeProjectData == null) {
-      return null;
-    }
-    BlazeJavaSyncData syncData = blazeProjectData.syncState.get(BlazeJavaSyncData.class);
+  @SuppressWarnings("unused")
+  private static Set<File> getSyncedJavaFiles(Project project, BlazeProjectData projectData) {
+    BlazeJavaSyncData syncData = projectData.syncState.get(BlazeJavaSyncData.class);
     if (syncData == null) {
-      return null;
+      return ImmutableSet.of();
     }
-    ArtifactLocationDecoder artifactLocationDecoder = blazeProjectData.artifactLocationDecoder;
-    return ImmutableSet.<File>builder()
-        .addAll(artifactLocationDecoder.decodeAll(syncData.importResult.javaSourceFiles))
-        .build();
-  }
-
-  static class UpdateSyncStatusMap extends SyncListener.Adapter {
-    @Override
-    public void onSyncComplete(
-        Project project,
-        BlazeContext context,
-        BlazeImportSettings importSettings,
-        ProjectViewSet projectViewSet,
-        BlazeProjectData blazeProjectData,
-        SyncMode syncMode,
-        SyncResult syncResult) {
-      getInstance(project).syncedJavaFiles = null;
-    }
+    ArtifactLocationDecoder artifactLocationDecoder = projectData.artifactLocationDecoder;
+    return ImmutableSet.copyOf(
+        artifactLocationDecoder.decodeAll(syncData.importResult.javaSourceFiles));
   }
 }
diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/JUnitTestHeuristicTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/JUnitTestHeuristicTest.java
new file mode 100644
index 0000000..5470d05
--- /dev/null
+++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/JUnitTestHeuristicTest.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.java.run;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.idea.blaze.base.BlazeIntegrationTestCase;
+import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.intellij.psi.PsiFile;
+import java.io.File;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Integration tests for {@link JUnitTestHeuristic}. */
+@RunWith(JUnit4.class)
+public class JUnitTestHeuristicTest extends BlazeIntegrationTestCase {
+
+  @Before
+  public final void doSetup() {
+    // required for IntelliJ to recognize annotations, JUnit version, etc.
+    workspace.createPsiFile(
+        new WorkspacePath("org/junit/runner/RunWith.java"),
+        "package org.junit.runner;"
+            + "public @interface RunWith {"
+            + "    Class<? extends Runner> value();"
+            + "}");
+    workspace.createPsiFile(
+        new WorkspacePath("org/junit/Test"), "package org.junit;", "public @interface Test {}");
+    workspace.createPsiFile(
+        new WorkspacePath("org/junit/runners/JUnit4"),
+        "package org.junit.runners;",
+        "public class JUnit4 {}");
+  }
+
+  @Test
+  public void testMatchesJunit4Annotation() {
+    PsiFile psiFile =
+        workspace.createPsiFile(
+            new WorkspacePath("java/com/google/lib/JavaClass.java"),
+            "package com.google.lib;",
+            "import org.junit.Test;",
+            "import org.junit.runner.RunWith;",
+            "import org.junit.runners.JUnit4;",
+            "@RunWith(JUnit4.class)",
+            "public class JavaClass {",
+            "  @Test",
+            "  public void testMethod1() {}",
+            "  @Test",
+            "  public void testMethod2() {}",
+            "}");
+    File file = new File(psiFile.getVirtualFile().getPath());
+    TargetIdeInfo target =
+        TargetIdeInfo.builder().setLabel("//foo:AllJUnit4Tests").setKind("java_test").build();
+    assertThat(new JUnitTestHeuristic().matchesSource(getProject(), target, psiFile, file, null))
+        .isTrue();
+  }
+
+  @Test
+  public void testIgnoresJunit4AnnotationIfTargetNameDoesNotMatch() {
+    PsiFile psiFile =
+        workspace.createPsiFile(
+            new WorkspacePath("java/com/google/lib/JavaClass.java"),
+            "package com.google.lib;",
+            "import org.junit.Test;",
+            "import org.junit.runner.RunWith;",
+            "import org.junit.runners.JUnit4;",
+            "@RunWith(JUnit4.class)",
+            "public class JavaClass {",
+            "  @Test",
+            "  public void testMethod1() {}",
+            "  @Test",
+            "  public void testMethod2() {}",
+            "}");
+    File file = new File(psiFile.getVirtualFile().getPath());
+    TargetIdeInfo target =
+        TargetIdeInfo.builder().setLabel("//foo:unrelatedName").setKind("java_test").build();
+    assertThat(new JUnitTestHeuristic().matchesSource(getProject(), target, psiFile, file, null))
+        .isFalse();
+  }
+
+  @Test
+  public void testNonJavaFileDoesNotMatch() {
+    PsiFile psiFile = workspace.createPsiFile(new WorkspacePath("foo/script_test.py"));
+    File file = new File(psiFile.getVirtualFile().getPath());
+    TargetIdeInfo target =
+        TargetIdeInfo.builder().setLabel("//foo:unrelatedName").setKind("python_test").build();
+    assertThat(new JUnitTestHeuristic().matchesSource(getProject(), target, psiFile, file, null))
+        .isFalse();
+  }
+
+  @Test
+  public void testNullPsiFileDoesNotMatch() {
+    File file = new File("foo/script_test.py");
+    TargetIdeInfo target =
+        TargetIdeInfo.builder().setLabel("//foo:unrelatedName").setKind("python_test").build();
+    assertThat(new JUnitTestHeuristic().matchesSource(getProject(), target, null, file, null))
+        .isFalse();
+  }
+
+  @Test
+  public void testJunit4SourceDoesNotMatchJunit3TargetName() {
+    PsiFile psiFile =
+        workspace.createPsiFile(
+            new WorkspacePath("java/com/google/lib/JavaClass.java"),
+            "package com.google.lib;",
+            "import org.junit.Test;",
+            "import org.junit.runner.RunWith;",
+            "import org.junit.runners.JUnit4;",
+            "@RunWith(JUnit4.class)",
+            "public class JavaClass {",
+            "  @Test",
+            "  public void testMethod1() {}",
+            "  @Test",
+            "  public void testMethod2() {}",
+            "}");
+    File file = new File(psiFile.getVirtualFile().getPath());
+    TargetIdeInfo target =
+        TargetIdeInfo.builder().setLabel("//foo:AllJUnit3Tests").setKind("java_test").build();
+    assertThat(new JUnitTestHeuristic().matchesSource(getProject(), target, psiFile, file, null))
+        .isFalse();
+  }
+}
diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducerTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducerTest.java
index ecf15d1..6c48f2f 100644
--- a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducerTest.java
+++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestClassConfigurationProducerTest.java
@@ -132,4 +132,57 @@
     assertThat(config.getName()).isEqualTo("Blaze test TestClass");
     assertThat(getCommandType(config)).isEqualTo(BlazeCommandName.TEST);
   }
+
+  @Test
+  public void testProducedFromPsiClassWithInnerTestClass() {
+    PsiFile javaFile =
+        createAndIndexFile(
+            new WorkspacePath("java/com/google/test/OuterClass.java"),
+            "package com.google.test;",
+            "@org.junit.runner.RunWith(org.junit.runners.Suite.class)",
+            "@org.junit.runners.Suite.SuiteClasses({OuterClass.InnerClass.class})",
+            "public class OuterClass {",
+            "  @org.junit.runner.RunWith(org.junit.runners.JUnit4.class)",
+            "  public static class InnerClass {",
+            "    @org.junit.Test",
+            "    public void testMethod1() {}",
+            "    @org.junit.Test",
+            "    public void testMethod2() {}",
+            "  }",
+            "}");
+
+    MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot);
+    builder.setTargetMap(
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setKind("java_test")
+                    .setLabel("//java/com/google/test:OuterClass")
+                    .addSource(sourceRoot("java/com/google/test/OuterClass.java"))
+                    .build())
+            .build());
+    registerProjectService(
+        BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build()));
+
+    PsiClass javaClass = ((PsiClassOwner) javaFile).getClasses()[0];
+    assertThat(javaClass).isNotNull();
+
+    ConfigurationContext context = createContextFromPsi(javaClass);
+    List<ConfigurationFromContext> configurations = context.getConfigurationsFromContext();
+    assertThat(configurations).hasSize(1);
+
+    ConfigurationFromContext fromContext = configurations.get(0);
+    assertThat(fromContext.isProducedBy(BlazeJavaTestClassConfigurationProducer.class)).isTrue();
+    assertThat(fromContext.getConfiguration()).isInstanceOf(BlazeCommandRunConfiguration.class);
+
+    BlazeCommandRunConfiguration config =
+        (BlazeCommandRunConfiguration) fromContext.getConfiguration();
+    assertThat(config.getTarget())
+        .isEqualTo(TargetExpression.fromString("//java/com/google/test:OuterClass"));
+    assertThat(getTestFilterContents(config))
+        .isEqualTo(
+            "--test_filter=com.google.test.OuterClass#|com.google.test.OuterClass.InnerClass#");
+    assertThat(config.getName()).isEqualTo("Blaze test OuterClass");
+    assertThat(getCommandType(config)).isEqualTo(BlazeCommandName.TEST);
+  }
 }
diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducerTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducerTest.java
index bd8118e..aa7d2a2 100644
--- a/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducerTest.java
+++ b/java/tests/integrationtests/com/google/idea/blaze/java/run/producers/BlazeJavaTestMethodConfigurationProducerTest.java
@@ -18,6 +18,7 @@
 import static com.google.common.truth.Truth.assertThat;
 
 import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.command.BlazeFlags;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
 import com.google.idea.blaze.base.ideinfo.TargetMapBuilder;
 import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
@@ -27,6 +28,7 @@
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
 import com.google.idea.blaze.base.run.producer.BlazeRunConfigurationProducerTestCase;
+import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState;
 import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
 import com.intellij.execution.actions.ConfigurationContext;
 import com.intellij.execution.actions.ConfigurationFromContext;
@@ -86,5 +88,9 @@
         .isEqualTo("--test_filter=com.google.test.TestClass#testMethod1$");
     assertThat(config.getName()).isEqualTo("Blaze test TestClass.testMethod1");
     assertThat(getCommandType(config)).isEqualTo(BlazeCommandName.TEST);
+
+    BlazeCommandRunConfigurationCommonState state =
+        config.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
+    assertThat(state.getBlazeFlagsState().getRawFlags()).contains(BlazeFlags.DISABLE_TEST_SHARDING);
   }
 }
diff --git a/java/tests/integrationtests/com/google/idea/blaze/java/sync/projectstructure/JavaSourceFolderProviderTest.java b/java/tests/integrationtests/com/google/idea/blaze/java/sync/projectstructure/JavaSourceFolderProviderTest.java
index bd15bde..2412829 100644
--- a/java/tests/integrationtests/com/google/idea/blaze/java/sync/projectstructure/JavaSourceFolderProviderTest.java
+++ b/java/tests/integrationtests/com/google/idea/blaze/java/sync/projectstructure/JavaSourceFolderProviderTest.java
@@ -140,6 +140,42 @@
     assertThat(testSourceChild.getPackagePrefix()).isEqualTo("apps.tests.model");
   }
 
+  @Test
+  public void testRelativePackagePrefixWithoutParentPrefix() {
+    ImmutableList<BlazeContentEntry> contentEntries =
+        ImmutableList.of(
+            BlazeContentEntry.builder("/src/workspace/java")
+                .addSource(
+                    BlazeSourceDirectory.builder("/src/workspace/java")
+                        .setPackagePrefix("")
+                        .build())
+                .build());
+
+    JavaSourceFolderProvider provider =
+        new JavaSourceFolderProvider(
+            new BlazeJavaSyncData(
+                new BlazeJavaImportResult(
+                    contentEntries, ImmutableMap.of(), ImmutableList.of(), ImmutableSet.of(), null),
+                new GlobSet(ImmutableList.of())));
+
+    VirtualFile root = workspace.createDirectory(new WorkspacePath("java"));
+    ContentEntry contentEntry = getContentEntry(root);
+
+    ImmutableMap<File, SourceFolder> sourceFolders = provider.initializeSourceFolders(contentEntry);
+    assertThat(sourceFolders).hasSize(1);
+
+    VirtualFile testRoot = workspace.createDirectory(new WorkspacePath("java/apps/tests"));
+
+    SourceFolder testSourceChild =
+        provider.setSourceFolderForLocation(
+            contentEntry,
+            sourceFolders.get(new File(root.getPath())),
+            new File(testRoot.getPath()),
+            true);
+    assertThat(testSourceChild.isTestSource()).isTrue();
+    assertThat(testSourceChild.getPackagePrefix()).isEqualTo("apps.tests");
+  }
+
   private ContentEntry getContentEntry(VirtualFile root) {
     return ModuleRootManager.getInstance(testFixture.getModule())
         .getModifiableModel()
diff --git a/java/tests/unittests/com/google/idea/blaze/java/run/BlazeJavaRunProfileStateTest.java b/java/tests/unittests/com/google/idea/blaze/java/run/BlazeJavaRunProfileStateTest.java
index d31ef3f..612b946 100644
--- a/java/tests/unittests/com/google/idea/blaze/java/run/BlazeJavaRunProfileStateTest.java
+++ b/java/tests/unittests/com/google/idea/blaze/java/run/BlazeJavaRunProfileStateTest.java
@@ -56,7 +56,7 @@
 public class BlazeJavaRunProfileStateTest extends BlazeTestCase {
 
   private static final BlazeImportSettings DUMMY_IMPORT_SETTINGS =
-      new BlazeImportSettings("", "", "", "", "", BuildSystem.Blaze);
+      new BlazeImportSettings("", "", "", "", BuildSystem.Blaze);
 
   private BlazeCommandRunConfiguration configuration;
 
@@ -89,11 +89,11 @@
 
   @Test
   public void flagsShouldBeAppendedIfPresent() {
-    configuration.setTarget(new Label("//label:rule"));
+    configuration.setTarget(Label.create("//label:rule"));
     BlazeCommandRunConfigurationCommonState handlerState =
         (BlazeCommandRunConfigurationCommonState) configuration.getHandler().getState();
-    handlerState.setCommand(BlazeCommandName.fromString("command"));
-    handlerState.setBlazeFlags(ImmutableList.of("--flag1", "--flag2"));
+    handlerState.getCommandState().setCommand(BlazeCommandName.fromString("command"));
+    handlerState.getBlazeFlagsState().setRawFlags(ImmutableList.of("--flag1", "--flag2"));
     assertThat(
             BlazeJavaRunProfileState.getBlazeCommand(
                     project,
@@ -115,10 +115,10 @@
 
   @Test
   public void debugFlagShouldBeIncludedForJavaTest() {
-    configuration.setTarget(new Label("//label:rule"));
+    configuration.setTarget(Label.create("//label:rule"));
     BlazeCommandRunConfigurationCommonState handlerState =
         (BlazeCommandRunConfigurationCommonState) configuration.getHandler().getState();
-    handlerState.setCommand(BlazeCommandName.fromString("command"));
+    handlerState.getCommandState().setCommand(BlazeCommandName.fromString("command"));
     assertThat(
             BlazeJavaRunProfileState.getBlazeCommand(
                     project,
@@ -139,10 +139,10 @@
 
   @Test
   public void debugFlagShouldBeIncludedForJavaBinary() {
-    configuration.setTarget(new Label("//label:java_binary_rule"));
+    configuration.setTarget(Label.create("//label:java_binary_rule"));
     BlazeCommandRunConfigurationCommonState handlerState =
         (BlazeCommandRunConfigurationCommonState) configuration.getHandler().getState();
-    handlerState.setCommand(BlazeCommandName.fromString("command"));
+    handlerState.getCommandState().setCommand(BlazeCommandName.fromString("command"));
     assertThat(
             BlazeJavaRunProfileState.getBlazeCommand(
                     project,
diff --git a/java/tests/unittests/com/google/idea/blaze/java/sync/importer/BlazeJavaWorkspaceImporterTest.java b/java/tests/unittests/com/google/idea/blaze/java/sync/importer/BlazeJavaWorkspaceImporterTest.java
index 7ff7620..c69b66b 100644
--- a/java/tests/unittests/com/google/idea/blaze/java/sync/importer/BlazeJavaWorkspaceImporterTest.java
+++ b/java/tests/unittests/com/google/idea/blaze/java/sync/importer/BlazeJavaWorkspaceImporterTest.java
@@ -68,6 +68,7 @@
 import com.google.idea.blaze.java.sync.model.BlazeJarLibrary;
 import com.google.idea.blaze.java.sync.model.BlazeJavaImportResult;
 import com.google.idea.blaze.java.sync.model.BlazeSourceDirectory;
+import com.google.idea.blaze.java.sync.source.JavaLikeLanguage;
 import com.google.idea.blaze.java.sync.source.JavaSourcePackageReader;
 import com.google.idea.blaze.java.sync.source.PackageManifestReader;
 import com.google.idea.blaze.java.sync.source.SourceArtifact;
@@ -97,13 +98,12 @@
   private static final String FAKE_GEN_ROOT_EXECUTION_PATH_FRAGMENT =
       "blaze-out/gcc-4.X.Y-crosstool-v17-hybrid-grtev3-k8-fastbuild/bin";
 
-
   private static final ArtifactLocationDecoder FAKE_ARTIFACT_DECODER =
       (ArtifactLocationDecoder)
           artifactLocation -> new File("/", artifactLocation.getRelativePath());
 
   private static final BlazeImportSettings DUMMY_IMPORT_SETTINGS =
-      new BlazeImportSettings("", "", "", "", "", BuildSystem.Blaze);
+      new BlazeImportSettings("", "", "", "", BuildSystem.Blaze);
   private ExtensionPointImpl<BlazeJavaSyncAugmenter> augmenters;
 
   private static class JdepsMock implements JdepsMap {
@@ -130,6 +130,7 @@
   private MockExperimentService experimentService;
 
   @Override
+  @SuppressWarnings("FunctionalInterfaceClash") // False positive on getDeclaredPackageOfJavaFile.
   protected void initTest(
       @NotNull Container applicationServices, @NotNull Container projectServices) {
     experimentService = new MockExperimentService();
@@ -161,6 +162,9 @@
 
     augmenters =
         registerExtensionPoint(BlazeJavaSyncAugmenter.EP_NAME, BlazeJavaSyncAugmenter.class);
+
+    registerExtensionPoint(JavaLikeLanguage.EP_NAME, JavaLikeLanguage.class)
+        .registerExtension(new JavaLikeLanguage.Java());
   }
 
   BlazeJavaImportResult importWorkspace(
@@ -890,7 +894,7 @@
                     .add(DirectoryEntry.include(new WorkspacePath("import"))))
             .add(
                 ListSection.builder(ImportTargetOutputSection.KEY)
-                    .add(new Label("//import:import")))
+                    .add(Label.create("//import:import")))
             .build();
 
     TargetMapBuilder response =
@@ -986,7 +990,7 @@
             .build();
     TargetMapBuilder targetMapBuilder = targetMapForJdepsSuite();
     jdepsMap.put(
-        TargetKey.forPlainTarget(new Label("//java/apps/example:example_debug")),
+        TargetKey.forPlainTarget(Label.create("//java/apps/example:example_debug")),
         Lists.newArrayList(jdepsPath("thirdparty/a.jar"), jdepsPath("thirdparty/c.jar")));
 
     BlazeJavaImportResult result = importWorkspace(workspaceRoot, targetMapBuilder, projectView);
@@ -1070,7 +1074,7 @@
                     .add(DirectoryEntry.include(new WorkspacePath("java/apps/example"))))
             .add(
                 ListSection.builder(ExcludeTargetSection.KEY)
-                    .add(new Label("//java/apps/example:example")))
+                    .add(Label.create("//java/apps/example:example")))
             .build();
 
     TargetMapBuilder targetMapBuilder =
@@ -1217,7 +1221,7 @@
 
     // First test - make sure that jdeps is working
     jdepsMap.put(
-        TargetKey.forPlainTarget(new Label("//java/example:liba")),
+        TargetKey.forPlainTarget(Label.create("//java/example:liba")),
         Lists.newArrayList(jdepsPath("thirdparty/proto/a/liba-ijar.jar")));
     BlazeJavaImportResult result = importWorkspace(workspaceRoot, targetMapBuilder, projectView);
     errorCollector.assertNoIssues();
@@ -1329,11 +1333,10 @@
               TargetIdeInfo target,
               Collection<BlazeJarLibrary> jars,
               Collection<BlazeJarLibrary> genJars) {
-            if (target.key.label.equals(new Label("//java/example:source"))) {
+            if (target.key.label.equals(Label.create("//java/example:source"))) {
               jars.add(
                   new BlazeJarLibrary(
-                      LibraryArtifact.builder().setInterfaceJar(gen("source.jar")).build(),
-                      target.key));
+                      LibraryArtifact.builder().setInterfaceJar(gen("source.jar")).build()));
             }
           }
         });
@@ -1392,10 +1395,7 @@
   }
 
   private static ArtifactLocation source(String relativePath) {
-    return ArtifactLocation.builder()
-        .setRelativePath(relativePath)
-        .setIsSource(true)
-        .build();
+    return ArtifactLocation.builder().setRelativePath(relativePath).setIsSource(true).build();
   }
 
   private static ArtifactLocation gen(String relativePath) {
diff --git a/java/tests/unittests/com/google/idea/blaze/java/sync/source/SourceDirectoryCalculatorTest.java b/java/tests/unittests/com/google/idea/blaze/java/sync/source/SourceDirectoryCalculatorTest.java
index 8545f55..0538155 100644
--- a/java/tests/unittests/com/google/idea/blaze/java/sync/source/SourceDirectoryCalculatorTest.java
+++ b/java/tests/unittests/com/google/idea/blaze/java/sync/source/SourceDirectoryCalculatorTest.java
@@ -24,11 +24,11 @@
 import com.google.idea.blaze.base.BlazeTestCase;
 import com.google.idea.blaze.base.async.executor.BlazeExecutor;
 import com.google.idea.blaze.base.async.executor.MockBlazeExecutor;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
 import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
 import com.google.idea.blaze.base.ideinfo.TargetKey;
 import com.google.idea.blaze.base.io.FileAttributeProvider;
 import com.google.idea.blaze.base.io.InputStreamProvider;
-import com.google.idea.blaze.base.model.primitives.ExecutionRootPath;
 import com.google.idea.blaze.base.model.primitives.Label;
 import com.google.idea.blaze.base.model.primitives.WorkspacePath;
 import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
@@ -39,7 +39,6 @@
 import com.google.idea.blaze.base.scope.output.IssueOutput;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoderImpl;
-import com.google.idea.blaze.base.sync.workspace.BlazeRoots;
 import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolverImpl;
 import com.google.idea.blaze.java.sync.model.BlazeContentEntry;
 import com.google.idea.blaze.java.sync.model.BlazeSourceDirectory;
@@ -66,7 +65,7 @@
 public class SourceDirectoryCalculatorTest extends BlazeTestCase {
 
   private static final ImmutableMap<TargetKey, ArtifactLocation> NO_MANIFESTS = ImmutableMap.of();
-  private static final Label LABEL = new Label("//fake:label");
+  private static final Label LABEL = Label.create("//fake:label");
 
   private MockInputStreamProvider mockInputStreamProvider;
   private SourceDirectoryCalculator sourceDirectoryCalculator;
@@ -101,6 +100,9 @@
     applicationServices.register(ExperimentService.class, experimentService);
 
     applicationServices.register(PrefetchService.class, new MockPrefetchService());
+
+    registerExtensionPoint(JavaLikeLanguage.EP_NAME, JavaLikeLanguage.class)
+        .registerExtension(new JavaLikeLanguage.Java());
   }
 
   @Test
@@ -901,7 +903,7 @@
                 .setIsSource(true)
                 .build());
     Map<TargetKey, Map<ArtifactLocation, String>> manifestMap =
-        readPackageManifestFiles(manifests, getDecoder("/root"));
+        readPackageManifestFiles(manifests, getDecoder());
 
     assertThat(manifestMap.get(TargetKey.forPlainTarget(LABEL)))
         .containsEntry(
@@ -926,7 +928,7 @@
                 .setIsSource(true)
                 .build());
     Map<TargetKey, Map<ArtifactLocation, String>> manifestMap =
-        readPackageManifestFiles(manifests, getDecoder("/root"));
+        readPackageManifestFiles(manifests, getDecoder());
 
     assertThat(manifestMap.get(TargetKey.forPlainTarget(LABEL)))
         .containsEntry(
@@ -950,38 +952,38 @@
     ImmutableMap<TargetKey, ArtifactLocation> manifests =
         ImmutableMap.<TargetKey, ArtifactLocation>builder()
             .put(
-                TargetKey.forPlainTarget(new Label("//a:a")),
+                TargetKey.forPlainTarget(Label.create("//a:a")),
                 ArtifactLocation.builder()
                     .setRelativePath("java/com/test.manifest")
                     .setIsSource(true)
                     .build())
             .put(
-                TargetKey.forPlainTarget(new Label("//b:b")),
+                TargetKey.forPlainTarget(Label.create("//b:b")),
                 ArtifactLocation.builder()
                     .setRelativePath("java/com/test2.manifest")
                     .setIsSource(true)
                     .build())
             .build();
     Map<TargetKey, Map<ArtifactLocation, String>> manifestMap =
-        readPackageManifestFiles(manifests, getDecoder("/root"));
+        readPackageManifestFiles(manifests, getDecoder());
 
     assertThat(manifestMap).hasSize(2);
 
-    assertThat(manifestMap.get(TargetKey.forPlainTarget(new Label("//a:a"))))
+    assertThat(manifestMap.get(TargetKey.forPlainTarget(Label.create("//a:a"))))
         .containsEntry(
             ArtifactLocation.builder()
                 .setRelativePath("java/com/google/Bla.java")
                 .setIsSource(true)
                 .build(),
             "com.google");
-    assertThat(manifestMap.get(TargetKey.forPlainTarget(new Label("//a:a"))))
+    assertThat(manifestMap.get(TargetKey.forPlainTarget(Label.create("//a:a"))))
         .containsEntry(
             ArtifactLocation.builder()
                 .setRelativePath("java/com/google/Foo.java")
                 .setIsSource(true)
                 .build(),
             "com.google.subpackage");
-    assertThat(manifestMap.get(TargetKey.forPlainTarget(new Label("//b:b"))))
+    assertThat(manifestMap.get(TargetKey.forPlainTarget(Label.create("//b:b"))))
         .containsEntry(
             ArtifactLocation.builder()
                 .setRelativePath("java/com/google/other/Temp.java")
@@ -1035,7 +1037,7 @@
             project,
             context,
             workspaceRoot,
-            getDecoder("/root"),
+            getDecoder(),
             ImmutableList.of(new WorkspacePath("java/com/google")),
             sourceArtifacts,
             manifests);
@@ -1087,15 +1089,12 @@
     mockInputStreamProvider.addFile(manifestPath, manifest.build().toByteArray());
   }
 
-  private static ArtifactLocationDecoder getDecoder(String rootPath) {
-    File root = new File(rootPath);
+  private static ArtifactLocationDecoder getDecoder() {
+    File root = new File("/root");
     WorkspaceRoot workspaceRoot = new WorkspaceRoot(root);
-    BlazeRoots roots =
-        new BlazeRoots(
-            root,
-            new ExecutionRootPath("out/crosstool/bin"),
-            new ExecutionRootPath("out/crosstool/gen"),
-            null);
+    BlazeInfo roots =
+        BlazeInfo.createMockBlazeInfo(
+            "/", "/root", "/root/out/crosstool/bin", "/root/out/crosstool/gen");
     return new ArtifactLocationDecoderImpl(roots, new WorkspacePathResolverImpl(workspaceRoot));
   }
 
@@ -1132,7 +1131,7 @@
       Map<TargetKey, ArtifactLocation> manifests, ArtifactLocationDecoder decoder) {
     return PackageManifestReader.getInstance()
         .readPackageManifestFiles(
-            project, context, decoder, manifests, MoreExecutors.sameThreadExecutor());
+            project, context, decoder, manifests, MoreExecutors.newDirectExecutorService());
   }
 
   static class MockFileAttributeProvider extends FileAttributeProvider {
diff --git a/plugin_dev/BUILD b/plugin_dev/BUILD
index 1c56953..1586378 100644
--- a/plugin_dev/BUILD
+++ b/plugin_dev/BUILD
@@ -9,6 +9,7 @@
         "//intellij_platform_sdk:devkit",
         "//intellij_platform_sdk:plugin_api",
         "//java",
+        "//proto:proto_deps",
         "//sdkcompat",
         "@jsr305_annotations//jar",
     ],
diff --git a/plugin_dev/src/com/google/idea/blaze/plugin/IntellijPluginRule.java b/plugin_dev/src/com/google/idea/blaze/plugin/IntellijPluginRule.java
index 3947b69..608c452 100644
--- a/plugin_dev/src/com/google/idea/blaze/plugin/IntellijPluginRule.java
+++ b/plugin_dev/src/com/google/idea/blaze/plugin/IntellijPluginRule.java
@@ -22,21 +22,14 @@
 public class IntellijPluginRule {
 
   public static final String TARGET_TAG_IJ_PLUGIN = "intellij-plugin";
-  public static final String TARGET_TAG_IJ_PLUGIN_BUNDLE = "intellij-plugin-bundle";
 
   public static boolean isPluginTarget(TargetIdeInfo target) {
     return isIntellijPluginDebugTarget(target)
-        || isPluginBundle(target)
         || isSinglePluginTarget(target);
   }
 
   public static boolean isIntellijPluginDebugTarget(TargetIdeInfo target) {
-    return target.intellijPluginDeployInfo != null;
-  }
-
-  public static boolean isPluginBundle(TargetIdeInfo target) {
-    return target.kindIsOneOf(Kind.JAVA_LIBRARY)
-        && target.tags.contains(TARGET_TAG_IJ_PLUGIN_BUNDLE);
+    return target.kind == Kind.INTELLIJ_PLUGIN_DEBUG_TARGET;
   }
 
   public static boolean isSinglePluginTarget(TargetIdeInfo target) {
diff --git a/plugin_dev/src/com/google/idea/blaze/plugin/run/BlazeIntellijPluginConfiguration.java b/plugin_dev/src/com/google/idea/blaze/plugin/run/BlazeIntellijPluginConfiguration.java
index bee62dd..3621e36 100644
--- a/plugin_dev/src/com/google/idea/blaze/plugin/run/BlazeIntellijPluginConfiguration.java
+++ b/plugin_dev/src/com/google/idea/blaze/plugin/run/BlazeIntellijPluginConfiguration.java
@@ -20,13 +20,9 @@
 import com.google.common.base.Strings;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Ordering;
-import com.google.idea.blaze.base.command.BlazeCommand;
-import com.google.idea.blaze.base.command.BlazeCommandName;
-import com.google.idea.blaze.base.command.BlazeFlags;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
 import com.google.idea.blaze.base.model.primitives.Label;
 import com.google.idea.blaze.base.model.primitives.TargetExpression;
-import com.google.idea.blaze.base.projectview.ProjectViewSet;
 import com.google.idea.blaze.base.run.BlazeConfigurationNameBuilder;
 import com.google.idea.blaze.base.run.BlazeRunConfiguration;
 import com.google.idea.blaze.base.run.state.RunConfigurationFlagsState;
@@ -194,6 +190,7 @@
     final BlazeIntellijPluginDeployer deployer =
         new BlazeIntellijPluginDeployer(getProject(), sandboxHome, buildNumber);
     deployer.addTarget(getTarget());
+    env.putUserData(BlazeIntellijPluginDeployer.USER_DATA_KEY, deployer);
 
     // copy license from running instance of idea
     IdeaJdkHelper.copyIDEALicense(sandboxHome);
@@ -332,8 +329,8 @@
     final BlazeIntellijPluginConfiguration configuration =
         (BlazeIntellijPluginConfiguration) super.clone();
     configuration.target = target;
-    configuration.blazeFlags.setFlags(blazeFlags.getFlags());
-    configuration.exeFlags.setFlags(exeFlags.getFlags());
+    configuration.blazeFlags.setRawFlags(blazeFlags.getRawFlags());
+    configuration.exeFlags.setRawFlags(exeFlags.getRawFlags());
     configuration.pluginSdk = pluginSdk;
     configuration.vmParameters = vmParameters;
     configuration.programParameters = programParameters;
@@ -341,15 +338,12 @@
     return configuration;
   }
 
-  protected BlazeCommand buildBlazeCommand(Project project, ProjectViewSet projectViewSet) {
-    BlazeCommand.Builder command =
-        BlazeCommand.builder(
-                Blaze.getBuildSystemProvider(project).getBinaryPath(), BlazeCommandName.BUILD)
-            .addTargets(getTarget())
-            .addBlazeFlags(BlazeFlags.buildFlags(project, projectViewSet))
-            .addBlazeFlags(blazeFlags.getFlags())
-            .addExeFlags(exeFlags.getFlags());
-    return command.build();
+  RunConfigurationFlagsState getBlazeFlagsState() {
+    return blazeFlags;
+  }
+
+  RunConfigurationFlagsState getExeFlagsState() {
+    return exeFlags;
   }
 
   @Override
diff --git a/plugin_dev/src/com/google/idea/blaze/plugin/run/BlazeIntellijPluginDeployer.java b/plugin_dev/src/com/google/idea/blaze/plugin/run/BlazeIntellijPluginDeployer.java
index a75ffd2..2c366f9 100644
--- a/plugin_dev/src/com/google/idea/blaze/plugin/run/BlazeIntellijPluginDeployer.java
+++ b/plugin_dev/src/com/google/idea/blaze/plugin/run/BlazeIntellijPluginDeployer.java
@@ -15,14 +15,13 @@
  */
 package com.google.idea.blaze.plugin.run;
 
+import static java.nio.charset.StandardCharsets.UTF_8;
+
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
-import com.google.idea.blaze.base.ideinfo.Dependency;
-import com.google.idea.blaze.base.ideinfo.Dependency.DependencyType;
-import com.google.idea.blaze.base.ideinfo.IntellijPluginDeployInfo;
-import com.google.idea.blaze.base.ideinfo.IntellijPluginDeployInfo.IntellijPluginDeployFile;
+import com.google.idea.blaze.base.command.buildresult.BuildResultHelper;
 import com.google.idea.blaze.base.ideinfo.JavaIdeInfo;
 import com.google.idea.blaze.base.ideinfo.LibraryArtifact;
 import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
@@ -31,17 +30,25 @@
 import com.google.idea.blaze.base.model.BlazeProjectData;
 import com.google.idea.blaze.base.model.primitives.Label;
 import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
-import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
 import com.google.idea.blaze.plugin.IntellijPluginRule;
+import com.google.repackaged.devtools.intellij.plugin.IntellijPluginTargetDeployInfo.IntellijPluginDeployFile;
+import com.google.repackaged.devtools.intellij.plugin.IntellijPluginTargetDeployInfo.IntellijPluginDeployInfo;
+import com.google.repackaged.protobuf.TextFormat;
 import com.intellij.execution.ExecutionException;
 import com.intellij.ide.plugins.IdeaPluginDescriptor;
 import com.intellij.ide.plugins.PluginManagerCore;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.BuildNumber;
+import com.intellij.openapi.util.Key;
+import java.io.BufferedInputStream;
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
 import java.nio.file.Files;
 import java.nio.file.StandardCopyOption;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -49,11 +56,17 @@
 
 /** Handles finding files to deploy and copying these into the sandbox. */
 class BlazeIntellijPluginDeployer {
+
+  static final Key<BlazeIntellijPluginDeployer> USER_DATA_KEY =
+      Key.create(BlazeIntellijPluginDeployer.class.getName());
+
   private final String sandboxHome;
   private final String buildNumber;
   private final TargetMap targetMap;
-  private final ArtifactLocationDecoder artifactLocationDecoder;
-  private Map<File, File> filesToDeploy = Maps.newHashMap();
+  private final List<Label> targetsToDeploy = new ArrayList<>();
+  private final List<File> deployInfoFiles = new ArrayList<>();
+  private final Map<File, File> filesToDeploy = Maps.newHashMap();
+  private File executionRoot;
 
   BlazeIntellijPluginDeployer(Project project, String sandboxHome, String buildNumber)
       throws ExecutionException {
@@ -65,17 +78,36 @@
     this.sandboxHome = sandboxHome;
     this.buildNumber = buildNumber;
     this.targetMap = blazeProjectData.targetMap;
-    this.artifactLocationDecoder = blazeProjectData.artifactLocationDecoder;
   }
 
   /** Adds an intellij plugin target to deploy */
   void addTarget(Label label) throws ExecutionException {
-    ImmutableList<IntellijPluginDeployInfo> deployInfos = findDeployInfo(label);
-    ImmutableMap<File, File> filesToDeploy = getFilesToDeploy(deployInfos);
-    this.filesToDeploy.putAll(filesToDeploy);
+    targetsToDeploy.add(label);
+  }
+
+  void reportBuildComplete(File executionRoot, BuildResultHelper buildResultHelper) {
+    this.executionRoot = executionRoot;
+    for (File file : buildResultHelper.getBuildArtifacts()) {
+      if (file.getName().endsWith(".intellij-plugin-debug-target-deploy-info")) {
+        deployInfoFiles.add(file);
+      }
+    }
   }
 
   List<String> deploy() throws ExecutionException {
+    List<IntellijPluginDeployInfo> deployInfoList = Lists.newArrayList();
+    if (!deployInfoFiles.isEmpty()) {
+      for (File deployInfoFile : deployInfoFiles) {
+        deployInfoList.addAll(readDeployInfoFromFile(deployInfoFile));
+      }
+    } else {
+      for (Label label : targetsToDeploy) {
+        deployInfoList.addAll(findDeployInfoFromBareIntelliJPluginTargets(label));
+      }
+    }
+    ImmutableMap<File, File> filesToDeploy = getFilesToDeploy(executionRoot, deployInfoList);
+    this.filesToDeploy.putAll(filesToDeploy);
+
     for (File file : filesToDeploy.keySet()) {
       if (!file.exists()) {
         throw new ExecutionException(
@@ -97,37 +129,33 @@
     }
   }
 
-  private ImmutableList<IntellijPluginDeployInfo> findDeployInfo(Label label)
+  private static ImmutableList<IntellijPluginDeployInfo> readDeployInfoFromFile(File deployInfoFile)
       throws ExecutionException {
+    ImmutableList.Builder<IntellijPluginDeployInfo> result = ImmutableList.builder();
+    try (InputStream inputStream = new BufferedInputStream(new FileInputStream(deployInfoFile))) {
+      IntellijPluginDeployInfo.Builder builder = IntellijPluginDeployInfo.newBuilder();
+      TextFormat.Parser parser = TextFormat.Parser.newBuilder().setAllowUnknownFields(true).build();
+      parser.merge(new InputStreamReader(inputStream, UTF_8), builder);
+      IntellijPluginDeployInfo deployInfo = builder.build();
+      result.add(deployInfo);
+    } catch (IOException e) {
+      throw new ExecutionException(e);
+    }
+    return result.build();
+  }
+
+  private ImmutableList<IntellijPluginDeployInfo> findDeployInfoFromBareIntelliJPluginTargets(
+      Label label) throws ExecutionException {
     TargetIdeInfo target = targetMap.get(TargetKey.forPlainTarget(label));
     if (target == null) {
       throw new ExecutionException("Target '" + label + "' not imported during sync");
     }
-    if (IntellijPluginRule.isIntellijPluginDebugTarget(target)) {
-      assert target.intellijPluginDeployInfo != null;
-      return ImmutableList.of(target.intellijPluginDeployInfo);
-    } else if (IntellijPluginRule.isSinglePluginTarget(target)) {
+    if (IntellijPluginRule.isSinglePluginTarget(target)) {
       return ImmutableList.of(deployInfoForIntellijPlugin(target));
-    } else if (IntellijPluginRule.isPluginBundle(target)) {
-      return deployInfoForLegacyBundle(target);
     }
     throw new ExecutionException("Target is not a supported intellij plugin type.");
   }
 
-  private ImmutableList<IntellijPluginDeployInfo> deployInfoForLegacyBundle(TargetIdeInfo target)
-      throws ExecutionException {
-    ImmutableList.Builder<IntellijPluginDeployInfo> deployInfoBuilder = ImmutableList.builder();
-    for (Dependency dep : target.dependencies) {
-      if (dep.dependencyType == DependencyType.COMPILE_TIME && dep.targetKey.isPlainTarget()) {
-        TargetIdeInfo depTarget = targetMap.get(dep.targetKey);
-        if (depTarget != null && IntellijPluginRule.isSinglePluginTarget(depTarget)) {
-          deployInfoBuilder.add(deployInfoForIntellijPlugin(depTarget));
-        }
-      }
-    }
-    return deployInfoBuilder.build();
-  }
-
   private static IntellijPluginDeployInfo deployInfoForIntellijPlugin(TargetIdeInfo target)
       throws ExecutionException {
     JavaIdeInfo javaIdeInfo = target.javaIdeInfo;
@@ -142,19 +170,21 @@
     if (artifact == null || artifact.classJar == null) {
       throw new ExecutionException("No output plugin jar found for '" + target + "'");
     }
-    IntellijPluginDeployFile deployFile =
-        new IntellijPluginDeployFile(
-            artifact.classJar, new File(artifact.classJar.relativePath).getName());
-    return new IntellijPluginDeployInfo(ImmutableList.of(deployFile));
+    return IntellijPluginDeployInfo.newBuilder()
+        .addDeployFiles(
+            IntellijPluginDeployFile.newBuilder()
+                .setExecutionPath(artifact.classJar.getExecutionRootRelativePath())
+                .setDeployLocation(new File(artifact.classJar.relativePath).getName()))
+        .build();
   }
 
   private ImmutableMap<File, File> getFilesToDeploy(
-      Collection<IntellijPluginDeployInfo> deployInfos) {
+      File executionRoot, Collection<IntellijPluginDeployInfo> deployInfos) {
     ImmutableMap.Builder<File, File> result = ImmutableMap.builder();
     for (IntellijPluginDeployInfo deployInfo : deployInfos) {
-      for (IntellijPluginDeployFile deployFile : deployInfo.deployFiles) {
-        File src = artifactLocationDecoder.decode(deployFile.src);
-        File dest = new File(sandboxPluginDirectory(sandboxHome), deployFile.deployLocation);
+      for (IntellijPluginDeployFile deployFile : deployInfo.getDeployFilesList()) {
+        File src = new File(executionRoot, deployFile.getExecutionPath());
+        File dest = new File(sandboxPluginDirectory(sandboxHome), deployFile.getDeployLocation());
         result.put(src, dest);
       }
     }
diff --git a/plugin_dev/src/com/google/idea/blaze/plugin/run/BuildPluginBeforeRunTaskProvider.java b/plugin_dev/src/com/google/idea/blaze/plugin/run/BuildPluginBeforeRunTaskProvider.java
index 2a9d071..3c778fe 100644
--- a/plugin_dev/src/com/google/idea/blaze/plugin/run/BuildPluginBeforeRunTaskProvider.java
+++ b/plugin_dev/src/com/google/idea/blaze/plugin/run/BuildPluginBeforeRunTaskProvider.java
@@ -19,8 +19,12 @@
 import com.google.common.util.concurrent.ListenableFuture;
 import com.google.idea.blaze.base.async.executor.BlazeExecutor;
 import com.google.idea.blaze.base.async.process.ExternalTask;
-import com.google.idea.blaze.base.async.process.LineProcessingOutputStream;
 import com.google.idea.blaze.base.command.BlazeCommand;
+import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.command.BlazeFlags;
+import com.google.idea.blaze.base.command.buildresult.BuildResultHelper;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
+import com.google.idea.blaze.base.command.info.BlazeInfoRunner;
 import com.google.idea.blaze.base.experiments.ExperimentScope;
 import com.google.idea.blaze.base.filecache.FileCaches;
 import com.google.idea.blaze.base.issueparser.IssueOutputLineProcessor;
@@ -45,6 +49,7 @@
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Key;
 import icons.BlazeIcons;
+import java.io.File;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.ExecutionException;
 import javax.annotation.Nullable;
@@ -159,20 +164,64 @@
               new ScopedTask(context) {
                 @Override
                 protected void execute(BlazeContext context) {
+                  BlazeIntellijPluginDeployer deployer =
+                      env.getUserData(BlazeIntellijPluginDeployer.USER_DATA_KEY);
+                  if (deployer == null) {
+                    IssueOutput.error("Could not find BlazeIntellijPluginDeployer in env.")
+                        .submit(context);
+                    return;
+                  }
+
+                  String binaryPath = Blaze.getBuildSystemProvider(project).getBinaryPath();
+                  WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project);
                   BlazeIntellijPluginConfiguration config =
                       (BlazeIntellijPluginConfiguration) configuration;
-                  BlazeCommand command = config.buildBlazeCommand(project, projectViewSet);
+
+                  ListenableFuture<String> executionRootFuture =
+                      BlazeInfoRunner.getInstance()
+                          .runBlazeInfo(
+                              context,
+                              binaryPath,
+                              workspaceRoot,
+                              config.getBlazeFlagsState().getExpandedFlags(),
+                              BlazeInfo.EXECUTION_ROOT_KEY);
+
+                  String executionRoot;
+                  try {
+                    executionRoot = executionRootFuture.get();
+                  } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    context.setCancelled();
+                    return;
+                  } catch (ExecutionException e) {
+                    IssueOutput.error(e.getMessage()).submit(context);
+                    context.setHasError();
+                    return;
+                  }
+                  if (executionRoot == null) {
+                    IssueOutput.error("Could not determine execution root").submit(context);
+                    return;
+                  }
+
+                  BuildResultHelper buildResultHelper = BuildResultHelper.forFiles(f -> true);
+                  BlazeCommand command =
+                      BlazeCommand.builder(binaryPath, BlazeCommandName.BUILD)
+                          .addTargets(config.getTarget())
+                          .addBlazeFlags(BlazeFlags.buildFlags(project, projectViewSet))
+                          .addBlazeFlags(config.getBlazeFlagsState().getExpandedFlags())
+                          .addExeFlags(config.getExeFlagsState().getExpandedFlags())
+                          .addBlazeFlags(buildResultHelper.getBuildFlags())
+                          .build();
                   if (command == null || context.hasErrors() || context.isCancelled()) {
                     return;
                   }
                   SaveUtil.saveAllFiles();
-                  WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project);
                   int retVal =
                       ExternalTask.builder(workspaceRoot)
                           .addBlazeCommand(command)
                           .context(context)
                           .stderr(
-                              LineProcessingOutputStream.of(
+                              buildResultHelper.stderr(
                                   new IssueOutputLineProcessor(project, context, workspaceRoot)))
                           .build()
                           .run();
@@ -180,6 +229,7 @@
                     context.setHasError();
                   }
                   FileCaches.refresh(project);
+                  deployer.reportBuildComplete(new File(executionRoot), buildResultHelper);
                 }
               };
 
diff --git a/proto/proto_deps.jar b/proto/proto_deps.jar
index b2e5390..2637779 100755
--- a/proto/proto_deps.jar
+++ b/proto/proto_deps.jar
Binary files differ
diff --git a/python/BUILD b/python/BUILD
new file mode 100644
index 0000000..51e2752
--- /dev/null
+++ b/python/BUILD
@@ -0,0 +1,99 @@
+licenses(["notice"])  # Apache 2.0
+
+load(
+    "//build_defs:build_defs.bzl",
+    "intellij_plugin",
+    "merged_plugin_xml",
+    "optional_plugin_xml",
+    "stamped_plugin_xml",
+)
+load(
+    "//testing:test_defs.bzl",
+    "intellij_integration_test_suite",
+    "intellij_unit_test_suite",
+)
+
+java_library(
+    name = "python",
+    srcs = glob(["src/**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//base",
+        "//common/experiments",
+        "//intellij_platform_sdk:plugin_api",
+        "//sdkcompat",
+        "//third_party/python",
+        "@jsr305_annotations//jar",
+    ],
+)
+
+filegroup(
+    name = "plugin_xml",
+    srcs = ["src/META-INF/blaze-python.xml"],
+    visibility = ["//visibility:public"],
+)
+
+optional_plugin_xml(
+    name = "optional_xml",
+    module = "com.intellij.modules.python",
+    plugin_xml = "src/META-INF/python-contents.xml",
+    visibility = ["//visibility:public"],
+)
+
+merged_plugin_xml(
+    name = "merged_plugin_xml",
+    srcs = [
+        "//base:plugin_xml",
+        "//python:plugin_xml",
+    ],
+)
+
+stamped_plugin_xml(
+    name = "python_plugin_xml",
+    plugin_id = "com.google.idea.blaze.python",
+    plugin_name = "com.google.idea.blaze.python",
+    plugin_xml = "merged_plugin_xml",
+)
+
+intellij_plugin(
+    name = "python_integration_test_plugin",
+    testonly = 1,
+    optional_plugin_xmls = [":optional_xml"],
+    plugin_xml = ":python_plugin_xml",
+    deps = [
+        "//python",
+    ],
+)
+
+intellij_integration_test_suite(
+    name = "integration_tests",
+    srcs = glob(["tests/integrationtests/**/*.java"]),
+    required_plugins = "com.google.idea.blaze.python",
+    test_package_root = "com.google.idea.blaze.python",
+    runtime_deps = [
+        ":python_integration_test_plugin",
+    ],
+    deps = [
+        ":python",
+        "//base",
+        "//base:integration_test_utils",
+        "//base:unit_test_utils",
+        "//intellij_platform_sdk:plugin_api_for_tests",
+        "//third_party/python:python_for_tests",
+        "@jsr305_annotations//jar",
+        "@junit//jar",
+    ],
+)
+
+intellij_unit_test_suite(
+    name = "unit_tests",
+    srcs = glob(["tests/unittests/**/*.java"]),
+    test_package_root = "com.google.idea.blaze.python",
+    deps = [
+        ":python",
+        "//base",
+        "//intellij_platform_sdk:plugin_api_for_tests",
+        "@jsr305_annotations//jar",
+        "@junit//jar",
+    ],
+)
diff --git a/python/src/META-INF/blaze-python.xml b/python/src/META-INF/blaze-python.xml
new file mode 100644
index 0000000..8ee292f
--- /dev/null
+++ b/python/src/META-INF/blaze-python.xml
@@ -0,0 +1,20 @@
+<!--
+  ~ Copyright 2017 The Bazel Authors. All rights reserved.
+  ~
+  ~ 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.
+  -->
+<idea-plugin>
+  <extensions defaultExtensionNs="com.google.idea.blaze">
+    <SyncPlugin implementation="com.google.idea.blaze.python.sync.AlwaysPresentPythonSyncPlugin"/>
+  </extensions>
+</idea-plugin>
\ No newline at end of file
diff --git a/python/src/META-INF/python-contents.xml b/python/src/META-INF/python-contents.xml
new file mode 100644
index 0000000..b2e1ab4
--- /dev/null
+++ b/python/src/META-INF/python-contents.xml
@@ -0,0 +1,47 @@
+<!--
+  ~ Copyright 2017 The Bazel Authors. All rights reserved.
+  ~
+  ~ 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.
+  -->
+<idea-plugin>
+
+  <extensions defaultExtensionNs="com.google.idea.blaze">
+    <SyncPlugin implementation="com.google.idea.blaze.python.sync.BlazePythonSyncPlugin"/>
+    <PrefetchFileSource implementation="com.google.idea.blaze.python.sync.PythonPrefetchFileSource"/>
+    <BlazeCommandRunConfigurationHandlerProvider implementation="com.google.idea.blaze.python.run.BlazePyRunConfigurationHandlerProvider" order="first"/>
+    <RunConfigurationFactory implementation="com.google.idea.blaze.python.run.BlazePyDebuggableRunConfigurationFactory"/>
+    <BlazeTestEventsHandler implementation="com.google.idea.blaze.python.run.smrunner.BlazePythonTestEventsHandler"/>
+  </extensions>
+
+  <extensions defaultExtensionNs="com.intellij">
+    <useScopeEnlarger implementation="com.google.idea.blaze.python.search.BlazePyUseScopeEnlarger"/>
+    <runConfigurationProducer implementation="com.google.idea.blaze.python.run.producers.BlazePyBinaryConfigurationProducer" order="first"/>
+    <runConfigurationProducer implementation="com.google.idea.blaze.python.run.producers.BlazePyTestConfigurationProducer" order="first"/>
+    <programRunner implementation="com.google.idea.blaze.python.run.BlazePyDebugRunner"/>
+    <consoleFilterProvider implementation="com.google.idea.blaze.python.run.filter.BlazePyTracebackFilter$BlazePyTracebackFilterProvider"/>
+  </extensions>
+
+  <extensionPoints>
+    <extensionPoint qualifiedName="com.google.idea.blaze.BlazePyFilterProvider"
+      interface="com.google.idea.blaze.python.run.filter.BlazePyFilterProvider"/>
+    <extensionPoint qualifiedName="com.google.idea.blaze.BlazePyDebugFlagsProvider"
+      interface="com.google.idea.blaze.python.run.BlazePyDebugHelper"/>
+  </extensionPoints>
+
+  <project-components>
+    <component>
+      <implementation-class>com.google.idea.blaze.python.run.producers.NonBlazeProducerSuppressor</implementation-class>
+    </component>
+  </project-components>
+
+</idea-plugin>
diff --git a/python/src/com/google/idea/blaze/python/PySdkUtils.java b/python/src/com/google/idea/blaze/python/PySdkUtils.java
new file mode 100644
index 0000000..0b56d45
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/PySdkUtils.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python;
+
+import com.google.idea.blaze.base.sync.data.BlazeDataStorage;
+import com.intellij.openapi.module.ModuleManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.jetbrains.python.sdk.PythonSdkType;
+import javax.annotation.Nullable;
+
+/** Helper methods related to the python SDK. */
+public class PySdkUtils {
+
+  /** Find a python SDK associated with a blaze project, or its workspace module. */
+  @Nullable
+  public static Sdk getPythonSdk(Project project) {
+    Sdk projectSdk = ProjectRootManager.getInstance(project).getProjectSdk();
+    if (projectSdk != null && projectSdk.getSdkType() instanceof PythonSdkType) {
+      return projectSdk;
+    }
+    // look for a SDK associated with a python facet instead.
+    return PythonSdkType.findPythonSdk(
+        ModuleManager.getInstance(project)
+            .findModuleByName(BlazeDataStorage.WORKSPACE_MODULE_NAME));
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/PythonPluginUtils.java b/python/src/com/google/idea/blaze/python/PythonPluginUtils.java
new file mode 100644
index 0000000..62fd0ab
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/PythonPluginUtils.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python;
+
+import com.google.common.collect.ImmutableMap;
+import com.intellij.util.PlatformUtils;
+
+/** Utilities class related to the JetBrains python plugin. */
+public final class PythonPluginUtils {
+
+  private PythonPluginUtils() {}
+
+  private static final ImmutableMap<String, String> PRODUCT_TO_PLUGIN_ID =
+      ImmutableMap.of(
+          PlatformUtils.IDEA_PREFIX, "Pythonid",
+          PlatformUtils.IDEA_CE_PREFIX, "PythonCore",
+          PlatformUtils.CLION_PREFIX, "com.intellij.clion-python");
+
+  public static String getPythonPluginId() {
+    String pluginId = PRODUCT_TO_PLUGIN_ID.get(PlatformUtils.getPlatformPrefix());
+    if (pluginId == null) {
+      throw new RuntimeException(
+          "No python plugin ID for unhandled platform: " + PlatformUtils.getPlatformPrefix());
+    }
+    return pluginId;
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/BlazePyDebugHelper.java b/python/src/com/google/idea/blaze/python/run/BlazePyDebugHelper.java
new file mode 100644
index 0000000..9418e2c
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/BlazePyDebugHelper.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run;
+
+import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.openapi.project.Project;
+import javax.annotation.Nullable;
+
+/** Extension point for adding blaze flags when debugging python targets. */
+public interface BlazePyDebugHelper {
+
+  ExtensionPointName<BlazePyDebugHelper> EP_NAME =
+      ExtensionPointName.create("com.google.idea.blaze.BlazePyDebugFlagsProvider");
+
+  static ImmutableList<String> getAllBlazeDebugFlags() {
+    ImmutableList.Builder<String> builder = ImmutableList.builder();
+    for (BlazePyDebugHelper provider : EP_NAME.getExtensions()) {
+      builder.addAll(provider.getBlazeDebugFlags());
+    }
+    return builder.build();
+  }
+
+  @Nullable
+  static String validateDebugTarget(Project project, @Nullable TargetExpression target) {
+    for (BlazePyDebugHelper provider : EP_NAME.getExtensions()) {
+      String error = provider.validatePyDebugTarget(project, target);
+      if (error != null) {
+        return error;
+      }
+    }
+    return null;
+  }
+
+  ImmutableList<String> getBlazeDebugFlags();
+
+  /**
+   * Attempts to check whether the given target can be debugged by the Blaze plugin. If there's a
+   * known problem, returns an error message with the details.
+   */
+  @Nullable
+  String validatePyDebugTarget(Project project, @Nullable TargetExpression target);
+}
diff --git a/python/src/com/google/idea/blaze/python/run/BlazePyDebugRunner.java b/python/src/com/google/idea/blaze/python/run/BlazePyDebugRunner.java
new file mode 100644
index 0000000..8b24142
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/BlazePyDebugRunner.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run;
+
+import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
+import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState;
+import com.google.idea.blaze.python.run.BlazePyRunConfigurationRunner.BlazePyDummyRunProfileState;
+import com.intellij.execution.ExecutionException;
+import com.intellij.execution.ExecutionResult;
+import com.intellij.execution.configurations.RunProfile;
+import com.intellij.execution.configurations.RunProfileState;
+import com.intellij.execution.executors.DefaultDebugExecutor;
+import com.intellij.execution.runners.ExecutionEnvironment;
+import com.intellij.execution.ui.RunContentDescriptor;
+import com.intellij.xdebugger.XDebugSession;
+import com.jetbrains.python.debugger.PyDebugProcess;
+import com.jetbrains.python.debugger.PyDebugRunner;
+import com.jetbrains.python.run.PythonCommandLineState;
+import java.net.ServerSocket;
+
+/** Blaze plugin specific {@link PyDebugRunner}. */
+public class BlazePyDebugRunner extends PyDebugRunner {
+
+  @Override
+  public String getRunnerId() {
+    return "BlazePyDebugRunner";
+  }
+
+  @Override
+  public boolean canRun(String executorId, RunProfile profile) {
+    if (!DefaultDebugExecutor.EXECUTOR_ID.equals(executorId)
+        || !(profile instanceof BlazeCommandRunConfiguration)) {
+      return false;
+    }
+    BlazeCommandRunConfiguration config = (BlazeCommandRunConfiguration) profile;
+    BlazeCommandRunConfigurationCommonState handlerState =
+        config.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
+    BlazeCommandName command =
+        handlerState != null ? handlerState.getCommandState().getCommand() : null;
+    return PyDebugUtils.canUsePyDebugger(config.getKindForTarget())
+        && (BlazeCommandName.TEST.equals(command) || BlazeCommandName.RUN.equals(command));
+  }
+
+  @Override
+  protected PyDebugProcess createDebugProcess(
+      XDebugSession xDebugSession,
+      ServerSocket serverSocket,
+      ExecutionResult executionResult,
+      PythonCommandLineState pythonCommandLineState) {
+    PyDebugProcess process =
+        super.createDebugProcess(
+            xDebugSession, serverSocket, executionResult, pythonCommandLineState);
+    process.setPositionConverter(new BlazePyPositionConverter());
+    return process;
+  }
+
+  @Override
+  protected RunContentDescriptor doExecute(RunProfileState state, ExecutionEnvironment environment)
+      throws ExecutionException {
+    if (!(state instanceof BlazePyDummyRunProfileState)) {
+      return null;
+    }
+    try {
+      state = ((BlazePyDummyRunProfileState) state).toNativeState(environment);
+      return super.doExecute(state, environment);
+    } catch (ExecutionException e) {
+      throw e;
+    } catch (Exception e) {
+      throw new ExecutionException(e);
+    }
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/BlazePyDebuggableRunConfigurationFactory.java b/python/src/com/google/idea/blaze/python/run/BlazePyDebuggableRunConfigurationFactory.java
new file mode 100644
index 0000000..7536401
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/BlazePyDebuggableRunConfigurationFactory.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run;
+
+import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
+import com.google.idea.blaze.base.ideinfo.TargetKey;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.model.primitives.Kind;
+import com.google.idea.blaze.base.model.primitives.Label;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfigurationType;
+import com.google.idea.blaze.base.run.BlazeRunConfigurationFactory;
+import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState;
+import com.intellij.execution.configurations.ConfigurationFactory;
+import com.intellij.execution.configurations.RunConfiguration;
+import com.intellij.openapi.project.Project;
+
+/** Creates run configurations for debuggable python targets. */
+public class BlazePyDebuggableRunConfigurationFactory extends BlazeRunConfigurationFactory {
+  @Override
+  public boolean handlesTarget(Project project, BlazeProjectData blazeProjectData, Label label) {
+    TargetIdeInfo target = blazeProjectData.targetMap.get(TargetKey.forPlainTarget(label));
+    return target != null && target.kind != null && PyDebugUtils.canUsePyDebugger(target.kind);
+  }
+
+  @Override
+  protected ConfigurationFactory getConfigurationFactory() {
+    return BlazeCommandRunConfigurationType.getInstance().getFactory();
+  }
+
+  @Override
+  public void setupConfiguration(RunConfiguration configuration, Label target) {
+    final BlazeCommandRunConfiguration blazeConfig = (BlazeCommandRunConfiguration) configuration;
+    blazeConfig.setTarget(target);
+
+    BlazeCommandRunConfigurationCommonState state =
+        blazeConfig.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
+    Kind kind = blazeConfig.getKindForTarget();
+    if (state != null) {
+      BlazeCommandName command =
+          kind != null && Kind.isTestRule(kind.toString())
+              ? BlazeCommandName.TEST
+              : BlazeCommandName.RUN;
+      state.getCommandState().setCommand(command);
+    }
+    blazeConfig.setGeneratedName();
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/BlazePyPositionConverter.java b/python/src/com/google/idea/blaze/python/run/BlazePyPositionConverter.java
new file mode 100644
index 0000000..7dd68d1
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/BlazePyPositionConverter.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run;
+
+import com.intellij.openapi.application.AccessToken;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.util.Computable;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.xdebugger.XDebuggerUtil;
+import com.intellij.xdebugger.XSourcePosition;
+import com.jetbrains.python.debugger.PyDebugSupportUtils;
+import com.jetbrains.python.debugger.PyLocalPositionConverter;
+import com.jetbrains.python.debugger.PyPositionConverter;
+import com.jetbrains.python.debugger.PySignature;
+import com.jetbrains.python.debugger.PySourcePosition;
+import java.io.File;
+import java.io.IOException;
+import javax.annotation.Nullable;
+
+/**
+ * Converts the blaze-out symlink file paths to the actual source file paths. Otherwise a copy of
+ * {@link PyLocalPositionConverter}
+ */
+public class BlazePyPositionConverter implements PyPositionConverter {
+
+  private static final Logger logger = Logger.getInstance(BlazePyPositionConverter.class);
+
+  @Override
+  public PySourcePosition create(String filePath, int line) {
+    return new PySourcePosition(convertFilePath(filePath), line) {};
+  }
+
+  @Override
+  public PySourcePosition convertToPython(XSourcePosition position) {
+    return new PySourcePosition(
+        convertFilePath(position.getFile().getPath()),
+        convertLocalLineToRemote(position.getFile(), position.getLine())) {};
+  }
+
+  @Nullable
+  @Override
+  public XSourcePosition convertFromPython(PySourcePosition position) {
+    return createXSourcePosition(getVirtualFile(position.getFile()), position.getLine());
+  }
+
+  @Override
+  public PySignature convertSignature(PySignature signature) {
+    return signature;
+  }
+
+  private static String convertFilePath(String filePath) {
+    File file = new File(filePath);
+    try {
+      return file.getCanonicalPath();
+    } catch (IOException e) {
+      logger.warn(e);
+      return filePath;
+    }
+  }
+
+  private static VirtualFile getVirtualFile(String filePath) {
+    return LocalFileSystem.getInstance().findFileByPath(filePath);
+  }
+
+  @Nullable
+  private static XSourcePosition createXSourcePosition(@Nullable VirtualFile vFile, int line) {
+    if (vFile != null) {
+      return XDebuggerUtil.getInstance()
+          .createPosition(vFile, convertRemoteLineToLocal(vFile, line));
+    } else {
+      return null;
+    }
+  }
+
+  /** Convert from 1- to 0-indexed line numbering, and account for continuation lines */
+  private static int convertLocalLineToRemote(VirtualFile file, int line) {
+    AccessToken lock = ApplicationManager.getApplication().acquireReadActionLock();
+    try {
+      final Document document = FileDocumentManager.getInstance().getDocument(file);
+      if (document != null) {
+        while (PyDebugSupportUtils.isContinuationLine(document, line)) {
+          line++;
+        }
+      }
+      return line + 1;
+    } finally {
+      lock.finish();
+    }
+  }
+
+  /** Convert from 0- to 1-indexed line numbering, and account for continuation lines */
+  private static int convertRemoteLineToLocal(final VirtualFile vFile, int line) {
+    final Document document =
+        ApplicationManager.getApplication()
+            .runReadAction(
+                new Computable<Document>() {
+                  @Override
+                  public Document compute() {
+                    return FileDocumentManager.getInstance().getDocument(vFile);
+                  }
+                });
+
+    line--;
+    if (document != null) {
+      while (PyDebugSupportUtils.isContinuationLine(document, line - 1)) {
+        line--;
+      }
+    }
+    return line;
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/BlazePyRunConfigurationHandler.java b/python/src/com/google/idea/blaze/python/run/BlazePyRunConfigurationHandler.java
new file mode 100644
index 0000000..e8a2d3f
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/BlazePyRunConfigurationHandler.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run;
+
+import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
+import com.google.idea.blaze.base.run.BlazeConfigurationNameBuilder;
+import com.google.idea.blaze.base.run.confighandler.BlazeCommandRunConfigurationHandler;
+import com.google.idea.blaze.base.run.confighandler.BlazeCommandRunConfigurationRunner;
+import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState;
+import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import com.intellij.execution.Executor;
+import com.intellij.execution.configurations.RunConfiguration;
+import com.intellij.execution.configurations.RuntimeConfigurationException;
+import com.intellij.execution.runners.ExecutionEnvironment;
+import javax.annotation.Nullable;
+import javax.swing.Icon;
+
+/** Python-specific handler for {@link BlazeCommandRunConfiguration}s. */
+public final class BlazePyRunConfigurationHandler implements BlazeCommandRunConfigurationHandler {
+
+  private final String buildSystemName;
+  private final BlazeCommandRunConfigurationCommonState state;
+
+  public BlazePyRunConfigurationHandler(BlazeCommandRunConfiguration configuration) {
+    BuildSystem buildSystem = Blaze.getBuildSystem(configuration.getProject());
+    this.buildSystemName = buildSystem.getName();
+    this.state = new BlazeCommandRunConfigurationCommonState(buildSystem);
+  }
+
+  @Override
+  public BlazeCommandRunConfigurationCommonState getState() {
+    return state;
+  }
+
+  @Override
+  public BlazeCommandRunConfigurationRunner createRunner(
+      Executor executor, ExecutionEnvironment environment) {
+    return new BlazePyRunConfigurationRunner();
+  }
+
+  @Override
+  public void checkConfiguration() throws RuntimeConfigurationException {
+    state.validate(buildSystemName);
+  }
+
+  @Override
+  @Nullable
+  public String suggestedName(BlazeCommandRunConfiguration configuration) {
+    if (configuration.getTarget() == null) {
+      return null;
+    }
+    return new BlazeConfigurationNameBuilder(configuration).build();
+  }
+
+  @Override
+  @Nullable
+  public String getCommandName() {
+    BlazeCommandName command = state.getCommandState().getCommand();
+    return command != null ? command.toString() : null;
+  }
+
+  @Override
+  public String getHandlerName() {
+    return "Python Handler";
+  }
+
+  @Override
+  @Nullable
+  public Icon getExecutorIcon(RunConfiguration configuration, Executor executor) {
+    return null;
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/BlazePyRunConfigurationHandlerProvider.java b/python/src/com/google/idea/blaze/python/run/BlazePyRunConfigurationHandlerProvider.java
new file mode 100644
index 0000000..0975c01
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/BlazePyRunConfigurationHandlerProvider.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run;
+
+import com.google.idea.blaze.base.model.primitives.Kind;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
+import com.google.idea.blaze.base.run.confighandler.BlazeCommandRunConfigurationHandler;
+import com.google.idea.blaze.base.run.confighandler.BlazeCommandRunConfigurationHandlerProvider;
+
+/** Python-specific handler provider for {@link BlazeCommandRunConfiguration}s. */
+public class BlazePyRunConfigurationHandlerProvider
+    implements BlazeCommandRunConfigurationHandlerProvider {
+
+  @Override
+  public boolean canHandleKind(Kind kind) {
+    return PyDebugUtils.canUsePyDebugger(kind);
+  }
+
+  @Override
+  public BlazeCommandRunConfigurationHandler createHandler(BlazeCommandRunConfiguration config) {
+    return new BlazePyRunConfigurationHandler(config);
+  }
+
+  @Override
+  public String getId() {
+    return "BlazePyRunConfigurationHandlerProvider";
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/BlazePyRunConfigurationRunner.java b/python/src/com/google/idea/blaze/python/run/BlazePyRunConfigurationRunner.java
new file mode 100644
index 0000000..08f2a22
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/BlazePyRunConfigurationRunner.java
@@ -0,0 +1,389 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.idea.blaze.base.async.executor.BlazeExecutor;
+import com.google.idea.blaze.base.async.process.ExternalTask;
+import com.google.idea.blaze.base.command.BlazeCommand;
+import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.command.BlazeFlags;
+import com.google.idea.blaze.base.command.buildresult.BuildResultHelper;
+import com.google.idea.blaze.base.io.FileAttributeProvider;
+import com.google.idea.blaze.base.issueparser.IssueOutputLineProcessor;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.model.primitives.Label;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.projectview.ProjectViewManager;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
+import com.google.idea.blaze.base.run.WithBrowserHyperlinkExecutionException;
+import com.google.idea.blaze.base.run.confighandler.BlazeCommandGenericRunConfigurationRunner.BlazeCommandRunProfileState;
+import com.google.idea.blaze.base.run.confighandler.BlazeCommandRunConfigurationRunner;
+import com.google.idea.blaze.base.run.filter.BlazeTargetFilter;
+import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.ScopedTask;
+import com.google.idea.blaze.base.scope.output.StatusOutput;
+import com.google.idea.blaze.base.scope.scopes.BlazeConsoleScope;
+import com.google.idea.blaze.base.scope.scopes.IssuesScope;
+import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.blaze.base.settings.BlazeUserSettings;
+import com.google.idea.blaze.base.sync.data.BlazeDataStorage;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.util.SaveUtil;
+import com.google.idea.blaze.python.run.filter.BlazePyFilterProvider;
+import com.google.idea.common.experiments.BoolExperiment;
+import com.intellij.execution.ExecutionException;
+import com.intellij.execution.ExecutionResult;
+import com.intellij.execution.Executor;
+import com.intellij.execution.configurations.GeneralCommandLine;
+import com.intellij.execution.configurations.RunProfile;
+import com.intellij.execution.configurations.RunProfileState;
+import com.intellij.execution.configurations.WrappingRunConfiguration;
+import com.intellij.execution.executors.DefaultDebugExecutor;
+import com.intellij.execution.filters.Filter;
+import com.intellij.execution.filters.TextConsoleBuilder;
+import com.intellij.execution.process.KillableProcessHandler;
+import com.intellij.execution.process.ProcessHandler;
+import com.intellij.execution.runners.ExecutionEnvironment;
+import com.intellij.execution.runners.ExecutionUtil;
+import com.intellij.execution.runners.ProgramRunner;
+import com.intellij.execution.ui.ConsoleView;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.util.Key;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vfs.LocalFileSystem;
+import com.intellij.util.PathUtil;
+import com.intellij.util.execution.ParametersListUtil;
+import com.jetbrains.python.console.PyDebugConsoleBuilder;
+import com.jetbrains.python.console.PythonDebugLanguageConsoleView;
+import com.jetbrains.python.run.PythonConfigurationType;
+import com.jetbrains.python.run.PythonRunConfiguration;
+import com.jetbrains.python.run.PythonScriptCommandLineState;
+import java.io.File;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
+
+/** Python-specific run configuration runner. */
+public class BlazePyRunConfigurationRunner implements BlazeCommandRunConfigurationRunner {
+
+  /** Used to store a runner to an {@link ExecutionEnvironment}. */
+  private static final Key<AtomicReference<File>> EXECUTABLE_KEY =
+      Key.create("blaze.debug.py.executable");
+
+  private static final Logger logger = Logger.getInstance(BlazePyRunConfigurationRunner.class);
+
+  // Filter executables instead of files in the bin directory
+  // This bin directory isn't the right one, because we don't know the blaze binary
+  // or the config flags used to execute the build command
+  // Introduced March 2017
+  private static final BoolExperiment filterExecutableFiles =
+      new BoolExperiment("filter.executable.files", true);
+
+  /** Converts to the native python plugin debug configuration state */
+  static class BlazePyDummyRunProfileState implements RunProfileState {
+    final BlazeCommandRunConfiguration configuration;
+
+    BlazePyDummyRunProfileState(BlazeCommandRunConfiguration configuration) {
+      this.configuration = configuration;
+    }
+
+    PythonScriptCommandLineState toNativeState(ExecutionEnvironment env) throws ExecutionException {
+      File executable = env.getCopyableUserData(EXECUTABLE_KEY).get();
+      if (executable == null || StringUtil.isEmptyOrSpaces(executable.getPath())) {
+        throw new ExecutionException("No blaze output script found");
+      }
+      PythonRunConfiguration nativeConfig =
+          (PythonRunConfiguration)
+              PythonConfigurationType.getInstance()
+                  .getFactory()
+                  .createTemplateConfiguration(env.getProject());
+      nativeConfig.setScriptName(executable.getPath());
+      nativeConfig.setAddContentRoots(false);
+      nativeConfig.setAddSourceRoots(false);
+      nativeConfig.setWorkingDirectory(
+          Strings.nullToEmpty(
+              getRunfilesPath(executable, WorkspaceRoot.fromProjectSafe(env.getProject()))));
+
+      Module workspaceModule =
+          nativeConfig.getConfigurationModule().findModule(BlazeDataStorage.WORKSPACE_MODULE_NAME);
+      if (workspaceModule != null) {
+        nativeConfig.setModule(workspaceModule);
+        nativeConfig.setUseModuleSdk(true);
+      } else {
+        throw new ExecutionException(
+            "Can't find the workspace module when debugging a python target");
+      }
+
+      BlazeCommandRunConfigurationCommonState handlerState =
+          configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
+      if (handlerState != null) {
+        nativeConfig.setScriptParameters(Strings.emptyToNull(getScriptParams(handlerState)));
+      }
+      return new PythonScriptCommandLineState(nativeConfig, env) {
+        @Override
+        public boolean isDebug() {
+          return true;
+        }
+
+        @Override
+        protected ConsoleView createAndAttachConsole(
+            Project project, ProcessHandler processHandler, Executor executor)
+            throws ExecutionException {
+          ConsoleView consoleView = createConsoleBuilder(project, getSdk()).getConsole();
+          consoleView.addMessageFilter(createUrlFilter(processHandler));
+          addTracebackFilter(project, consoleView, processHandler);
+
+          consoleView.attachToProcess(processHandler);
+          return consoleView;
+        }
+
+        @Override
+        protected ProcessHandler doCreateProcess(GeneralCommandLine commandLine)
+            throws ExecutionException {
+          ProcessHandler handler = super.doCreateProcess(commandLine);
+          if (handler instanceof KillableProcessHandler) {
+            // SIGINT can cause the JVM to crash, when stopped at a breakpoint (IDEA-167432).
+            ((KillableProcessHandler) handler).setShouldKillProcessSoftly(false);
+          }
+          return handler;
+        }
+      };
+    }
+
+    @Nullable
+    @Override
+    public ExecutionResult execute(Executor executor, ProgramRunner runner)
+        throws ExecutionException {
+      return null;
+    }
+
+    private static TextConsoleBuilder createConsoleBuilder(Project project, Sdk sdk) {
+      return new PyDebugConsoleBuilder(project, sdk) {
+        @Override
+        protected ConsoleView createConsole() {
+          PythonDebugLanguageConsoleView consoleView =
+              new PythonDebugLanguageConsoleView(project, sdk);
+          for (Filter filter : getFilters(project)) {
+            consoleView.addMessageFilter(filter);
+          }
+          return consoleView;
+        }
+      };
+    }
+
+    private static String getScriptParams(BlazeCommandRunConfigurationCommonState state) {
+      List<String> params = Lists.newArrayList(state.getExeFlagsState().getExpandedFlags());
+      String filterFlag = state.getTestFilterFlag();
+      if (filterFlag != null) {
+        params.add(filterFlag.substring((BlazeFlags.TEST_FILTER + "=").length()));
+      }
+      return ParametersListUtil.join(params);
+    }
+  }
+
+  private static ImmutableList<Filter> getFilters(Project project) {
+    return ImmutableList.<Filter>builder()
+        .addAll(BlazePyFilterProvider.getPyFilters(project))
+        .add(new BlazeTargetFilter(project))
+        .build();
+  }
+
+  @Override
+  public RunProfileState getRunProfileState(Executor executor, ExecutionEnvironment environment)
+      throws ExecutionException {
+    BlazeCommandRunConfiguration configuration = getConfiguration(environment);
+    if (isDebugging(environment)) {
+      environment.putCopyableUserData(EXECUTABLE_KEY, new AtomicReference<>());
+      return new BlazePyDummyRunProfileState(configuration);
+    }
+    return new BlazeCommandRunProfileState(environment, getFilters(environment.getProject()));
+  }
+
+  @Override
+  public boolean executeBeforeRunTask(ExecutionEnvironment env) {
+    if (!isDebugging(env)) {
+      return true;
+    }
+    try {
+      File executable = getExecutableToDebug(env);
+      env.getCopyableUserData(EXECUTABLE_KEY).set(executable);
+      if (executable != null) {
+        return true;
+      }
+    } catch (ExecutionException e) {
+      ExecutionUtil.handleExecutionError(
+          env.getProject(), env.getExecutor().getToolWindowId(), env.getRunProfile(), e);
+      logger.info(e);
+    }
+    return false;
+  }
+
+  private static boolean isDebugging(ExecutionEnvironment environment) {
+    Executor executor = environment.getExecutor();
+    return executor instanceof DefaultDebugExecutor;
+  }
+
+  private static BlazeCommandRunConfiguration getConfiguration(ExecutionEnvironment environment) {
+    RunProfile runProfile = environment.getRunProfile();
+    if (runProfile instanceof WrappingRunConfiguration) {
+      runProfile = ((WrappingRunConfiguration) runProfile).getPeer();
+    }
+    return (BlazeCommandRunConfiguration) runProfile;
+  }
+
+  /** Make a best-effort attempt to get the runfiles path. Returns null if it can't be found. */
+  @Nullable
+  private static String getRunfilesPath(File executable, @Nullable WorkspaceRoot root) {
+    if (root == null) {
+      return null;
+    }
+    String workspaceName = root.directory().getName();
+    File expectedPath = new File(executable.getPath() + ".runfiles", workspaceName);
+    if (FileAttributeProvider.getInstance().exists(expectedPath)) {
+      return expectedPath.getPath();
+    }
+    return null;
+  }
+
+  /**
+   * Builds blaze python target and returns the output build artifact.
+   *
+   * @throws ExecutionException if the target cannot be debugged.
+   */
+  private static File getExecutableToDebug(ExecutionEnvironment env) throws ExecutionException {
+    BlazeCommandRunConfiguration configuration = getConfiguration(env);
+    final Project project = configuration.getProject();
+    BlazeProjectData blazeProjectData =
+        BlazeProjectDataManager.getInstance(project).getBlazeProjectData();
+    if (blazeProjectData == null) {
+      throw new ExecutionException("Not synced yet, please sync project");
+    }
+
+    String validationError =
+        BlazePyDebugHelper.validateDebugTarget(env.getProject(), configuration.getTarget());
+    if (validationError != null) {
+      throw new WithBrowserHyperlinkExecutionException(validationError);
+    }
+
+    final BlazeCommandRunConfigurationCommonState handlerState =
+        (BlazeCommandRunConfigurationCommonState) configuration.getHandler().getState();
+    final WorkspaceRoot workspaceRoot = WorkspaceRoot.fromProject(project);
+    final ProjectViewSet projectViewSet =
+        ProjectViewManager.getInstance(project).getProjectViewSet();
+
+    BuildResultHelper buildResultHelper = BuildResultHelper.forFiles(file -> true);
+    boolean suppressConsole = BlazeUserSettings.getInstance().getSuppressConsoleForRunAction();
+    final ListenableFuture<Void> buildOperation =
+        BlazeExecutor.submitTask(
+            project,
+            new ScopedTask() {
+              @Override
+              protected void execute(BlazeContext context) {
+                context
+                    .push(new IssuesScope(project))
+                    .push(
+                        new BlazeConsoleScope.Builder(project)
+                            .setSuppressConsole(suppressConsole)
+                            .build());
+
+                context.output(new StatusOutput("Building debug binary"));
+
+                BlazeCommand.Builder command =
+                    BlazeCommand.builder(
+                            Blaze.getBuildSystemProvider(project).getBinaryPath(),
+                            BlazeCommandName.BUILD)
+                        .addTargets(configuration.getTarget())
+                        .addBlazeFlags(BlazeFlags.buildFlags(project, projectViewSet))
+                        .addBlazeFlags(handlerState.getBlazeFlagsState().getExpandedFlags())
+                        .addBlazeFlags(BlazePyDebugHelper.getAllBlazeDebugFlags())
+                        .addBlazeFlags(buildResultHelper.getBuildFlags());
+
+                ExternalTask.builder(workspaceRoot)
+                    .addBlazeCommand(command.build())
+                    .context(context)
+                    .stderr(
+                        buildResultHelper.stderr(
+                            new IssueOutputLineProcessor(project, context, workspaceRoot)))
+                    .build()
+                    .run();
+              }
+            });
+
+    try {
+      SaveUtil.saveAllFiles();
+      buildOperation.get();
+    } catch (InterruptedException | java.util.concurrent.ExecutionException e) {
+      throw new ExecutionException(e);
+    }
+    List<File> candidateFiles =
+        buildResultHelper
+            .getBuildArtifacts()
+            .stream()
+            .filter(fileFilter(blazeProjectData))
+            .collect(Collectors.toList());
+    if (candidateFiles.isEmpty()) {
+      throw new ExecutionException(
+          String.format("No output artifacts found when building %s", configuration.getTarget()));
+    }
+    File file = findExecutable((Label) configuration.getTarget(), candidateFiles);
+    if (file == null) {
+      throw new ExecutionException(
+          String.format(
+              "More than 1 executable was produced when building %s; don't know which one to debug",
+              configuration.getTarget()));
+    }
+    LocalFileSystem.getInstance().refreshIoFiles(ImmutableList.of(file));
+    return file;
+  }
+
+  private static Predicate<File> fileFilter(BlazeProjectData blazeProjectData) {
+    return filterExecutableFiles.getValue()
+        ? File::canExecute
+        : f -> FileUtil.isAncestor(blazeProjectData.blazeInfo.getBlazeBinDirectory(), f, true);
+  }
+
+  /**
+   * Basic heuristic for choosing between multiple output files. Currently just looks for a filename
+   * matching the target name.
+   */
+  @VisibleForTesting
+  @Nullable
+  static File findExecutable(Label target, List<File> outputs) {
+    if (outputs.size() == 1) {
+      return outputs.get(0);
+    }
+    String name = PathUtil.getFileName(target.targetName().toString());
+    for (File file : outputs) {
+      if (file.getName().equals(name)) {
+        return file;
+      }
+    }
+    return null;
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/PyDebugUtils.java b/python/src/com/google/idea/blaze/python/run/PyDebugUtils.java
new file mode 100644
index 0000000..ec41831
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/PyDebugUtils.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run;
+
+import com.google.idea.blaze.base.model.primitives.Kind;
+import javax.annotation.Nullable;
+
+/** Utilities class for debuggable python run configurations. */
+public class PyDebugUtils {
+
+  static boolean canUsePyDebugger(@Nullable Kind kind) {
+    return kind != null && kind.isOneOf(Kind.PY_BINARY, Kind.PY_APPENGINE_BINARY, Kind.PY_TEST);
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/PyTestUtils.java b/python/src/com/google/idea/blaze/python/run/PyTestUtils.java
new file mode 100644
index 0000000..4493706
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/PyTestUtils.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run;
+
+import com.google.common.collect.ImmutableSet;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyFile;
+import com.jetbrains.python.psi.PyFunction;
+import com.jetbrains.python.psi.types.PyClassLikeType;
+import com.jetbrains.python.psi.types.TypeEvalContext;
+
+/** Utilities class for identifying python test psi elements. */
+public class PyTestUtils {
+
+  private static final ImmutableSet<String> PY_UNIT_TEST_CLASSES =
+      ImmutableSet.of("unittest.TestCase", "unittest.case.TestCase");
+
+  public static boolean isTestFile(PyFile file) {
+    for (PyClass cls : file.getTopLevelClasses()) {
+      if (isTestClass(cls)) {
+        return true;
+      }
+    }
+    for (PyFunction cls : file.getTopLevelFunctions()) {
+      if (isTestFunction(cls)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  public static boolean isTestClass(PyClass pyClass) {
+    final TypeEvalContext contextToUse =
+        TypeEvalContext.userInitiated(pyClass.getProject(), pyClass.getContainingFile());
+    for (PyClassLikeType type : pyClass.getAncestorTypes(contextToUse)) {
+      if (type != null && PY_UNIT_TEST_CLASSES.contains(type.getClassQName())) {
+        return true;
+      }
+    }
+    String name = pyClass.getName();
+    return name != null && name.endsWith("Test");
+  }
+
+  public static boolean isTestFunction(PyFunction fn) {
+    String name = fn.getName();
+    return name != null && name.startsWith("test");
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/filter/BlazePyFilterProvider.java b/python/src/com/google/idea/blaze/python/run/filter/BlazePyFilterProvider.java
new file mode 100644
index 0000000..2507b06
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/filter/BlazePyFilterProvider.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run.filter;
+
+import com.intellij.execution.filters.Filter;
+import com.intellij.openapi.extensions.ExtensionPointName;
+import com.intellij.openapi.project.Project;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+/** Filters for python run configuration console output. */
+public interface BlazePyFilterProvider {
+
+  ExtensionPointName<BlazePyFilterProvider> EP_NAME =
+      ExtensionPointName.create("com.google.idea.blaze.BlazePyFilterProvider");
+
+  static Collection<Filter> getPyFilters(Project project) {
+    return Arrays.stream(EP_NAME.getExtensions())
+        .map(provider -> provider.getFilter(project))
+        .collect(Collectors.toList());
+  }
+
+  Filter getFilter(Project project);
+}
diff --git a/python/src/com/google/idea/blaze/python/run/filter/BlazePyTracebackFilter.java b/python/src/com/google/idea/blaze/python/run/filter/BlazePyTracebackFilter.java
new file mode 100644
index 0000000..a13892d
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/filter/BlazePyTracebackFilter.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run.filter;
+
+import com.google.idea.blaze.base.run.filter.FileResolver;
+import com.intellij.execution.filters.ConsoleFilterProvider;
+import com.intellij.execution.filters.Filter;
+import com.intellij.execution.filters.OpenFileHyperlinkInfo;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.annotation.Nullable;
+
+/** Parses traceback links in python test results */
+public class BlazePyTracebackFilter implements Filter {
+
+  /** Provider for traceback filter */
+  public static class BlazePyTracebackFilterProvider implements ConsoleFilterProvider {
+    @Override
+    public Filter[] getDefaultFilters(Project project) {
+      return new Filter[] {new BlazePyTracebackFilter(project)};
+    }
+  }
+
+  private static final Pattern TRACEBACK_FILE_LINE =
+      Pattern.compile("File \"(.*?)\", line ([0-9]+), in (.*?)");
+
+  private final Project project;
+
+  private BlazePyTracebackFilter(Project project) {
+    this.project = project;
+  }
+
+  @Nullable
+  @Override
+  public Result applyFilter(String line, int entireLength) {
+    Matcher matcher = TRACEBACK_FILE_LINE.matcher(line);
+    if (!matcher.find()) {
+      return null;
+    }
+    String filePath = matcher.group(1);
+    if (filePath == null) {
+      return null;
+    }
+    VirtualFile file = FileResolver.resolve(project, filePath);
+    if (file == null) {
+      return null;
+    }
+    int lineNumber = parseLineNumber(matcher.group(2));
+    OpenFileHyperlinkInfo hyperlink = new OpenFileHyperlinkInfo(project, file, lineNumber - 1);
+
+    int startIx = matcher.start(2) - "line ".length();
+    int endIx = matcher.end(2);
+    if (startIx < 0) {
+      startIx = matcher.start(1);
+      endIx = matcher.end(1);
+    }
+    int offset = entireLength - line.length();
+    return new Result(startIx + offset, endIx + offset, hyperlink);
+  }
+
+  /** defaults to -1 if no line number can be parsed. */
+  private static int parseLineNumber(@Nullable String string) {
+    try {
+      return string != null ? Integer.parseInt(string) : -1;
+    } catch (NumberFormatException e) {
+      return -1;
+    }
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/producers/BlazePyBinaryConfigurationProducer.java b/python/src/com/google/idea/blaze/python/run/producers/BlazePyBinaryConfigurationProducer.java
new file mode 100644
index 0000000..1b61af0
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/producers/BlazePyBinaryConfigurationProducer.java
@@ -0,0 +1,139 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run.producers;
+
+import com.google.common.collect.ImmutableCollection;
+import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
+import com.google.idea.blaze.base.ideinfo.TargetKey;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.model.primitives.Kind;
+import com.google.idea.blaze.base.model.primitives.Label;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfigurationType;
+import com.google.idea.blaze.base.run.producers.BlazeRunConfigurationProducer;
+import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.targetmaps.SourceToTargetMap;
+import com.intellij.execution.Location;
+import com.intellij.execution.actions.ConfigurationContext;
+import com.intellij.openapi.util.Ref;
+import com.intellij.openapi.util.io.FileUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.python.psi.PyFile;
+import java.io.File;
+import javax.annotation.Nullable;
+
+/** Producer for run configurations related to py_binary main classes in Blaze. */
+public class BlazePyBinaryConfigurationProducer
+    extends BlazeRunConfigurationProducer<BlazeCommandRunConfiguration> {
+
+  public BlazePyBinaryConfigurationProducer() {
+    super(BlazeCommandRunConfigurationType.getInstance());
+  }
+
+  @Override
+  protected boolean doSetupConfigFromContext(
+      BlazeCommandRunConfiguration configuration,
+      ConfigurationContext context,
+      Ref<PsiElement> sourceElement) {
+
+    Location<?> location = context.getLocation();
+    if (location == null) {
+      return false;
+    }
+    PsiElement element = location.getPsiElement();
+    PsiFile file = element.getContainingFile();
+    if (!(file instanceof PyFile)) {
+      return false;
+    }
+    Label binaryTarget = getTargetLabel(file);
+    if (binaryTarget == null) {
+      return false;
+    }
+    configuration.setTarget(binaryTarget);
+    sourceElement.set(file);
+
+    BlazeCommandRunConfigurationCommonState handlerState =
+        configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
+    if (handlerState == null) {
+      return false;
+    }
+    handlerState.getCommandState().setCommand(BlazeCommandName.RUN);
+    configuration.setGeneratedName();
+    return true;
+  }
+
+  @Override
+  protected boolean doIsConfigFromContext(
+      BlazeCommandRunConfiguration configuration, ConfigurationContext context) {
+
+    BlazeCommandRunConfigurationCommonState handlerState =
+        configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
+    if (handlerState == null
+        || !BlazeCommandName.RUN.equals(handlerState.getCommandState().getCommand())) {
+      return false;
+    }
+
+    Location<?> location = context.getLocation();
+    if (location == null) {
+      return false;
+    }
+    PsiElement element = location.getPsiElement();
+    PsiFile file = element.getContainingFile();
+    if (!(file instanceof PyFile)) {
+      return false;
+    }
+    Label binaryTarget = getTargetLabel(file);
+    if (binaryTarget == null) {
+      return false;
+    }
+    return binaryTarget.equals(configuration.getTarget());
+  }
+
+  @Nullable
+  private static Label getTargetLabel(PsiFile psiFile) {
+    VirtualFile vf = psiFile.getVirtualFile();
+    if (vf == null) {
+      return null;
+    }
+    File file = new File(vf.getPath());
+    ImmutableCollection<TargetKey> targetKeys =
+        SourceToTargetMap.getInstance(psiFile.getProject()).getRulesForSourceFile(file);
+    BlazeProjectData blazeProjectData =
+        BlazeProjectDataManager.getInstance(psiFile.getProject()).getBlazeProjectData();
+    if (blazeProjectData == null) {
+      return null;
+    }
+
+    String fileName = FileUtil.getNameWithoutExtension(file);
+    for (TargetKey key : targetKeys) {
+      TargetIdeInfo target = blazeProjectData.targetMap.get(key);
+      if (target == null) {
+        continue;
+      }
+      if (target.kind == Kind.PY_BINARY || target.kind == Kind.PY_APPENGINE_BINARY) {
+        // The 'main' attribute isn't exposed, so only suggest a binary if the name matches
+        if (key.label.targetName().toString().equals(fileName)) {
+          return key.label;
+        }
+      }
+    }
+    return null;
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/producers/BlazePyTestConfigurationProducer.java b/python/src/com/google/idea/blaze/python/run/producers/BlazePyTestConfigurationProducer.java
new file mode 100644
index 0000000..5d21fa8
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/producers/BlazePyTestConfigurationProducer.java
@@ -0,0 +1,185 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run.producers;
+
+import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.command.BlazeFlags;
+import com.google.idea.blaze.base.model.primitives.Label;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfigurationType;
+import com.google.idea.blaze.base.run.BlazeConfigurationNameBuilder;
+import com.google.idea.blaze.base.run.TestTargetHeuristic;
+import com.google.idea.blaze.base.run.producers.BlazeRunConfigurationProducer;
+import com.google.idea.blaze.base.run.smrunner.SmRunnerUtils;
+import com.google.idea.blaze.base.run.state.BlazeCommandRunConfigurationCommonState;
+import com.google.idea.blaze.python.run.PyTestUtils;
+import com.intellij.execution.Location;
+import com.intellij.execution.actions.ConfigurationContext;
+import com.intellij.openapi.util.Ref;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyFile;
+import com.jetbrains.python.psi.PyFunction;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import javax.annotation.Nullable;
+
+/** Producer for run configurations related to python test classes in Blaze. */
+public class BlazePyTestConfigurationProducer
+    extends BlazeRunConfigurationProducer<BlazeCommandRunConfiguration> {
+
+  public BlazePyTestConfigurationProducer() {
+    super(BlazeCommandRunConfigurationType.getInstance());
+  }
+
+  private static class TestLocation {
+    @Nullable private final PyClass testClass;
+    @Nullable private final PyFunction testFunction;
+
+    private TestLocation(@Nullable PyClass testClass, @Nullable PyFunction testFunction) {
+      this.testClass = testClass;
+      this.testFunction = testFunction;
+    }
+
+    @Nullable
+    private String testFilter() {
+      if (testClass == null) {
+        return null;
+      }
+      return testFunction == null
+          ? testClass.getName()
+          : testClass.getName() + "." + testFunction.getName();
+    }
+
+    @Nullable
+    PsiElement sourceElement(PsiFile file) {
+      if (testFunction != null) {
+        return testFunction;
+      }
+      return testClass != null ? testClass : file;
+    }
+  }
+
+  /**
+   * The single selected {@link PsiElement}. Returns null if we're in a SM runner tree UI context
+   * (handled by a different producer).
+   */
+  @Nullable
+  private static PsiElement selectedPsiElement(ConfigurationContext context) {
+    List<Location<?>> selectedTestUiElements =
+        SmRunnerUtils.getSelectedSmRunnerTreeElements(context);
+    if (!selectedTestUiElements.isEmpty()) {
+      return null;
+    }
+    Location<?> location = context.getLocation();
+    return location != null ? location.getPsiElement() : null;
+  }
+
+  @Override
+  protected boolean doSetupConfigFromContext(
+      BlazeCommandRunConfiguration configuration,
+      ConfigurationContext context,
+      Ref<PsiElement> sourceElement) {
+
+    PsiElement element = selectedPsiElement(context);
+    if (element == null) {
+      return false;
+    }
+    PsiFile file = element.getContainingFile();
+    if (!(file instanceof PyFile) || !PyTestUtils.isTestFile((PyFile) file)) {
+      return false;
+    }
+    Label testTarget = TestTargetHeuristic.testTargetForPsiElement(element);
+    if (testTarget == null) {
+      return false;
+    }
+    configuration.setTarget(testTarget);
+
+    TestLocation testLocation = testLocation(element);
+    sourceElement.set(testLocation.sourceElement(file));
+    BlazeCommandRunConfigurationCommonState handlerState =
+        configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
+    if (handlerState == null) {
+      return false;
+    }
+    handlerState.getCommandState().setCommand(BlazeCommandName.TEST);
+
+    ImmutableList.Builder<String> flags = ImmutableList.builder();
+    String filter = testLocation.testFilter();
+    if (filter != null) {
+      flags.add(BlazeFlags.TEST_FILTER + "=" + filter);
+    }
+    // remove conflicting flags from initial configuration
+    List<String> oldFlags = new ArrayList<>(handlerState.getBlazeFlagsState().getRawFlags());
+    oldFlags.removeIf((flag) -> flag.startsWith(BlazeFlags.TEST_FILTER));
+    flags.addAll(oldFlags);
+    handlerState.getBlazeFlagsState().setRawFlags(flags.build());
+
+    BlazeConfigurationNameBuilder nameBuilder = new BlazeConfigurationNameBuilder(configuration);
+    nameBuilder.setTargetString(
+        filter != null
+            ? String.format("%s (%s)", filter, testTarget.toString())
+            : testTarget.toString());
+    configuration.setName(nameBuilder.build());
+    configuration.setNameChangedByUser(true); // don't revert to generated name
+    return true;
+  }
+
+  @Override
+  protected boolean doIsConfigFromContext(
+      BlazeCommandRunConfiguration configuration, ConfigurationContext context) {
+
+    BlazeCommandRunConfigurationCommonState handlerState =
+        configuration.getHandlerStateIfType(BlazeCommandRunConfigurationCommonState.class);
+    if (handlerState == null
+        || !BlazeCommandName.TEST.equals(handlerState.getCommandState().getCommand())) {
+      return false;
+    }
+
+    PsiElement element = selectedPsiElement(context);
+    if (element == null) {
+      return false;
+    }
+    if (!(element.getContainingFile() instanceof PyFile)) {
+      return false;
+    }
+    Label testTarget = TestTargetHeuristic.testTargetForPsiElement(element);
+    if (testTarget == null || !testTarget.equals(configuration.getTarget())) {
+      return false;
+    }
+    String filter = testLocation(element).testFilter();
+
+    String filterFlag = handlerState.getTestFilterFlag();
+    return (filterFlag == null && filter == null)
+        || Objects.equals(filterFlag, BlazeFlags.TEST_FILTER + "=" + filter);
+  }
+
+  private static TestLocation testLocation(PsiElement element) {
+    PyClass pyClass = PsiTreeUtil.getParentOfType(element, PyClass.class, false);
+    if (pyClass == null || !PyTestUtils.isTestClass(pyClass)) {
+      return new TestLocation(null, null);
+    }
+    PyFunction pyFunction = PsiTreeUtil.getParentOfType(element, PyFunction.class, false);
+    if (pyFunction != null && PyTestUtils.isTestFunction(pyFunction)) {
+      return new TestLocation(pyClass, pyFunction);
+    }
+    return new TestLocation(pyClass, null);
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/producers/NonBlazeProducerSuppressor.java b/python/src/com/google/idea/blaze/python/run/producers/NonBlazeProducerSuppressor.java
new file mode 100644
index 0000000..d4cabff
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/producers/NonBlazeProducerSuppressor.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run.producers;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.idea.blaze.base.settings.Blaze;
+import com.google.idea.sdkcompat.python.PyConfigurationProducersList;
+import com.intellij.execution.RunConfigurationProducerService;
+import com.intellij.execution.actions.RunConfigurationProducer;
+import com.intellij.openapi.components.AbstractProjectComponent;
+import com.intellij.openapi.project.Project;
+
+/** Suppresses certain non-Blaze configuration producers in Blaze projects. */
+public class NonBlazeProducerSuppressor extends AbstractProjectComponent {
+
+  public NonBlazeProducerSuppressor(Project project) {
+    super(project);
+  }
+
+  @Override
+  public void projectOpened() {
+    if (Blaze.isBlazeProject(myProject)) {
+      suppressProducers(myProject);
+    }
+  }
+
+  @VisibleForTesting
+  @SuppressWarnings("unchecked")
+  static void suppressProducers(Project project) {
+    RunConfigurationProducerService producerService =
+        RunConfigurationProducerService.getInstance(project);
+    PyConfigurationProducersList.PRODUCERS_TO_SUPPRESS.forEach(
+        (klass) -> {
+          if (RunConfigurationProducer.class.isAssignableFrom(klass)) {
+            producerService.addIgnoredProducer((Class<RunConfigurationProducer<?>>) klass);
+          }
+        });
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/run/smrunner/BlazePythonTestEventsHandler.java b/python/src/com/google/idea/blaze/python/run/smrunner/BlazePythonTestEventsHandler.java
new file mode 100644
index 0000000..f39eb76
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/smrunner/BlazePythonTestEventsHandler.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run.smrunner;
+
+import com.google.common.base.Joiner;
+import com.google.idea.blaze.base.command.BlazeFlags;
+import com.google.idea.blaze.base.model.primitives.Kind;
+import com.google.idea.blaze.base.run.smrunner.BlazeTestEventsHandler;
+import com.intellij.execution.Location;
+import com.intellij.execution.testframework.sm.runner.SMTestLocator;
+import com.intellij.openapi.project.Project;
+import com.intellij.psi.PsiElement;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyFunction;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.List;
+import javax.annotation.Nullable;
+
+/** Provides python-specific methods needed by the SM-runner test UI. */
+public class BlazePythonTestEventsHandler extends BlazeTestEventsHandler {
+
+  @Override
+  protected EnumSet<Kind> handledKinds() {
+    return EnumSet.of(Kind.PY_TEST);
+  }
+
+  @Override
+  public SMTestLocator getTestLocator() {
+    return BlazePythonTestLocator.INSTANCE;
+  }
+
+  @Override
+  public String testDisplayName(@Nullable Kind kind, String rawName) {
+    int lastDotIndex = rawName.lastIndexOf('.');
+    return lastDotIndex != -1 ? rawName.substring(lastDotIndex + 1) : rawName;
+  }
+
+  @Nullable
+  @Override
+  public String getTestFilter(Project project, List<Location<?>> testLocations) {
+    // python test runner parses filters of the form "class1.method1 class2.method2 ..."
+    List<String> filters = new ArrayList<>();
+    for (Location<?> location : testLocations) {
+      String filter = getFilter(location.getPsiElement());
+      if (filter != null) {
+        filters.add(filter);
+      }
+    }
+    if (filters.isEmpty()) {
+      return null;
+    }
+    return String.format("%s=%s", BlazeFlags.TEST_FILTER, Joiner.on(' ').join(filters));
+  }
+
+  @Nullable
+  private static String getFilter(PsiElement psiElement) {
+    if (psiElement instanceof PyClass) {
+      return ((PyClass) psiElement).getName();
+    }
+    if (!(psiElement instanceof PyFunction)) {
+      return null;
+    }
+    PyClass pyClass = ((PyFunction) psiElement).getContainingClass();
+    if (pyClass == null) {
+      return null;
+    }
+    String methodName = ((PyFunction) psiElement).getName();
+    String className = pyClass.getName();
+    return methodName != null && className != null ? className + "." + methodName : null;
+  }
+
+}
diff --git a/python/src/com/google/idea/blaze/python/run/smrunner/BlazePythonTestLocator.java b/python/src/com/google/idea/blaze/python/run/smrunner/BlazePythonTestLocator.java
new file mode 100644
index 0000000..5bcfdc2
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/run/smrunner/BlazePythonTestLocator.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run.smrunner;
+
+import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.run.smrunner.SmRunnerUtils;
+import com.google.idea.blaze.python.run.PyTestUtils;
+import com.intellij.execution.Location;
+import com.intellij.execution.PsiLocation;
+import com.intellij.execution.testframework.sm.runner.SMTestLocator;
+import com.intellij.openapi.progress.ProgressManager;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyFunction;
+import com.jetbrains.python.psi.stubs.PyClassNameIndex;
+import java.util.ArrayList;
+import java.util.List;
+import javax.annotation.Nullable;
+
+/** Locate python test classes / methods for test UI navigation. */
+public final class BlazePythonTestLocator implements SMTestLocator {
+
+  public static final BlazePythonTestLocator INSTANCE = new BlazePythonTestLocator();
+
+  static final String PY_TESTCASE_PREFIX = "__main__.";
+
+  private BlazePythonTestLocator() {}
+
+  @Override
+  public List<Location> getLocation(
+      String protocol, String path, Project project, GlobalSearchScope scope) {
+    if (protocol.equals(SmRunnerUtils.GENERIC_SUITE_PROTOCOL)) {
+      return findTestClass(project, scope, path);
+    }
+    if (protocol.equals(SmRunnerUtils.GENERIC_TEST_PROTOCOL)) {
+      path = StringUtil.trimStart(path, PY_TESTCASE_PREFIX);
+      String[] components = path.split("\\.");
+      if (components.length < 2) {
+        return ImmutableList.of();
+      }
+      return findTestMethod(
+          project, scope, components[components.length - 2], components[components.length - 1]);
+    }
+    return ImmutableList.of();
+  }
+
+  private static List<Location> findTestMethod(
+      Project project, GlobalSearchScope scope, String className, @Nullable String methodName) {
+    List<Location> results = new ArrayList<>();
+    if (methodName == null) {
+      return findTestClass(project, scope, className);
+    }
+    for (PyClass pyClass : PyClassNameIndex.find(className, project, scope)) {
+      ProgressManager.checkCanceled();
+      if (PyTestUtils.isTestClass(pyClass)) {
+        PyFunction method = pyClass.findMethodByName(methodName, true, null);
+        if (method != null && PyTestUtils.isTestFunction(method)) {
+          results.add(new PsiLocation<>(project, method));
+        }
+        results.add(new PsiLocation<>(project, pyClass));
+      }
+    }
+    return results;
+  }
+
+  private static List<Location> findTestClass(
+      Project project, GlobalSearchScope scope, String className) {
+    List<Location> results = new ArrayList<>();
+    for (PyClass pyClass : PyClassNameIndex.find(className, project, scope)) {
+      ProgressManager.checkCanceled();
+      if (PyTestUtils.isTestClass(pyClass)) {
+        results.add(new PsiLocation<>(project, pyClass));
+      }
+    }
+    return results;
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/search/BlazePyUseScopeEnlarger.java b/python/src/com/google/idea/blaze/python/search/BlazePyUseScopeEnlarger.java
new file mode 100644
index 0000000..908a527
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/search/BlazePyUseScopeEnlarger.java
@@ -0,0 +1,68 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.search;
+
+import com.google.idea.blaze.base.settings.Blaze;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.intellij.psi.search.SearchScope;
+import com.intellij.psi.search.UseScopeEnlarger;
+import com.jetbrains.python.PyNames;
+import com.jetbrains.python.psi.PyFile;
+import javax.annotation.Nullable;
+
+/**
+ * Genfiles (and files in READONLY, etc.) are not included in the project scope. To resolve
+ * references to these files, we need to either add them to the project scope (which would destroy
+ * performance) or modify the default scope behavior, as done here.
+ */
+public class BlazePyUseScopeEnlarger extends UseScopeEnlarger {
+
+  @Nullable
+  @Override
+  public SearchScope getAdditionalUseScope(PsiElement element) {
+    if (!Blaze.isBlazeProject(element.getProject())) {
+      return null;
+    }
+    if (isPyPackageOutsideProject(element) || isPyFileOutsideProject(element)) {
+      return GlobalSearchScope.projectScope(element.getProject());
+    }
+    return null;
+  }
+
+  private static boolean isPyPackageOutsideProject(PsiElement element) {
+    if (!(element instanceof PsiDirectory)) {
+      return false;
+    }
+    PsiDirectory dir = (PsiDirectory) element;
+    return dir.findFile(PyNames.INIT_DOT_PY) != null
+        && !inProjectScope(dir.getProject(), dir.getVirtualFile());
+  }
+
+  private static boolean isPyFileOutsideProject(PsiElement element) {
+    PsiFile file = element.getContainingFile();
+    return file instanceof PyFile
+        && !inProjectScope(file.getProject(), file.getViewProvider().getVirtualFile());
+  }
+
+  private static boolean inProjectScope(Project project, VirtualFile virtualFile) {
+    return GlobalSearchScope.projectScope(project).contains(virtualFile);
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/sync/AlwaysPresentPythonSyncPlugin.java b/python/src/com/google/idea/blaze/python/sync/AlwaysPresentPythonSyncPlugin.java
new file mode 100644
index 0000000..7499620
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/sync/AlwaysPresentPythonSyncPlugin.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.sync;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.model.primitives.Kind;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.plugin.PluginUtils;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.output.IssueOutput;
+import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
+import com.google.idea.blaze.base.sync.projectview.ImportRoots;
+import com.google.idea.blaze.python.PythonPluginUtils;
+import com.intellij.openapi.project.Project;
+import java.util.Set;
+
+/**
+ * Unlike most of the python-specific code, will be run even if the JetBrains python plugin isn't
+ * enabled.
+ */
+public class AlwaysPresentPythonSyncPlugin extends BlazeSyncPlugin.Adapter {
+
+  @Override
+  public ImmutableList<WorkspaceType> getSupportedWorkspaceTypes() {
+    // retained for backwards-compatibility
+    return ImmutableList.of(WorkspaceType.PYTHON);
+  }
+
+  @Override
+  public Set<LanguageClass> getSupportedLanguagesInWorkspace(WorkspaceType workspaceType) {
+    // retained for backwards-compatibility
+    return ImmutableSet.of(LanguageClass.PYTHON);
+  }
+
+  @Override
+  public boolean validate(
+      Project project, BlazeContext context, BlazeProjectData blazeProjectData) {
+    ImportRoots importRoots = ImportRoots.forProjectSafe(project);
+    if (importRoots == null) {
+      return true;
+    }
+    boolean hasPythonTarget =
+        blazeProjectData
+            .targetMap
+            .targets()
+            .stream()
+            .filter(target -> importRoots.importAsSource(target.key.label))
+            .anyMatch(target -> target.kindIsOneOf(Kind.allKindsForLanguage(LanguageClass.PYTHON)));
+    if (!hasPythonTarget) {
+      return true;
+    }
+    String pluginId = PythonPluginUtils.getPythonPluginId();
+    if (!PluginUtils.isPluginEnabled(pluginId)) {
+      IssueOutput.warn(
+              "Your project appears to contain Python targets. To enable Python support, "
+                  + "install/enable the JetBrains python plugin, then restart the IDE")
+          .navigatable(PluginUtils.installOrEnablePluginNavigable(pluginId))
+          .submit(context);
+      return false;
+    }
+    return true;
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/sync/BlazePythonSyncPlugin.java b/python/src/com/google/idea/blaze/python/sync/BlazePythonSyncPlugin.java
new file mode 100644
index 0000000..2354f3c
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/sync/BlazePythonSyncPlugin.java
@@ -0,0 +1,358 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.sync;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.io.VirtualFileSystemProvider;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.model.BlazeVersionData;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.projectview.ProjectView;
+import com.google.idea.blaze.base.projectview.ProjectViewEdit;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.projectview.ProjectViewSet.ProjectViewFile;
+import com.google.idea.blaze.base.projectview.section.ListSection;
+import com.google.idea.blaze.base.projectview.section.ScalarSection;
+import com.google.idea.blaze.base.projectview.section.sections.AdditionalLanguagesSection;
+import com.google.idea.blaze.base.projectview.section.sections.WorkspaceTypeSection;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.output.IssueOutput;
+import com.google.idea.blaze.base.settings.BlazeUserSettings;
+import com.google.idea.blaze.base.sync.BlazeSyncManager;
+import com.google.idea.blaze.base.sync.BlazeSyncParams;
+import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
+import com.google.idea.blaze.base.sync.GenericSourceFolderProvider;
+import com.google.idea.blaze.base.sync.SourceFolderProvider;
+import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
+import com.google.idea.common.experiments.BoolExperiment;
+import com.google.idea.sdkcompat.transactions.Transactions;
+import com.intellij.facet.Facet;
+import com.intellij.facet.FacetManager;
+import com.intellij.facet.ModifiableFacetModel;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.module.ModuleType;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.projectRoots.impl.SdkConfigurationUtil;
+import com.intellij.openapi.roots.ModifiableRootModel;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.openapi.roots.libraries.Library;
+import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
+import com.intellij.openapi.ui.Messages;
+import com.intellij.openapi.vfs.VfsUtil;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.pom.NavigatableAdapter;
+import com.intellij.util.PlatformUtils;
+import com.jetbrains.python.PythonModuleTypeBase;
+import com.jetbrains.python.facet.PythonFacet;
+import com.jetbrains.python.facet.PythonFacetType;
+import com.jetbrains.python.sdk.PythonSdkType;
+import java.util.List;
+import java.util.Set;
+import javax.annotation.Nullable;
+
+/** Allows people to use a python workspace. */
+public class BlazePythonSyncPlugin extends BlazeSyncPlugin.Adapter {
+
+  private static final Logger logger = Logger.getInstance(BlazePythonSyncPlugin.class);
+
+  private static final BoolExperiment refreshExecRoot =
+      new BoolExperiment("refresh.exec.root.python", true);
+
+  @Override
+  public Set<LanguageClass> getSupportedLanguagesInWorkspace(WorkspaceType workspaceType) {
+    // supported for legacy reasons, but otherwise ignored.
+    return ImmutableSet.of(LanguageClass.PYTHON);
+  }
+
+  @Override
+  public Set<LanguageClass> getAlwaysActiveLanguages() {
+    return ImmutableSet.of(LanguageClass.PYTHON);
+  }
+
+  @Nullable
+  @Override
+  public ModuleType getWorkspaceModuleType(WorkspaceType workspaceType) {
+    // left here for backwards compatibility -- python workspace types are deprecated.
+    if (workspaceType == WorkspaceType.PYTHON && supportsPythonWorkspaceType()) {
+      return PythonModuleTypeBase.getInstance();
+    }
+    return null;
+  }
+
+  private static boolean supportsPythonWorkspaceType() {
+    return !PlatformUtils.isCLion();
+  }
+
+  @Override
+  public ImmutableList<WorkspaceType> getSupportedWorkspaceTypes() {
+    // 'supports' python by giving a more detailed error message with quick-fix later in the sync
+    // process, in the case where a python workspace type is not supported.
+    return ImmutableList.of(WorkspaceType.PYTHON);
+  }
+
+  @Nullable
+  @Override
+  public SourceFolderProvider getSourceFolderProvider(BlazeProjectData projectData) {
+    if (!projectData.workspaceLanguageSettings.isWorkspaceType(WorkspaceType.PYTHON)) {
+      return null;
+    }
+    return GenericSourceFolderProvider.INSTANCE;
+  }
+
+  @Override
+  public void updateProjectStructure(
+      Project project,
+      BlazeContext context,
+      WorkspaceRoot workspaceRoot,
+      ProjectViewSet projectViewSet,
+      BlazeProjectData blazeProjectData,
+      @Nullable BlazeProjectData oldBlazeProjectData,
+      ModuleEditor moduleEditor,
+      Module workspaceModule,
+      ModifiableRootModel workspaceModifiableModel) {
+    updatePythonFacet(context, blazeProjectData, workspaceModule, workspaceModifiableModel);
+  }
+
+  @Override
+  public void refreshVirtualFileSystem(BlazeProjectData blazeProjectData) {
+    if (!refreshExecRoot.getValue()) {
+      return;
+    }
+    long start = System.currentTimeMillis();
+    refreshExecRoot(blazeProjectData);
+    long end = System.currentTimeMillis();
+    logger.info(String.format("Refreshing execution root took: %d ms", (end - start)));
+  }
+
+  private static void refreshExecRoot(BlazeProjectData blazeProjectData) {
+    // recursive refresh of the blaze execution root. This is required because our blaze aspect
+    // can't yet tell us exactly which genfiles are required to resolve the project.
+    VirtualFile execRoot =
+        VirtualFileSystemProvider.getInstance()
+            .getSystem()
+            .refreshAndFindFileByIoFile(blazeProjectData.blazeInfo.getExecutionRoot());
+    if (execRoot != null) {
+      VfsUtil.markDirtyAndRefresh(false, true, true, execRoot);
+    }
+  }
+
+  private static void updatePythonFacet(
+      BlazeContext context,
+      BlazeProjectData blazeProjectData,
+      Module workspaceModule,
+      ModifiableRootModel workspaceModifiableModel) {
+    if (!blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.PYTHON)
+        || blazeProjectData.workspaceLanguageSettings.isWorkspaceType(WorkspaceType.PYTHON)) {
+      removeFacet(workspaceModule);
+      return;
+    }
+    if (ModuleType.get(workspaceModule) instanceof PythonModuleTypeBase) {
+      return;
+    }
+    PythonFacet pythonFacet = getOrCreatePythonFacet(context, workspaceModule);
+    if (pythonFacet == null) {
+      return;
+    }
+    Library pythonLib = getFacetLibrary(pythonFacet);
+    if (pythonLib != null) {
+      workspaceModifiableModel.addLibraryEntry(pythonLib);
+    }
+  }
+
+  private static void removeFacet(Module workspaceModule) {
+    FacetManager manager = FacetManager.getInstance(workspaceModule);
+    ModifiableFacetModel facetModel = manager.createModifiableModel();
+    PythonFacet facet = manager.findFacet(PythonFacet.ID, "Python");
+    if (facet != null) {
+      facetModel.removeFacet(facet);
+      facetModel.commit();
+    }
+  }
+
+  @Nullable
+  private static PythonFacet getOrCreatePythonFacet(BlazeContext context, Module module) {
+    PythonFacet facet = findPythonFacet(module);
+    if (facet != null && facetHasSdk(facet)) {
+      return facet;
+    }
+    FacetManager manager = FacetManager.getInstance(module);
+    ModifiableFacetModel facetModel = manager.createModifiableModel();
+    if (facet != null) {
+      // we can't modify in place, IntelliJ has no hook to trigger change events. Instead we create
+      // a new facet.
+      facetModel.removeFacet(facet);
+    }
+    Sdk sdk = getOrCreatePythonSdk();
+    if (sdk == null) {
+      String msg =
+          "Unable to find a Python SDK installed.\n"
+              + "After configuring a suitable SDK in the \"Project Structure\" dialog, "
+              + "sync the project again.";
+      IssueOutput.error(msg).submit(context);
+      return null;
+    }
+    facet = manager.createFacet(PythonFacetType.getInstance(), "Python", null);
+    facetModel.addFacet(facet);
+    facetModel.commit();
+    return facet;
+  }
+
+  private static boolean facetHasSdk(PythonFacet facet) {
+    // facets aren't properly updated when SDKs change (e.g. when they're deleted), so we need to
+    // manually check against the full list.
+    Sdk sdk = facet.getConfiguration().getSdk();
+    return sdk != null && PythonSdkType.getAllSdks().contains(sdk);
+  }
+
+  @Nullable
+  private static Library getFacetLibrary(PythonFacet pythonFacet) {
+    Sdk sdk = pythonFacet.getConfiguration().getSdk();
+    if (sdk == null) {
+      return null;
+    }
+    return LibraryTablesRegistrar.getInstance()
+        .getLibraryTable()
+        .getLibraryByName(sdk.getName() + PythonFacet.PYTHON_FACET_LIBRARY_NAME_SUFFIX);
+  }
+
+  private static PythonFacet findPythonFacet(Module module) {
+    final Facet<?>[] allFacets = FacetManager.getInstance(module).getAllFacets();
+    for (Facet<?> facet : allFacets) {
+      if (facet instanceof PythonFacet) {
+        return (PythonFacet) facet;
+      }
+    }
+    return null;
+  }
+
+  @Override
+  public void updateProjectSdk(
+      Project project,
+      BlazeContext context,
+      ProjectViewSet projectViewSet,
+      BlazeVersionData blazeVersionData,
+      BlazeProjectData blazeProjectData) {
+    if (!blazeProjectData.workspaceLanguageSettings.isWorkspaceType(WorkspaceType.PYTHON)) {
+      return;
+    }
+    Sdk currentSdk = ProjectRootManager.getInstance(project).getProjectSdk();
+    if (currentSdk != null && currentSdk.getSdkType() instanceof PythonSdkType) {
+      return;
+    }
+    Sdk sdk = getOrCreatePythonSdk();
+    if (sdk != null) {
+      setProjectSdk(project, sdk);
+    }
+  }
+
+  @Nullable
+  private static Sdk getOrCreatePythonSdk() {
+    List<Sdk> sdk = PythonSdkType.getAllSdks();
+    if (!sdk.isEmpty()) {
+      return sdk.get(0);
+    }
+    return SdkConfigurationUtil.createAndAddSDK("/usr/bin/python2.7", PythonSdkType.getInstance());
+  }
+
+  private static void setProjectSdk(Project project, Sdk sdk) {
+    Transactions.submitTransactionAndWait(
+        () ->
+            ApplicationManager.getApplication()
+                .runWriteAction(() -> ProjectRootManager.getInstance(project).setProjectSdk(sdk)));
+  }
+
+  @Override
+  public boolean validateProjectView(
+      @Nullable Project project,
+      BlazeContext context,
+      ProjectViewSet projectViewSet,
+      WorkspaceLanguageSettings workspaceLanguageSettings) {
+    ProjectViewFile topLevelProjectViewFile = projectViewSet.getTopLevelProjectViewFile();
+    if (!supportsPythonWorkspaceType()
+        && workspaceLanguageSettings.isWorkspaceType(WorkspaceType.PYTHON)) {
+      String msg = "Python workspace type is not supported (and is unnecessary) for this IDE. ";
+      boolean fixable =
+          topLevelProjectViewFile != null
+              && topLevelProjectViewFile.projectView.getScalarValue(WorkspaceTypeSection.KEY)
+                  == WorkspaceType.PYTHON;
+      msg +=
+          fixable
+              ? "Click here to remove it, retaining python support"
+              : "Please remove it and resync.";
+      IssueOutput.error(msg)
+          .navigatable(
+              project == null || !fixable
+                  ? null
+                  : new NavigatableAdapter() {
+                    @Override
+                    public void navigate(boolean requestFocus) {
+                      fixLanguageSupport(project, true);
+                    }
+                  })
+          .submit(context);
+      return false;
+    }
+    return true;
+  }
+
+  private static void fixLanguageSupport(Project project, boolean removeWorkspaceType) {
+    ProjectViewEdit edit =
+        ProjectViewEdit.editLocalProjectView(
+            project,
+            builder -> {
+              if (removeWorkspaceType) {
+                removePythonWorkspaceType(builder);
+              }
+              removeFromAdditionalLanguages(builder);
+              return true;
+            });
+    if (edit == null) {
+      Messages.showErrorDialog(
+          "Could not modify project view. Check for errors in your project view and try again",
+          "Error");
+      return;
+    }
+    edit.apply();
+
+    BlazeSyncManager.getInstance(project)
+        .requestProjectSync(
+            new BlazeSyncParams.Builder("Sync", BlazeSyncParams.SyncMode.INCREMENTAL)
+                .addProjectViewTargets(true)
+                .addWorkingSet(BlazeUserSettings.getInstance().getExpandSyncToWorkingSet())
+                .build());
+  }
+
+  private static void removePythonWorkspaceType(ProjectView.Builder builder) {
+    ScalarSection<WorkspaceType> section = builder.getLast(WorkspaceTypeSection.KEY);
+    if (section != null && section.getValue() == WorkspaceType.PYTHON) {
+      builder.remove(section);
+    }
+  }
+
+  private static void removeFromAdditionalLanguages(ProjectView.Builder builder) {
+    ListSection<LanguageClass> existingSection = builder.getLast(AdditionalLanguagesSection.KEY);
+    builder.replace(
+        existingSection,
+        ListSection.update(AdditionalLanguagesSection.KEY, existingSection)
+            .remove(LanguageClass.PYTHON));
+  }
+}
diff --git a/python/src/com/google/idea/blaze/python/sync/PythonPrefetchFileSource.java b/python/src/com/google/idea/blaze/python/sync/PythonPrefetchFileSource.java
new file mode 100644
index 0000000..29bde5e
--- /dev/null
+++ b/python/src/com/google/idea/blaze/python/sync/PythonPrefetchFileSource.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.sync;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.prefetch.PrefetchFileSource;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.intellij.openapi.project.Project;
+import java.io.File;
+import java.util.Collection;
+import java.util.Set;
+
+/** Causes python files to become prefetched. */
+public class PythonPrefetchFileSource implements PrefetchFileSource {
+  @Override
+  public void addFilesToPrefetch(
+      Project project,
+      ProjectViewSet projectViewSet,
+      BlazeProjectData blazeProjectData,
+      Collection<File> files) {}
+
+  @Override
+  public Set<String> prefetchSrcFileExtensions() {
+    return ImmutableSet.of("py", "pyw", "pyi");
+  }
+}
diff --git a/python/tests/integrationtests/com/google/idea/blaze/python/run/producers/BlazePyBinaryConfigurationProducerTest.java b/python/tests/integrationtests/com/google/idea/blaze/python/run/producers/BlazePyBinaryConfigurationProducerTest.java
new file mode 100644
index 0000000..26e6177
--- /dev/null
+++ b/python/tests/integrationtests/com/google/idea/blaze/python/run/producers/BlazePyBinaryConfigurationProducerTest.java
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run.producers;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
+import com.google.idea.blaze.base.ideinfo.TargetMapBuilder;
+import com.google.idea.blaze.base.model.MockBlazeProjectDataBuilder;
+import com.google.idea.blaze.base.model.MockBlazeProjectDataManager;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
+import com.google.idea.blaze.base.run.producer.BlazeRunConfigurationProducerTestCase;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.intellij.execution.actions.ConfigurationContext;
+import com.intellij.execution.actions.ConfigurationFromContext;
+import com.intellij.psi.PsiFile;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Integration tests for {@link BlazePyBinaryConfigurationProducer}. */
+@RunWith(JUnit4.class)
+public class BlazePyBinaryConfigurationProducerTest extends BlazeRunConfigurationProducerTestCase {
+
+  @Test
+  public void testProducedFromPyFile() {
+    PsiFile pyFile =
+        createAndIndexFile(
+            new WorkspacePath("py/bin/main.py"),
+            "def main():",
+            "  return",
+            "if __name__ == '__main__':",
+            "  main()");
+
+    workspace.createFile(new WorkspacePath("py/bin/BUILD"), "py_binary(name = 'main')");
+
+    MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot);
+    builder.setTargetMap(
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setKind("py_binary")
+                    .setLabel("//py/bin:main")
+                    .addSource(sourceRoot("py/bin/main.py"))
+                    .build())
+            .build());
+    registerProjectService(
+        BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build()));
+
+    ConfigurationContext context = createContextFromPsi(pyFile);
+    List<ConfigurationFromContext> configurations = context.getConfigurationsFromContext();
+    assertThat(configurations).hasSize(1);
+
+    ConfigurationFromContext fromContext = configurations.get(0);
+    assertThat(fromContext.isProducedBy(BlazePyBinaryConfigurationProducer.class)).isTrue();
+    assertThat(fromContext.getConfiguration()).isInstanceOf(BlazeCommandRunConfiguration.class);
+
+    BlazeCommandRunConfiguration config =
+        (BlazeCommandRunConfiguration) fromContext.getConfiguration();
+    assertThat(config.getTarget()).isEqualTo(TargetExpression.fromString("//py/bin:main"));
+    assertThat(getCommandType(config)).isEqualTo(BlazeCommandName.RUN);
+  }
+}
diff --git a/python/tests/integrationtests/com/google/idea/blaze/python/run/producers/BlazePyTestConfigurationProducerTest.java b/python/tests/integrationtests/com/google/idea/blaze/python/run/producers/BlazePyTestConfigurationProducerTest.java
new file mode 100644
index 0000000..7f358ac
--- /dev/null
+++ b/python/tests/integrationtests/com/google/idea/blaze/python/run/producers/BlazePyTestConfigurationProducerTest.java
@@ -0,0 +1,170 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run.producers;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.idea.blaze.base.command.BlazeCommandName;
+import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
+import com.google.idea.blaze.base.ideinfo.TargetMapBuilder;
+import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
+import com.google.idea.blaze.base.model.MockBlazeProjectDataBuilder;
+import com.google.idea.blaze.base.model.MockBlazeProjectDataManager;
+import com.google.idea.blaze.base.model.primitives.TargetExpression;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.run.BlazeCommandRunConfiguration;
+import com.google.idea.blaze.base.run.producer.BlazeRunConfigurationProducerTestCase;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.intellij.execution.actions.ConfigurationContext;
+import com.intellij.execution.actions.ConfigurationFromContext;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyFunction;
+import java.util.List;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Integration tests for {@link BlazePyTestConfigurationProducer}.
+ */
+@RunWith(JUnit4.class)
+public class BlazePyTestConfigurationProducerTest extends BlazeRunConfigurationProducerTestCase {
+
+  @Before
+  public final void suppressNativeProducers() {
+    // Project components triggered before we can set up BlazeImportSettings.
+    NonBlazeProducerSuppressor.suppressProducers(getProject());
+  }
+
+  @Test
+  public void testProducedFromPyFile() {
+    PsiFile pyFile =
+        createAndIndexFile(
+            new WorkspacePath("py/test/unittest.py"),
+            "class UnitTest(googletest.TestCase):",
+            "  def testSomething():",
+            "    return");
+
+    MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot);
+    builder.setTargetMap(
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setKind("py_test")
+                    .setLabel("//py/test:unittests")
+                    .addSource(sourceRoot("py/test/unittest.py"))
+                    .build())
+            .build());
+    registerProjectService(
+        BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build()));
+
+    ConfigurationContext context = createContextFromPsi(pyFile);
+    List<ConfigurationFromContext> configurations = context.getConfigurationsFromContext();
+    assertThat(configurations).hasSize(1);
+
+    ConfigurationFromContext fromContext = configurations.get(0);
+    assertThat(fromContext.isProducedBy(BlazePyTestConfigurationProducer.class)).isTrue();
+    assertThat(fromContext.getConfiguration()).isInstanceOf(BlazeCommandRunConfiguration.class);
+
+    BlazeCommandRunConfiguration config =
+        (BlazeCommandRunConfiguration) fromContext.getConfiguration();
+    assertThat(config.getTarget()).isEqualTo(TargetExpression.fromString("//py/test:unittests"));
+    assertThat(getTestFilterContents(config)).isNull();
+    assertThat(getCommandType(config)).isEqualTo(BlazeCommandName.TEST);
+  }
+
+  @Test
+  public void testProducedFromPyClass() {
+    PsiFile pyFile =
+        createAndIndexFile(
+            new WorkspacePath("py/test/unittest.py"),
+            "class UnitTest(googletest.TestCase):",
+            "  def testSomething():",
+            "    return");
+
+    MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot);
+    builder.setTargetMap(
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setKind("py_test")
+                    .setLabel("//py/test:unittests")
+                    .addSource(sourceRoot("py/test/unittest.py"))
+                    .build())
+            .build());
+    registerProjectService(
+        BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build()));
+
+    PyClass pyClass = PsiUtils.findFirstChildOfClassRecursive(pyFile, PyClass.class);
+    assertThat(pyClass).isNotNull();
+
+    ConfigurationContext context = createContextFromPsi(pyClass);
+    List<ConfigurationFromContext> configurations = context.getConfigurationsFromContext();
+    assertThat(configurations).hasSize(1);
+
+    ConfigurationFromContext fromContext = configurations.get(0);
+    assertThat(fromContext.isProducedBy(BlazePyTestConfigurationProducer.class)).isTrue();
+    assertThat(fromContext.getConfiguration()).isInstanceOf(BlazeCommandRunConfiguration.class);
+
+    BlazeCommandRunConfiguration config =
+        (BlazeCommandRunConfiguration) fromContext.getConfiguration();
+    assertThat(config.getTarget()).isEqualTo(TargetExpression.fromString("//py/test:unittests"));
+    assertThat(getTestFilterContents(config)).isEqualTo("--test_filter=UnitTest");
+    assertThat(getCommandType(config)).isEqualTo(BlazeCommandName.TEST);
+  }
+
+  @Test
+  public void testProducedFromTestCase() {
+    PsiFile pyFile =
+        createAndIndexFile(
+            new WorkspacePath("py/test/unittest.py"),
+            "class UnitTest(googletest.TestCase):",
+            "  def testSomething():",
+            "    return");
+
+    MockBlazeProjectDataBuilder builder = MockBlazeProjectDataBuilder.builder(workspaceRoot);
+    builder.setTargetMap(
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setKind("py_test")
+                    .setLabel("//py/test:unittests")
+                    .addSource(sourceRoot("py/test/unittest.py"))
+                    .build())
+            .build());
+    registerProjectService(
+        BlazeProjectDataManager.class, new MockBlazeProjectDataManager(builder.build()));
+
+    PyFunction function = PsiUtils.findFirstChildOfClassRecursive(pyFile, PyFunction.class);
+    assertThat(function).isNotNull();
+
+    ConfigurationContext context = createContextFromPsi(function);
+    List<ConfigurationFromContext> configurations = context.getConfigurationsFromContext();
+    assertThat(configurations).hasSize(1);
+
+    ConfigurationFromContext fromContext = configurations.get(0);
+    assertThat(fromContext.isProducedBy(BlazePyTestConfigurationProducer.class)).isTrue();
+    assertThat(fromContext.getConfiguration()).isInstanceOf(BlazeCommandRunConfiguration.class);
+
+    BlazeCommandRunConfiguration config =
+        (BlazeCommandRunConfiguration) fromContext.getConfiguration();
+    assertThat(config.getTarget()).isEqualTo(TargetExpression.fromString("//py/test:unittests"));
+    assertThat(getTestFilterContents(config)).isEqualTo("--test_filter=UnitTest.testSomething");
+    assertThat(getCommandType(config)).isEqualTo(BlazeCommandName.TEST);
+  }
+}
diff --git a/python/tests/integrationtests/com/google/idea/blaze/python/run/smrunner/BlazePythonTestEventsHandlerTest.java b/python/tests/integrationtests/com/google/idea/blaze/python/run/smrunner/BlazePythonTestEventsHandlerTest.java
new file mode 100644
index 0000000..c87025c
--- /dev/null
+++ b/python/tests/integrationtests/com/google/idea/blaze/python/run/smrunner/BlazePythonTestEventsHandlerTest.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run.smrunner;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.Iterables;
+import com.google.idea.blaze.base.BlazeIntegrationTestCase;
+import com.google.idea.blaze.base.lang.buildfile.psi.util.PsiUtils;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.intellij.execution.Location;
+import com.intellij.openapi.vfs.VirtualFileManager;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.search.GlobalSearchScope;
+import com.jetbrains.python.psi.PyClass;
+import com.jetbrains.python.psi.PyFunction;
+import javax.annotation.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/**
+ * Integration tests for {@link BlazePythonTestEventsHandler}.
+ */
+@RunWith(JUnit4.class)
+public class BlazePythonTestEventsHandlerTest extends BlazeIntegrationTestCase {
+
+  private final BlazePythonTestEventsHandler handler = new BlazePythonTestEventsHandler();
+
+  @Test
+  public void testSuiteLocationResolves() {
+    PsiFile file =
+        workspace.createPsiFile(
+            new WorkspacePath("lib/app_unittest.py"),
+            "class AppUnitTest:",
+            "  def function(self):",
+            "    return");
+    PyClass pyClass = PsiUtils.findFirstChildOfClassRecursive(file, PyClass.class);
+    assertThat(pyClass).isNotNull();
+
+    String url = handler.suiteLocationUrl(null, "AppUnitTest");
+    Location<?> location = getLocation(url);
+    assertThat(location.getPsiElement()).isEqualTo(pyClass);
+  }
+
+  @Test
+  public void testFunctionLocationResolves() {
+    PsiFile file =
+        workspace.createPsiFile(
+            new WorkspacePath("lib/app_unittest.py"),
+            "class AppUnitTest:",
+            "  def testApp(self):",
+            "    return");
+    PyClass pyClass = PsiUtils.findFirstChildOfClassRecursive(file, PyClass.class);
+    PyFunction function = pyClass.findMethodByName("testApp", false, null);
+    assertThat(function).isNotNull();
+
+    String url = handler.testLocationUrl(null, null, "__main__.AppUnitTest.testApp", null);
+    Location<?> location = getLocation(url);
+    assertThat(location.getPsiElement()).isEqualTo(function);
+  }
+
+  @Test
+  public void testFunctionWithoutMainPrefixResolves() {
+    PsiFile file =
+        workspace.createPsiFile(
+            new WorkspacePath("lib/app/app_unittest.py"),
+            "class AppUnitTest:",
+            "  def testApp(self):",
+            "    return");
+    PyClass pyClass = PsiUtils.findFirstChildOfClassRecursive(file, PyClass.class);
+    PyFunction function = pyClass.findMethodByName("testApp", false, null);
+    assertThat(function).isNotNull();
+
+    String url = handler.testLocationUrl(null, null, "lib.app.AppUnitTest.testApp", null);
+    Location<?> location = getLocation(url);
+    assertThat(location.getPsiElement()).isEqualTo(function);
+  }
+
+  @Nullable
+  private Location<?> getLocation(String url) {
+    String protocol = VirtualFileManager.extractProtocol(url);
+    String path = VirtualFileManager.extractPath(url);
+    if (protocol == null) {
+      return null;
+    }
+    return Iterables.getFirst(
+        handler
+            .getTestLocator()
+            .getLocation(protocol, path, getProject(), GlobalSearchScope.allScope(getProject())),
+        null);
+  }
+}
diff --git a/python/tests/unittests/com/google/idea/blaze/python/run/BlazePyRunConfigurationRunnerTest.java b/python/tests/unittests/com/google/idea/blaze/python/run/BlazePyRunConfigurationRunnerTest.java
new file mode 100644
index 0000000..d29c2fb
--- /dev/null
+++ b/python/tests/unittests/com/google/idea/blaze/python/run/BlazePyRunConfigurationRunnerTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.python.run;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.model.primitives.Label;
+import java.io.File;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit tests for {@link BlazePyRunConfigurationRunner}. */
+@RunWith(JUnit4.class)
+public class BlazePyRunConfigurationRunnerTest {
+
+  @Test
+  public void testMultipleOutputFiles() {
+    Label target = Label.create("//path/to/package:SomeTest");
+    ImmutableList<File> outputFiles =
+        ImmutableList.of(
+            new File("blaze-bin/path/to/package/SomeTest.run.py"),
+            new File("blaze-bin/path/to/package/SomeTest"));
+    assertThat(BlazePyRunConfigurationRunner.findExecutable(target, outputFiles))
+        .isEqualTo(new File("blaze-bin/path/to/package/SomeTest"));
+  }
+}
diff --git a/scala/BUILD b/scala/BUILD
new file mode 100644
index 0000000..1343c03
--- /dev/null
+++ b/scala/BUILD
@@ -0,0 +1,97 @@
+licenses(["notice"])  # Apache 2.0
+
+load(
+    "//build_defs:build_defs.bzl",
+    "merged_plugin_xml",
+    "stamped_plugin_xml",
+    "intellij_plugin",
+    "optional_plugin_xml",
+)
+load(
+    "//testing:test_defs.bzl",
+    "intellij_unit_test_suite",
+    "intellij_integration_test_suite",
+)
+
+filegroup(
+    name = "plugin_xml",
+    srcs = ["src/META-INF/blaze-scala.xml"],
+    visibility = ["//visibility:public"],
+)
+
+optional_plugin_xml(
+    name = "optional_xml",
+    module = "org.intellij.scala",
+    plugin_xml = "src/META-INF/scala-contents.xml",
+    visibility = ["//visibility:public"],
+)
+
+merged_plugin_xml(
+    name = "merged_plugin_xml",
+    srcs = [
+        ":plugin_xml",
+        "//base:plugin_xml",
+        "//java:plugin_xml",
+    ],
+)
+
+stamped_plugin_xml(
+    name = "scala_plugin_xml",
+    plugin_id = "com.google.idea.blaze.scala",
+    plugin_name = "com.google.idea.blaze.scala",
+    plugin_xml = "merged_plugin_xml",
+)
+
+java_library(
+    name = "scala",
+    srcs = glob(["src/**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//base",
+        "//intellij_platform_sdk:plugin_api",
+        "//java",
+        "//third_party/scala",
+        "@jsr305_annotations//jar",
+    ],
+)
+
+intellij_plugin(
+    name = "scala_integration_test_plugin",
+    testonly = 1,
+    optional_plugin_xmls = [":optional_xml"],
+    plugin_xml = ":scala_plugin_xml",
+    deps = [":scala"],
+)
+
+intellij_unit_test_suite(
+    name = "unit_tests",
+    srcs = glob(["tests/unittests/**/*.java"]),
+    test_package_root = "com.google.idea.blaze",
+    deps = [
+        ":scala",
+        "//base",
+        "//base:unit_test_utils",
+        "//intellij_platform_sdk:plugin_api_for_tests",
+        "//java",
+        "//third_party/scala:scala_for_tests",
+        "@junit//jar",
+    ],
+)
+
+intellij_integration_test_suite(
+    name = "integration_tests",
+    srcs = glob(["tests/integrationtests/**/*.java"]),
+    required_plugins = "org.intellij.scala,com.google.idea.blaze.scala",
+    test_package_root = "com.google.idea.blaze.scala",
+    runtime_deps = [":scala_integration_test_plugin"],
+    deps = [
+        ":scala",
+        "//base",
+        "//base:integration_test_utils",
+        "//base:unit_test_utils",
+        "//intellij_platform_sdk:plugin_api_for_tests",
+        "//java",
+        "//third_party/scala:scala_for_tests",
+        "@junit//jar",
+    ],
+)
diff --git a/scala/src/META-INF/blaze-scala.xml b/scala/src/META-INF/blaze-scala.xml
new file mode 100644
index 0000000..375fdc7
--- /dev/null
+++ b/scala/src/META-INF/blaze-scala.xml
@@ -0,0 +1,5 @@
+<idea-plugin>
+  <extensions defaultExtensionNs="com.google.idea.blaze">
+    <SyncPlugin implementation="com.google.idea.blaze.scala.sync.AlwaysPresentScalaSyncPlugin"/>
+  </extensions>
+</idea-plugin>
diff --git a/scala/src/META-INF/scala-contents.xml b/scala/src/META-INF/scala-contents.xml
new file mode 100644
index 0000000..9c46cf1
--- /dev/null
+++ b/scala/src/META-INF/scala-contents.xml
@@ -0,0 +1,7 @@
+<idea-plugin>
+  <extensions defaultExtensionNs="com.google.idea.blaze">
+    <SyncPlugin implementation="com.google.idea.blaze.scala.sync.BlazeScalaSyncPlugin"/>
+    <JavaLikeLanguage
+        implementation="com.google.idea.blaze.scala.sync.source.ScalaJavaLikeLanguage"/>
+  </extensions>
+</idea-plugin>
diff --git a/scala/src/com/google/idea/blaze/scala/sync/AlwaysPresentScalaSyncPlugin.java b/scala/src/com/google/idea/blaze/scala/sync/AlwaysPresentScalaSyncPlugin.java
new file mode 100644
index 0000000..e331132
--- /dev/null
+++ b/scala/src/com/google/idea/blaze/scala/sync/AlwaysPresentScalaSyncPlugin.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.scala.sync;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.plugin.PluginUtils;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.output.IssueOutput;
+import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
+import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
+import com.intellij.openapi.project.Project;
+import java.util.Set;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Unlike most of the scala-specific code, will be run even if the JetBrains scala plugin isn't
+ * enabled.
+ */
+public class AlwaysPresentScalaSyncPlugin extends BlazeSyncPlugin.Adapter {
+  private static final String SCALA_PLUGIN_ID = "org.intellij.scala";
+
+  @Override
+  public Set<LanguageClass> getSupportedLanguagesInWorkspace(WorkspaceType workspaceType) {
+    if (workspaceType.equals(WorkspaceType.JAVA)) {
+      return ImmutableSet.of(LanguageClass.SCALA);
+    }
+    return ImmutableSet.of();
+  }
+
+  @Override
+  public boolean validateProjectView(
+      @Nullable Project project,
+      BlazeContext context,
+      ProjectViewSet projectViewSet,
+      WorkspaceLanguageSettings workspaceLanguageSettings) {
+    if (!workspaceLanguageSettings.isLanguageActive(LanguageClass.SCALA)) {
+      return true;
+    }
+    if (!PluginUtils.isPluginEnabled(SCALA_PLUGIN_ID)) {
+      IssueOutput.error("Scala plugin needed for Scala language support.")
+          .navigatable(PluginUtils.installOrEnablePluginNavigable(SCALA_PLUGIN_ID))
+          .submit(context);
+      return false;
+    }
+    return true;
+  }
+}
diff --git a/scala/src/com/google/idea/blaze/scala/sync/BlazeScalaLibrarySource.java b/scala/src/com/google/idea/blaze/scala/sync/BlazeScalaLibrarySource.java
new file mode 100644
index 0000000..86f276f
--- /dev/null
+++ b/scala/src/com/google/idea/blaze/scala/sync/BlazeScalaLibrarySource.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.scala.sync;
+
+import com.google.common.collect.ImmutableList;
+import com.google.idea.blaze.base.model.BlazeLibrary;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.sync.libraries.LibrarySource;
+import com.google.idea.blaze.scala.sync.model.BlazeScalaSyncData;
+import java.util.Collection;
+
+/** Provides libraries required by Scala rules. */
+public class BlazeScalaLibrarySource extends LibrarySource.Adapter {
+  private final BlazeProjectData blazeProjectData;
+
+  BlazeScalaLibrarySource(BlazeProjectData blazeProjectData) {
+    this.blazeProjectData = blazeProjectData;
+  }
+
+  @Override
+  public Collection<? extends BlazeLibrary> getLibraries() {
+    BlazeScalaSyncData syncData = blazeProjectData.syncState.get(BlazeScalaSyncData.class);
+    if (syncData == null) {
+      return ImmutableList.of();
+    }
+    return syncData.importResult.libraries.values();
+  }
+}
diff --git a/scala/src/com/google/idea/blaze/scala/sync/BlazeScalaSyncPlugin.java b/scala/src/com/google/idea/blaze/scala/sync/BlazeScalaSyncPlugin.java
new file mode 100644
index 0000000..20fa54c
--- /dev/null
+++ b/scala/src/com/google/idea/blaze/scala/sync/BlazeScalaSyncPlugin.java
@@ -0,0 +1,128 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.scala.sync;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.command.info.BlazeInfo;
+import com.google.idea.blaze.base.ideinfo.TargetMap;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.model.SyncState;
+import com.google.idea.blaze.base.model.SyncState.Builder;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.Scope;
+import com.google.idea.blaze.base.scope.scopes.TimingScope;
+import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
+import com.google.idea.blaze.base.sync.libraries.LibrarySource;
+import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
+import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
+import com.google.idea.blaze.base.sync.workspace.WorkingSet;
+import com.google.idea.blaze.base.sync.workspace.WorkspacePathResolver;
+import com.google.idea.blaze.scala.sync.importer.BlazeScalaWorkspaceImporter;
+import com.google.idea.blaze.scala.sync.model.BlazeScalaImportResult;
+import com.google.idea.blaze.scala.sync.model.BlazeScalaSyncData;
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.ModifiableRootModel;
+import com.intellij.openapi.roots.OrderEnumerator;
+import com.intellij.openapi.roots.ui.configuration.libraryEditor.ExistingLibraryEditor;
+import java.util.Set;
+import javax.annotation.Nullable;
+import org.jetbrains.plugins.scala.project.ScalaLibraryType;
+
+/** Supports scala. */
+public class BlazeScalaSyncPlugin extends BlazeSyncPlugin.Adapter {
+  @Override
+  public Set<LanguageClass> getSupportedLanguagesInWorkspace(WorkspaceType workspaceType) {
+    if (workspaceType.equals(WorkspaceType.JAVA)) {
+      return ImmutableSet.of(LanguageClass.SCALA);
+    }
+    return ImmutableSet.of();
+  }
+
+  @Override
+  public void updateProjectStructure(
+      Project project,
+      BlazeContext context,
+      WorkspaceRoot workspaceRoot,
+      ProjectViewSet projectViewSet,
+      BlazeProjectData blazeProjectData,
+      @Nullable BlazeProjectData oldBlazeProjectData,
+      ModuleEditor moduleEditor,
+      Module workspaceModule,
+      ModifiableRootModel workspaceModifiableModel) {
+    if (!blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.SCALA)) {
+      return;
+    }
+    OrderEnumerator.orderEntries(workspaceModule)
+        .forEachLibrary(
+            library -> {
+              // Convert the type of the SDK library to prevent the scala plugin from
+              // showing the missing SDK notification.
+              // TODO: use a canonical class in the SDK (e.g., scala.App) instead of the name?
+              if (library.getName() != null && library.getName().startsWith("scala-library")) {
+                ExistingLibraryEditor editor = new ExistingLibraryEditor(library, null);
+                editor.setType(ScalaLibraryType.instance());
+                editor.commit();
+                return false; // stop
+              }
+              return true; // continue
+            });
+  }
+
+  @Override
+  public void updateSyncState(
+      Project project,
+      BlazeContext context,
+      WorkspaceRoot workspaceRoot,
+      ProjectViewSet projectViewSet,
+      WorkspaceLanguageSettings workspaceLanguageSettings,
+      BlazeInfo blazeInfo,
+      @Nullable WorkingSet workingSet,
+      WorkspacePathResolver workspacePathResolver,
+      ArtifactLocationDecoder artifactLocationDecoder,
+      TargetMap targetMap,
+      Builder syncStateBuilder,
+      @Nullable SyncState previousSyncState) {
+    if (!workspaceLanguageSettings.isLanguageActive(LanguageClass.SCALA)) {
+      return;
+    }
+    BlazeScalaWorkspaceImporter blazeScalaWorkspaceImporter =
+        new BlazeScalaWorkspaceImporter(project, workspaceRoot, projectViewSet, targetMap);
+    BlazeScalaImportResult importResult =
+        Scope.push(
+            context,
+            (childContext) -> {
+              childContext.push(new TimingScope("ScalaWorkspaceImporter"));
+              return blazeScalaWorkspaceImporter.importWorkspace();
+            });
+    BlazeScalaSyncData syncData = new BlazeScalaSyncData(importResult);
+    syncStateBuilder.put(BlazeScalaSyncData.class, syncData);
+  }
+
+  @Nullable
+  @Override
+  public LibrarySource getLibrarySource(
+      ProjectViewSet projectViewSet, BlazeProjectData blazeProjectData) {
+    if (!blazeProjectData.workspaceLanguageSettings.isLanguageActive(LanguageClass.SCALA)) {
+      return null;
+    }
+    return new BlazeScalaLibrarySource(blazeProjectData);
+  }
+}
diff --git a/scala/src/com/google/idea/blaze/scala/sync/importer/BlazeScalaWorkspaceImporter.java b/scala/src/com/google/idea/blaze/scala/sync/importer/BlazeScalaWorkspaceImporter.java
new file mode 100644
index 0000000..5410f2c
--- /dev/null
+++ b/scala/src/com/google/idea/blaze/scala/sync/importer/BlazeScalaWorkspaceImporter.java
@@ -0,0 +1,96 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.scala.sync.importer;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
+import com.google.idea.blaze.base.ideinfo.TargetKey;
+import com.google.idea.blaze.base.ideinfo.TargetMap;
+import com.google.idea.blaze.base.model.LibraryKey;
+import com.google.idea.blaze.base.model.primitives.Kind;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.sync.projectview.ProjectViewTargetImportFilter;
+import com.google.idea.blaze.base.targetmaps.TransitiveDependencyMap;
+import com.google.idea.blaze.java.sync.model.BlazeJarLibrary;
+import com.google.idea.blaze.scala.sync.model.BlazeScalaImportResult;
+import com.intellij.openapi.project.Project;
+import java.util.Collection;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/** Builds a BlazeWorkspace. */
+public final class BlazeScalaWorkspaceImporter {
+  private final Project project;
+  private final WorkspaceRoot workspaceRoot;
+  private final ProjectViewSet projectViewSet;
+  private final TargetMap targetMap;
+
+  public BlazeScalaWorkspaceImporter(
+      Project project,
+      WorkspaceRoot workspaceRoot,
+      ProjectViewSet projectViewSet,
+      TargetMap targetMap) {
+    this.project = project;
+    this.workspaceRoot = workspaceRoot;
+    this.projectViewSet = projectViewSet;
+    this.targetMap = targetMap;
+  }
+
+  public BlazeScalaImportResult importWorkspace() {
+    ProjectViewTargetImportFilter importFilter =
+        new ProjectViewTargetImportFilter(project, workspaceRoot, projectViewSet);
+
+    Collection<Kind> scalaKinds = Kind.allKindsForLanguage(LanguageClass.SCALA);
+    List<TargetKey> scalaSourceTargets =
+        targetMap
+            .targets()
+            .stream()
+            .filter(target -> target.javaIdeInfo != null)
+            .filter(target -> target.kindIsOneOf(scalaKinds))
+            .filter(importFilter::isSourceTarget)
+            .map(target -> target.key)
+            .collect(Collectors.toList());
+
+    ImmutableMap.Builder<LibraryKey, BlazeJarLibrary> libraries = ImmutableMap.builder();
+
+    // Add every jar in the transitive closure of dependencies.
+    // Direct dependencies of the working set will be double counted by BlazeJavaWorkspaceImporter,
+    // but since they'll all merged into one set, we will end up with exactly one of each.
+    for (TargetKey dependency :
+        TransitiveDependencyMap.getTransitiveDependencies(scalaSourceTargets, targetMap)) {
+      TargetIdeInfo target = targetMap.get(dependency);
+      if (target == null) {
+        continue;
+      }
+      // Except source targets.
+      if (importFilter.isSourceTarget(target)) {
+        continue;
+      }
+      if (target.javaIdeInfo != null) {
+        target
+            .javaIdeInfo
+            .jars
+            .stream()
+            .map(BlazeJarLibrary::new)
+            .forEach(library -> libraries.put(library.key, library));
+      }
+    }
+
+    return new BlazeScalaImportResult(libraries.build());
+  }
+}
diff --git a/scala/src/com/google/idea/blaze/scala/sync/model/BlazeScalaImportResult.java b/scala/src/com/google/idea/blaze/scala/sync/model/BlazeScalaImportResult.java
new file mode 100644
index 0000000..2140c19
--- /dev/null
+++ b/scala/src/com/google/idea/blaze/scala/sync/model/BlazeScalaImportResult.java
@@ -0,0 +1,34 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.scala.sync.model;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.idea.blaze.base.model.LibraryKey;
+import com.google.idea.blaze.java.sync.model.BlazeJarLibrary;
+import java.io.Serializable;
+import javax.annotation.concurrent.Immutable;
+
+/** The result of a blaze import operation. */
+@Immutable
+public class BlazeScalaImportResult implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  public final ImmutableMap<LibraryKey, BlazeJarLibrary> libraries;
+
+  public BlazeScalaImportResult(ImmutableMap<LibraryKey, BlazeJarLibrary> libraries) {
+    this.libraries = libraries;
+  }
+}
diff --git a/scala/src/com/google/idea/blaze/scala/sync/model/BlazeScalaSyncData.java b/scala/src/com/google/idea/blaze/scala/sync/model/BlazeScalaSyncData.java
new file mode 100644
index 0000000..56ce799
--- /dev/null
+++ b/scala/src/com/google/idea/blaze/scala/sync/model/BlazeScalaSyncData.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.scala.sync.model;
+
+import java.io.Serializable;
+
+/** Sync data for the scala plugin. */
+public class BlazeScalaSyncData implements Serializable {
+  private static final long serialVersionUID = 1L;
+
+  public final BlazeScalaImportResult importResult;
+
+  public BlazeScalaSyncData(BlazeScalaImportResult importResult) {
+    this.importResult = importResult;
+  }
+}
diff --git a/scala/src/com/google/idea/blaze/scala/sync/source/ScalaJavaLikeLanguage.java b/scala/src/com/google/idea/blaze/scala/sync/source/ScalaJavaLikeLanguage.java
new file mode 100644
index 0000000..df37840
--- /dev/null
+++ b/scala/src/com/google/idea/blaze/scala/sync/source/ScalaJavaLikeLanguage.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.scala.sync.source;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.java.sync.source.JavaLikeLanguage;
+import java.util.Set;
+
+/** Provides Java-like parts of Scala to the Java plugin. */
+public class ScalaJavaLikeLanguage implements JavaLikeLanguage {
+  @Override
+  public Set<String> getFileExtensions() {
+    return ImmutableSet.of(".scala");
+  }
+}
diff --git a/scala/tests/integrationtests/com/google/idea/blaze/scala/sync/ScalaSyncTest.java b/scala/tests/integrationtests/com/google/idea/blaze/scala/sync/ScalaSyncTest.java
new file mode 100644
index 0000000..c55075f
--- /dev/null
+++ b/scala/tests/integrationtests/com/google/idea/blaze/scala/sync/ScalaSyncTest.java
@@ -0,0 +1,165 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.scala.sync;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.ideinfo.JavaIdeInfo;
+import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
+import com.google.idea.blaze.base.ideinfo.TargetMap;
+import com.google.idea.blaze.base.ideinfo.TargetMapBuilder;
+import com.google.idea.blaze.base.model.BlazeProjectData;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.sync.BlazeSyncIntegrationTestCase;
+import com.google.idea.blaze.base.sync.BlazeSyncParams;
+import com.google.idea.blaze.base.sync.BlazeSyncParams.SyncMode;
+import com.google.idea.blaze.base.sync.data.BlazeProjectDataManager;
+import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
+import com.google.idea.blaze.java.sync.model.BlazeContentEntry;
+import com.google.idea.blaze.java.sync.model.BlazeJavaSyncData;
+import com.google.idea.blaze.java.sync.model.BlazeSourceDirectory;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Scala-specific sync integration tests. */
+@RunWith(JUnit4.class)
+public class ScalaSyncTest extends BlazeSyncIntegrationTestCase {
+  @Test
+  public void testScalaClassesPresentInClassPath() throws Exception {
+    setProjectView(
+        "directories:",
+        "  src/main/scala/com/google",
+        "targets:",
+        "  //src/main/scala/com/google:lib",
+        "additional_languages:",
+        "  scala");
+
+    workspace.createFile(
+        new WorkspacePath("src/main/scala/com/google/ClassWithUniqueName1.scala"),
+        "package com.google;",
+        "public class ClassWithUniqueName1 {}");
+
+    workspace.createFile(
+        new WorkspacePath("src/main/scala/com/google/ClassWithUniqueName2.scala"),
+        "package com.google;",
+        "public class ClassWithUniqueName2 {}");
+
+    TargetMap targetMap =
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setBuildFile(sourceRoot("src/main/scala/com/google/BUILD"))
+                    .setLabel("//src/main/scala/com/google:lib")
+                    .setKind("scala_library")
+                    .addSource(sourceRoot("src/main/scala/com/google/ClassWithUniqueName1.scala"))
+                    .addSource(sourceRoot("src/main/scala/com/google/ClassWithUniqueName2.scala"))
+                    .setJavaInfo(JavaIdeInfo.builder()))
+            .build();
+
+    setTargetMap(targetMap);
+
+    BlazeSyncParams syncParams =
+        new BlazeSyncParams.Builder("Full Sync", BlazeSyncParams.SyncMode.FULL)
+            .addProjectViewTargets(true)
+            .build();
+    runBlazeSync(syncParams);
+
+    errorCollector.assertNoIssues();
+
+    BlazeProjectData blazeProjectData =
+        BlazeProjectDataManager.getInstance(getProject()).getBlazeProjectData();
+    assertThat(blazeProjectData).isNotNull();
+    assertThat(blazeProjectData.targetMap).isEqualTo(targetMap);
+    assertThat(blazeProjectData.workspaceLanguageSettings)
+        .isEqualTo(
+            new WorkspaceLanguageSettings(
+                WorkspaceType.JAVA,
+                ImmutableSet.of(LanguageClass.GENERIC, LanguageClass.JAVA, LanguageClass.SCALA)));
+
+    BlazeJavaSyncData javaSyncData = blazeProjectData.syncState.get(BlazeJavaSyncData.class);
+    assertThat(javaSyncData).isNotNull();
+    List<BlazeContentEntry> contentEntries = javaSyncData.importResult.contentEntries;
+    assertThat(contentEntries).hasSize(1);
+
+    BlazeContentEntry contentEntry = contentEntries.get(0);
+    assertThat(contentEntry.contentRoot.getPath())
+        .isEqualTo(
+            workspaceRoot.fileForPath(new WorkspacePath("src/main/scala/com/google")).getPath());
+    assertThat(contentEntry.sources).hasSize(1);
+
+    BlazeSourceDirectory sourceDir = contentEntry.sources.get(0);
+    assertThat(sourceDir.getPackagePrefix()).isEqualTo("com.google");
+    assertThat(sourceDir.getDirectory().getPath())
+        .isEqualTo(
+            workspaceRoot.fileForPath(new WorkspacePath("src/main/scala/com/google")).getPath());
+  }
+
+  @Test
+  public void testSimpleSync() throws Exception {
+    setProjectView(
+        "directories:",
+        "  src/main/scala/com/google",
+        "targets:",
+        "  //src/main/scala/com/google:lib",
+        "additional_languages:",
+        "  scala");
+
+    workspace.createFile(
+        new WorkspacePath("src/main/scala/com/google/Source.scala"),
+        "package com.google;",
+        "public class Source {}");
+
+    workspace.createFile(
+        new WorkspacePath("src/main/scala/com/google/Other.scala"),
+        "package com.google;",
+        "public class Other {}");
+
+    TargetMap targetMap =
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setBuildFile(sourceRoot("src/main/scala/com/google/BUILD"))
+                    .setLabel("//src/main/scala/com/google:lib")
+                    .setKind("scala_library")
+                    .addSource(sourceRoot("src/main/scala/com/google/Source.scala"))
+                    .addSource(sourceRoot("src/main/scala/com/google/Other.scala")))
+            .build();
+
+    setTargetMap(targetMap);
+
+    runBlazeSync(
+        new BlazeSyncParams.Builder("Sync", SyncMode.INCREMENTAL)
+            .addProjectViewTargets(true)
+            .build());
+
+    errorCollector.assertNoIssues();
+
+    BlazeProjectData blazeProjectData =
+        BlazeProjectDataManager.getInstance(getProject()).getBlazeProjectData();
+    assertThat(blazeProjectData).isNotNull();
+    assertThat(blazeProjectData.targetMap).isEqualTo(targetMap);
+    assertThat(blazeProjectData.workspaceLanguageSettings)
+        .isEqualTo(
+            new WorkspaceLanguageSettings(
+                WorkspaceType.JAVA,
+                ImmutableSet.of(LanguageClass.GENERIC, LanguageClass.SCALA, LanguageClass.JAVA)));
+  }
+}
diff --git a/scala/tests/unittests/com/google/idea/blaze/java/sync/source/ScalaSourceDirectoryCalculatorTest.java b/scala/tests/unittests/com/google/idea/blaze/java/sync/source/ScalaSourceDirectoryCalculatorTest.java
new file mode 100644
index 0000000..c364c85
--- /dev/null
+++ b/scala/tests/unittests/com/google/idea/blaze/java/sync/source/ScalaSourceDirectoryCalculatorTest.java
@@ -0,0 +1,267 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.java.sync.source;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.idea.blaze.base.BlazeTestCase;
+import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
+import com.google.idea.blaze.base.ideinfo.TargetKey;
+import com.google.idea.blaze.base.io.InputStreamProvider;
+import com.google.idea.blaze.base.model.primitives.Label;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.prefetch.MockPrefetchService;
+import com.google.idea.blaze.base.prefetch.PrefetchService;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.ErrorCollector;
+import com.google.idea.blaze.base.scope.output.IssueOutput;
+import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
+import com.google.idea.blaze.java.sync.model.BlazeContentEntry;
+import com.google.idea.blaze.java.sync.model.BlazeSourceDirectory;
+import com.google.idea.blaze.scala.sync.source.ScalaJavaLikeLanguage;
+import com.intellij.openapi.extensions.ExtensionPoint;
+import com.intellij.util.containers.HashMap;
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
+import java.util.List;
+import java.util.Map;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Test cases for {@link SourceDirectoryCalculator} with Scala sources. */
+@RunWith(JUnit4.class)
+public class ScalaSourceDirectoryCalculatorTest extends BlazeTestCase {
+  private MockInputStreamProvider mockInputStreamProvider;
+  private SourceDirectoryCalculator sourceDirectoryCalculator;
+  private final BlazeContext context = new BlazeContext();
+  private final ErrorCollector issues = new ErrorCollector();
+  private final WorkspaceRoot workspaceRoot = new WorkspaceRoot(new File("/root"));
+
+  private final ArtifactLocationDecoder decoder =
+      (ArtifactLocationDecoder)
+          artifactLocation -> new File("/root", artifactLocation.getRelativePath());
+
+  @Override
+  protected void initTest(
+      @NotNull Container applicationServices, @NotNull Container projectServices) {
+    super.initTest(applicationServices, projectServices);
+
+    mockInputStreamProvider = new MockInputStreamProvider();
+    applicationServices.register(InputStreamProvider.class, mockInputStreamProvider);
+    applicationServices.register(JavaSourcePackageReader.class, new JavaSourcePackageReader());
+    applicationServices.register(PackageManifestReader.class, new PackageManifestReader());
+    applicationServices.register(PrefetchService.class, new MockPrefetchService());
+
+    ExtensionPoint<JavaLikeLanguage> javaLikeLanguages =
+        registerExtensionPoint(JavaLikeLanguage.EP_NAME, JavaLikeLanguage.class);
+    javaLikeLanguages.registerExtension(new JavaLikeLanguage.Java());
+    javaLikeLanguages.registerExtension(new ScalaJavaLikeLanguage());
+
+    context.addOutputSink(IssueOutput.class, issues);
+    sourceDirectoryCalculator = new SourceDirectoryCalculator();
+  }
+
+  @Test
+  public void testSingleScalaSource() {
+    mockInputStreamProvider.addFile(
+        "/root/src/main/scala/com/google/Foo.scala", "package com.google\n public class Foo {}");
+    List<SourceArtifact> sourceArtifacts =
+        ImmutableList.of(
+            SourceArtifact.builder(
+                    TargetKey.forPlainTarget(Label.create("//src/main/scala/com/google:foo")))
+                .setArtifactLocation(
+                    ArtifactLocation.builder()
+                        .setRelativePath("src/main/scala/com/google/Foo.scala")
+                        .setIsSource(true))
+                .build());
+    ImmutableList<BlazeContentEntry> result =
+        sourceDirectoryCalculator.calculateContentEntries(
+            project,
+            context,
+            workspaceRoot,
+            decoder,
+            ImmutableList.of(new WorkspacePath("src/main/scala/com/google")),
+            sourceArtifacts,
+            ImmutableMap.of());
+    assertThat(result)
+        .containsExactly(
+            BlazeContentEntry.builder("/root/src/main/scala/com/google")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/com/google")
+                        .setPackagePrefix("com.google")
+                        .build())
+                .build());
+    issues.assertNoIssues();
+  }
+
+  @Test
+  public void testMultipleScalaSources() {
+    mockInputStreamProvider
+        .addFile(
+            "/root/src/main/scala/com/google/Foo.scala",
+            "package com.google;\n public class Foo {}")
+        .addFile(
+            "/root/src/main/scala/com/google/Bar.scala", "package com.google\n public class Bar {}")
+        .addFile(
+            "/root/src/main/scala/com/alphabet/Baz.scala",
+            "package com.alphabet {\n public class Baz {} }");
+    List<SourceArtifact> sourceArtifacts =
+        ImmutableList.of(
+            SourceArtifact.builder(
+                    TargetKey.forPlainTarget(Label.create("//src/main/scala/com/google:foo")))
+                .setArtifactLocation(
+                    ArtifactLocation.builder()
+                        .setRelativePath("src/main/scala/com/google/Foo.scala")
+                        .setIsSource(true))
+                .build(),
+            SourceArtifact.builder(
+                    TargetKey.forPlainTarget(Label.create("//src/main/scala/com/google:bar")))
+                .setArtifactLocation(
+                    ArtifactLocation.builder()
+                        .setRelativePath("src/main/scala/com/google/Bar.scala")
+                        .setIsSource(true))
+                .build(),
+            SourceArtifact.builder(
+                    TargetKey.forPlainTarget(Label.create("//src/main/scala/com/alphabet:baz")))
+                .setArtifactLocation(
+                    ArtifactLocation.builder()
+                        .setRelativePath("src/main/scala/com/alphabet/Baz.scala")
+                        .setIsSource(true))
+                .build());
+    ImmutableList<BlazeContentEntry> result =
+        sourceDirectoryCalculator.calculateContentEntries(
+            project,
+            context,
+            workspaceRoot,
+            decoder,
+            ImmutableList.of(
+                new WorkspacePath("src/main/scala/com/google"),
+                new WorkspacePath("src/main/scala/com/alphabet")),
+            sourceArtifacts,
+            ImmutableMap.of());
+    assertThat(result)
+        .containsExactly(
+            BlazeContentEntry.builder("/root/src/main/scala/com/google")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/com/google")
+                        .setPackagePrefix("com.google")
+                        .build())
+                .build(),
+            BlazeContentEntry.builder("/root/src/main/scala/com/alphabet")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/com/alphabet")
+                        .setPackagePrefix("com.alphabet")
+                        .build())
+                .build());
+    issues.assertNoIssues();
+  }
+
+  @Test
+  public void testMixedScalaAndJavaSources() {
+    mockInputStreamProvider
+        .addFile(
+            "/root/src/main/java/com/google/Foo.java", "package com.google;\n public class Foo {}")
+        .addFile(
+            "/root/src/main/scala/com/google/Bar.scala", "package com.google\n public class Bar {}")
+        .addFile(
+            "/root/src/main/scala/com/alphabet/Baz.scala",
+            "package com.alphabet {\n public class Baz {} }");
+    List<SourceArtifact> sourceArtifacts =
+        ImmutableList.of(
+            SourceArtifact.builder(
+                    TargetKey.forPlainTarget(Label.create("//src/main/java/com/google:foo")))
+                .setArtifactLocation(
+                    ArtifactLocation.builder()
+                        .setRelativePath("src/main/java/com/google/Foo.java")
+                        .setIsSource(true))
+                .build(),
+            SourceArtifact.builder(
+                    TargetKey.forPlainTarget(Label.create("//src/main/scala/com/google:bar")))
+                .setArtifactLocation(
+                    ArtifactLocation.builder()
+                        .setRelativePath("src/main/scala/com/google/Bar.scala")
+                        .setIsSource(true))
+                .build(),
+            SourceArtifact.builder(
+                    TargetKey.forPlainTarget(Label.create("//src/main/scala/com/alphabet:baz")))
+                .setArtifactLocation(
+                    ArtifactLocation.builder()
+                        .setRelativePath("src/main/scala/com/alphabet/Baz.scala")
+                        .setIsSource(true))
+                .build());
+    ImmutableList<BlazeContentEntry> result =
+        sourceDirectoryCalculator.calculateContentEntries(
+            project,
+            context,
+            workspaceRoot,
+            decoder,
+            ImmutableList.of(
+                new WorkspacePath("src/main/java/com/google"),
+                new WorkspacePath("src/main/scala/com/google"),
+                new WorkspacePath("src/main/scala/com/alphabet")),
+            sourceArtifacts,
+            ImmutableMap.of());
+    assertThat(result)
+        .containsExactly(
+            BlazeContentEntry.builder("/root/src/main/java/com/google")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/java/com/google")
+                        .setPackagePrefix("com.google")
+                        .build())
+                .build(),
+            BlazeContentEntry.builder("/root/src/main/scala/com/google")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/com/google")
+                        .setPackagePrefix("com.google")
+                        .build())
+                .build(),
+            BlazeContentEntry.builder("/root/src/main/scala/com/alphabet")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/com/alphabet")
+                        .setPackagePrefix("com.alphabet")
+                        .build())
+                .build());
+    issues.assertNoIssues();
+  }
+
+  private static class MockInputStreamProvider implements InputStreamProvider {
+
+    private final Map<String, InputStream> files = new HashMap<>();
+
+    MockInputStreamProvider addFile(String filePath, String src) {
+      try {
+        files.put(filePath, new ByteArrayInputStream(src.getBytes("UTF-8")));
+      } catch (UnsupportedEncodingException ignored) {
+        // ignored
+      }
+      return this;
+    }
+
+    @Nullable
+    @Override
+    public InputStream getFile(@NotNull File path) {
+      return files.get(path.getPath());
+    }
+  }
+}
diff --git a/scala/tests/unittests/com/google/idea/blaze/scala/sync/BlazeScalaSyncPluginTest.java b/scala/tests/unittests/com/google/idea/blaze/scala/sync/BlazeScalaSyncPluginTest.java
new file mode 100644
index 0000000..6002f5d
--- /dev/null
+++ b/scala/tests/unittests/com/google/idea/blaze/scala/sync/BlazeScalaSyncPluginTest.java
@@ -0,0 +1,83 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.scala.sync;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.BlazeTestCase;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.projectview.ProjectView;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.projectview.section.ListSection;
+import com.google.idea.blaze.base.projectview.section.ScalarSection;
+import com.google.idea.blaze.base.projectview.section.sections.AdditionalLanguagesSection;
+import com.google.idea.blaze.base.projectview.section.sections.WorkspaceTypeSection;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.ErrorCollector;
+import com.google.idea.blaze.base.scope.output.IssueOutput;
+import com.google.idea.blaze.base.sync.BlazeSyncPlugin;
+import com.google.idea.blaze.base.sync.projectview.LanguageSupport;
+import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
+import com.google.idea.blaze.java.sync.BlazeJavaSyncPlugin;
+import com.intellij.openapi.extensions.impl.ExtensionPointImpl;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Unit tests for {@link BlazeScalaSyncPlugin} */
+@RunWith(JUnit4.class)
+public class BlazeScalaSyncPluginTest extends BlazeTestCase {
+  private final ErrorCollector errorCollector = new ErrorCollector();
+  private BlazeContext context;
+
+  @Override
+  protected void initTest(
+      @NotNull Container applicationServices, @NotNull Container projectServices) {
+    super.initTest(applicationServices, projectServices);
+    ExtensionPointImpl<BlazeSyncPlugin> syncPlugins =
+        registerExtensionPoint(BlazeSyncPlugin.EP_NAME, BlazeSyncPlugin.class);
+    syncPlugins.registerExtension(new BlazeJavaSyncPlugin());
+    syncPlugins.registerExtension(new BlazeScalaSyncPlugin());
+    context = new BlazeContext();
+    context.addOutputSink(IssueOutput.class, errorCollector);
+  }
+
+  @Test
+  public void testScalaValidAdditionalLanguage() {
+    ProjectViewSet projectViewSet =
+        ProjectViewSet.builder()
+            .add(
+                ProjectView.builder()
+                    .add(ScalarSection.builder(WorkspaceTypeSection.KEY).set(WorkspaceType.JAVA))
+                    .add(
+                        ListSection.builder(AdditionalLanguagesSection.KEY)
+                            .add(LanguageClass.SCALA))
+                    .build())
+            .build();
+    WorkspaceLanguageSettings workspaceLanguageSettings =
+        LanguageSupport.createWorkspaceLanguageSettings(projectViewSet);
+    LanguageSupport.validateLanguageSettings(context, workspaceLanguageSettings);
+    errorCollector.assertNoIssues();
+    assertThat(workspaceLanguageSettings)
+        .isEqualTo(
+            new WorkspaceLanguageSettings(
+                WorkspaceType.JAVA,
+                ImmutableSet.of(LanguageClass.GENERIC, LanguageClass.JAVA, LanguageClass.SCALA)));
+  }
+}
diff --git a/scala/tests/unittests/com/google/idea/blaze/scala/sync/importer/BlazeScalaWorkspaceImporterTest.java b/scala/tests/unittests/com/google/idea/blaze/scala/sync/importer/BlazeScalaWorkspaceImporterTest.java
new file mode 100644
index 0000000..363bcfb
--- /dev/null
+++ b/scala/tests/unittests/com/google/idea/blaze/scala/sync/importer/BlazeScalaWorkspaceImporterTest.java
@@ -0,0 +1,573 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.scala.sync.importer;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.idea.blaze.base.BlazeTestCase;
+import com.google.idea.blaze.base.ideinfo.ArtifactLocation;
+import com.google.idea.blaze.base.ideinfo.JavaIdeInfo;
+import com.google.idea.blaze.base.ideinfo.LibraryArtifact;
+import com.google.idea.blaze.base.ideinfo.TargetIdeInfo;
+import com.google.idea.blaze.base.ideinfo.TargetMap;
+import com.google.idea.blaze.base.ideinfo.TargetMapBuilder;
+import com.google.idea.blaze.base.model.LibraryKey;
+import com.google.idea.blaze.base.model.primitives.LanguageClass;
+import com.google.idea.blaze.base.model.primitives.WorkspacePath;
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.google.idea.blaze.base.model.primitives.WorkspaceType;
+import com.google.idea.blaze.base.prefetch.MockPrefetchService;
+import com.google.idea.blaze.base.prefetch.PrefetchService;
+import com.google.idea.blaze.base.projectview.ProjectView;
+import com.google.idea.blaze.base.projectview.ProjectViewSet;
+import com.google.idea.blaze.base.projectview.section.ListSection;
+import com.google.idea.blaze.base.projectview.section.sections.DirectoryEntry;
+import com.google.idea.blaze.base.projectview.section.sections.DirectorySection;
+import com.google.idea.blaze.base.scope.BlazeContext;
+import com.google.idea.blaze.base.scope.ErrorCollector;
+import com.google.idea.blaze.base.scope.output.IssueOutput;
+import com.google.idea.blaze.base.settings.Blaze.BuildSystem;
+import com.google.idea.blaze.base.settings.BlazeImportSettings;
+import com.google.idea.blaze.base.settings.BlazeImportSettingsManager;
+import com.google.idea.blaze.base.sync.projectview.WorkspaceLanguageSettings;
+import com.google.idea.blaze.base.sync.workspace.ArtifactLocationDecoder;
+import com.google.idea.blaze.java.sync.BlazeJavaSyncAugmenter;
+import com.google.idea.blaze.java.sync.importer.BlazeJavaWorkspaceImporter;
+import com.google.idea.blaze.java.sync.importer.JavaSourceFilter;
+import com.google.idea.blaze.java.sync.jdeps.JdepsMap;
+import com.google.idea.blaze.java.sync.model.BlazeContentEntry;
+import com.google.idea.blaze.java.sync.model.BlazeJarLibrary;
+import com.google.idea.blaze.java.sync.model.BlazeJavaImportResult;
+import com.google.idea.blaze.java.sync.model.BlazeSourceDirectory;
+import com.google.idea.blaze.java.sync.source.JavaLikeLanguage;
+import com.google.idea.blaze.java.sync.source.JavaSourcePackageReader;
+import com.google.idea.blaze.java.sync.source.PackageManifestReader;
+import com.google.idea.blaze.java.sync.source.SourceArtifact;
+import com.google.idea.blaze.scala.sync.model.BlazeScalaImportResult;
+import com.google.idea.blaze.scala.sync.source.ScalaJavaLikeLanguage;
+import com.intellij.openapi.extensions.ExtensionPoint;
+import java.io.File;
+import java.util.Map;
+import javax.annotation.Nullable;
+import org.jetbrains.annotations.NotNull;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+/** Tests for {@link BlazeScalaWorkspaceImporter} */
+@RunWith(JUnit4.class)
+public class BlazeScalaWorkspaceImporterTest extends BlazeTestCase {
+  private final WorkspaceRoot workspaceRoot = new WorkspaceRoot(new File("/root"));
+  private BlazeContext context;
+  private final ErrorCollector errorCollector = new ErrorCollector();
+
+  @Override
+  @SuppressWarnings("FunctionalInterfaceClash") // False positive on getDeclaredPackageOfJavaFile.
+  protected void initTest(
+      @NotNull Container applicationServices, @NotNull Container projectServices) {
+    super.initTest(applicationServices, projectServices);
+    context = new BlazeContext();
+    context.addOutputSink(IssueOutput.class, errorCollector);
+
+    registerExtensionPoint(BlazeJavaSyncAugmenter.EP_NAME, BlazeJavaSyncAugmenter.class);
+
+    BlazeImportSettingsManager importSettingsManager = new BlazeImportSettingsManager();
+    importSettingsManager.setImportSettings(
+        new BlazeImportSettings("", "", "", "", BuildSystem.Blaze));
+    projectServices.register(BlazeImportSettingsManager.class, importSettingsManager);
+
+    applicationServices.register(PrefetchService.class, new MockPrefetchService());
+    applicationServices.register(PackageManifestReader.class, new PackageManifestReader());
+
+    // will silently fall back to FilePathJavaPackageReader
+    applicationServices.register(
+        JavaSourcePackageReader.class,
+        new JavaSourcePackageReader() {
+          @Nullable
+          @Override
+          public String getDeclaredPackageOfJavaFile(
+              BlazeContext context,
+              ArtifactLocationDecoder artifactLocationDecoder,
+              SourceArtifact sourceArtifact) {
+            return null;
+          }
+        });
+
+    ExtensionPoint<JavaLikeLanguage> javaLikeLanguages =
+        registerExtensionPoint(JavaLikeLanguage.EP_NAME, JavaLikeLanguage.class);
+    javaLikeLanguages.registerExtension(new JavaLikeLanguage.Java());
+    javaLikeLanguages.registerExtension(new ScalaJavaLikeLanguage());
+  }
+
+  @Test
+  public void testEmptyProject() {
+    ProjectView projectView = ProjectView.builder().build();
+    TargetMap targetMap = TargetMapBuilder.builder().build();
+
+    BlazeJavaImportResult javaImportResult = importJava(projectView, targetMap);
+    BlazeScalaImportResult scalaImportResult = importScala(projectView, targetMap);
+    errorCollector.assertNoIssues();
+
+    assertThat(javaImportResult.libraries).isEmpty();
+    assertThat(javaImportResult.contentEntries).isEmpty();
+    assertThat(javaImportResult.javaSourceFiles).isEmpty();
+    assertThat(javaImportResult.libraries).isEmpty();
+    assertThat(scalaImportResult.libraries).isEmpty();
+  }
+
+  @Test
+  public void testSingleScalaBinary() {
+    ProjectView projectView =
+        ProjectView.builder()
+            .add(
+                ListSection.builder(DirectorySection.KEY)
+                    .add(DirectoryEntry.include(new WorkspacePath("src/main/scala/apps/example"))))
+            .build();
+
+    TargetMap targetMap =
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/scala/apps/example:example")
+                    .setBuildFile(source("src/main/scala/apps/example/BUILD"))
+                    .setKind("scala_binary")
+                    .addSource(source("src/main/scala/apps/example/Main.scala"))
+                    .addSource(source("src/main/scala/apps/example/subdir/SubdirHelper.scala"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(gen("src/main/scala/apps/example/example.jar"))
+                                    .setClassJar(gen("src/main/scala/apps/example/example.jar")))))
+            .build();
+
+    BlazeJavaImportResult javaImportResult = importJava(projectView, targetMap);
+    BlazeScalaImportResult scalaImportResult = importScala(projectView, targetMap);
+    errorCollector.assertNoIssues();
+
+    assertThat(javaImportResult.contentEntries)
+        .containsExactly(
+            BlazeContentEntry.builder("/root/src/main/scala/apps/example")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/apps/example")
+                        .setPackagePrefix("apps.example")
+                        .build())
+                .build());
+    assertThat(javaImportResult.libraries).isEmpty();
+    assertThat(javaImportResult.javaSourceFiles)
+        .containsExactly(
+            source("src/main/scala/apps/example/Main.scala"),
+            source("src/main/scala/apps/example/subdir/SubdirHelper.scala"));
+    assertThat(scalaImportResult.libraries).isEmpty();
+  }
+
+  @Test
+  public void testScalaBinaryWithMultipleLibraries() {
+    ProjectView projectView =
+        ProjectView.builder()
+            .add(
+                ListSection.builder(DirectorySection.KEY)
+                    .add(DirectoryEntry.include(new WorkspacePath("src/main/scala/apps/example"))))
+            .build();
+
+    TargetMap targetMap =
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/scala/apps/example:example")
+                    .setBuildFile(source("src/main/scala/apps/example/BUILD"))
+                    .setKind("scala_binary")
+                    .addSource(source("src/main/scala/apps/example/Main.scala"))
+                    .addSource(source("src/main/scala/apps/example/subdir/SubdirHelper.scala"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(gen("src/main/scala/apps/example/example.jar"))
+                                    .setClassJar(gen("src/main/scala/apps/example/example.jar"))))
+                    .addDependency("//src/main/scala/some/library1:library1")
+                    .addDependency("//src/main/java/other/library2:library2"))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/scala/some/library1:library1")
+                    .setBuildFile(source("src/main/scala/some/library1/BUILD"))
+                    .setKind("scala_library")
+                    .addSource(source("src/main/scala/some/library1/Library.scala"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(
+                                        gen("src/main/scala/some/library1/library1_ijar.jar"))
+                                    .setClassJar(gen("src/main/scala/some/library1/library1.jar"))))
+                    .addDependency("//src/main/java/other/import:import"))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/java/other/library2:library2")
+                    .setBuildFile(source("src/main/java/other/library2/BUILD"))
+                    .setKind("java_library")
+                    .addSource(source("src/main/java/other/library2/Library.java"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(
+                                        gen("src/main/java/other/library2/liblibrary2-ijar.jar"))
+                                    .setClassJar(
+                                        gen("src/main/java/other/library2/liblibrary2.jar")))))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/java/other/import:import")
+                    .setBuildFile(source("src/main/java/other/import/BUILD"))
+                    .setKind("java_import")
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(
+                                        gen("src/main/java/other/import/libimport-ijar.jar"))
+                                    .setClassJar(gen("src/main/java/other/import/libimport.jar")))))
+            .build();
+
+    BlazeJavaImportResult javaImportResult = importJava(projectView, targetMap);
+    BlazeScalaImportResult scalaImportResult = importScala(projectView, targetMap);
+    errorCollector.assertNoIssues();
+
+    assertThat(javaImportResult.contentEntries)
+        .containsExactly(
+            BlazeContentEntry.builder("/root/src/main/scala/apps/example")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/apps/example")
+                        .setPackagePrefix("apps.example")
+                        .build())
+                .build());
+    // Direct library deps will be double counted.
+    assertThat(javaImportResult.libraries).hasSize(2);
+    assertThat(hasLibrary(javaImportResult.libraries, "library1_ijar")).isTrue();
+    assertThat(hasLibrary(javaImportResult.libraries, "library2-ijar")).isTrue();
+    assertThat(javaImportResult.javaSourceFiles)
+        .containsExactly(
+            source("src/main/scala/apps/example/Main.scala"),
+            source("src/main/scala/apps/example/subdir/SubdirHelper.scala"));
+    assertThat(scalaImportResult.libraries).hasSize(3);
+    assertThat(hasLibrary(scalaImportResult.libraries, "library1_ijar")).isTrue();
+    assertThat(hasLibrary(scalaImportResult.libraries, "library2-ijar")).isTrue();
+    assertThat(hasLibrary(scalaImportResult.libraries, "import-ijar")).isTrue();
+  }
+
+  @Test
+  public void testScalaAndJavaBinary() {
+    ProjectView projectView =
+        ProjectView.builder()
+            .add(
+                ListSection.builder(DirectorySection.KEY)
+                    .add(DirectoryEntry.include(new WorkspacePath("src/main/scala/apps/example")))
+                    .add(DirectoryEntry.include(new WorkspacePath("src/main/java/apps/example"))))
+            .build();
+
+    TargetMap targetMap =
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/scala/apps/example:example")
+                    .setBuildFile(source("src/main/scala/apps/example/BUILD"))
+                    .setKind("scala_binary")
+                    .addSource(source("src/main/scala/apps/example/Main.scala"))
+                    .addSource(source("src/main/scala/apps/example/subdir/SubdirHelper.scala"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(gen("src/main/scala/apps/example/example.jar"))
+                                    .setClassJar(gen("src/main/scala/apps/example/example.jar")))))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/java/apps/example:example")
+                    .setBuildFile(source("src/main/java/apps/example/BUILD"))
+                    .setKind("java_binary")
+                    .addSource(source("src/main/java/apps/example/Main.java"))
+                    .addSource(source("src/main/java/apps/example/subdir/SubdirHelper.java"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(gen("src/main/java/apps/example/example.jar"))
+                                    .setClassJar(gen("src/main/java/apps/example/example.jar")))))
+            .build();
+
+    BlazeJavaImportResult javaImportResult = importJava(projectView, targetMap);
+    BlazeScalaImportResult scalaImportResult = importScala(projectView, targetMap);
+    errorCollector.assertNoIssues();
+
+    assertThat(javaImportResult.contentEntries)
+        .containsExactly(
+            BlazeContentEntry.builder("/root/src/main/scala/apps/example")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/apps/example")
+                        .setPackagePrefix("apps.example")
+                        .build())
+                .build(),
+            BlazeContentEntry.builder("/root/src/main/java/apps/example")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/java/apps/example")
+                        .setPackagePrefix("apps.example")
+                        .build())
+                .build());
+    assertThat(javaImportResult.libraries).isEmpty();
+    assertThat(javaImportResult.javaSourceFiles)
+        .containsExactly(
+            source("src/main/scala/apps/example/Main.scala"),
+            source("src/main/scala/apps/example/subdir/SubdirHelper.scala"),
+            source("src/main/java/apps/example/Main.java"),
+            source("src/main/java/apps/example/subdir/SubdirHelper.java"));
+    assertThat(scalaImportResult.libraries).isEmpty();
+  }
+
+  @Test
+  public void testTwoScalaBinariesWithSharedLibrary() {
+    ProjectView projectView =
+        ProjectView.builder()
+            .add(
+                ListSection.builder(DirectorySection.KEY)
+                    .add(DirectoryEntry.include(new WorkspacePath("src/main/scala/apps/example")))
+                    .add(DirectoryEntry.include(new WorkspacePath("src/main/scala/apps/other"))))
+            .build();
+
+    TargetMap targetMap =
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/scala/apps/example:example")
+                    .setBuildFile(source("src/main/scala/apps/example/BUILD"))
+                    .setKind("scala_binary")
+                    .addSource(source("src/main/scala/apps/example/Main.scala"))
+                    .addSource(source("src/main/scala/apps/example/subdir/SubdirHelper.scala"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(gen("src/main/scala/apps/example/example.jar"))
+                                    .setClassJar(gen("src/main/scala/apps/example/example.jar"))))
+                    .addDependency("//src/main/scala/some/library:library"))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/scala/apps/other:other")
+                    .setBuildFile(source("src/main/scala/apps/other/BUILD"))
+                    .setKind("scala_binary")
+                    .addSource(source("src/main/scala/apps/other/Main.scala"))
+                    .addSource(source("src/main/scala/apps/other/subdir/SubdirHelper.scala"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(gen("src/main/scala/apps/other/other.jar"))
+                                    .setClassJar(gen("src/main/scala/apps/other/other.jar"))))
+                    .addDependency("//src/main/scala/some/library:library"))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/scala/some/library:library")
+                    .setBuildFile(source("src/main/scala/some/library/BUILD"))
+                    .setKind("scala_library")
+                    .addSource(source("src/main/scala/some/library/Library.scala"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(
+                                        gen("src/main/scala/some/library/library_ijar.jar"))
+                                    .setClassJar(gen("src/main/scala/some/library/library.jar")))))
+            .build();
+
+    BlazeJavaImportResult javaImportResult = importJava(projectView, targetMap);
+    BlazeScalaImportResult scalaImportResult = importScala(projectView, targetMap);
+    errorCollector.assertNoIssues();
+
+    assertThat(javaImportResult.contentEntries)
+        .containsExactly(
+            BlazeContentEntry.builder("/root/src/main/scala/apps/example")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/apps/example")
+                        .setPackagePrefix("apps.example")
+                        .build())
+                .build(),
+            BlazeContentEntry.builder("/root/src/main/scala/apps/other")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/apps/other")
+                        .setPackagePrefix("apps.other")
+                        .build())
+                .build());
+    // Direct library deps will be double counted.
+    assertThat(javaImportResult.libraries).hasSize(1);
+    assertThat(hasLibrary(javaImportResult.libraries, "library_ijar")).isTrue();
+    assertThat(javaImportResult.javaSourceFiles)
+        .containsExactly(
+            source("src/main/scala/apps/example/Main.scala"),
+            source("src/main/scala/apps/example/subdir/SubdirHelper.scala"),
+            source("src/main/scala/apps/other/Main.scala"),
+            source("src/main/scala/apps/other/subdir/SubdirHelper.scala"));
+    assertThat(scalaImportResult.libraries).hasSize(1);
+    assertThat(hasLibrary(scalaImportResult.libraries, "library_ijar")).isTrue();
+  }
+
+  @Test
+  public void testSourceRulesNotInLibraries() {
+    ProjectView projectView =
+        ProjectView.builder()
+            .add(
+                ListSection.builder(DirectorySection.KEY)
+                    .add(DirectoryEntry.include(new WorkspacePath("src/main/scala/apps/example")))
+                    .add(DirectoryEntry.include(new WorkspacePath("src/main/scala/some/library1")))
+                    .add(DirectoryEntry.include(new WorkspacePath("src/main/java/other/library2"))))
+            .build();
+
+    TargetMap targetMap =
+        TargetMapBuilder.builder()
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/scala/apps/example:example")
+                    .setBuildFile(source("src/main/scala/apps/example/BUILD"))
+                    .setKind("scala_binary")
+                    .addSource(source("src/main/scala/apps/example/Main.scala"))
+                    .addSource(source("src/main/scala/apps/example/subdir/SubdirHelper.scala"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(gen("src/main/scala/apps/example/example.jar"))
+                                    .setClassJar(gen("src/main/scala/apps/example/example.jar"))))
+                    .addDependency("//src/main/scala/some/library1:library1")
+                    .addDependency("//src/main/java/other/library2:library2"))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/scala/some/library1:library1")
+                    .setBuildFile(source("src/main/scala/some/library1/BUILD"))
+                    .setKind("scala_library")
+                    .addSource(source("src/main/scala/some/library1/Library.scala"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(
+                                        gen("src/main/scala/some/library1/library1_ijar.jar"))
+                                    .setClassJar(
+                                        gen("src/main/scala/some/library1/library1.jar")))))
+            .addTarget(
+                TargetIdeInfo.builder()
+                    .setLabel("//src/main/java/other/library2:library2")
+                    .setBuildFile(source("src/main/java/other/library2/BUILD"))
+                    .setKind("java_library")
+                    .addSource(source("src/main/java/other/library2/Library.java"))
+                    .setJavaInfo(
+                        JavaIdeInfo.builder()
+                            .addJar(
+                                LibraryArtifact.builder()
+                                    .setInterfaceJar(
+                                        gen("src/main/java/other/library2/libibrary2-ijar.jar"))
+                                    .setClassJar(
+                                        gen("src/main/java/other/library2/liblibrary2.jar")))))
+            .build();
+
+    BlazeJavaImportResult javaImportResult = importJava(projectView, targetMap);
+    BlazeScalaImportResult scalaImportResult = importScala(projectView, targetMap);
+    errorCollector.assertNoIssues();
+
+    assertThat(javaImportResult.contentEntries)
+        .containsExactly(
+            BlazeContentEntry.builder("/root/src/main/scala/apps/example")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/apps/example")
+                        .setPackagePrefix("apps.example")
+                        .build())
+                .build(),
+            BlazeContentEntry.builder("/root/src/main/scala/some/library1")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/scala/some/library1")
+                        .setPackagePrefix("some.library1")
+                        .build())
+                .build(),
+            BlazeContentEntry.builder("/root/src/main/java/other/library2")
+                .addSource(
+                    BlazeSourceDirectory.builder("/root/src/main/java/other/library2")
+                        .setPackagePrefix("other.library2")
+                        .build())
+                .build());
+    assertThat(javaImportResult.libraries).isEmpty();
+    assertThat(javaImportResult.javaSourceFiles)
+        .containsExactly(
+            source("src/main/scala/apps/example/Main.scala"),
+            source("src/main/scala/apps/example/subdir/SubdirHelper.scala"),
+            source("src/main/scala/some/library1/Library.scala"),
+            source("src/main/java/other/library2/Library.java"));
+    assertThat(scalaImportResult.libraries).isEmpty();
+  }
+
+  private static boolean hasLibrary(
+      Map<LibraryKey, BlazeJarLibrary> libraries, String libraryName) {
+    return libraries
+        .values()
+        .stream()
+        .anyMatch(
+            library ->
+                library
+                    .libraryArtifact
+                    .jarForIntellijLibrary()
+                    .relativePath
+                    .endsWith(libraryName + ".jar"));
+  }
+
+  private BlazeJavaImportResult importJava(ProjectView projectView, TargetMap targetMap) {
+    ProjectViewSet projectViewSet = ProjectViewSet.builder().add(projectView).build();
+    WorkspaceLanguageSettings languageSettings =
+        new WorkspaceLanguageSettings(
+            WorkspaceType.JAVA,
+            ImmutableSet.of(LanguageClass.GENERIC, LanguageClass.SCALA, LanguageClass.JAVA));
+    JavaSourceFilter sourceFilter =
+        new JavaSourceFilter(project, workspaceRoot, projectViewSet, targetMap);
+    JdepsMap jdepsMap = key -> ImmutableList.of();
+    ArtifactLocationDecoder decoder = location -> new File(location.getRelativePath());
+    return new BlazeJavaWorkspaceImporter(
+            project,
+            workspaceRoot,
+            projectViewSet,
+            languageSettings,
+            targetMap,
+            sourceFilter,
+            jdepsMap,
+            null,
+            decoder)
+        .importWorkspace(context);
+  }
+
+  private BlazeScalaImportResult importScala(ProjectView projectView, TargetMap targetMap) {
+    ProjectViewSet projectViewSet = ProjectViewSet.builder().add(projectView).build();
+    return new BlazeScalaWorkspaceImporter(project, workspaceRoot, projectViewSet, targetMap)
+        .importWorkspace();
+  }
+
+  private static ArtifactLocation source(String relativePath) {
+    return ArtifactLocation.builder().setRelativePath(relativePath).setIsSource(true).build();
+  }
+
+  private static ArtifactLocation gen(String relativePath) {
+    return ArtifactLocation.builder()
+        .setRootExecutionPathFragment("blaze-out/bin")
+        .setRelativePath(relativePath)
+        .setIsSource(false)
+        .build();
+  }
+}
diff --git a/sdkcompat/BUILD b/sdkcompat/BUILD
index a3b2a13..a152a21 100644
--- a/sdkcompat/BUILD
+++ b/sdkcompat/BUILD
@@ -6,19 +6,14 @@
 
 java_library(
     name = "sdkcompat",
-    srcs = select_for_plugin_api({
-        "android-studio-145.1617.8": ["//sdkcompat/v145"],
-        "android-studio-2.3.0.3": ["//sdkcompat/v162"],
-        "android-studio-2.3.0.4": ["//sdkcompat/v162"],
-        "android-studio-2.3.0.6": ["//sdkcompat/v162"],
+    visibility = ["//visibility:public"],
+    exports = select_for_plugin_api({
+        "android-studio-2.3.0.8": ["//sdkcompat/v162"],
+        "android-studio-2.3.1.0": ["//sdkcompat/v162"],
+        "intellij-2017.1.1": ["//sdkcompat/v171"],
         "intellij-2016.3.1": ["//sdkcompat/v163"],
-        "intellij-162.2032.8": ["//sdkcompat/v162"],
         "clion-162.1967.7": ["//sdkcompat/v162"],
         "clion-2016.3.2": ["//sdkcompat/v163"],
+        "clion-2017.1.1": ["//sdkcompat/v171"],
     }),
-    visibility = ["//visibility:public"],
-    deps = [
-        "//intellij_platform_sdk:plugin_api",
-        "@jsr305_annotations//jar",
-    ],
 )
diff --git a/sdkcompat/v145/BUILD b/sdkcompat/v145/BUILD
deleted file mode 100644
index a12549d..0000000
--- a/sdkcompat/v145/BUILD
+++ /dev/null
@@ -1,23 +0,0 @@
-# Description: Indirections for SDK changes to the underlying platform library.
-
-licenses(["notice"])  # Apache 2.0
-
-load("//intellij_platform_sdk:build_defs.bzl", "select_for_ide")
-
-filegroup(
-    name = "v145",
-    srcs = glob([
-        "com/google/idea/sdkcompat/codestyle/**",
-        "com/google/idea/sdkcompat/smrunner/**",
-        "com/google/idea/sdkcompat/transactions/**",
-        "com/google/idea/sdkcompat/vcs/**",
-    ]) + select_for_ide(
-        android_studio = glob([
-            "com/google/idea/sdkcompat/debugger/**",
-            "com/google/idea/sdkcompat/cidr/**",
-        ]),
-        clion = glob(["com/google/idea/sdkcompat/cidr/**"]),
-        intellij = glob(["com/google/idea/sdkcompat/debugger/**"]),
-    ),
-    visibility = ["//sdkcompat:__pkg__"],
-)
diff --git a/sdkcompat/v145/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java b/sdkcompat/v145/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java
deleted file mode 100644
index ccf31fe..0000000
--- a/sdkcompat/v145/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package com.google.idea.sdkcompat.cidr;
-
-import com.intellij.openapi.project.Project;
-import com.jetbrains.cidr.lang.workspace.OCResolveConfiguration;
-import com.jetbrains.cidr.lang.workspace.OCWorkspace;
-import com.jetbrains.cidr.lang.workspace.OCWorkspaceModificationTrackers;
-import javax.annotation.Nullable;
-
-/** Adapter to extend two bridge different SDK versions. */
-public abstract class OCWorkspaceAdapter implements OCWorkspace {
-
-  private final Project project;
-
-  protected OCWorkspaceAdapter(Project project) {
-    this.project = project;
-  }
-
-  @Nullable
-  @Override
-  public OCResolveConfiguration getSelectedResolveConfiguration() {
-    return null;
-  }
-
-  @Override
-  public OCWorkspaceModificationTrackers getModificationTrackers() {
-    return OCWorkspaceModificationTrackersCompatUtils.getTrackers(project);
-  }
-}
diff --git a/sdkcompat/v145/com/google/idea/sdkcompat/codestyle/CodeStyleManagerSdkCompatAdapter.java b/sdkcompat/v145/com/google/idea/sdkcompat/codestyle/CodeStyleManagerSdkCompatAdapter.java
deleted file mode 100644
index 6051cc9..0000000
--- a/sdkcompat/v145/com/google/idea/sdkcompat/codestyle/CodeStyleManagerSdkCompatAdapter.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.google.idea.sdkcompat.codestyle;
-
-import com.intellij.psi.codeStyle.CodeStyleManager;
-
-/** Adapter to extend two bridge different IntelliJ SDK versions. */
-public abstract class CodeStyleManagerSdkCompatAdapter extends CodeStyleManager {}
diff --git a/sdkcompat/v145/com/google/idea/sdkcompat/debugger/GenericDebuggerRunnerSdkCompatAdapter.java b/sdkcompat/v145/com/google/idea/sdkcompat/debugger/GenericDebuggerRunnerSdkCompatAdapter.java
deleted file mode 100644
index 6dfc995..0000000
--- a/sdkcompat/v145/com/google/idea/sdkcompat/debugger/GenericDebuggerRunnerSdkCompatAdapter.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.google.idea.sdkcompat.debugger;
-
-import com.intellij.debugger.impl.GenericDebuggerRunner;
-import com.intellij.execution.ExecutionException;
-import com.intellij.execution.configurations.RemoteConnection;
-import com.intellij.execution.configurations.RunProfileState;
-import com.intellij.execution.runners.ExecutionEnvironment;
-import com.intellij.execution.ui.RunContentDescriptor;
-import javax.annotation.Nullable;
-
-/** SDK compatibility for {@link GenericDebuggerRunner}. */
-public class GenericDebuggerRunnerSdkCompatAdapter extends GenericDebuggerRunner {
-
-  @Nullable
-  protected RunContentDescriptor attachVirtualMachine(
-      RunProfileState state,
-      ExecutionEnvironment env,
-      RemoteConnection connection,
-      long pollTimeout)
-      throws ExecutionException {
-    // no timeout available until 2016.2 onwards
-    return super.attachVirtualMachine(
-        state, env, connection, pollTimeout != 0 /* pollConnection */);
-  }
-}
diff --git a/sdkcompat/v145/com/google/idea/sdkcompat/transactions/Transactions.java b/sdkcompat/v145/com/google/idea/sdkcompat/transactions/Transactions.java
deleted file mode 100644
index 94ab905..0000000
--- a/sdkcompat/v145/com/google/idea/sdkcompat/transactions/Transactions.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.google.idea.sdkcompat.transactions;
-
-import com.intellij.openapi.Disposable;
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.application.ModalityState;
-
-/** Created by tomlu on 12/22/16. */
-public class Transactions {
-  public static void submitTransactionAndWait(Runnable runnable) {
-    ApplicationManager.getApplication().invokeAndWait(runnable, ModalityState.any());
-  }
-
-  public static void submitTransaction(Disposable disposable, Runnable runnable) {
-    ApplicationManager.getApplication().invokeLater(runnable);
-  }
-}
diff --git a/sdkcompat/v145/com/google/idea/sdkcompat/vcs/ChangeListManagerSdkCompatAdapter.java b/sdkcompat/v145/com/google/idea/sdkcompat/vcs/ChangeListManagerSdkCompatAdapter.java
deleted file mode 100644
index df055ea..0000000
--- a/sdkcompat/v145/com/google/idea/sdkcompat/vcs/ChangeListManagerSdkCompatAdapter.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.google.idea.sdkcompat.vcs;
-
-import com.intellij.openapi.vcs.changes.ChangeListManager;
-import com.intellij.util.continuation.ContinuationPause;
-
-/** SDK adapter for change list interface. */
-public abstract class ChangeListManagerSdkCompatAdapter extends ChangeListManager {
-  @Override
-  public void freeze(ContinuationPause context, String reason) {
-    throw new UnsupportedOperationException("ChangeListManager#freeze()");
-  }
-}
diff --git a/sdkcompat/v162/BUILD b/sdkcompat/v162/BUILD
index f8ddfc1..8eb53e7 100644
--- a/sdkcompat/v162/BUILD
+++ b/sdkcompat/v162/BUILD
@@ -4,7 +4,7 @@
 
 load("//intellij_platform_sdk:build_defs.bzl", "select_for_ide")
 
-filegroup(
+java_library(
     name = "v162",
     srcs = glob([
         "com/google/idea/sdkcompat/codestyle/**",
@@ -13,14 +13,22 @@
         "com/google/idea/sdkcompat/vcs/**",
     ]) + select_for_ide(
         android_studio = glob([
-            "com/google/idea/sdkcompat/debugger/**",
             "com/google/idea/sdkcompat/cidr/**",
         ]),
         clion = glob([
             "com/google/idea/sdkcompat/cidr/**",
             "com/google/idea/sdkcompat/clion/**",
         ]),
-        intellij = glob(["com/google/idea/sdkcompat/debugger/**"]),
+        intellij = glob([
+            "com/google/idea/sdkcompat/python/**",
+            "com/google/idea/sdkcompat/dart/**",
+        ]),
     ),
     visibility = ["//sdkcompat:__pkg__"],
+    deps = [
+        "//intellij_platform_sdk:plugin_api",
+        "@jsr305_annotations//jar",
+    ] + select_for_ide(
+        intellij = ["//third_party/python"],
+    ),
 )
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/cidr/CidrCompilerSwitchesAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/cidr/CidrCompilerSwitchesAdapter.java
new file mode 100644
index 0000000..d60a1a6
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/cidr/CidrCompilerSwitchesAdapter.java
@@ -0,0 +1,20 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.jetbrains.cidr.lang.toolchains.CidrCompilerSwitches;
+import java.util.List;
+
+/** Adapter to bridge different SDK versions. */
+public class CidrCompilerSwitchesAdapter {
+  /** Old interface does not know anything about CidrCompilerSwitches.Format */
+  public static List<String> getFileArgs(CidrCompilerSwitches switches) {
+    return switches.getFileArgs();
+  }
+
+  public static List<String> getCommandLineArgs(CidrCompilerSwitches switches) {
+    return switches.getCommandLineArgs();
+  }
+
+  public static String getCommandLineString(CidrCompilerSwitches switches) {
+    return switches.getCommandLineString();
+  }
+}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
index 66a868e..63eabeb 100644
--- a/sdkcompat/v162/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
@@ -3,7 +3,7 @@
 import com.intellij.openapi.project.Project;
 import com.jetbrains.cidr.execution.CidrConsoleBuilder;
 
-/** Adapter to extend two bridge different SDK versions. */
+/** Adapter to bridge different SDK versions. */
 public class CidrConsoleBuilderAdapter extends CidrConsoleBuilder {
 
   public CidrConsoleBuilderAdapter(Project project) {
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/cidr/CidrSwitchBuilderAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/cidr/CidrSwitchBuilderAdapter.java
new file mode 100644
index 0000000..c39c08b
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/cidr/CidrSwitchBuilderAdapter.java
@@ -0,0 +1,24 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.google.common.base.Joiner;
+import com.jetbrains.cidr.lang.toolchains.CidrSwitchBuilder;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/** Adapter to bridge different SDK versions. */
+public class CidrSwitchBuilderAdapter extends CidrSwitchBuilder {
+  /**
+   * Old CidrSwitchBuilder is unable to deal with options with spaces embedded. This is a hack to
+   * preserve the old behaviour for 2016.2 Original hack explanation: - this list of switches is
+   * currently only used in one place -- GCCCompiler.tryRunGCC. - list is written to an argument
+   * file, whitespace-separated, then passed as a @file arg to clang. In this context, escaped
+   * whitespace within a single arg is not handled. Currently, the only way (short of using
+   * reflection) to ensure unescaped whitespace is to have CidrSwitchBuilder treat whitespace as a
+   * delimiter between args.
+   */
+  public CidrSwitchBuilderAdapter addAllRaw(List<String> switches) {
+    switches = switches.stream().map(flag -> flag.replace("\\ ", " ")).collect(Collectors.toList());
+    addAll(Joiner.on(" ").join(switches), CidrSwitchBuilder.Format.FILE_ARGS);
+    return this;
+  }
+}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/cidr/OCResolveConfigurationAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/cidr/OCResolveConfigurationAdapter.java
new file mode 100644
index 0000000..912eb77
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/cidr/OCResolveConfigurationAdapter.java
@@ -0,0 +1,20 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.cidr.lang.OCLanguageKind;
+import com.jetbrains.cidr.lang.workspace.OCResolveConfiguration;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/** Adapter to bridge different SDK versions. */
+public interface OCResolveConfigurationAdapter extends OCResolveConfiguration {
+  /* v171 */
+  public List<VirtualFile> getPrecompiledHeaders(OCLanguageKind kind, VirtualFile sourceFile);
+
+  /* v171 */
+  public Collection<VirtualFile> getSources();
+
+  /* v171 */
+  public Set<VirtualFile> getPrecompiledHeaders();
+}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java
index ccf31fe..99c1d36 100644
--- a/sdkcompat/v162/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java
@@ -6,7 +6,7 @@
 import com.jetbrains.cidr.lang.workspace.OCWorkspaceModificationTrackers;
 import javax.annotation.Nullable;
 
-/** Adapter to extend two bridge different SDK versions. */
+/** Adapter to bridge different SDK versions. */
 public abstract class OCWorkspaceAdapter implements OCWorkspace {
 
   private final Project project;
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/codestyle/CodeStyleManagerSdkCompatAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/codestyle/CodeStyleManagerSdkCompatAdapter.java
deleted file mode 100644
index 6051cc9..0000000
--- a/sdkcompat/v162/com/google/idea/sdkcompat/codestyle/CodeStyleManagerSdkCompatAdapter.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.google.idea.sdkcompat.codestyle;
-
-import com.intellij.psi.codeStyle.CodeStyleManager;
-
-/** Adapter to extend two bridge different IntelliJ SDK versions. */
-public abstract class CodeStyleManagerSdkCompatAdapter extends CodeStyleManager {}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/codestyle/DelegatingCodeStyleManagerSdkCompatAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/codestyle/DelegatingCodeStyleManagerSdkCompatAdapter.java
new file mode 100644
index 0000000..a16e94a
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/codestyle/DelegatingCodeStyleManagerSdkCompatAdapter.java
@@ -0,0 +1,13 @@
+package com.google.idea.sdkcompat.codestyle;
+
+import com.intellij.psi.codeStyle.CodeStyleManager;
+
+/** Adapter to bridge different SDK versions. */
+public abstract class DelegatingCodeStyleManagerSdkCompatAdapter extends CodeStyleManager {
+
+  protected CodeStyleManager delegate;
+
+  protected DelegatingCodeStyleManagerSdkCompatAdapter(CodeStyleManager delegate) {
+    this.delegate = delegate;
+  }
+}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/dart/DartSdkCompatUtils.java b/sdkcompat/v162/com/google/idea/sdkcompat/dart/DartSdkCompatUtils.java
new file mode 100644
index 0000000..58f48e4
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/dart/DartSdkCompatUtils.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.sdkcompat.dart;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.impl.libraries.ApplicationLibraryTable;
+import com.intellij.openapi.roots.libraries.Library;
+import javax.annotation.Nullable;
+
+/** Handles changes to the Dart plugin libraries between our supported versions. */
+public class DartSdkCompatUtils {
+
+  public static final String DART_SDK_LIBRARY_NAME = "Dart SDK";
+
+  @Nullable
+  public static Library findDartLibrary(Project project) {
+    return ApplicationLibraryTable.getApplicationTable().getLibraryByName(DART_SDK_LIBRARY_NAME);
+  }
+}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/debugger/GenericDebuggerRunnerSdkCompatAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/debugger/GenericDebuggerRunnerSdkCompatAdapter.java
deleted file mode 100644
index ed822b3..0000000
--- a/sdkcompat/v162/com/google/idea/sdkcompat/debugger/GenericDebuggerRunnerSdkCompatAdapter.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.google.idea.sdkcompat.debugger;
-
-import com.intellij.debugger.impl.GenericDebuggerRunner;
-
-/** SDK compatibility for {@link GenericDebuggerRunner}. */
-public class GenericDebuggerRunnerSdkCompatAdapter extends GenericDebuggerRunner {}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/python/PyConfigurationProducersList.java b/sdkcompat/v162/com/google/idea/sdkcompat/python/PyConfigurationProducersList.java
new file mode 100644
index 0000000..b3785da
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/python/PyConfigurationProducersList.java
@@ -0,0 +1,17 @@
+package com.google.idea.sdkcompat.python;
+
+import com.google.common.collect.ImmutableList;
+import java.util.Collection;
+
+/** List of python configuration producers for a given plugin version. */
+public class PyConfigurationProducersList {
+
+  public static final Collection<Class<?>> PRODUCERS_TO_SUPPRESS =
+      ImmutableList.of(
+          com.jetbrains.python.run.PythonRunConfigurationProducer.class,
+          com.jetbrains.python.testing.attest.PythonAtTestConfigurationProducer.class,
+          com.jetbrains.python.testing.nosetest.PythonNoseTestConfigurationProducer.class,
+          com.jetbrains.python.testing.doctest.PythonDocTestConfigurationProducer.class,
+          com.jetbrains.python.testing.pytest.PyTestConfigurationProducer.class,
+          com.jetbrains.python.testing.unittest.PythonUnitTestConfigurationProducer.class);
+}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/python/PyImportResolverAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/python/PyImportResolverAdapter.java
new file mode 100644
index 0000000..9ccba03
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/python/PyImportResolverAdapter.java
@@ -0,0 +1,23 @@
+package com.google.idea.sdkcompat.python;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.util.QualifiedName;
+import com.jetbrains.python.psi.impl.PyImportResolver;
+import com.jetbrains.python.psi.resolve.QualifiedNameResolveContext;
+import javax.annotation.Nullable;
+
+/** Adapter to bridge different SDK versions. */
+public interface PyImportResolverAdapter extends PyImportResolver {
+
+  @Nullable
+  PsiElement resolveImportReference(
+      QualifiedName name, PyQualifiedNameResolveContextAdapter context, boolean withRoots);
+
+  @Override
+  @Nullable
+  default PsiElement resolveImportReference(
+      QualifiedName name, QualifiedNameResolveContext context, boolean withRoots) {
+    return resolveImportReference(
+        name, new PyQualifiedNameResolveContextAdapter(context), withRoots);
+  }
+}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/python/PyQualifiedNameResolveContextAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/python/PyQualifiedNameResolveContextAdapter.java
new file mode 100644
index 0000000..7330e11
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/python/PyQualifiedNameResolveContextAdapter.java
@@ -0,0 +1,77 @@
+package com.google.idea.sdkcompat.python;
+
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
+import com.jetbrains.python.psi.resolve.QualifiedNameResolveContext;
+import javax.annotation.Nullable;
+
+/** Adapter to bridge different SDK versions. */
+public class PyQualifiedNameResolveContextAdapter extends QualifiedNameResolveContext {
+
+  private final QualifiedNameResolveContext delegate;
+
+  PyQualifiedNameResolveContextAdapter(QualifiedNameResolveContext delegate) {
+    this.delegate = delegate;
+  }
+
+  @Override
+  public void copyFrom(QualifiedNameResolveContext context) {
+    delegate.copyFrom(context);
+  }
+
+  @Override
+  public void setFromElement(PsiElement element) {
+    delegate.setFromElement(element);
+  }
+
+  @Override
+  public void setFromModule(Module module) {
+    delegate.setFromModule(module);
+  }
+
+  @Override
+  public void setFromSdk(Project project, Sdk sdk) {
+    delegate.setFromSdk(project, sdk);
+  }
+
+  @Override
+  public void setSdk(Sdk sdk) {
+    delegate.setSdk(sdk);
+  }
+
+  @Override
+  @Nullable
+  public Module getModule() {
+    return delegate.getModule();
+  }
+
+  @Override
+  public boolean isValid() {
+    return delegate.isValid();
+  }
+
+  @Override
+  @Nullable
+  public PsiFile getFootholdFile() {
+    return delegate.getFootholdFile();
+  }
+
+  @Override
+  public PsiManager getPsiManager() {
+    return delegate.getPsiManager();
+  }
+
+  @Override
+  public Project getProject() {
+    return delegate.getProject();
+  }
+
+  @Override
+  public Sdk getSdk() {
+    return delegate.getSdk();
+  }
+}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/python/PyReferenceResolveProviderAdapter.java b/sdkcompat/v162/com/google/idea/sdkcompat/python/PyReferenceResolveProviderAdapter.java
new file mode 100644
index 0000000..36d4767
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/python/PyReferenceResolveProviderAdapter.java
@@ -0,0 +1,19 @@
+package com.google.idea.sdkcompat.python;
+
+import com.jetbrains.python.psi.PyQualifiedExpression;
+import com.jetbrains.python.psi.resolve.PyReferenceResolveProvider;
+import com.jetbrains.python.psi.resolve.RatedResolveResult;
+import com.jetbrains.python.psi.types.TypeEvalContext;
+import java.util.List;
+
+/** Adapter to bridge different SDK versions. */
+public interface PyReferenceResolveProviderAdapter extends PyReferenceResolveProvider {
+
+  @Override
+  default List<RatedResolveResult> resolveName(PyQualifiedExpression element) {
+    TypeEvalContext context = TypeEvalContext.codeInsightFallback(element.getProject());
+    return resolveName(element, context);
+  }
+
+  List<RatedResolveResult> resolveName(PyQualifiedExpression element, TypeEvalContext context);
+}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/python/ResolveImportCompatUtils.java b/sdkcompat/v162/com/google/idea/sdkcompat/python/ResolveImportCompatUtils.java
new file mode 100644
index 0000000..5a6bef2
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/python/ResolveImportCompatUtils.java
@@ -0,0 +1,22 @@
+package com.google.idea.sdkcompat.python;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.python.psi.resolve.ResolveImportUtil;
+import javax.annotation.Nullable;
+
+/** Handles changes to {@link ResolveImportUtil} between our supported versions. */
+public class ResolveImportCompatUtils {
+
+  @Nullable
+  public static PsiElement resolveChild(
+      @Nullable PsiElement parent,
+      String referencedName,
+      @Nullable PsiFile containingFile,
+      boolean fileOnly,
+      boolean checkForPackage,
+      boolean withoutStubs) {
+    return ResolveImportUtil.resolveChild(
+        parent, referencedName, containingFile, fileOnly, checkForPackage);
+  }
+}
diff --git a/sdkcompat/v162/com/google/idea/sdkcompat/vcs/MergeDataBuilder.java b/sdkcompat/v162/com/google/idea/sdkcompat/vcs/MergeDataBuilder.java
new file mode 100644
index 0000000..b0a7697
--- /dev/null
+++ b/sdkcompat/v162/com/google/idea/sdkcompat/vcs/MergeDataBuilder.java
@@ -0,0 +1,54 @@
+package com.google.idea.sdkcompat.vcs;
+
+import com.intellij.openapi.vcs.FilePath;
+import com.intellij.openapi.vcs.history.VcsRevisionNumber;
+import com.intellij.openapi.vcs.merge.MergeData;
+import org.jetbrains.annotations.Nullable;
+
+/** SDK adapter for creating {@link MergeData}. */
+public final class MergeDataBuilder {
+  private byte[] baseContent;
+  private byte[] theirsContent;
+  private byte[] yoursContent;
+
+  @Nullable private VcsRevisionNumber theirsRevisionNumber;
+
+  public void setBaseContent(byte[] baseContent) {
+    this.baseContent = baseContent;
+  }
+
+  public void setTheirsContent(byte[] theirsContent) {
+    this.theirsContent = theirsContent;
+  }
+
+  public void setYoursContent(byte[] yoursContent) {
+    this.yoursContent = yoursContent;
+  }
+
+  public void setBaseRevisionNumber(@Nullable VcsRevisionNumber baseRevisionNumber) {}
+
+  public void setTheirsRevisionNumber(@Nullable VcsRevisionNumber theirsRevisionNumber) {
+    this.theirsRevisionNumber = theirsRevisionNumber;
+  }
+
+  public void setYoursRevisionNumber(@Nullable VcsRevisionNumber yoursRevisionNumber) {}
+
+  public void setBaseFilePath(@Nullable FilePath baseFilePath) {}
+
+  public void setTheirsFilePath(@Nullable FilePath theirsFilePath) {}
+
+  public void setYoursFilePath(@Nullable FilePath yoursFilePath) {}
+
+  public MergeData build() {
+    MergeData mergeData = new MergeData();
+
+    mergeData.ORIGINAL = baseContent;
+
+    mergeData.LAST = theirsContent;
+    mergeData.LAST_REVISION_NUMBER = theirsRevisionNumber;
+
+    mergeData.CURRENT = yoursContent;
+
+    return mergeData;
+  }
+}
diff --git a/sdkcompat/v163/BUILD b/sdkcompat/v163/BUILD
index ca51bb8..8e2c272 100644
--- a/sdkcompat/v163/BUILD
+++ b/sdkcompat/v163/BUILD
@@ -4,7 +4,7 @@
 
 load("//intellij_platform_sdk:build_defs.bzl", "select_for_ide")
 
-filegroup(
+java_library(
     name = "v163",
     srcs = glob([
         "com/google/idea/sdkcompat/codestyle/**",
@@ -13,14 +13,22 @@
         "com/google/idea/sdkcompat/vcs/**",
     ]) + select_for_ide(
         android_studio = glob([
-            "com/google/idea/sdkcompat/debugger/**",
             "com/google/idea/sdkcompat/cidr/**",
         ]),
         clion = glob([
             "com/google/idea/sdkcompat/cidr/**",
             "com/google/idea/sdkcompat/clion/**",
         ]),
-        intellij = glob(["com/google/idea/sdkcompat/debugger/**"]),
+        intellij = glob([
+            "com/google/idea/sdkcompat/python/**",
+            "com/google/idea/sdkcompat/dart/**",
+        ]),
     ),
     visibility = ["//sdkcompat:__pkg__"],
+    deps = [
+        "//intellij_platform_sdk:plugin_api",
+        "@jsr305_annotations//jar",
+    ] + select_for_ide(
+        intellij = ["//third_party/python"],
+    ),
 )
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrCompilerSwitchesAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrCompilerSwitchesAdapter.java
new file mode 100644
index 0000000..d60a1a6
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrCompilerSwitchesAdapter.java
@@ -0,0 +1,20 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.jetbrains.cidr.lang.toolchains.CidrCompilerSwitches;
+import java.util.List;
+
+/** Adapter to bridge different SDK versions. */
+public class CidrCompilerSwitchesAdapter {
+  /** Old interface does not know anything about CidrCompilerSwitches.Format */
+  public static List<String> getFileArgs(CidrCompilerSwitches switches) {
+    return switches.getFileArgs();
+  }
+
+  public static List<String> getCommandLineArgs(CidrCompilerSwitches switches) {
+    return switches.getCommandLineArgs();
+  }
+
+  public static String getCommandLineString(CidrCompilerSwitches switches) {
+    return switches.getCommandLineString();
+  }
+}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
index 0ed4265..70e753b 100644
--- a/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
@@ -3,7 +3,7 @@
 import com.intellij.openapi.project.Project;
 import com.jetbrains.cidr.execution.CidrConsoleBuilder;
 
-/** Adapter to extend two bridge different SDK versions. */
+/** Adapter to bridge different SDK versions. */
 public class CidrConsoleBuilderAdapter extends CidrConsoleBuilder {
 
   public CidrConsoleBuilderAdapter(Project project) {
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrGoogleTestUtilAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrGoogleTestUtilAdapter.java
new file mode 100644
index 0000000..cf3a258
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrGoogleTestUtilAdapter.java
@@ -0,0 +1,6 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.jetbrains.cidr.execution.testing.CidrTestUtil;
+
+/** Adapter to bridge different SDK versions. */
+public class CidrGoogleTestUtilAdapter extends CidrTestUtil {}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrSwitchBuilderAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrSwitchBuilderAdapter.java
new file mode 100644
index 0000000..68772fa
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/CidrSwitchBuilderAdapter.java
@@ -0,0 +1,24 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.google.common.base.Joiner;
+import com.jetbrains.cidr.lang.toolchains.CidrSwitchBuilder;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/** Adapter to bridge different SDK versions. */
+public class CidrSwitchBuilderAdapter extends CidrSwitchBuilder {
+  /**
+   * Old CidrSwitchBuilder is unable to deal with options with spaces embedded. This is a hack to
+   * preserve the old behaviour for 2016.3 Original hack explanation: - this list of switches is
+   * currently only used in one place -- GCCCompiler.tryRunGCC. - list is written to an argument
+   * file, whitespace-separated, then passed as a @file arg to clang. In this context, escaped
+   * whitespace within a single arg is not handled. Currently, the only way (short of using
+   * reflection) to ensure unescaped whitespace is to have CidrSwitchBuilder treat whitespace as a
+   * delimiter between args.
+   */
+  public CidrSwitchBuilderAdapter addAllRaw(List<String> switches) {
+    switches = switches.stream().map(flag -> flag.replace("\\ ", " ")).collect(Collectors.toList());
+    addAll(Joiner.on(" ").join(switches), CidrSwitchBuilder.Format.FILE_ARGS);
+    return this;
+  }
+}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/cidr/OCResolveConfigurationAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/OCResolveConfigurationAdapter.java
new file mode 100644
index 0000000..912eb77
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/OCResolveConfigurationAdapter.java
@@ -0,0 +1,20 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.cidr.lang.OCLanguageKind;
+import com.jetbrains.cidr.lang.workspace.OCResolveConfiguration;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+
+/** Adapter to bridge different SDK versions. */
+public interface OCResolveConfigurationAdapter extends OCResolveConfiguration {
+  /* v171 */
+  public List<VirtualFile> getPrecompiledHeaders(OCLanguageKind kind, VirtualFile sourceFile);
+
+  /* v171 */
+  public Collection<VirtualFile> getSources();
+
+  /* v171 */
+  public Set<VirtualFile> getPrecompiledHeaders();
+}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java
index 1c4d586..4266e35 100644
--- a/sdkcompat/v163/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java
@@ -3,7 +3,7 @@
 import com.intellij.openapi.project.Project;
 import com.jetbrains.cidr.lang.workspace.OCWorkspace;
 
-/** Adapter to extend two bridge different SDK versions. */
+/** Adapter to bridge different SDK versions. */
 public abstract class OCWorkspaceAdapter implements OCWorkspace {
   protected OCWorkspaceAdapter(Project project) {}
 }
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/clion/CMakeActionList.java b/sdkcompat/v163/com/google/idea/sdkcompat/clion/CMakeActionList.java
index 007bd23..55f4936 100644
--- a/sdkcompat/v163/com/google/idea/sdkcompat/clion/CMakeActionList.java
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/clion/CMakeActionList.java
@@ -10,7 +10,7 @@
 /** Handles CMake actions which have changed between our supported versions. */
 public class CMakeActionList {
 
-  public static ImmutableSet<String> CMAKE_ACTION_IDS =
+  public static final ImmutableSet<String> CMAKE_ACTION_IDS =
       ImmutableSet.of(
           ChangeCMakeProjectContentRootAction.ID,
           ClearCMakeCacheAndReloadAction.ID,
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/clion/CMakeConfigurationProducersList.java b/sdkcompat/v163/com/google/idea/sdkcompat/clion/CMakeConfigurationProducersList.java
new file mode 100644
index 0000000..f402269
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/clion/CMakeConfigurationProducersList.java
@@ -0,0 +1,11 @@
+package com.google.idea.sdkcompat.clion;
+
+import com.google.common.collect.ImmutableList;
+import com.intellij.execution.actions.RunConfigurationProducer;
+import com.jetbrains.cidr.cpp.execution.testing.CMakeGoogleTestRunConfigurationProducer;
+
+/** List of C/C++ configuration producers for a given plugin version. */
+public class CMakeConfigurationProducersList {
+  public static final ImmutableList<Class<? extends RunConfigurationProducer<?>>>
+      PRODUCERS_TO_SUPPRESS = ImmutableList.of(CMakeGoogleTestRunConfigurationProducer.class);
+}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/codestyle/CodeStyleManagerSdkCompatAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/codestyle/DelegatingCodeStyleManagerSdkCompatAdapter.java
similarity index 70%
rename from sdkcompat/v163/com/google/idea/sdkcompat/codestyle/CodeStyleManagerSdkCompatAdapter.java
rename to sdkcompat/v163/com/google/idea/sdkcompat/codestyle/DelegatingCodeStyleManagerSdkCompatAdapter.java
index 33d3ad4..8075c2e 100644
--- a/sdkcompat/v163/com/google/idea/sdkcompat/codestyle/CodeStyleManagerSdkCompatAdapter.java
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/codestyle/DelegatingCodeStyleManagerSdkCompatAdapter.java
@@ -9,8 +9,15 @@
 import java.util.List;
 import org.jetbrains.annotations.NotNull;
 
-/** Adapter to extend two bridge different IntelliJ SDK versions. */
-public abstract class CodeStyleManagerSdkCompatAdapter extends CodeStyleManager {
+/** Adapter to bridge different SDK versions. */
+public abstract class DelegatingCodeStyleManagerSdkCompatAdapter extends CodeStyleManager {
+
+  protected CodeStyleManager delegate;
+
+  protected DelegatingCodeStyleManagerSdkCompatAdapter(CodeStyleManager delegate) {
+    this.delegate = delegate;
+  }
+
   @Override
   public void reformatTextWithContext(@NotNull PsiFile file, @NotNull ChangedRangesInfo info)
       throws IncorrectOperationException {
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/dart/DartSdkCompatUtils.java b/sdkcompat/v163/com/google/idea/sdkcompat/dart/DartSdkCompatUtils.java
new file mode 100644
index 0000000..58f48e4
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/dart/DartSdkCompatUtils.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.sdkcompat.dart;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.impl.libraries.ApplicationLibraryTable;
+import com.intellij.openapi.roots.libraries.Library;
+import javax.annotation.Nullable;
+
+/** Handles changes to the Dart plugin libraries between our supported versions. */
+public class DartSdkCompatUtils {
+
+  public static final String DART_SDK_LIBRARY_NAME = "Dart SDK";
+
+  @Nullable
+  public static Library findDartLibrary(Project project) {
+    return ApplicationLibraryTable.getApplicationTable().getLibraryByName(DART_SDK_LIBRARY_NAME);
+  }
+}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/debugger/GenericDebuggerRunnerSdkCompatAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/debugger/GenericDebuggerRunnerSdkCompatAdapter.java
deleted file mode 100644
index ed822b3..0000000
--- a/sdkcompat/v163/com/google/idea/sdkcompat/debugger/GenericDebuggerRunnerSdkCompatAdapter.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.google.idea.sdkcompat.debugger;
-
-import com.intellij.debugger.impl.GenericDebuggerRunner;
-
-/** SDK compatibility for {@link GenericDebuggerRunner}. */
-public class GenericDebuggerRunnerSdkCompatAdapter extends GenericDebuggerRunner {}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/python/PyConfigurationProducersList.java b/sdkcompat/v163/com/google/idea/sdkcompat/python/PyConfigurationProducersList.java
new file mode 100644
index 0000000..b3785da
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/python/PyConfigurationProducersList.java
@@ -0,0 +1,17 @@
+package com.google.idea.sdkcompat.python;
+
+import com.google.common.collect.ImmutableList;
+import java.util.Collection;
+
+/** List of python configuration producers for a given plugin version. */
+public class PyConfigurationProducersList {
+
+  public static final Collection<Class<?>> PRODUCERS_TO_SUPPRESS =
+      ImmutableList.of(
+          com.jetbrains.python.run.PythonRunConfigurationProducer.class,
+          com.jetbrains.python.testing.attest.PythonAtTestConfigurationProducer.class,
+          com.jetbrains.python.testing.nosetest.PythonNoseTestConfigurationProducer.class,
+          com.jetbrains.python.testing.doctest.PythonDocTestConfigurationProducer.class,
+          com.jetbrains.python.testing.pytest.PyTestConfigurationProducer.class,
+          com.jetbrains.python.testing.unittest.PythonUnitTestConfigurationProducer.class);
+}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/python/PyImportResolverAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/python/PyImportResolverAdapter.java
new file mode 100644
index 0000000..9ccba03
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/python/PyImportResolverAdapter.java
@@ -0,0 +1,23 @@
+package com.google.idea.sdkcompat.python;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.util.QualifiedName;
+import com.jetbrains.python.psi.impl.PyImportResolver;
+import com.jetbrains.python.psi.resolve.QualifiedNameResolveContext;
+import javax.annotation.Nullable;
+
+/** Adapter to bridge different SDK versions. */
+public interface PyImportResolverAdapter extends PyImportResolver {
+
+  @Nullable
+  PsiElement resolveImportReference(
+      QualifiedName name, PyQualifiedNameResolveContextAdapter context, boolean withRoots);
+
+  @Override
+  @Nullable
+  default PsiElement resolveImportReference(
+      QualifiedName name, QualifiedNameResolveContext context, boolean withRoots) {
+    return resolveImportReference(
+        name, new PyQualifiedNameResolveContextAdapter(context), withRoots);
+  }
+}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/python/PyQualifiedNameResolveContextAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/python/PyQualifiedNameResolveContextAdapter.java
new file mode 100644
index 0000000..7330e11
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/python/PyQualifiedNameResolveContextAdapter.java
@@ -0,0 +1,77 @@
+package com.google.idea.sdkcompat.python;
+
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
+import com.jetbrains.python.psi.resolve.QualifiedNameResolveContext;
+import javax.annotation.Nullable;
+
+/** Adapter to bridge different SDK versions. */
+public class PyQualifiedNameResolveContextAdapter extends QualifiedNameResolveContext {
+
+  private final QualifiedNameResolveContext delegate;
+
+  PyQualifiedNameResolveContextAdapter(QualifiedNameResolveContext delegate) {
+    this.delegate = delegate;
+  }
+
+  @Override
+  public void copyFrom(QualifiedNameResolveContext context) {
+    delegate.copyFrom(context);
+  }
+
+  @Override
+  public void setFromElement(PsiElement element) {
+    delegate.setFromElement(element);
+  }
+
+  @Override
+  public void setFromModule(Module module) {
+    delegate.setFromModule(module);
+  }
+
+  @Override
+  public void setFromSdk(Project project, Sdk sdk) {
+    delegate.setFromSdk(project, sdk);
+  }
+
+  @Override
+  public void setSdk(Sdk sdk) {
+    delegate.setSdk(sdk);
+  }
+
+  @Override
+  @Nullable
+  public Module getModule() {
+    return delegate.getModule();
+  }
+
+  @Override
+  public boolean isValid() {
+    return delegate.isValid();
+  }
+
+  @Override
+  @Nullable
+  public PsiFile getFootholdFile() {
+    return delegate.getFootholdFile();
+  }
+
+  @Override
+  public PsiManager getPsiManager() {
+    return delegate.getPsiManager();
+  }
+
+  @Override
+  public Project getProject() {
+    return delegate.getProject();
+  }
+
+  @Override
+  public Sdk getSdk() {
+    return delegate.getSdk();
+  }
+}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/python/PyReferenceResolveProviderAdapter.java b/sdkcompat/v163/com/google/idea/sdkcompat/python/PyReferenceResolveProviderAdapter.java
new file mode 100644
index 0000000..36d4767
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/python/PyReferenceResolveProviderAdapter.java
@@ -0,0 +1,19 @@
+package com.google.idea.sdkcompat.python;
+
+import com.jetbrains.python.psi.PyQualifiedExpression;
+import com.jetbrains.python.psi.resolve.PyReferenceResolveProvider;
+import com.jetbrains.python.psi.resolve.RatedResolveResult;
+import com.jetbrains.python.psi.types.TypeEvalContext;
+import java.util.List;
+
+/** Adapter to bridge different SDK versions. */
+public interface PyReferenceResolveProviderAdapter extends PyReferenceResolveProvider {
+
+  @Override
+  default List<RatedResolveResult> resolveName(PyQualifiedExpression element) {
+    TypeEvalContext context = TypeEvalContext.codeInsightFallback(element.getProject());
+    return resolveName(element, context);
+  }
+
+  List<RatedResolveResult> resolveName(PyQualifiedExpression element, TypeEvalContext context);
+}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/python/ResolveImportCompatUtils.java b/sdkcompat/v163/com/google/idea/sdkcompat/python/ResolveImportCompatUtils.java
new file mode 100644
index 0000000..5a6bef2
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/python/ResolveImportCompatUtils.java
@@ -0,0 +1,22 @@
+package com.google.idea.sdkcompat.python;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.python.psi.resolve.ResolveImportUtil;
+import javax.annotation.Nullable;
+
+/** Handles changes to {@link ResolveImportUtil} between our supported versions. */
+public class ResolveImportCompatUtils {
+
+  @Nullable
+  public static PsiElement resolveChild(
+      @Nullable PsiElement parent,
+      String referencedName,
+      @Nullable PsiFile containingFile,
+      boolean fileOnly,
+      boolean checkForPackage,
+      boolean withoutStubs) {
+    return ResolveImportUtil.resolveChild(
+        parent, referencedName, containingFile, fileOnly, checkForPackage);
+  }
+}
diff --git a/sdkcompat/v163/com/google/idea/sdkcompat/vcs/MergeDataBuilder.java b/sdkcompat/v163/com/google/idea/sdkcompat/vcs/MergeDataBuilder.java
new file mode 100644
index 0000000..b0a7697
--- /dev/null
+++ b/sdkcompat/v163/com/google/idea/sdkcompat/vcs/MergeDataBuilder.java
@@ -0,0 +1,54 @@
+package com.google.idea.sdkcompat.vcs;
+
+import com.intellij.openapi.vcs.FilePath;
+import com.intellij.openapi.vcs.history.VcsRevisionNumber;
+import com.intellij.openapi.vcs.merge.MergeData;
+import org.jetbrains.annotations.Nullable;
+
+/** SDK adapter for creating {@link MergeData}. */
+public final class MergeDataBuilder {
+  private byte[] baseContent;
+  private byte[] theirsContent;
+  private byte[] yoursContent;
+
+  @Nullable private VcsRevisionNumber theirsRevisionNumber;
+
+  public void setBaseContent(byte[] baseContent) {
+    this.baseContent = baseContent;
+  }
+
+  public void setTheirsContent(byte[] theirsContent) {
+    this.theirsContent = theirsContent;
+  }
+
+  public void setYoursContent(byte[] yoursContent) {
+    this.yoursContent = yoursContent;
+  }
+
+  public void setBaseRevisionNumber(@Nullable VcsRevisionNumber baseRevisionNumber) {}
+
+  public void setTheirsRevisionNumber(@Nullable VcsRevisionNumber theirsRevisionNumber) {
+    this.theirsRevisionNumber = theirsRevisionNumber;
+  }
+
+  public void setYoursRevisionNumber(@Nullable VcsRevisionNumber yoursRevisionNumber) {}
+
+  public void setBaseFilePath(@Nullable FilePath baseFilePath) {}
+
+  public void setTheirsFilePath(@Nullable FilePath theirsFilePath) {}
+
+  public void setYoursFilePath(@Nullable FilePath yoursFilePath) {}
+
+  public MergeData build() {
+    MergeData mergeData = new MergeData();
+
+    mergeData.ORIGINAL = baseContent;
+
+    mergeData.LAST = theirsContent;
+    mergeData.LAST_REVISION_NUMBER = theirsRevisionNumber;
+
+    mergeData.CURRENT = yoursContent;
+
+    return mergeData;
+  }
+}
diff --git a/sdkcompat/v171/BUILD b/sdkcompat/v171/BUILD
new file mode 100644
index 0000000..d8392a9
--- /dev/null
+++ b/sdkcompat/v171/BUILD
@@ -0,0 +1,33 @@
+# Description: Indirections for SDK changes to the underlying platform library.
+
+licenses(["notice"])  # Apache 2.0
+
+load("//intellij_platform_sdk:build_defs.bzl", "select_for_ide")
+
+java_library(
+    name = "v171",
+    srcs = glob([
+        "com/google/idea/sdkcompat/codestyle/**",
+        "com/google/idea/sdkcompat/python/**",
+        "com/google/idea/sdkcompat/smrunner/**",
+        "com/google/idea/sdkcompat/transactions/**",
+        "com/google/idea/sdkcompat/vcs/**",
+    ]) + select_for_ide(
+        android_studio = glob([
+            "com/google/idea/sdkcompat/cidr/**",
+        ]),
+        clion = glob([
+            "com/google/idea/sdkcompat/cidr/**",
+            "com/google/idea/sdkcompat/clion/**",
+        ]),
+        intellij = glob([
+            "com/google/idea/sdkcompat/dart/**",
+        ]),
+    ),
+    visibility = ["//sdkcompat:__pkg__"],
+    deps = [
+        "//intellij_platform_sdk:plugin_api",
+        "//third_party/python",
+        "@jsr305_annotations//jar",
+    ],
+)
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrCompilerSwitchesAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrCompilerSwitchesAdapter.java
new file mode 100644
index 0000000..c20ad1f
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrCompilerSwitchesAdapter.java
@@ -0,0 +1,21 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.intellij.openapi.util.text.StringUtil;
+import com.jetbrains.cidr.lang.toolchains.CidrCompilerSwitches;
+import java.util.List;
+
+/** Adapter to bridge different SDK versions. */
+public class CidrCompilerSwitchesAdapter {
+  /** Old interface does not know anything about CidrCompilerSwitches.Format */
+  public static List<String> getFileArgs(CidrCompilerSwitches switches) {
+    return switches.getList(CidrCompilerSwitches.Format.RAW);
+  }
+
+  public static List<String> getCommandLineArgs(CidrCompilerSwitches switches) {
+    return switches.getList(CidrCompilerSwitches.Format.BASH_SHELL);
+  }
+
+  public static String getCommandLineString(CidrCompilerSwitches switches) {
+    return StringUtil.join(getCommandLineArgs(switches), " ");
+  }
+}
diff --git a/sdkcompat/v145/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
similarity index 77%
rename from sdkcompat/v145/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
rename to sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
index 66a868e..70e753b 100644
--- a/sdkcompat/v145/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrConsoleBuilderAdapter.java
@@ -3,10 +3,10 @@
 import com.intellij.openapi.project.Project;
 import com.jetbrains.cidr.execution.CidrConsoleBuilder;
 
-/** Adapter to extend two bridge different SDK versions. */
+/** Adapter to bridge different SDK versions. */
 public class CidrConsoleBuilderAdapter extends CidrConsoleBuilder {
 
   public CidrConsoleBuilderAdapter(Project project) {
-    super(project);
+    super(project, null, null);
   }
 }
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrGoogleTestUtilAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrGoogleTestUtilAdapter.java
new file mode 100644
index 0000000..efad3f4
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrGoogleTestUtilAdapter.java
@@ -0,0 +1,6 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.jetbrains.cidr.execution.testing.google.CidrGoogleTestUtil;
+
+/** Adapter to bridge different SDK versions. */
+public class CidrGoogleTestUtilAdapter extends CidrGoogleTestUtil {}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrSwitchBuilderAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrSwitchBuilderAdapter.java
new file mode 100644
index 0000000..40684be
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/CidrSwitchBuilderAdapter.java
@@ -0,0 +1,6 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.jetbrains.cidr.lang.toolchains.CidrSwitchBuilder;
+
+/** Adapter to bridge different SDK versions. */
+public class CidrSwitchBuilderAdapter extends CidrSwitchBuilder {}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/cidr/OCResolveConfigurationAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/OCResolveConfigurationAdapter.java
new file mode 100644
index 0000000..a6bf252
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/OCResolveConfigurationAdapter.java
@@ -0,0 +1,14 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.cidr.lang.OCLanguageKind;
+import com.jetbrains.cidr.lang.workspace.OCResolveConfiguration;
+
+/** Adapter to bridge different SDK versions. */
+public interface OCResolveConfigurationAdapter extends OCResolveConfiguration {
+  /* v162/v163 */
+  public VirtualFile getPrecompiledHeader();
+
+  /* v162/v163 */
+  public OCLanguageKind getPrecompiledLanguageKind();
+}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java
new file mode 100644
index 0000000..4266e35
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/OCWorkspaceAdapter.java
@@ -0,0 +1,9 @@
+package com.google.idea.sdkcompat.cidr;
+
+import com.intellij.openapi.project.Project;
+import com.jetbrains.cidr.lang.workspace.OCWorkspace;
+
+/** Adapter to bridge different SDK versions. */
+public abstract class OCWorkspaceAdapter implements OCWorkspace {
+  protected OCWorkspaceAdapter(Project project) {}
+}
diff --git a/sdkcompat/v145/com/google/idea/sdkcompat/cidr/OCWorkspaceModificationTrackersCompatUtils.java b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/OCWorkspaceModificationTrackersCompatUtils.java
similarity index 72%
rename from sdkcompat/v145/com/google/idea/sdkcompat/cidr/OCWorkspaceModificationTrackersCompatUtils.java
rename to sdkcompat/v171/com/google/idea/sdkcompat/cidr/OCWorkspaceModificationTrackersCompatUtils.java
index 4b17895..1f38a39 100644
--- a/sdkcompat/v145/com/google/idea/sdkcompat/cidr/OCWorkspaceModificationTrackersCompatUtils.java
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/cidr/OCWorkspaceModificationTrackersCompatUtils.java
@@ -2,16 +2,12 @@
 
 import com.intellij.openapi.project.Project;
 import com.jetbrains.cidr.lang.workspace.OCWorkspaceModificationTrackers;
-import java.util.HashMap;
-import java.util.Map;
 
 /** Handles changes to modification trackers between our supported versions. */
 public class OCWorkspaceModificationTrackersCompatUtils {
 
-  private static final Map<Project, OCWorkspaceModificationTrackers> trackers = new HashMap<>();
-
   public static OCWorkspaceModificationTrackers getTrackers(Project project) {
-    return trackers.computeIfAbsent(project, OCWorkspaceModificationTrackers::new);
+    return OCWorkspaceModificationTrackers.getInstance(project);
   }
 
   /** Must be called inside a write action, on the EDT. */
@@ -19,7 +15,7 @@
     OCWorkspaceModificationTrackers modTrackers = getTrackers(project);
     modTrackers.getProjectFilesListTracker().incModificationCount();
     modTrackers.getSourceFilesListTracker().incModificationCount();
-    modTrackers.getBuildConfigurationChangesTracker().incModificationCount();
+    modTrackers.getSelectedResolveConfigurationTracker().incModificationCount();
     modTrackers.getBuildSettingsChangesTracker().incModificationCount();
   }
 }
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/clion/CMakeActionList.java b/sdkcompat/v171/com/google/idea/sdkcompat/clion/CMakeActionList.java
new file mode 100644
index 0000000..1230fd0
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/clion/CMakeActionList.java
@@ -0,0 +1,23 @@
+package com.google.idea.sdkcompat.clion;
+
+import com.google.common.collect.ImmutableSet;
+import com.jetbrains.cidr.cpp.cmake.actions.ChangeCMakeProjectContentRootAction;
+import com.jetbrains.cidr.cpp.cmake.actions.ClearCMakeCacheAndReloadAction;
+import com.jetbrains.cidr.cpp.cmake.actions.ReloadCMakeProjectAction;
+import com.jetbrains.cidr.cpp.cmake.actions.ToggleCMakeAutoReloadAction;
+
+/** Handles CMake actions which have changed between our supported versions. */
+public class CMakeActionList {
+
+  public static final ImmutableSet<String> CMAKE_ACTION_IDS =
+      ImmutableSet.of(
+          ChangeCMakeProjectContentRootAction.ID,
+          ClearCMakeCacheAndReloadAction.ID,
+          // 'CMake' -> 'CMake Settings' action: com.cidr.cpp.cmake.actions.OpenCMakeSettingsAction
+          "CMake.OpenCMakeSettings",
+          ReloadCMakeProjectAction.ID,
+          ToggleCMakeAutoReloadAction.ID,
+          // 'CMake' > 'Show Generated CMake Files' action:
+          //   com.cidr.cpp.cmake.actions.ShowCMakeGeneratedDirAction
+          "CMake.ShowCMakeGeneratedDir");
+}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/clion/CMakeConfigurationProducersList.java b/sdkcompat/v171/com/google/idea/sdkcompat/clion/CMakeConfigurationProducersList.java
new file mode 100644
index 0000000..abc58af
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/clion/CMakeConfigurationProducersList.java
@@ -0,0 +1,16 @@
+package com.google.idea.sdkcompat.clion;
+
+import com.google.common.collect.ImmutableList;
+import com.intellij.execution.actions.RunConfigurationProducer;
+import com.jetbrains.cidr.cpp.execution.testing.google.CMakeGoogleTestRunConfigurationProducer;
+import com.jetbrains.cidr.cpp.execution.testing.tcatch.CMakeCatchTestRunConfigurationProducer;
+
+/** List of C/C++ configuration producers for a given plugin version. */
+public class CMakeConfigurationProducersList {
+
+  public static final ImmutableList<Class<? extends RunConfigurationProducer<?>>>
+      PRODUCERS_TO_SUPPRESS =
+          ImmutableList.of(
+              CMakeGoogleTestRunConfigurationProducer.class,
+              CMakeCatchTestRunConfigurationProducer.class);
+}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/codestyle/DelegatingCodeStyleManagerSdkCompatAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/codestyle/DelegatingCodeStyleManagerSdkCompatAdapter.java
new file mode 100644
index 0000000..d6cbc72
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/codestyle/DelegatingCodeStyleManagerSdkCompatAdapter.java
@@ -0,0 +1,53 @@
+package com.google.idea.sdkcompat.codestyle;
+
+import com.intellij.formatting.FormattingMode;
+import com.intellij.openapi.editor.Document;
+import com.intellij.openapi.util.TextRange;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.codeStyle.ChangedRangesInfo;
+import com.intellij.psi.codeStyle.CodeStyleManager;
+import com.intellij.psi.codeStyle.FormattingModeAwareIndentAdjuster;
+import com.intellij.util.IncorrectOperationException;
+import java.util.ArrayList;
+import java.util.List;
+import org.jetbrains.annotations.NotNull;
+
+/** Adapter to bridge different SDK versions. */
+public abstract class DelegatingCodeStyleManagerSdkCompatAdapter extends CodeStyleManager
+    implements FormattingModeAwareIndentAdjuster {
+
+  protected CodeStyleManager delegate;
+
+  protected DelegatingCodeStyleManagerSdkCompatAdapter(CodeStyleManager delegate) {
+    this.delegate = delegate;
+  }
+
+  @Override
+  public void reformatTextWithContext(@NotNull PsiFile file, @NotNull ChangedRangesInfo info)
+      throws IncorrectOperationException {
+    List<TextRange> ranges = new ArrayList<>();
+    ranges.addAll(info.insertedRanges);
+    ranges.addAll(info.allChangedRanges);
+    this.reformatTextWithContext(file, ranges);
+  }
+
+  /** Uses same fallback as {@link CodeStyleManager#getCurrentFormattingMode}. */
+  @Override
+  public FormattingMode getCurrentFormattingMode() {
+    if (delegate instanceof FormattingModeAwareIndentAdjuster) {
+      return ((FormattingModeAwareIndentAdjuster) delegate).getCurrentFormattingMode();
+    }
+    return FormattingMode.REFORMAT;
+  }
+
+  @Override
+  public int adjustLineIndent(
+      @NotNull final Document document, final int offset, FormattingMode mode)
+      throws IncorrectOperationException {
+    if (delegate instanceof FormattingModeAwareIndentAdjuster) {
+      return ((FormattingModeAwareIndentAdjuster) delegate)
+          .adjustLineIndent(document, offset, mode);
+    }
+    return offset;
+  }
+}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/dart/DartSdkCompatUtils.java b/sdkcompat/v171/com/google/idea/sdkcompat/dart/DartSdkCompatUtils.java
new file mode 100644
index 0000000..c2d1a3e
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/dart/DartSdkCompatUtils.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.sdkcompat.dart;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.roots.impl.libraries.ProjectLibraryTable;
+import com.intellij.openapi.roots.libraries.Library;
+import javax.annotation.Nullable;
+
+/** Handles changes to the Dart plugin libraries between our supported versions. */
+public class DartSdkCompatUtils {
+
+  public static final String DART_SDK_LIBRARY_NAME = "Dart SDK";
+
+  @Nullable
+  public static Library findDartLibrary(Project project) {
+    return ProjectLibraryTable.getInstance(project).getLibraryByName(DART_SDK_LIBRARY_NAME);
+  }
+}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/python/PyConfigurationProducersList.java b/sdkcompat/v171/com/google/idea/sdkcompat/python/PyConfigurationProducersList.java
new file mode 100644
index 0000000..e65ad6e
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/python/PyConfigurationProducersList.java
@@ -0,0 +1,17 @@
+package com.google.idea.sdkcompat.python;
+
+import com.google.common.collect.ImmutableList;
+import java.util.Collection;
+
+/** List of python configuration producers for a given plugin version. */
+public class PyConfigurationProducersList {
+
+  public static final Collection<Class<?>> PRODUCERS_TO_SUPPRESS =
+      ImmutableList.of(
+          com.jetbrains.python.run.PythonRunConfigurationProducer.class,
+          com.jetbrains.python.testing.universalTests.PyUniversalTestsConfigurationProducer.class,
+          com.jetbrains.python.testing.nosetest.PythonNoseTestConfigurationProducer.class,
+          com.jetbrains.python.testing.doctest.PythonDocTestConfigurationProducer.class,
+          com.jetbrains.python.testing.pytest.PyTestConfigurationProducer.class,
+          com.jetbrains.python.testing.unittest.PythonUnitTestConfigurationProducer.class);
+}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/python/PyImportResolverAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/python/PyImportResolverAdapter.java
new file mode 100644
index 0000000..7edba6c
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/python/PyImportResolverAdapter.java
@@ -0,0 +1,23 @@
+package com.google.idea.sdkcompat.python;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.util.QualifiedName;
+import com.jetbrains.python.psi.impl.PyImportResolver;
+import com.jetbrains.python.psi.resolve.PyQualifiedNameResolveContext;
+import javax.annotation.Nullable;
+
+/** Adapter to bridge different SDK versions. */
+public interface PyImportResolverAdapter extends PyImportResolver {
+
+  @Nullable
+  PsiElement resolveImportReference(
+      QualifiedName name, PyQualifiedNameResolveContextAdapter context, boolean withRoots);
+
+  @Override
+  @Nullable
+  default PsiElement resolveImportReference(
+      QualifiedName name, PyQualifiedNameResolveContext context, boolean withRoots) {
+    return resolveImportReference(
+        name, new PyQualifiedNameResolveContextAdapter(context), withRoots);
+  }
+}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/python/PyQualifiedNameResolveContextAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/python/PyQualifiedNameResolveContextAdapter.java
new file mode 100644
index 0000000..7311580
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/python/PyQualifiedNameResolveContextAdapter.java
@@ -0,0 +1,152 @@
+package com.google.idea.sdkcompat.python;
+
+import com.intellij.openapi.module.Module;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.psi.PsiDirectory;
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
+import com.jetbrains.python.psi.resolve.PyQualifiedNameResolveContext;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+/** Adapter to bridge different SDK versions. */
+public class PyQualifiedNameResolveContextAdapter implements PyQualifiedNameResolveContext {
+
+  private final PyQualifiedNameResolveContext delegate;
+
+  PyQualifiedNameResolveContextAdapter(PyQualifiedNameResolveContext delegate) {
+    this.delegate = delegate;
+  }
+
+  @Nullable
+  @Override
+  public PsiElement getFoothold() {
+    return delegate.getFoothold();
+  }
+
+  @Override
+  public int getRelativeLevel() {
+    return delegate.getRelativeLevel();
+  }
+
+  @Nullable
+  @Override
+  public Sdk getSdk() {
+    return delegate.getSdk();
+  }
+
+  @Nullable
+  @Override
+  public Module getModule() {
+    return delegate.getModule();
+  }
+
+  @NotNull
+  @Override
+  public Project getProject() {
+    return delegate.getProject();
+  }
+
+  @Override
+  public boolean getWithoutRoots() {
+    return delegate.getWithoutRoots();
+  }
+
+  @Override
+  public boolean getWithoutForeign() {
+    return delegate.getWithoutForeign();
+  }
+
+  @Override
+  public boolean getWithoutStubs() {
+    return delegate.getWithoutStubs();
+  }
+
+  @NotNull
+  @Override
+  public PsiManager getPsiManager() {
+    return delegate.getPsiManager();
+  }
+
+  @Override
+  public boolean getWithMembers() {
+    return delegate.getWithMembers();
+  }
+
+  @Override
+  public boolean getWithPlainDirectories() {
+    return delegate.getWithPlainDirectories();
+  }
+
+  @Override
+  public boolean getVisitAllModules() {
+    return delegate.getVisitAllModules();
+  }
+
+  @Nullable
+  @Override
+  public Sdk getEffectiveSdk() {
+    return delegate.getEffectiveSdk();
+  }
+
+  @Override
+  public boolean isValid() {
+    return delegate.isValid();
+  }
+
+  @Nullable
+  @Override
+  public PsiFile getFootholdFile() {
+    return delegate.getFootholdFile();
+  }
+
+  @Nullable
+  @Override
+  public PsiDirectory getContainingDirectory() {
+    return delegate.getContainingDirectory();
+  }
+
+  @NotNull
+  @Override
+  public PyQualifiedNameResolveContext copyWithoutForeign() {
+    return delegate.copyWithoutForeign();
+  }
+
+  @NotNull
+  @Override
+  public PyQualifiedNameResolveContext copyWithMembers() {
+    return delegate.copyWithMembers();
+  }
+
+  @NotNull
+  @Override
+  public PyQualifiedNameResolveContext copyWithPlainDirectories() {
+    return delegate.copyWithPlainDirectories();
+  }
+
+  @NotNull
+  @Override
+  public PyQualifiedNameResolveContext copyWithRelative(int i) {
+    return delegate.copyWithRelative(i);
+  }
+
+  @NotNull
+  @Override
+  public PyQualifiedNameResolveContext copyWithoutRoots() {
+    return delegate.copyWithoutRoots();
+  }
+
+  @NotNull
+  @Override
+  public PyQualifiedNameResolveContext copyWithRoots() {
+    return delegate.copyWithRoots();
+  }
+
+  @NotNull
+  @Override
+  public PyQualifiedNameResolveContext copyWithoutStubs() {
+    return delegate.copyWithoutStubs();
+  }
+}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/python/PyReferenceResolveProviderAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/python/PyReferenceResolveProviderAdapter.java
new file mode 100644
index 0000000..9f8b5c3
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/python/PyReferenceResolveProviderAdapter.java
@@ -0,0 +1,6 @@
+package com.google.idea.sdkcompat.python;
+
+import com.jetbrains.python.psi.resolve.PyReferenceResolveProvider;
+
+/** Adapter to bridge different SDK versions. */
+public interface PyReferenceResolveProviderAdapter extends PyReferenceResolveProvider {}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/python/ResolveImportCompatUtils.java b/sdkcompat/v171/com/google/idea/sdkcompat/python/ResolveImportCompatUtils.java
new file mode 100644
index 0000000..0329801
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/python/ResolveImportCompatUtils.java
@@ -0,0 +1,22 @@
+package com.google.idea.sdkcompat.python;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiFile;
+import com.jetbrains.python.psi.resolve.ResolveImportUtil;
+import javax.annotation.Nullable;
+
+/** Handles changes to {@link ResolveImportUtil} between our supported versions. */
+public class ResolveImportCompatUtils {
+
+  @Nullable
+  public static PsiElement resolveChild(
+      @Nullable PsiElement parent,
+      String referencedName,
+      @Nullable PsiFile containingFile,
+      boolean fileOnly,
+      boolean checkForPackage,
+      boolean withoutStubs) {
+    return ResolveImportUtil.resolveChild(
+        parent, referencedName, containingFile, fileOnly, checkForPackage, withoutStubs);
+  }
+}
diff --git a/sdkcompat/v145/com/google/idea/sdkcompat/smrunner/SmRunnerCompatUtils.java b/sdkcompat/v171/com/google/idea/sdkcompat/smrunner/SmRunnerCompatUtils.java
similarity index 77%
rename from sdkcompat/v145/com/google/idea/sdkcompat/smrunner/SmRunnerCompatUtils.java
rename to sdkcompat/v171/com/google/idea/sdkcompat/smrunner/SmRunnerCompatUtils.java
index c4bd9a7..8555ad8 100644
--- a/sdkcompat/v145/com/google/idea/sdkcompat/smrunner/SmRunnerCompatUtils.java
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/smrunner/SmRunnerCompatUtils.java
@@ -8,6 +8,7 @@
 
   public static TestFailedEvent getTestFailedEvent(
       String name, @Nullable String message, @Nullable String content, long duration) {
-    return new TestFailedEvent(name, -1, message, content, true, null, null, null, duration);
+    return new TestFailedEvent(
+        name, null, message, content, true, null, null, null, null, false, false, duration);
   }
 }
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/transactions/Transactions.java b/sdkcompat/v171/com/google/idea/sdkcompat/transactions/Transactions.java
new file mode 100644
index 0000000..8862aa8
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/transactions/Transactions.java
@@ -0,0 +1,15 @@
+package com.google.idea.sdkcompat.transactions;
+
+import com.intellij.openapi.Disposable;
+import com.intellij.openapi.application.TransactionGuard;
+
+/** SDK adapter to use transaction guards. */
+public class Transactions {
+  public static void submitTransactionAndWait(Runnable runnable) {
+    TransactionGuard.getInstance().submitTransactionAndWait(runnable);
+  }
+
+  public static void submitTransaction(Disposable disposable, Runnable runnable) {
+    TransactionGuard.submitTransaction(disposable, runnable);
+  }
+}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/vcs/ChangeListManagerSdkCompatAdapter.java b/sdkcompat/v171/com/google/idea/sdkcompat/vcs/ChangeListManagerSdkCompatAdapter.java
new file mode 100644
index 0000000..1e525c1
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/vcs/ChangeListManagerSdkCompatAdapter.java
@@ -0,0 +1,6 @@
+package com.google.idea.sdkcompat.vcs;
+
+import com.intellij.openapi.vcs.changes.ChangeListManager;
+
+/** SDK adapter to for changelist interface. */
+public abstract class ChangeListManagerSdkCompatAdapter extends ChangeListManager {}
diff --git a/sdkcompat/v171/com/google/idea/sdkcompat/vcs/MergeDataBuilder.java b/sdkcompat/v171/com/google/idea/sdkcompat/vcs/MergeDataBuilder.java
new file mode 100644
index 0000000..49b4665
--- /dev/null
+++ b/sdkcompat/v171/com/google/idea/sdkcompat/vcs/MergeDataBuilder.java
@@ -0,0 +1,78 @@
+package com.google.idea.sdkcompat.vcs;
+
+import com.intellij.openapi.vcs.FilePath;
+import com.intellij.openapi.vcs.history.VcsRevisionNumber;
+import com.intellij.openapi.vcs.merge.MergeData;
+import org.jetbrains.annotations.Nullable;
+
+/** SDK adapter for creating {@link MergeData}. */
+// TODO(grl): Move to com.google.devtools.intellij.piper.resolve and make package-private
+// once versions less than v171 have been deleted. We may as well keep the builder around,
+// since it uses piper-relevant terminology and complies with Java style conventions.
+public final class MergeDataBuilder {
+  private byte[] baseContent;
+  private byte[] theirsContent;
+  private byte[] yoursContent;
+
+  @Nullable private VcsRevisionNumber baseRevisionNumber;
+  @Nullable private VcsRevisionNumber theirsRevisionNumber;
+  @Nullable private VcsRevisionNumber yoursRevisionNumber;
+
+  @Nullable private FilePath baseFilePath;
+  @Nullable private FilePath theirsFilePath;
+  @Nullable private FilePath yoursFilePath;
+
+  public void setBaseContent(byte[] baseContent) {
+    this.baseContent = baseContent;
+  }
+
+  public void setTheirsContent(byte[] theirsContent) {
+    this.theirsContent = theirsContent;
+  }
+
+  public void setYoursContent(byte[] yoursContent) {
+    this.yoursContent = yoursContent;
+  }
+
+  public void setBaseRevisionNumber(@Nullable VcsRevisionNumber baseRevisionNumber) {
+    this.baseRevisionNumber = baseRevisionNumber;
+  }
+
+  public void setTheirsRevisionNumber(@Nullable VcsRevisionNumber theirsRevisionNumber) {
+    this.theirsRevisionNumber = theirsRevisionNumber;
+  }
+
+  public void setYoursRevisionNumber(@Nullable VcsRevisionNumber yoursRevisionNumber) {
+    this.yoursRevisionNumber = yoursRevisionNumber;
+  }
+
+  public void setBaseFilePath(@Nullable FilePath baseFilePath) {
+    this.baseFilePath = baseFilePath;
+  }
+
+  public void setTheirsFilePath(@Nullable FilePath theirsFilePath) {
+    this.theirsFilePath = theirsFilePath;
+  }
+
+  public void setYoursFilePath(@Nullable FilePath yoursFilePath) {
+    this.yoursFilePath = yoursFilePath;
+  }
+
+  public MergeData build() {
+    MergeData mergeData = new MergeData();
+
+    mergeData.ORIGINAL = baseContent;
+    mergeData.ORIGINAL_REVISION_NUMBER = baseRevisionNumber;
+    mergeData.ORIGINAL_FILE_PATH = baseFilePath;
+
+    mergeData.LAST = theirsContent;
+    mergeData.LAST_REVISION_NUMBER = theirsRevisionNumber;
+    mergeData.LAST_FILE_PATH = theirsFilePath;
+
+    mergeData.CURRENT = yoursContent;
+    mergeData.CURRENT_REVISION_NUMBER = yoursRevisionNumber;
+    mergeData.CURRENT_FILE_PATH = yoursFilePath;
+
+    return mergeData;
+  }
+}
diff --git a/terminal/BUILD b/terminal/BUILD
new file mode 100644
index 0000000..d3f2562
--- /dev/null
+++ b/terminal/BUILD
@@ -0,0 +1,22 @@
+licenses(["notice"])  # Apache 2.0
+
+load("//build_defs:build_defs.bzl", "optional_plugin_xml")
+
+java_library(
+    name = "terminal",
+    srcs = glob(["src/**/*.java"]),
+    visibility = ["//visibility:public"],
+    deps = [
+        "//base",
+        "//intellij_platform_sdk:plugin_api",
+        "//intellij_platform_sdk:terminal",
+        "@jsr305_annotations//jar",
+    ],
+)
+
+optional_plugin_xml(
+    name = "optional_xml",
+    module = "org.jetbrains.plugins.terminal",
+    plugin_xml = "src/META-INF/terminal-contents.xml",
+    visibility = ["//visibility:public"],
+)
diff --git a/terminal/src/META-INF/terminal-contents.xml b/terminal/src/META-INF/terminal-contents.xml
new file mode 100644
index 0000000..b5b3255
--- /dev/null
+++ b/terminal/src/META-INF/terminal-contents.xml
@@ -0,0 +1,5 @@
+<idea-plugin>
+  <extensions defaultExtensionNs="org.jetbrains.plugins.terminal">
+    <localTerminalCustomizer implementation="com.google.idea.blaze.terminal.DefaultTerminalLocationCustomizer"/>
+  </extensions>
+</idea-plugin>
diff --git a/terminal/src/com/google/idea/blaze/terminal/DefaultTerminalLocationCustomizer.java b/terminal/src/com/google/idea/blaze/terminal/DefaultTerminalLocationCustomizer.java
new file mode 100644
index 0000000..8023f0a
--- /dev/null
+++ b/terminal/src/com/google/idea/blaze/terminal/DefaultTerminalLocationCustomizer.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright 2017 The Bazel Authors. All rights reserved.
+ *
+ * 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.idea.blaze.terminal;
+
+import com.google.idea.blaze.base.model.primitives.WorkspaceRoot;
+import com.intellij.openapi.project.Project;
+import javax.annotation.Nullable;
+import org.jetbrains.plugins.terminal.LocalTerminalCustomizer;
+
+/** Set the default terminal path to the workspace root. */
+public class DefaultTerminalLocationCustomizer extends LocalTerminalCustomizer {
+
+  // added in 2017.1, so foregoing the override annotation for backwards compatibility.
+  @SuppressWarnings("Overrides")
+  @Nullable
+  protected String getDefaultFolder(Project project) {
+    WorkspaceRoot root = WorkspaceRoot.fromProjectSafe(project);
+    return root != null ? root.toString() : null;
+  }
+}
diff --git a/testing/BUILD b/testing/BUILD
index 8b2600e..e9a3c7a 100644
--- a/testing/BUILD
+++ b/testing/BUILD
@@ -6,13 +6,24 @@
 
 licenses(["notice"])  # Apache 2.0
 
+load("//intellij_platform_sdk:build_defs.bzl", "select_for_ide")
+
 java_library(
     name = "lib",
     testonly = 1,
-    srcs = glob(["src/**/*.java"]),
+    srcs = glob(["src/**/*.java"]) +
+           select_for_ide(
+               android_studio = glob(["cidr/src/**/*.java"]),
+               clion = glob(["cidr/src/**/*.java"]),
+               default = [],
+           ),
     deps = [
         "//intellij_platform_sdk:plugin_api_for_tests",
         "@jsr305_annotations//jar",
         "@junit//jar",
-    ],
+    ] + select_for_ide(
+        android_studio = ["//sdkcompat"],
+        clion = ["//sdkcompat"],
+        default = [],
+    ),
 )
diff --git a/testing/cidr/src/com/google/idea/testing/cidr/StubOCCompilerMacros.java b/testing/cidr/src/com/google/idea/testing/cidr/StubOCCompilerMacros.java
new file mode 100644
index 0000000..6345104
--- /dev/null
+++ b/testing/cidr/src/com/google/idea/testing/cidr/StubOCCompilerMacros.java
@@ -0,0 +1,12 @@
+package com.google.idea.testing.cidr;
+
+import com.intellij.psi.PsiFile;
+import com.jetbrains.cidr.lang.preprocessor.OCInclusionContext;
+import com.jetbrains.cidr.lang.workspace.compiler.OCCompilerMacros;
+
+/** Stub {@link OCCompilerMacros} for testing. */
+class StubOCCompilerMacros extends OCCompilerMacros {
+
+  @Override
+  protected void fillFileMacros(OCInclusionContext context, PsiFile sourceFile) {}
+}
diff --git a/testing/cidr/src/com/google/idea/testing/cidr/StubOCCompilerSettings.java b/testing/cidr/src/com/google/idea/testing/cidr/StubOCCompilerSettings.java
new file mode 100644
index 0000000..41e0dee
--- /dev/null
+++ b/testing/cidr/src/com/google/idea/testing/cidr/StubOCCompilerSettings.java
@@ -0,0 +1,52 @@
+package com.google.idea.testing.cidr;
+
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VfsUtilCore;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.cidr.lang.OCLanguageKind;
+import com.jetbrains.cidr.lang.toolchains.CidrCompilerSwitches;
+import com.jetbrains.cidr.lang.toolchains.CidrSwitchBuilder;
+import com.jetbrains.cidr.lang.toolchains.CidrToolEnvironment;
+import com.jetbrains.cidr.lang.toolchains.DefaultCidrToolEnvironment;
+import com.jetbrains.cidr.lang.workspace.compiler.OCCompilerKind;
+import com.jetbrains.cidr.lang.workspace.compiler.OCCompilerSettings;
+import java.io.File;
+import javax.annotation.Nullable;
+
+/** Stub {@link OCCompilerSettings} for testing. */
+class StubOCCompilerSettings extends OCCompilerSettings {
+
+  private final Project project;
+
+  StubOCCompilerSettings(Project project) {
+    this.project = project;
+  }
+
+  @Nullable
+  @Override
+  public OCCompilerKind getCompiler(OCLanguageKind languageKind) {
+    return OCCompilerKind.CLANG;
+  }
+
+  @Nullable
+  @Override
+  public File getCompilerExecutable(OCLanguageKind languageKind) {
+    return null;
+  }
+
+  @Override
+  public File getCompilerWorkingDir() {
+    return VfsUtilCore.virtualToIoFile(project.getBaseDir());
+  }
+
+  @Override
+  public CidrToolEnvironment getEnvironment() {
+    return new DefaultCidrToolEnvironment();
+  }
+
+  @Override
+  public CidrCompilerSwitches getCompilerSwitches(
+      OCLanguageKind languageKind, @Nullable VirtualFile sourceFile) {
+    return new CidrSwitchBuilder().build();
+  }
+}
diff --git a/testing/cidr/src/com/google/idea/testing/cidr/StubOCResolveConfiguration.java b/testing/cidr/src/com/google/idea/testing/cidr/StubOCResolveConfiguration.java
new file mode 100644
index 0000000..6d6c083
--- /dev/null
+++ b/testing/cidr/src/com/google/idea/testing/cidr/StubOCResolveConfiguration.java
@@ -0,0 +1,104 @@
+package com.google.idea.testing.cidr;
+
+import com.google.common.collect.ImmutableList;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.util.UserDataHolderBase;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.cidr.lang.OCFileTypeHelpers;
+import com.jetbrains.cidr.lang.OCLanguageKind;
+import com.jetbrains.cidr.lang.workspace.OCLanguageKindCalculator;
+import com.jetbrains.cidr.lang.workspace.OCResolveConfiguration;
+import com.jetbrains.cidr.lang.workspace.OCResolveRootAndConfiguration;
+import com.jetbrains.cidr.lang.workspace.OCWorkspaceUtil;
+import com.jetbrains.cidr.lang.workspace.compiler.OCCompilerMacros;
+import com.jetbrains.cidr.lang.workspace.compiler.OCCompilerSettings;
+import com.jetbrains.cidr.lang.workspace.headerRoots.HeaderRoots;
+import javax.annotation.Nullable;
+
+/** Stub {@link OCResolveConfiguration} for testing. */
+class StubOCResolveConfiguration extends UserDataHolderBase implements OCResolveConfiguration {
+
+  private final Project project;
+  private final HeaderRoots projectIncludeRoots;
+  private final OCCompilerSettings compilerSettings;
+  private final OCCompilerMacros compilerMacros;
+
+  StubOCResolveConfiguration(Project project) {
+    this.project = project;
+    this.projectIncludeRoots = new HeaderRoots(ImmutableList.of());
+    this.compilerMacros = new StubOCCompilerMacros();
+    this.compilerSettings = new StubOCCompilerSettings(project);
+  }
+
+  @Override
+  public Project getProject() {
+    return project;
+  }
+
+  @Override
+  public String getDisplayName(boolean shorten) {
+    return "Stub resolve configuration";
+  }
+
+  @Nullable
+  @Override
+  public VirtualFile getPrecompiledHeader() {
+    return null;
+  }
+
+  @Nullable
+  @Override
+  public OCLanguageKind getDeclaredLanguageKind(VirtualFile sourceOrHeaderFile) {
+    String fileName = sourceOrHeaderFile.getName();
+    if (OCFileTypeHelpers.isSourceFile(fileName)) {
+      return getLanguageKind(sourceOrHeaderFile);
+    }
+    return getMaximumLanguageKind();
+  }
+
+  private OCLanguageKind getLanguageKind(VirtualFile sourceFile) {
+    OCLanguageKind kind = OCLanguageKindCalculator.tryFileTypeAndExtension(project, sourceFile);
+    return kind != null ? kind : getMaximumLanguageKind();
+  }
+
+  @Override
+  public OCLanguageKind getMaximumLanguageKind() {
+    return OCLanguageKind.CPP;
+  }
+
+  @Override
+  public OCLanguageKind getPrecompiledLanguageKind() {
+    return getMaximumLanguageKind();
+  }
+
+  @Override
+  public HeaderRoots getProjectHeadersRoots() {
+    return projectIncludeRoots;
+  }
+
+  @Override
+  public HeaderRoots getLibraryHeadersRoots(OCResolveRootAndConfiguration headerContext) {
+    return projectIncludeRoots;
+  }
+
+  @Override
+  public OCCompilerMacros getCompilerMacros() {
+    return compilerMacros;
+  }
+
+  @Override
+  public OCCompilerSettings getCompilerSettings() {
+    return compilerSettings;
+  }
+
+  @Nullable
+  @Override
+  public Object getIndexingCluster() {
+    return null;
+  }
+
+  @Override
+  public int compareTo(OCResolveConfiguration o) {
+    return OCWorkspaceUtil.compareConfigurations(this, o);
+  }
+}
diff --git a/testing/cidr/src/com/google/idea/testing/cidr/StubOCWorkspace.java b/testing/cidr/src/com/google/idea/testing/cidr/StubOCWorkspace.java
new file mode 100644
index 0000000..1f58463
--- /dev/null
+++ b/testing/cidr/src/com/google/idea/testing/cidr/StubOCWorkspace.java
@@ -0,0 +1,68 @@
+package com.google.idea.testing.cidr;
+
+import com.google.common.collect.ImmutableList;
+import com.google.idea.sdkcompat.cidr.OCWorkspaceAdapter;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.jetbrains.cidr.lang.OCFileType;
+import com.jetbrains.cidr.lang.symbols.OCSymbol;
+import com.jetbrains.cidr.lang.workspace.OCResolveConfiguration;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import javax.annotation.Nullable;
+
+/** A stub {@link com.jetbrains.cidr.lang.workspace.OCWorkspace} to use for testing. */
+class StubOCWorkspace extends OCWorkspaceAdapter {
+
+  private final List<OCResolveConfiguration> resolveConfigurations;
+
+  StubOCWorkspace(Project project) {
+    super(project);
+    resolveConfigurations = new ArrayList<>();
+    resolveConfigurations.add(new StubOCResolveConfiguration(project));
+  }
+
+  @Override
+  public Collection<VirtualFile> getLibraryFilesToBuildSymbols() {
+    return ImmutableList.of();
+  }
+
+  @Override
+  public boolean areFromSameProject(@Nullable VirtualFile a, @Nullable VirtualFile b) {
+    return Objects.equals(a, b);
+  }
+
+  @Override
+  public boolean areFromSamePackage(@Nullable VirtualFile a, @Nullable VirtualFile b) {
+    return Objects.equals(a, b);
+  }
+
+  @Override
+  public boolean isInSDK(@Nullable VirtualFile file) {
+    return false;
+  }
+
+  @Override
+  public boolean isFromWrongSDK(OCSymbol symbol, @Nullable VirtualFile contextFile) {
+    return false;
+  }
+
+  @Override
+  public List<? extends OCResolveConfiguration> getConfigurations() {
+    return resolveConfigurations;
+  }
+
+  @Override
+  public List<? extends OCResolveConfiguration> getConfigurationsForFile(
+      @Nullable VirtualFile sourceFile) {
+    if (sourceFile == null) {
+      return Collections.emptyList();
+    }
+    return OCFileType.INSTANCE.equals(sourceFile.getFileType())
+        ? resolveConfigurations
+        : Collections.emptyList();
+  }
+}
diff --git a/testing/cidr/src/com/google/idea/testing/cidr/StubOCWorkspaceManager.java b/testing/cidr/src/com/google/idea/testing/cidr/StubOCWorkspaceManager.java
new file mode 100644
index 0000000..05921b7
--- /dev/null
+++ b/testing/cidr/src/com/google/idea/testing/cidr/StubOCWorkspaceManager.java
@@ -0,0 +1,90 @@
+package com.google.idea.testing.cidr;
+
+import com.intellij.lang.Language;
+import com.intellij.openapi.application.ApplicationManager;
+import com.intellij.openapi.fileTypes.PlainTextLanguage;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.psi.PsiFile;
+import com.intellij.psi.PsiManager;
+import com.intellij.psi.impl.PsiManagerEx;
+import com.intellij.psi.impl.file.impl.FileManager;
+import com.intellij.util.ui.UIUtil;
+import com.jetbrains.cidr.lang.OCLanguage;
+import com.jetbrains.cidr.lang.preprocessor.OCInclusionContextUtil;
+import com.jetbrains.cidr.lang.workspace.OCWorkspace;
+import com.jetbrains.cidr.lang.workspace.OCWorkspaceManager;
+
+/**
+ * A stub {@link OCWorkspaceManager} to use for testing. Also allows toggling on C++ support (which
+ * may have been disabled by other OCWorkspaceManagers.
+ *
+ * <p>Once the plugin API ships with a more official OCWorkspaceManager-for-testing, we may be able
+ * to switch over to those classes. See: b/32420569
+ */
+public class StubOCWorkspaceManager extends OCWorkspaceManager {
+
+  private final Project project;
+  private final OCWorkspace workspace;
+
+  public StubOCWorkspaceManager(Project project) {
+    this.project = project;
+    this.workspace = new StubOCWorkspace(project);
+  }
+
+  @Override
+  public OCWorkspace getWorkspace() {
+    return workspace;
+  }
+
+  /**
+   * Enable C++ language support for testing (a previously registered OCWorkspace which may have
+   * disabled language support).
+   */
+  public void enableCSupportForTesting() throws Exception {
+    OCWorkspace workspace = OCWorkspaceManager.getWorkspace(project);
+    Boolean isCurrentlyEnabled = !OCLanguage.LANGUAGE_SUPPORT_DISABLED.get(project, false);
+    if (!isCurrentlyEnabled) {
+      enableLanguageSupport(project);
+      rebuildSymbols(project, workspace);
+    }
+  }
+
+  private static void enableLanguageSupport(Project project) {
+    OCLanguage.LANGUAGE_SUPPORT_DISABLED.set(project, false);
+    UIUtil.invokeLaterIfNeeded(
+        () ->
+            ApplicationManager.getApplication()
+                .runWriteAction(
+                    () -> {
+                      if (project.isDisposed()) {
+                        return;
+                      }
+                      Language langToReset = PlainTextLanguage.INSTANCE;
+                      FileManager fileManager =
+                          ((PsiManagerEx) PsiManager.getInstance(project)).getFileManager();
+                      for (PsiFile file : fileManager.getAllCachedFiles()) {
+                        if (file.getLanguage() == langToReset) {
+                          VirtualFile vf = OCInclusionContextUtil.getVirtualFile(file);
+                          if (vf != null) {
+                            fileManager.setViewProvider(vf, null);
+                          }
+                        }
+                      }
+                    }));
+  }
+
+  private static void rebuildSymbols(Project project, OCWorkspace workspace) {
+    ApplicationManager.getApplication()
+        .runReadAction(
+            () -> {
+              if (project.isDisposed()) {
+                return;
+              }
+              workspace
+                  .getModificationTrackers()
+                  .getBuildSettingsChangesTracker()
+                  .incModificationCount();
+            });
+  }
+}
diff --git a/third_party/BUILD b/third_party/BUILD
index 283fe42..06e9b19 100644
--- a/third_party/BUILD
+++ b/third_party/BUILD
@@ -10,3 +10,13 @@
     name = "zip",
     srcs = ["zip-wrap/zip.sh"],
 )
+
+sh_binary(
+    name = "unzip",
+    srcs = ["zip-wrap/unzip.sh"],
+)
+
+java_library(
+    name = "python",
+    exports = ["//third_party/python"],
+)
diff --git a/third_party/python/BUILD b/third_party/python/BUILD
new file mode 100644
index 0000000..2f69d16
--- /dev/null
+++ b/third_party/python/BUILD
@@ -0,0 +1,27 @@
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"])
+
+load("//intellij_platform_sdk:build_defs.bzl", "select_for_plugin_api")
+
+java_library(
+    name = "python_internal",
+    visibility = ["//visibility:private"],
+    exports = select_for_plugin_api({
+        "intellij-2016.3.1": ["@python_2016_3//:python"],
+        "intellij-2017.1.1": ["@python_2017_1//:python"],
+        "clion-2017.1.1": ["@clion_2017_1_1//:python"],
+    }),
+)
+
+java_library(
+    name = "python_for_tests",
+    testonly = 1,
+    exports = [":python_internal"],
+)
+
+java_library(
+    name = "python",
+    neverlink = 1,
+    exports = [":python_internal"],
+)
diff --git a/third_party/python/LICENSE b/third_party/python/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/third_party/python/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
diff --git a/third_party/scala/BUILD b/third_party/scala/BUILD
new file mode 100644
index 0000000..9786523
--- /dev/null
+++ b/third_party/scala/BUILD
@@ -0,0 +1,25 @@
+package(default_visibility = ["//visibility:public"])
+
+licenses(["notice"])
+
+load("//intellij_platform_sdk:build_defs.bzl", "select_for_plugin_api")
+
+java_library(
+    name = "scala_internal",
+    visibility = ["//visibility:private"],
+    exports = select_for_plugin_api({
+        "intellij-2017.1.1": ["@scala_2017_1//:scala"],
+    }),
+)
+
+java_library(
+    name = "scala_for_tests",
+    testonly = 1,
+    exports = [":scala_internal"],
+)
+
+java_library(
+    name = "scala",
+    neverlink = 1,
+    exports = [":scala_internal"],
+)
diff --git a/third_party/scala/LICENSE b/third_party/scala/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/third_party/scala/LICENSE
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   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.
diff --git a/third_party/zip-wrap/unzip.sh b/third_party/zip-wrap/unzip.sh
new file mode 100755
index 0000000..f1be34d
--- /dev/null
+++ b/third_party/zip-wrap/unzip.sh
@@ -0,0 +1,15 @@
+# Copyright 2015 The Bazel Authors. All rights reserved.
+#
+# 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.
+
+unzip "$@"
diff --git a/version.bzl b/version.bzl
index 5e34b4b..667e07a 100644
--- a/version.bzl
+++ b/version.bzl
@@ -1,3 +1,3 @@
 """Version of the blaze plugin."""
 
-VERSION = "2017.02.27.1"
+VERSION = "2017.05.17.1"
