Merge remote-tracking branch 'aosp/upstream-master' into merge-upstream

Conflicts:
	android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java
	android/src/org/jetbrains/android/logcat/AndroidToolWindowFactory.java

This includes the following CLs:
e0a5c04: uppercase prefix should middle-match lowercase string
6588401: support for resource directories: enable java-specific actions only for directories under source roots
44dc6a5: IDEA-100044 Parceable.CREATOR shouldn't be marker as unused
f255477: IDEA-89390 proguard vm options settings
9763c39: IDEA-113138 do not suggest class-based test run configuration in method context
a4baa06: do not open logcat automatically if it is test configuration
f5e0724: fix typo
02615b7:  fix regression of IDEA-80976: restore access to logcat view
b602f9e: IDEA-85457 activate "DDMS" tool window automatically after application is successfully deployed and launched if we're not in debug mo
d52b94e: IDEA-112293 clear resolved apklibs info when importing is finished
6815307: first letter case sensitivity should match pattern start with name start even in middle matches
6234bda: spellchecker: suggest to renaming of value resource, ID, app package to update all usages
4439bc0: IDEA-112979 spellchecker inspection should be suppressed for symbols user cannot edit
2ed6ec6: IDEA-102180 Android XML: markup nested to string resources should not be reformatted
bd6ee47: IDEA-112932 place "width" and then "height" attributes right after "layout_*" attrs
c107496: do not add "generated_by_ide" mark 2 times
b0e3c52: IDEA-100046 BuildConfig.DEBUG shouldn't be marked as always true/false

Change-Id: I890945feb64f12547d3301807deb95120150283a
diff --git a/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java b/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java
index 8a5150b..858c86e 100644
--- a/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java
+++ b/android/common/src/org/jetbrains/android/util/AndroidCommonUtils.java
@@ -37,6 +37,7 @@
 import com.intellij.openapi.util.io.FileUtilRt;
 import com.intellij.util.ArrayUtil;
 import com.intellij.util.containers.HashMap;
+import com.intellij.util.execution.ParametersListUtil;
 import org.jetbrains.android.AndroidCommonBundle;
 import org.jetbrains.android.sdk.MessageBuildingSdkLog;
 import org.jetbrains.annotations.NonNls;
@@ -356,6 +357,8 @@
   public static Map<AndroidCompilerMessageKind, List<String>> launchProguard(@NotNull IAndroidTarget target,
                                                                              int sdkToolsRevision,
                                                                              @NotNull String sdkOsPath,
+                                                                             @NotNull String javaExecutablePath,
+                                                                             @NotNull String proguardVmOptions,
                                                                              @NotNull String[] proguardConfigFileOsPaths,
                                                                              boolean includeSystemProguardFile,
                                                                              @NotNull String inputJarOsPath,
@@ -363,11 +366,15 @@
                                                                              @NotNull String outputJarFileOsPath,
                                                                              @Nullable String logDirOutputOsPath) throws IOException {
     final List<String> commands = new ArrayList<String>();
-    final String toolOsPath = sdkOsPath + File.separator + SdkConstants.OS_SDK_TOOLS_PROGUARD_BIN_FOLDER + SdkConstants.FN_PROGUARD;
-    commands.add(toolOsPath);
+    commands.add(javaExecutablePath);
 
+    if (proguardVmOptions.length() > 0) {
+      commands.addAll(ParametersListUtil.parse(proguardVmOptions));
+    }
+    commands.add("-jar");
     final String proguardHome = sdkOsPath + File.separator + SdkConstants.FD_TOOLS + File.separator + SdkConstants.FD_PROGUARD;
-
+    final String proguardJarOsPath = proguardHome + File.separator + "lib" + File.separator + "proguard.jar";
+    commands.add(proguardJarOsPath);
     final String systemProguardCfgPath = proguardHome + File.separator + SYSTEM_PROGUARD_CFG_FILE_NAME;
 
     if (isIncludingInProguardSupported(sdkToolsRevision)) {
diff --git a/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java b/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java
index e22abb6..943f4be 100644
--- a/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java
+++ b/android/jps-plugin/src/org/jetbrains/jps/android/AndroidDexBuilder.java
@@ -301,18 +301,13 @@
       context.processMessage(new CompilerMessage(builderName, BuildMessage.Kind.WARNING,
                                                  AndroidJpsBundle.message("android.jps.cannot.delete.file", outFilePath)));
     }
+    final String javaExecutable = getJavaExecutable(platform, context, builderName);
 
-    final JpsSdk<JpsSimpleElement<JpsAndroidSdkProperties>> sdk = platform.getSdk();
-    final String jdkName = sdk.getSdkProperties().getData().getJdkName();
-    final JpsLibrary javaSdk = context.getProjectDescriptor().getModel().getGlobal().getLibraryCollection().findLibrary(jdkName);
-    if (javaSdk == null || !javaSdk.getType().equals(JpsJavaSdkType.INSTANCE)) {
-      context.processMessage(new CompilerMessage(builderName, BuildMessage.Kind.ERROR,
-                                                 AndroidJpsBundle.message("android.jps.errors.java.sdk.not.specified", jdkName)));
+    if (javaExecutable == null) {
       return false;
     }
-
     final List<String> commandLine = ExternalProcessUtil
-      .buildJavaCommandLine(JpsJavaSdkType.getJavaExecutable((JpsSdk<?>)javaSdk.getProperties()), AndroidDxRunner.class.getName(),
+      .buildJavaCommandLine(javaExecutable, AndroidDxRunner.class.getName(),
                             Collections.<String>emptyList(), classPath, vmOptions, programParamList);
 
     LOG.info(AndroidCommonUtils.command2string(commandLine));
@@ -364,6 +359,18 @@
   }
 
   @Nullable
+  private static String getJavaExecutable(@NotNull AndroidPlatform platform, @NotNull CompileContext context, @NotNull String builderName) {
+    final JpsSdk<JpsSimpleElement<JpsAndroidSdkProperties>> sdk = platform.getSdk();
+    final String jdkName = sdk.getSdkProperties().getData().getJdkName();
+    final JpsLibrary javaSdk = context.getProjectDescriptor().getModel().getGlobal().getLibraryCollection().findLibrary(jdkName);
+    if (javaSdk == null || !javaSdk.getType().equals(JpsJavaSdkType.INSTANCE)) {
+      context.processMessage(new CompilerMessage(builderName, BuildMessage.Kind.ERROR,
+                                                 AndroidJpsBundle.message("android.jps.errors.java.sdk.not.specified", jdkName)));
+      return null;
+    }
+    return JpsJavaSdkType.getJavaExecutable((JpsSdk<?>)javaSdk.getProperties());
+  }
+
   private static Pair<Boolean, AndroidProGuardStateStorage.MyState>
   runProguardIfNecessary(@NotNull JpsAndroidModuleExtension extension,
                          @NotNull AndroidDexBuildTarget target,
@@ -395,6 +402,11 @@
       return null;
     }
 
+    final String javaExecutable = getJavaExecutable(platform, context, PRO_GUARD_BUILDER_NAME);
+    if (javaExecutable == null) {
+      return null;
+    }
+
     final String logsDirOsPath =
           FileUtil.toSystemDependentName(mainContentRoot.getPath() + '/' + AndroidCommonUtils.DIRECTORY_FOR_LOGS_NAME);
     final AndroidProGuardStateStorage.MyState newState = new AndroidProGuardStateStorage.MyState(
@@ -455,13 +467,18 @@
         return null;
       }
     }
-
+    final JpsAndroidDexCompilerConfiguration configuration =
+      JpsAndroidExtensionService.getInstance().getDexCompilerConfiguration(module.getProject());
+    String proguardVmOptions = configuration != null ? configuration.getProguardVmOptions() : null;
+    if (proguardVmOptions == null) {
+      proguardVmOptions = "";
+    }
     context.processMessage(new ProgressMessage(AndroidJpsBundle.message("android.jps.progress.proguard", module.getName())));
 
     final Map<AndroidCompilerMessageKind, List<String>> messages =
       AndroidCommonUtils.launchProguard(platform.getTarget(), platform.getSdkToolsRevision(), platform.getSdk().getHomePath(),
-                                        proguardCfgPaths, includeSystemProguardCfg, inputJarOsPath, externalJarOsPaths,
-                                        outputJarPath, logsDirOsPath);
+                                        javaExecutable, proguardVmOptions, proguardCfgPaths, includeSystemProguardCfg, inputJarOsPath,
+                                        externalJarOsPaths, outputJarPath, logsDirOsPath);
     AndroidJpsUtil.addMessages(context, messages, PRO_GUARD_BUILDER_NAME, module.getName());
     return messages.get(AndroidCompilerMessageKind.ERROR).isEmpty()
            ? Pair.create(true, newState) : null;
diff --git a/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidDexBuildTarget.java b/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidDexBuildTarget.java
index 6668beb..9b8ca8c 100644
--- a/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidDexBuildTarget.java
+++ b/android/jps-plugin/src/org/jetbrains/jps/android/builder/AndroidDexBuildTarget.java
@@ -48,6 +48,7 @@
       out.println(c.isOptimize());
       out.println(c.isForceJumbo());
       out.println(c.isCoreLibrary());
+      out.println(c.getProguardVmOptions());
     }
   }
 
diff --git a/android/jps-plugin/src/org/jetbrains/jps/android/model/JpsAndroidDexCompilerConfiguration.java b/android/jps-plugin/src/org/jetbrains/jps/android/model/JpsAndroidDexCompilerConfiguration.java
index ade7831..e12f3d6 100644
--- a/android/jps-plugin/src/org/jetbrains/jps/android/model/JpsAndroidDexCompilerConfiguration.java
+++ b/android/jps-plugin/src/org/jetbrains/jps/android/model/JpsAndroidDexCompilerConfiguration.java
@@ -25,4 +25,8 @@
   boolean isCoreLibrary();
 
   void setCoreLibrary(boolean value);
+
+  String getProguardVmOptions();
+
+  void setProguardVmOptions(String value);
 }
diff --git a/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidDexCompilerConfigurationImpl.java b/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidDexCompilerConfigurationImpl.java
index addc9bd..60afac0 100644
--- a/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidDexCompilerConfigurationImpl.java
+++ b/android/jps-plugin/src/org/jetbrains/jps/android/model/impl/JpsAndroidDexCompilerConfigurationImpl.java
@@ -26,6 +26,7 @@
     myState.VM_OPTIONS = state.VM_OPTIONS;
     myState.FORCE_JUMBO = state.FORCE_JUMBO;
     myState.CORE_LIBRARY = state.CORE_LIBRARY;
+    myState.PROGUARD_VM_OPTIONS = state.PROGUARD_VM_OPTIONS;
   }
 
   @Override
@@ -93,6 +94,19 @@
     }
   }
 
+  @Override
+  public String getProguardVmOptions() {
+    return myState.PROGUARD_VM_OPTIONS;
+  }
+
+  @Override
+  public void setProguardVmOptions(String value) {
+    if (!myState.PROGUARD_VM_OPTIONS.equals(value)) {
+      myState.PROGUARD_VM_OPTIONS = value;
+      fireElementChanged();
+    }
+  }
+
   @NotNull
   @Override
   public JpsAndroidDexCompilerConfigurationImpl createCopy() {
@@ -106,6 +120,7 @@
     setOptimize(modified.isOptimize());
     setForceJumbo(modified.isForceJumbo());
     setCoreLibrary(modified.isCoreLibrary());
+    setProguardVmOptions(modified.getProguardVmOptions());
   }
 
   @NotNull
@@ -115,6 +130,7 @@
 
   public static class MyState {
     public String VM_OPTIONS = "";
+    public String PROGUARD_VM_OPTIONS = "";
     public int MAX_HEAP_SIZE = 1024;
     public boolean OPTIMIZE = true;
     public boolean FORCE_JUMBO = false;
diff --git a/android/jps-plugin/testData/4/expected_log_4.txt b/android/jps-plugin/testData/4/expected_log_4.txt
index f1b9ca1..421c77f 100644
--- a/android/jps-plugin/testData/4/expected_log_4.txt
+++ b/android/jps-plugin/testData/4/expected_log_4.txt
@@ -14,7 +14,9 @@
 $DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/proguard.txt
 
 ______ENTRY_1:0
-$ANDROID_SDK_DIR$/tools/proguard/bin/proguard.bat
+$JAVA_PATH$
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
 -include
 $ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
 -include
diff --git a/android/jps-plugin/testData/4/expected_log_5.txt b/android/jps-plugin/testData/4/expected_log_5.txt
new file mode 100644
index 0000000..282d354
--- /dev/null
+++ b/android/jps-plugin/testData/4/expected_log_5.txt
@@ -0,0 +1,56 @@
+______ENTRY_0:
+$JAVA_PATH$
+-Xmx700M
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
+-include
+$ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
+-include
+$PROJECT_DIR$/root/proguard-project.txt
+-include
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/proguard.txt
+-injars
+$PROGUARD_INPUT_JAR$
+-outjars
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/obfuscated_sources.jar
+-libraryjars
+$ANDROID_SDK_DIR$/platforms/android-1.5/android.jar
+-dump
+$PROJECT_DIR$/root/proguard_logs/dump.txt
+-printseeds
+$PROJECT_DIR$/root/proguard_logs/seeds.txt
+-printusage
+$PROJECT_DIR$/root/proguard_logs/usage.txt
+-printmapping
+$PROJECT_DIR$/root/proguard_logs/mapping.txt
+env: PROGUARD_HOME=$ANDROID_SDK_DIR$/tools/proguard
+
+______ENTRY_1:0
+$JAVA_PATH$
+-Xmx1024M
+-classpath
+$IDEA_RT_PATH$
+com.intellij.rt.execution.CommandLineWrapper
+$CLASSPATH_TMP$
+org.jetbrains.android.compiler.tools.AndroidDxRunner
+$ANDROID_SDK_DIR$/platform-tools/lib/dx.jar
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/classes.dex
+--optimize
+true
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/obfuscated_sources.jar
+--exclude
+
+______ENTRY_2:0,1
+apk_builder
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/module.apk.res
+$DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/classes.dex
+[
+$PROJECT_DIR$/out/production/java_module
+$PROJECT_DIR$/out/production/module
+]
+[]
+[]
+[]
+$PROJECT_DIR$/out/production/module/module.apk
+false
+$ANDROID_SDK_DIR$
\ No newline at end of file
diff --git a/android/jps-plugin/testData/preDexing/project/app/proguard-project.txt b/android/jps-plugin/testData/preDexing/project/app/proguard-project.txt
index f874218..c447ff3 100644
--- a/android/jps-plugin/testData/preDexing/project/app/proguard-project.txt
+++ b/android/jps-plugin/testData/preDexing/project/app/proguard-project.txt
@@ -55,7 +55,9 @@
 --exclude
 
 ______ENTRY_4:0
-$ANDROID_SDK_DIR$/tools/proguard/bin/proguard.bat
+$JAVA_PATH$
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
 -include
 $ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
 -include
diff --git a/android/jps-plugin/testData/proGuardWithJar/expected_log.txt b/android/jps-plugin/testData/proGuardWithJar/expected_log.txt
index a290543..88b9b69 100644
--- a/android/jps-plugin/testData/proGuardWithJar/expected_log.txt
+++ b/android/jps-plugin/testData/proGuardWithJar/expected_log.txt
@@ -55,7 +55,9 @@
 --exclude
 
 ______ENTRY_4:0
-$ANDROID_SDK_DIR$/tools/proguard/bin/proguard.bat
+$JAVA_PATH$
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
 -include
 $ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
 -include
diff --git a/android/jps-plugin/testData/proGuardWithJar/expected_log_1.txt b/android/jps-plugin/testData/proGuardWithJar/expected_log_1.txt
index b58b2d2..0dd8e48 100644
--- a/android/jps-plugin/testData/proGuardWithJar/expected_log_1.txt
+++ b/android/jps-plugin/testData/proGuardWithJar/expected_log_1.txt
@@ -40,7 +40,9 @@
 $DATA_STORAGE_ROOT$/android/intermediate_artifacts/module/module.apk.res
 
 ______ENTRY_3:0
-$ANDROID_SDK_DIR$/tools/proguard/bin/proguard.bat
+$JAVA_PATH$
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
 -include
 $ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
 -include
diff --git a/android/jps-plugin/testData/proGuardWithJar/project/proguard-project.txt b/android/jps-plugin/testData/proGuardWithJar/project/proguard-project.txt
index f874218..c447ff3 100644
--- a/android/jps-plugin/testData/proGuardWithJar/project/proguard-project.txt
+++ b/android/jps-plugin/testData/proGuardWithJar/project/proguard-project.txt
@@ -55,7 +55,9 @@
 --exclude
 
 ______ENTRY_4:0
-$ANDROID_SDK_DIR$/tools/proguard/bin/proguard.bat
+$JAVA_PATH$
+-jar
+$ANDROID_SDK_DIR$/tools/proguard/lib/proguard.jar
 -include
 $ANDROID_SDK_DIR$/tools/proguard/proguard-android.txt
 -include
diff --git a/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java b/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java
index 4268686..8deef21 100644
--- a/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java
+++ b/android/jps-plugin/testSrc/org/jetbrains/jps/android/AndroidBuilderTest.java
@@ -446,6 +446,15 @@
     checkBuildLog(executor, "expected_log_4");
     assertEquals(Collections.singleton("proguard_input_jar"), executor.getCheckedJars());
     checkMakeUpToDate(executor);
+
+    final JpsAndroidExtensionService service = JpsAndroidExtensionService.getInstance();
+    final JpsAndroidDexCompilerConfiguration c = service.getDexCompilerConfiguration(myProject);
+    assertNotNull(c);
+    service.setDexCompilerConfiguration(myProject, c);
+    c.setProguardVmOptions("-Xmx700M");
+    makeAll();
+    checkBuildLog(executor, "expected_log_5");
+    checkMakeUpToDate(executor);
   }
 
   public void test5() throws Exception {
diff --git a/android/resources/messages/AndroidBundle.properties b/android/resources/messages/AndroidBundle.properties
index 1f2f34e..ee36617 100644
--- a/android/resources/messages/AndroidBundle.properties
+++ b/android/resources/messages/AndroidBundle.properties
@@ -207,7 +207,8 @@
 android.ddms.disabled.error=You have to enable ADB integration to launch debugging. Do you want to do that?
 android.ddms.disabled.dialog.title=ADB Integration Disabled
 android.dex.compiler.vm.options.title=Android DX Compiler VM Options
-android.dex.compiler.configurable.display.name=Android DX Compiler
+android.proguard.vm.options.title=Android ProGuard VM Options
+android.dex.compiler.configurable.display.name=Android Tools
 android.run.configuration.general.tab.title=General
 android.run.configuration.emulator.tab.title=Emulator
 android.run.configuration.logcat.tab.title=Logcat
@@ -509,7 +510,7 @@
 android.facet.importing.notification.group=Importing Error
 android.facet.importing.title=Error when importing module ''{0}''
 android.find.style.applications.title=Use Style Where Possible
-android.aapt.use.custom.package.name=Rename manifest pac&kag\:
+android.aapt.use.custom.package.name=Rename manifest pac&kage\:
 android.wizard.cannot.find.main.content.root.error=Cannot find content root containing AndroidManifest.xml file in module {0}
 android.9patch.file.type.description=Android 9-patch Files
 android.update.project.properties.dialog.text=The structure of following Android modules was changed:<br>{0}<br>Would you like to update related project.properties files?<br>\
diff --git a/android/src/META-INF/plugin.xml b/android/src/META-INF/plugin.xml
index 37d1d69..90d5513 100755
--- a/android/src/META-INF/plugin.xml
+++ b/android/src/META-INF/plugin.xml
@@ -474,6 +474,7 @@
     <codeInsight.lineMarkerProvider language="JAVA" implementationClass="org.jetbrains.android.AndroidLineMarkerProvider"/>
     <implicitUsageProvider implementation="org.jetbrains.android.AndroidImplicitUsagesProvider"/>
     <xml.completionExtension implementation="org.jetbrains.android.dom.AndroidXmlCompletionExtension"/>
+    <spellchecker.support language="XML" implementationClass="org.jetbrains.android.spellchecker.AndroidXmlSpellcheckingStrategy" order="before xml"/>
   </extensions>
 
   <extensionPoints>
diff --git a/android/src/com/android/tools/idea/actions/JavaSourceAction.java b/android/src/com/android/tools/idea/actions/JavaSourceAction.java
index 3d7726c..eae29b4 100644
--- a/android/src/com/android/tools/idea/actions/JavaSourceAction.java
+++ b/android/src/com/android/tools/idea/actions/JavaSourceAction.java
@@ -26,6 +26,7 @@
 import com.intellij.psi.JavaDirectoryService;
 import com.intellij.psi.PsiDirectory;
 import org.jetbrains.android.facet.AndroidFacet;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 
 import javax.swing.*;
 
@@ -51,7 +52,7 @@
     final JavaDirectoryService dirService = JavaDirectoryService.getInstance();
 
     for (PsiDirectory dir : view.getDirectories()) {
-      if (projectIndex.isInSourceContent(dir.getVirtualFile()) &&
+      if (projectIndex.isUnderSourceRootOfType(dir.getVirtualFile(), JavaModuleSourceRootTypes.SOURCES) &&
           dirService.getPackage(dir) != null &&
           !dirService.getPackage(dir).getQualifiedName().isEmpty()) {
         return true;
diff --git a/android/src/org/jetbrains/android/AndroidImplicitUsagesProvider.java b/android/src/org/jetbrains/android/AndroidImplicitUsagesProvider.java
index 7b1b690..42308cf 100644
--- a/android/src/org/jetbrains/android/AndroidImplicitUsagesProvider.java
+++ b/android/src/org/jetbrains/android/AndroidImplicitUsagesProvider.java
@@ -2,6 +2,7 @@
 
 import com.intellij.codeInsight.daemon.ImplicitUsageProvider;
 import com.intellij.psi.*;
+import com.intellij.psi.util.InheritanceUtil;
 import org.jetbrains.android.facet.AndroidFacet;
 import org.jetbrains.android.util.AndroidUtils;
 
@@ -11,7 +12,21 @@
 public class AndroidImplicitUsagesProvider implements ImplicitUsageProvider {
   @Override
   public boolean isImplicitUsage(PsiElement element) {
-    return false;
+    if (!(element instanceof PsiField)) {
+      return false;
+    }
+    final PsiField field = (PsiField)element;
+
+    if (!"CREATOR".equals(field.getName())) {
+      return false;
+    }
+    final PsiModifierList modifierList = field.getModifierList();
+
+    if (modifierList == null || !modifierList.hasModifierProperty(PsiModifier.STATIC)) {
+      return false;
+    }
+    final PsiClass aClass = field.getContainingClass();
+    return aClass != null && InheritanceUtil.isInheritor(aClass, "android.os.Parcelable");
   }
 
   @Override
diff --git a/android/src/org/jetbrains/android/actions/NewAndroidComponentAction.java b/android/src/org/jetbrains/android/actions/NewAndroidComponentAction.java
index 5e65e9a..799184a 100644
--- a/android/src/org/jetbrains/android/actions/NewAndroidComponentAction.java
+++ b/android/src/org/jetbrains/android/actions/NewAndroidComponentAction.java
@@ -30,6 +30,7 @@
 import icons.AndroidIcons;
 import org.jetbrains.android.facet.AndroidFacet;
 import org.jetbrains.android.util.AndroidBundle;
+import org.jetbrains.jps.model.java.JavaModuleSourceRootTypes;
 
 /**
  * @author Eugene.Kudelevsky
@@ -60,7 +61,7 @@
     final JavaDirectoryService dirService = JavaDirectoryService.getInstance();
 
     for (PsiDirectory dir : view.getDirectories()) {
-      if (projectIndex.isInSourceContent(dir.getVirtualFile()) &&
+      if (projectIndex.isUnderSourceRootOfType(dir.getVirtualFile(), JavaModuleSourceRootTypes.SOURCES) &&
           dirService.getPackage(dir) != null) {
         return true;
       }
diff --git a/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java b/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java
index 5b24a17..d641730 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidAutogenerator.java
@@ -160,18 +160,11 @@
       return;
     }
 
-    // doesn't matter, because autogenerated class is used for resolve/completion only
-    final boolean debug = true;
-    final BuildConfigGenerator generator = new BuildConfigGenerator(item.mySourceRootOsPath, item.myPackage, debug);
     try {
-      try {
-        generator.generate();
-      }
-      catch (RuntimeException e) {
-        // todo: report to context
-        LOG.debug(e);
-        return;
-      }
+      // hack for IDEA-100046: we need to avoid reporting "condition is always 'true'
+      // from data flow inspection, so use non-constant value here
+      generateStubClass(item.myPackage, new File(item.mySourceRootOsPath), "BuildConfig",
+                        "  public final static boolean DEBUG = Boolean.parseBoolean(null);\n");
 
       final VirtualFile genSourceRoot = LocalFileSystem.getInstance().findFileByPath(item.mySourceRootOsPath);
       if (genSourceRoot != null) {
@@ -183,7 +176,7 @@
         item.mySourceRootOsPath + '/' + item.myPackage.replace('.', '/') + '/' + BuildConfigGenerator.BUILD_CONFIG_NAME);
 
       if (genFile != null && genFile.exists()) {
-        patchAndMarkGeneratedFile(facet, AndroidAutogeneratorMode.BUILDCONFIG, genFile);
+        facet.markFileAutogenerated(AndroidAutogeneratorMode.BUILDCONFIG, genFile);
       }
     }
     catch (final IOException e) {
@@ -358,23 +351,28 @@
     assert aPackage.length() > 0;
 
     for (String className : classNames) {
-      final File packageDir = new File(outputDir.getPath() + '/' + aPackage.replace('.', '/'));
-      if (!packageDir.exists() && !packageDir.mkdirs()) {
-        throw new IOException("Cannot create directory " + FileUtil.toSystemDependentName(packageDir.getPath()));
-      }
-      final BufferedWriter writer = new BufferedWriter(new FileWriter(new File(packageDir, className + ".java")));
-      try {
-        writer.write(
-          AndroidCommonUtils.AUTOGENERATED_JAVA_FILE_HEADER +
-          "\n\npackage " + aPackage + ";\n\n" +
-          "/* This stub is only used by the IDE. It is NOT the " + className + " class actually packed into the APK */\n" +
-          "public final class " + className + " {\n" +
-          "}"
-        );
-      }
-      finally {
-        writer.close();
-      }
+      generateStubClass(aPackage, outputDir, className, "");
+    }
+  }
+
+  private static void generateStubClass(String aPackage, File outputDir, String className, String content) throws IOException {
+    final File packageDir = new File(outputDir.getPath() + '/' + aPackage.replace('.', '/'));
+    if (!packageDir.exists() && !packageDir.mkdirs()) {
+      throw new IOException("Cannot create directory " + FileUtil.toSystemDependentName(packageDir.getPath()));
+    }
+    final BufferedWriter writer = new BufferedWriter(new FileWriter(new File(packageDir, className + ".java")));
+    try {
+      writer.write(
+        AndroidCommonUtils.AUTOGENERATED_JAVA_FILE_HEADER +
+        "\n\npackage " + aPackage + ";\n\n" +
+        "/* This stub is only used by the IDE. It is NOT the " + className + " class actually packed into the APK */\n" +
+        "public final class " + className + " {\n" +
+        content +
+        "}"
+      );
+    }
+    finally {
+      writer.close();
     }
   }
 
diff --git a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java
index 60f43db..ad4143b 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerConfiguration.java
@@ -35,6 +35,7 @@
   public boolean OPTIMIZE = true;
   public boolean FORCE_JUMBO = false;
   public boolean CORE_LIBRARY = false;
+  public String PROGUARD_VM_OPTIONS = "";
 
   @Override
   public AndroidDexCompilerConfiguration getState() {
diff --git a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form
index 00bff84..c1b2689 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form
+++ b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.form
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <form xmlns="http://www.intellij.com/uidesigner/form/" version="1" bind-to-class="org.jetbrains.android.compiler.AndroidDexCompilerSettingsConfigurable">
-  <grid id="27dc6" binding="myContentPanel" layout-manager="GridLayoutManager" row-count="6" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+  <grid id="27dc6" binding="myContentPanel" layout-manager="GridLayoutManager" row-count="3" column-count="1" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
     <margin top="0" left="0" bottom="0" right="0"/>
     <constraints>
       <xy x="20" y="20" width="378" height="400"/>
@@ -8,71 +8,112 @@
     <properties/>
     <border type="none"/>
     <children>
-      <component id="74b9" class="javax.swing.JLabel">
+      <grid id="23587" layout-manager="GridLayoutManager" row-count="5" column-count="3" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+        <margin top="0" left="0" bottom="0" right="0"/>
         <constraints>
-          <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+          <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
         </constraints>
-        <properties>
-          <labelFor value="163dc"/>
-          <text value="&amp;Maximum heap size (MB):"/>
-        </properties>
-      </component>
-      <hspacer id="a5efd">
-        <constraints>
-          <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
-        </constraints>
-      </hspacer>
+        <properties/>
+        <clientProperties>
+          <BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithIndentWithoutInsets"/>
+        </clientProperties>
+        <border type="etched" title="DEX"/>
+        <children>
+          <component id="74b9" class="javax.swing.JLabel">
+            <constraints>
+              <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties>
+              <labelFor value="163dc"/>
+              <text value="&amp;Maximum heap size (MB):"/>
+            </properties>
+          </component>
+          <hspacer id="a5efd">
+            <constraints>
+              <grid row="0" column="2" row-span="1" col-span="1" vsize-policy="1" hsize-policy="6" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+            </constraints>
+          </hspacer>
+          <component id="5c5d1" class="javax.swing.JLabel" binding="myVmOptionsLabel">
+            <constraints>
+              <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties>
+              <text value="&amp;Additional VM options:"/>
+            </properties>
+          </component>
+          <component id="b3b7a" class="com.intellij.ui.RawCommandLineEditor" binding="myVmOptionsEditor">
+            <constraints>
+              <grid row="1" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="7" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties/>
+          </component>
+          <component id="163dc" class="javax.swing.JSpinner" binding="myHeapSizeSpinner">
+            <constraints>
+              <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="1" indent="0" use-parent-layout="false">
+                <preferred-size width="100" height="-1"/>
+              </grid>
+            </constraints>
+            <properties/>
+          </component>
+          <component id="a1a71" class="com.intellij.ui.components.JBCheckBox" binding="myOptimizeCheckBox">
+            <constraints>
+              <grid row="2" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties>
+              <text value="&amp;Optimize"/>
+            </properties>
+          </component>
+          <component id="4ee27" class="com.intellij.ui.components.JBCheckBox" binding="myJumboModeCheckBox">
+            <constraints>
+              <grid row="3" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties>
+              <text value="Force &amp;jumbo mode"/>
+            </properties>
+          </component>
+          <component id="4b4ef" class="com.intellij.ui.components.JBCheckBox" binding="myCoreLibraryCheckBox">
+            <constraints>
+              <grid row="4" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties>
+              <text value="Add &quot;--&amp;core-library&quot; flag"/>
+            </properties>
+          </component>
+        </children>
+      </grid>
       <vspacer id="e6619">
         <constraints>
-          <grid row="5" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
+          <grid row="2" column="0" row-span="1" col-span="1" vsize-policy="6" hsize-policy="1" anchor="0" fill="2" indent="0" use-parent-layout="false"/>
         </constraints>
       </vspacer>
-      <component id="5c5d1" class="javax.swing.JLabel" binding="myVmOptionsLabel">
+      <grid id="77ae5" layout-manager="GridLayoutManager" row-count="1" column-count="2" same-size-horizontally="false" same-size-vertically="false" hgap="-1" vgap="-1">
+        <margin top="0" left="0" bottom="0" right="0"/>
         <constraints>
-          <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
-        </constraints>
-        <properties>
-          <text value="&amp;Additional VM options:"/>
-        </properties>
-      </component>
-      <component id="b3b7a" class="com.intellij.ui.RawCommandLineEditor" binding="myVmOptionsEditor">
-        <constraints>
-          <grid row="1" column="1" row-span="1" col-span="2" vsize-policy="0" hsize-policy="7" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+          <grid row="1" column="0" row-span="1" col-span="1" vsize-policy="3" hsize-policy="3" anchor="0" fill="3" indent="0" use-parent-layout="false"/>
         </constraints>
         <properties/>
-      </component>
-      <component id="163dc" class="javax.swing.JSpinner" binding="myHeapSizeSpinner">
-        <constraints>
-          <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="8" fill="1" indent="0" use-parent-layout="false">
-            <preferred-size width="100" height="-1"/>
-          </grid>
-        </constraints>
-        <properties/>
-      </component>
-      <component id="a1a71" class="com.intellij.ui.components.JBCheckBox" binding="myOptimizeCheckBox">
-        <constraints>
-          <grid row="2" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
-        </constraints>
-        <properties>
-          <text value="&amp;Optimize"/>
-        </properties>
-      </component>
-      <component id="4ee27" class="com.intellij.ui.components.JBCheckBox" binding="myJumboModeCheckBox">
-        <constraints>
-          <grid row="3" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
-        </constraints>
-        <properties>
-          <text value="Force &amp;jumbo mode"/>
-        </properties>
-      </component>
-      <component id="4b4ef" class="com.intellij.ui.components.JBCheckBox" binding="myCoreLibraryCheckBox">
-        <constraints>
-          <grid row="4" column="0" row-span="1" col-span="3" vsize-policy="0" hsize-policy="0" anchor="8" fill="0" indent="0" use-parent-layout="false"/>
-        </constraints>
-        <properties>
-          <text value="Add &quot;--&amp;core-library&quot; flag"/>
-        </properties>
-      </component>
+        <clientProperties>
+          <BorderFactoryClass class="java.lang.String" value="com.intellij.ui.IdeBorderFactory$PlainSmallWithIndentWithoutInsets"/>
+        </clientProperties>
+        <border type="etched" title="ProGuard"/>
+        <children>
+          <component id="4150b" class="com.intellij.ui.components.JBLabel">
+            <constraints>
+              <grid row="0" column="0" row-span="1" col-span="1" vsize-policy="0" hsize-policy="0" anchor="0" fill="0" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties>
+              <labelFor value="b3d20"/>
+              <text value="&amp;VM options:"/>
+            </properties>
+          </component>
+          <component id="b3d20" class="com.intellij.ui.RawCommandLineEditor" binding="myProguardVmOptionsEditor">
+            <constraints>
+              <grid row="0" column="1" row-span="1" col-span="1" vsize-policy="0" hsize-policy="7" anchor="0" fill="1" indent="0" use-parent-layout="false"/>
+            </constraints>
+            <properties/>
+          </component>
+        </children>
+      </grid>
     </children>
   </grid>
 </form>
diff --git a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.java b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.java
index a49b152..d323c87 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidDexCompilerSettingsConfigurable.java
@@ -40,11 +40,13 @@
   private JBCheckBox myOptimizeCheckBox;
   private JBCheckBox myJumboModeCheckBox;
   private JBCheckBox myCoreLibraryCheckBox;
+  private RawCommandLineEditor myProguardVmOptionsEditor;
 
   public AndroidDexCompilerSettingsConfigurable(Project project) {
     myConfig = AndroidDexCompilerConfiguration.getInstance(project);
     myVmOptionsLabel.setLabelFor(myVmOptionsEditor);
     myVmOptionsEditor.setDialogCaption(AndroidBundle.message("android.dex.compiler.vm.options.title"));
+    myProguardVmOptionsEditor.setDialogCaption(AndroidBundle.message("android.proguard.vm.options.title"));
   }
 
   @Nls
@@ -70,7 +72,8 @@
            !myVmOptionsEditor.getText().equals(myConfig.VM_OPTIONS) ||
            myOptimizeCheckBox.isSelected() != myConfig.OPTIMIZE ||
            myJumboModeCheckBox.isSelected() != myConfig.FORCE_JUMBO ||
-           myCoreLibraryCheckBox.isSelected() != myConfig.CORE_LIBRARY;
+           myCoreLibraryCheckBox.isSelected() != myConfig.CORE_LIBRARY ||
+           !myProguardVmOptionsEditor.getText().equals(myConfig.PROGUARD_VM_OPTIONS);
   }
 
   @Override
@@ -80,6 +83,7 @@
     myConfig.OPTIMIZE = myOptimizeCheckBox.isSelected();
     myConfig.FORCE_JUMBO = myJumboModeCheckBox.isSelected();
     myConfig.CORE_LIBRARY = myCoreLibraryCheckBox.isSelected();
+    myConfig.PROGUARD_VM_OPTIONS = myProguardVmOptionsEditor.getText();
   }
 
   @Override
@@ -89,6 +93,7 @@
     myOptimizeCheckBox.setSelected(myConfig.OPTIMIZE);
     myJumboModeCheckBox.setSelected(myConfig.FORCE_JUMBO);
     myCoreLibraryCheckBox.setSelected(myConfig.CORE_LIBRARY);
+    myProguardVmOptionsEditor.setText(myConfig.PROGUARD_VM_OPTIONS);
   }
 
   @Override
diff --git a/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java b/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java
index 05b539d..6688ebe 100644
--- a/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java
+++ b/android/src/org/jetbrains/android/compiler/AndroidProguardCompiler.java
@@ -9,7 +9,11 @@
 import com.intellij.openapi.fileTypes.StdFileTypes;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleManager;
+import com.intellij.openapi.projectRoots.JavaSdkType;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.projectRoots.SdkTypeId;
 import com.intellij.openapi.roots.CompilerModuleExtension;
+import com.intellij.openapi.roots.ModuleRootManager;
 import com.intellij.openapi.util.Computable;
 import com.intellij.openapi.util.Key;
 import com.intellij.openapi.util.io.FileUtil;
@@ -153,6 +157,21 @@
     });
   }
 
+  @Nullable
+  private static String getJavaExecutablePath(@NotNull Module module) {
+    final Sdk sdk = ModuleRootManager.getInstance(module).getSdk();
+
+    if (sdk == null) {
+      return null;
+    }
+    final SdkTypeId sdkType = sdk.getSdkType();
+
+    if (!(sdkType instanceof JavaSdkType)) {
+      return null;
+    }
+    return ((JavaSdkType)sdkType).getVMExecutablePath(sdk);
+  }
+
   @Override
   public ProcessingItem[] process(CompileContext context, ProcessingItem[] items) {
     final List<ProcessingItem> processedItems = new ArrayList<ProcessingItem>();
@@ -163,6 +182,13 @@
       if (!AndroidCompileUtil.isModuleAffected(context, processingItem.myModule)) {
         continue;
       }
+      final Module module = ((MyProcessingItem)item).getModule();
+      final String javaExecutablePath = getJavaExecutablePath(module);
+
+      if (javaExecutablePath == null) {
+        context.addMessage(CompilerMessageCategory.ERROR, "Cannot find Java SDK for module " + module.getName(), null, -1, -1);
+        continue;
+      }
       final List<VirtualFile> cfgFiles = processingItem.getProguardConfigFiles();
       final String[] proguardCfgOsPaths = AndroidCompileUtil.toOsPaths(cfgFiles.toArray(new VirtualFile[cfgFiles.size()]));
 
@@ -176,7 +202,7 @@
 
         final Map<CompilerMessageCategory, List<String>> messages = AndroidCompileUtil.toCompilerMessageCategoryKeys(
           AndroidCommonUtils.launchProguard(processingItem.getTarget(), processingItem.getSdkToolsRevision(),
-                                            processingItem.getSdkOsPath(), proguardCfgOsPaths,
+                                            processingItem.getSdkOsPath(), javaExecutablePath, "", proguardCfgOsPaths,
                                             processingItem.isIncludeSystemProguardFile(), inputJarOsPath, externalJarOsPaths,
                                             processingItem.getOutputJarOsPath(), logsDirOsPath));
 
diff --git a/android/src/org/jetbrains/android/formatter/AndroidXmlCodeStyleSettings.java b/android/src/org/jetbrains/android/formatter/AndroidXmlCodeStyleSettings.java
index faa4065..323a060 100644
--- a/android/src/org/jetbrains/android/formatter/AndroidXmlCodeStyleSettings.java
+++ b/android/src/org/jetbrains/android/formatter/AndroidXmlCodeStyleSettings.java
@@ -217,6 +217,21 @@
         }
 
         @Override
+        public boolean keepWhiteSpacesInsideTag(XmlTag tag) {
+          if (super.keepWhiteSpacesInsideTag(tag)) {
+            return true;
+          }
+
+          while (tag != null) {
+            if ("string".equals(tag.getName())) {
+              return true;
+            }
+            tag = tag.getParentTag();
+          }
+          return false;
+        }
+
+        @Override
         public boolean insertLineBreakBeforeTag(XmlTag xmlTag) {
           if (!INSERT_LINE_BREAKS_AROUND_STYLE) {
             return false;
diff --git a/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java b/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java
index 226d2f5..d7d2602 100644
--- a/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java
+++ b/android/src/org/jetbrains/android/formatter/AndroidXmlPredefinedCodeStyle.java
@@ -55,6 +55,8 @@
     rules.add(attrArrangementRule(".*:layout_width", SdkConstants.NS_RESOURCES, KEEP));
     rules.add(attrArrangementRule(".*:layout_height", SdkConstants.NS_RESOURCES, KEEP));
     rules.add(attrArrangementRule(".*:layout_.*", SdkConstants.NS_RESOURCES, BY_NAME));
+    rules.add(attrArrangementRule(".*:width", SdkConstants.NS_RESOURCES, BY_NAME));
+    rules.add(attrArrangementRule(".*:height", SdkConstants.NS_RESOURCES, BY_NAME));
     rules.add(attrArrangementRule(".*", SdkConstants.NS_RESOURCES, BY_NAME));
     rules.add(attrArrangementRule(".*", ".*", BY_NAME));
     // TODO: Should sort name:"color",namespace:"" to the end (primarily for color state lists)
diff --git a/android/src/org/jetbrains/android/logcat/AndroidToolWindowFactory.java b/android/src/org/jetbrains/android/logcat/AndroidToolWindowFactory.java
index ce16ae8..7de3cbe 100644
--- a/android/src/org/jetbrains/android/logcat/AndroidToolWindowFactory.java
+++ b/android/src/org/jetbrains/android/logcat/AndroidToolWindowFactory.java
@@ -103,9 +103,12 @@
 
     final ContentManager contentManager = toolWindow.getContentManager();
     Content c = contentManager.getFactory().createContent(layoutUi.getComponent(), "DDMS", true);
+
     // Store a reference to the logcat view, so that this view can be retrieved directly from
     // the DDMS tool window. (e.g. to clear logcat before a launch)
+    // add possibility to access logcat view externally in the future
     c.putUserData(AndroidLogcatView.ANDROID_LOGCAT_VIEW_KEY, logcatView);
+
     contentManager.addContent(c);
 
     ApplicationManager.getApplication().invokeLater(new Runnable() {
diff --git a/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java b/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java
index 594246f..32f20ee 100644
--- a/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java
+++ b/android/src/org/jetbrains/android/maven/AndroidFacetImporterBase.java
@@ -91,6 +91,8 @@
 
   private static final Key<Boolean> DELETE_OBSOLETE_MODULE_TASK_KEY = Key.create("DELETE_OBSOLETE_MODULE_TASK");
 
+  private static final Key<Boolean> CLEAR_RESOLVED_APKLIBS_TASK_KEY = Key.create("CLEAR_RESOLVED_APKLIBS");
+
   public AndroidFacetImporterBase(@NotNull String pluginId) {
     super("com.jayway.maven.plugins.android.generation2", pluginId, FacetType.findInstance(AndroidFacetType.class));
   }
@@ -171,6 +173,16 @@
     project.putUserData(DELETE_OBSOLETE_MODULE_TASK_KEY, Boolean.TRUE);
     postTasks.add(new MyDeleteObsoleteApklibModulesTask(project));
 
+    project.putUserData(CLEAR_RESOLVED_APKLIBS_TASK_KEY, Boolean.TRUE);
+    postTasks.add(new MavenProjectsProcessorTask() {
+      @Override
+      public void perform(Project project, MavenEmbeddersManager embeddersManager,
+                          MavenConsole console, MavenProgressIndicator indicator)
+        throws MavenProcessCanceledException {
+        clearResolvedApklibsInfo(project);
+      }
+    });
+
     // exclude folders where Maven generates sources if gen source roots were changed by user manually
     final AndroidFacetConfiguration defaultConfig = new AndroidFacetConfiguration();
     AndroidMavenProviderImpl.setPathsToDefault(mavenProject, module, defaultConfig);
@@ -190,6 +202,25 @@
     }
   }
 
+  private static void clearResolvedApklibsInfo(final Project project) {
+    ApplicationManager.getApplication().invokeLater(new Runnable() {
+      @Override
+      public void run() {
+        if (project.isDisposed() || project.getUserData(CLEAR_RESOLVED_APKLIBS_TASK_KEY) != Boolean.TRUE) {
+          return;
+        }
+        project.putUserData(CLEAR_RESOLVED_APKLIBS_TASK_KEY, null);
+        final AndroidExternalApklibDependenciesManager.State state =
+          AndroidExternalApklibDependenciesManager.getInstance(project).getState();
+
+        if (state != null) {
+          state.getResolvedInfoMap().clear();
+          state.getArtifactFilesMap().clear();
+        }
+      }
+    });
+  }
+
   private void importNativeDependencies(@NotNull AndroidFacet facet, @NotNull MavenProject mavenProject, @NotNull String moduleDirPath) {
     final List<AndroidNativeLibData> additionalNativeLibs = new ArrayList<AndroidNativeLibData>();
     final String localRepository = MavenProjectsManager.getInstance(facet.getModule().getProject()).getLocalRepository().getPath();
diff --git a/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java b/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java
index 72a9e3b..f672792 100755
--- a/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java
+++ b/android/src/org/jetbrains/android/run/AndroidRunConfiguration.java
@@ -133,6 +133,7 @@
     AndroidRunningState state = super.getState(executor, env);
     if (state != null) {
       state.setDeploy(DEPLOY);
+      state.setOpenLogcatAutomatically(true);
     }
     return state;
   }
diff --git a/android/src/org/jetbrains/android/run/AndroidRunningState.java b/android/src/org/jetbrains/android/run/AndroidRunningState.java
index 56b5a49..2c55f7d 100644
--- a/android/src/org/jetbrains/android/run/AndroidRunningState.java
+++ b/android/src/org/jetbrains/android/run/AndroidRunningState.java
@@ -136,6 +136,7 @@
 
   private volatile String myAvdName;
   private volatile boolean myDebugMode;
+  private volatile boolean myOpenLogcatAutomatically;
 
   private volatile DebugLauncher myDebugLauncher;
 
@@ -782,6 +783,10 @@
     }
   }
 
+  public void setOpenLogcatAutomatically(boolean openLogcatAutomatically) {
+    myOpenLogcatAutomatically = openLogcatAutomatically;
+  }
+
   private boolean doPrepareAndStart(IDevice device) {
     if (myClearLogcatBeforeStart) {
       clearLogcatAndConsole(getModule().getProject(), device);
@@ -841,6 +846,16 @@
           }
         }
       }
+      if (!myDebugMode && myOpenLogcatAutomatically) {
+        ApplicationManager.getApplication().invokeLater(new Runnable() {
+          @Override
+          public void run() {
+            final ToolWindow androidToolWindow = ToolWindowManager.getInstance(myEnv.getProject()).
+              getToolWindow(AndroidToolWindowFactory.TOOL_WINDOW_ID);
+            androidToolWindow.activate(null, false);
+          }
+        });
+      }
       return true;
     }
     catch (TimeoutException e) {
diff --git a/android/src/org/jetbrains/android/run/testing/AndroidTestConfigurationProducer.java b/android/src/org/jetbrains/android/run/testing/AndroidTestConfigurationProducer.java
index 60e361c..d1e6500 100644
--- a/android/src/org/jetbrains/android/run/testing/AndroidTestConfigurationProducer.java
+++ b/android/src/org/jetbrains/android/run/testing/AndroidTestConfigurationProducer.java
@@ -194,7 +194,7 @@
         return packageName != null && packageName.equals(configuration.PACKAGE_NAME);
 
       case AndroidTestRunConfiguration.TEST_CLASS:
-        return className != null && className.equals(configuration.CLASS_NAME);
+        return elementMethod == null && className != null && className.equals(configuration.CLASS_NAME);
 
       case AndroidTestRunConfiguration.TEST_METHOD:
         return methodName != null && methodName.equals(configuration.METHOD_NAME);
diff --git a/android/src/org/jetbrains/android/spellchecker/AndroidXmlSpellcheckingStrategy.java b/android/src/org/jetbrains/android/spellchecker/AndroidXmlSpellcheckingStrategy.java
new file mode 100644
index 0000000..dfb38e5
--- /dev/null
+++ b/android/src/org/jetbrains/android/spellchecker/AndroidXmlSpellcheckingStrategy.java
@@ -0,0 +1,114 @@
+package org.jetbrains.android.spellchecker;
+
+import com.intellij.psi.PsiElement;
+import com.intellij.psi.PsiReference;
+import com.intellij.psi.xml.XmlAttribute;
+import com.intellij.psi.xml.XmlAttributeValue;
+import com.intellij.psi.xml.XmlTag;
+import com.intellij.spellchecker.inspections.TextSplitter;
+import com.intellij.spellchecker.tokenizer.TokenConsumer;
+import com.intellij.spellchecker.tokenizer.Tokenizer;
+import com.intellij.spellchecker.xml.XmlSpellcheckingStrategy;
+import com.intellij.util.xml.Converter;
+import com.intellij.util.xml.DomElement;
+import com.intellij.util.xml.DomManager;
+import com.intellij.util.xml.GenericAttributeValue;
+import org.jetbrains.android.dom.AndroidDomElement;
+import org.jetbrains.android.dom.converters.AndroidPackageConverter;
+import org.jetbrains.android.dom.converters.AndroidResourceReferenceBase;
+import org.jetbrains.android.dom.converters.ConstantFieldConverter;
+import org.jetbrains.android.dom.converters.ResourceReferenceConverter;
+import org.jetbrains.android.dom.resources.ResourceNameConverter;
+import org.jetbrains.android.util.AndroidResourceUtil;
+import org.jetbrains.annotations.NotNull;
+
+/**
+ * @author Eugene.Kudelevsky
+ */
+public class AndroidXmlSpellcheckingStrategy extends XmlSpellcheckingStrategy {
+  private final MyResourceReferenceTokenizer myResourceReferenceTokenizer = new MyResourceReferenceTokenizer();
+
+  private final Tokenizer<XmlAttributeValue> myAttributeValueRenamingTokenizer = new Tokenizer<XmlAttributeValue>() {
+    @Override
+    public void tokenize(@NotNull XmlAttributeValue element, TokenConsumer consumer) {
+      consumer.consumeToken(element, true, TextSplitter.getInstance());
+    }
+  };
+
+  @NotNull
+  @Override
+  public Tokenizer getTokenizer(PsiElement element) {
+    assert element instanceof XmlAttributeValue;
+
+    if (AndroidResourceUtil.isIdDeclaration((XmlAttributeValue)element)) {
+      return myAttributeValueRenamingTokenizer;
+    }
+    final PsiElement parent = element.getParent();
+
+    if (parent instanceof XmlAttribute) {
+      final String value = ((XmlAttribute)parent).getValue();
+
+      if (value != null) {
+        final GenericAttributeValue domValue = DomManager.getDomManager(
+          parent.getProject()).getDomElement((XmlAttribute)parent);
+
+        if (domValue != null) {
+          final Converter converter = domValue.getConverter();
+
+          if (converter instanceof ResourceReferenceConverter) {
+            return myResourceReferenceTokenizer;
+          }
+          else if (converter instanceof ConstantFieldConverter) {
+            return EMPTY_TOKENIZER;
+          }
+          else if (converter instanceof ResourceNameConverter || converter instanceof AndroidPackageConverter) {
+            return myAttributeValueRenamingTokenizer;
+          }
+        }
+      }
+    }
+    return super.getTokenizer(element);
+  }
+
+  @Override
+  public boolean isMyContext(@NotNull PsiElement element) {
+    if (!super.isMyContext(element)) {
+      return false;
+    }
+    if (!(element instanceof XmlAttributeValue)) {
+      return false;
+    }
+    PsiElement parent = element.getParent();
+    parent = parent != null ? parent.getParent() : null;
+
+    if (!(parent instanceof XmlTag)) {
+      return false;
+    }
+    final DomElement domElement = DomManager.getDomManager(
+      element.getProject()).getDomElement((XmlTag)parent);
+    return domElement instanceof AndroidDomElement;
+  }
+
+  private static class MyResourceReferenceTokenizer extends XmlAttributeValueTokenizer {
+    private static AndroidResourceReferenceBase findResourceReference(PsiElement element) {
+      for (PsiReference reference : element.getReferences()) {
+        if (reference instanceof AndroidResourceReferenceBase) {
+          return (AndroidResourceReferenceBase)reference;
+        }
+      }
+      return null;
+    }
+
+    public void tokenize(@NotNull final XmlAttributeValue element, final TokenConsumer consumer) {
+      final AndroidResourceReferenceBase reference = findResourceReference(element);
+
+      if (reference != null) {
+        if (reference.getResourceValue().getPackage() == null) {
+          consumer.consumeToken(element, true, TextSplitter.getInstance());
+        }
+        return;
+      }
+      super.tokenize(element, consumer);
+    }
+  }
+}
diff --git a/android/testData/dom/layout/spellchecker.xml b/android/testData/dom/layout/spellchecker.xml
new file mode 100644
index 0000000..7e00c13
--- /dev/null
+++ b/android/testData/dom/layout/spellchecker.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="fill_parent"
+              android:layout_height="fill_parent"
+              android:orientation="vertical">
+
+  <TextView
+      android:id="@+id/my_<TYPO>idddd</TYPO>"
+      android:layout_width="fill_parent"
+      android:layout_height="wrap_content"
+      android:text="@android:string/defaultMsisdnAlphaTag" />
+
+  <TextView
+      android:layout_width="fill_parent"
+      android:layout_height="wrap_content"
+      android:text="@string/my<TYPO>Msisdn</TYPO>AlphaTag" />
+
+    <TextView
+        android:layout_width="fill_parent"
+        android:layout_height="wrap_content"
+        android:text="Hello <TYPO>Worlld</TYPO>" />
+</LinearLayout>
+
diff --git a/android/testData/dom/layout/spellcheckerQuickfix.xml b/android/testData/dom/layout/spellcheckerQuickfix.xml
new file mode 100644
index 0000000..8178c2a
--- /dev/null
+++ b/android/testData/dom/layout/spellcheckerQuickfix.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+              android:layout_width="fill_parent"
+              android:layout_height="fill_parent"
+              android:orientation="vertical">
+
+  <TextView
+      android:layout_width="fill_parent"
+      android:layout_height="wrap_content"
+      android:text="@string/myMsisdnAlphaTag" />
+</LinearLayout>
+
diff --git a/android/testData/dom/layout/spellchecker_resources.xml b/android/testData/dom/layout/spellchecker_resources.xml
new file mode 100644
index 0000000..19ca68b
--- /dev/null
+++ b/android/testData/dom/layout/spellchecker_resources.xml
@@ -0,0 +1,3 @@
+<resources>
+  <string name="myMsisdnAlphaTag"></string>
+</resources>
\ No newline at end of file
diff --git a/android/testData/dom/manifest/spellchecker1.xml b/android/testData/dom/manifest/spellchecker1.xml
new file mode 100644
index 0000000..b71c1ac
--- /dev/null
+++ b/android/testData/dom/manifest/spellchecker1.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="p1.<TYPO>alola</TYPO>">
+  <uses-permission android:name="android.permission.BRICKP"/>
+  <uses-permission android:name="android.permission.BIND_APPWIDGET"/>
+  <application>
+  </application>
+</manifest>
\ No newline at end of file
diff --git a/android/testData/dom/manifest/spellchecker2.xml b/android/testData/dom/manifest/spellchecker2.xml
new file mode 100644
index 0000000..b2d4ff5
--- /dev/null
+++ b/android/testData/dom/manifest/spellchecker2.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+          package="p1.alola">
+  <application>
+  </application>
+</manifest>
\ No newline at end of file
diff --git a/android/testData/dom/resources/spellchecker1.xml b/android/testData/dom/resources/spellchecker1.xml
new file mode 100644
index 0000000..18287ef
--- /dev/null
+++ b/android/testData/dom/resources/spellchecker1.xml
@@ -0,0 +1,3 @@
+<resources>
+  <string name="hello_<TYPO>worlld</TYPO>">Hello, <TYPO>worlld</TYPO></string>
+</resources>
\ No newline at end of file
diff --git a/android/testData/dom/resources/spellchecker2.xml b/android/testData/dom/resources/spellchecker2.xml
new file mode 100644
index 0000000..ececae8
--- /dev/null
+++ b/android/testData/dom/resources/spellchecker2.xml
@@ -0,0 +1,3 @@
+<resources>
+  <string name="hello_worlld">Hello, world</string>
+</resources>
\ No newline at end of file
diff --git a/android/testData/formatter/xml/attributesArrangement1.xml b/android/testData/formatter/xml/attributesArrangement1.xml
index 64be50a..403b32a 100644
--- a/android/testData/formatter/xml/attributesArrangement1.xml
+++ b/android/testData/formatter/xml/attributesArrangement1.xml
@@ -13,6 +13,8 @@
 
   <TextView
       android:layout_height="wrap_content"
+      android:height="30dp"
       android:text="Hello World, MyActivity"
-      android:layout_width="fill_parent" />
+      android:width="30dp"
+      android:layout_width="fill_parent"/>
 </LinearLayout>
\ No newline at end of file
diff --git a/android/testData/formatter/xml/attributesArrangement1_after.xml b/android/testData/formatter/xml/attributesArrangement1_after.xml
index ba98f41..77c7b6b 100644
--- a/android/testData/formatter/xml/attributesArrangement1_after.xml
+++ b/android/testData/formatter/xml/attributesArrangement1_after.xml
@@ -14,5 +14,7 @@
   <TextView
       android:layout_width="fill_parent"
       android:layout_height="wrap_content"
-      android:text="Hello World, MyActivity" />
+      android:width="30dp"
+      android:height="30dp"
+      android:text="Hello World, MyActivity"/>
 </LinearLayout>
\ No newline at end of file
diff --git a/android/testData/formatter/xml/htmlInsideString.xml b/android/testData/formatter/xml/htmlInsideString.xml
new file mode 100644
index 0000000..16e8fe5
--- /dev/null
+++ b/android/testData/formatter/xml/htmlInsideString.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="contactsSyncPlug"><font fgcolor="#ffffffff">Sync your Google contacts!</font>
+        \nAfter syncing to your phone, <p>your contacts</p> will be <div><font>available</font></div>\n
+        to you wherever you go.</string>
+</resources>
diff --git a/android/testData/formatter/xml/htmlInsideString_after.xml b/android/testData/formatter/xml/htmlInsideString_after.xml
new file mode 100644
index 0000000..16e8fe5
--- /dev/null
+++ b/android/testData/formatter/xml/htmlInsideString_after.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="contactsSyncPlug"><font fgcolor="#ffffffff">Sync your Google contacts!</font>
+        \nAfter syncing to your phone, <p>your contacts</p> will be <div><font>available</font></div>\n
+        to you wherever you go.</string>
+</resources>
diff --git a/android/testData/javaHighlighting/Parcelable.java b/android/testData/javaHighlighting/Parcelable.java
new file mode 100644
index 0000000..ccdae2d
--- /dev/null
+++ b/android/testData/javaHighlighting/Parcelable.java
@@ -0,0 +1,39 @@
+package p1.p2;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+public class <warning>MyParcelable</warning> implements Parcelable {
+  public static final Creator<MyParcelable> CREATOR = new Creator<MyParcelable>() {
+    @Override
+    public MyParcelable createFromParcel(Parcel source) {
+      return new MyParcelable();
+    }
+
+    @Override
+    public MyParcelable[] newArray(int size) {
+      return new MyParcelable[size];
+    }
+  };
+
+  public static final Creator<MyParcelable> <warning>CREATOR1</warning> = new Creator<MyParcelable>() {
+    @Override
+    public MyParcelable createFromParcel(Parcel source) {
+      return new MyParcelable();
+    }
+
+    @Override
+    public MyParcelable[] newArray(int size) {
+      return new MyParcelable[size];
+    }
+  };
+
+  @Override
+  public int describeContents() {
+    return 0;
+  }
+
+  @Override
+  public void writeToParcel(Parcel dest, int flags) {
+  }
+}
\ No newline at end of file
diff --git a/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml b/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml
index d9a902b..e9c7758 100644
--- a/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml
+++ b/android/testData/sdk1.5/platforms/android-1.5/data/res/values/resources.xml
@@ -22,4 +22,5 @@
 
   <string name="cancel">cancel</string>
   <string name="private_str">private</string>
+  <string name="defaultMsisdnAlphaTag"></string>
 </resources>
\ No newline at end of file
diff --git a/android/testSrc/org/jetbrains/android/AndroidJavaHighlightingTest.java b/android/testSrc/org/jetbrains/android/AndroidJavaHighlightingTest.java
index d119c40..c778170 100644
--- a/android/testSrc/org/jetbrains/android/AndroidJavaHighlightingTest.java
+++ b/android/testSrc/org/jetbrains/android/AndroidJavaHighlightingTest.java
@@ -1,5 +1,6 @@
 package org.jetbrains.android;
 
+import com.intellij.codeInspection.deadCode.UnusedDeclarationInspection;
 import com.intellij.codeInspection.unusedSymbol.UnusedSymbolLocalInspection;
 import com.intellij.openapi.vfs.VirtualFile;
 
@@ -20,4 +21,12 @@
     myFixture.configureFromExistingVirtualFile(f);
     myFixture.checkHighlighting(true, false, true);
   }
+
+  public void testParcelable() throws Exception {
+    myFixture.enableInspections(new UnusedDeclarationInspection());
+    myFixture.enableInspections(UnusedSymbolLocalInspection.class);
+    final VirtualFile f = myFixture.copyFileToProject(BASE_PATH + getTestName(false) + ".java", "src/p1/p2/MyParcelable.java");
+    myFixture.configureFromExistingVirtualFile(f);
+    myFixture.checkHighlighting(true, false, true);
+  }
 }
diff --git a/android/testSrc/org/jetbrains/android/AndroidXmlFormatterTest.java b/android/testSrc/org/jetbrains/android/AndroidXmlFormatterTest.java
index 34b57e2..0880e84 100644
--- a/android/testSrc/org/jetbrains/android/AndroidXmlFormatterTest.java
+++ b/android/testSrc/org/jetbrains/android/AndroidXmlFormatterTest.java
@@ -154,6 +154,11 @@
     doTestValues("values4.xml");
   }
 
+  public void testHtmlInsideString() throws Exception {
+    new AndroidXmlPredefinedCodeStyle().apply(mySettings);
+    doTestValues(getTestName(true) + ".xml");
+  }
+
   public void testSelector1() throws Exception {
     new AndroidXmlPredefinedCodeStyle().apply(mySettings);
     doTest("selector1.xml", "res/drawable/selector.xml");
diff --git a/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java b/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java
index 54101a7..ff96e22 100644
--- a/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java
+++ b/android/testSrc/org/jetbrains/android/dom/AndroidDomTest.java
@@ -4,6 +4,7 @@
 import com.intellij.codeInsight.daemon.impl.HighlightInfo;
 import com.intellij.codeInsight.documentation.DocumentationManager;
 import com.intellij.codeInsight.intention.IntentionAction;
+import com.intellij.codeInspection.ex.QuickFixWrapper;
 import com.intellij.lang.documentation.DocumentationProvider;
 import com.intellij.lang.documentation.ExternalDocumentationProvider;
 import com.intellij.openapi.application.ApplicationManager;
@@ -11,6 +12,9 @@
 import com.intellij.openapi.util.TextRange;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiElement;
+import com.intellij.spellchecker.inspections.SpellCheckingInspection;
+import com.intellij.spellchecker.quickfixes.AcceptWordAsCorrect;
+import com.intellij.spellchecker.quickfixes.RenameTo;
 import com.intellij.testFramework.UsefulTestCase;
 import org.jetbrains.android.AndroidTestCase;
 import org.jetbrains.android.inspections.AndroidDomInspection;
@@ -115,6 +119,16 @@
     myFixture.checkResultByFile(testFolder + '/' + fileAfter);
   }
 
+  protected void doTestSpellcheckerQuickFixes() throws IOException {
+    myFixture.enableInspections(SpellCheckingInspection.class);
+    VirtualFile virtualFile = copyFileToProject(getTestName(true) + ".xml");
+    myFixture.configureFromExistingVirtualFile(virtualFile);
+    final List<IntentionAction> fixes = highlightAndFindQuickFixes(null);
+    assertEquals(2, fixes.size());
+    assertInstanceOf(((QuickFixWrapper)fixes.get(0)).getFix(), RenameTo.class);
+    assertInstanceOf(((QuickFixWrapper)fixes.get(1)).getFix(), AcceptWordAsCorrect.class);
+  }
+
   protected abstract String getPathToCopy(String testFileName);
 
   protected VirtualFile copyFileToProject(String path) throws IOException {
@@ -162,7 +176,7 @@
       if (ranges != null) {
         for (Pair<HighlightInfo.IntentionActionDescriptor, TextRange> pair : ranges) {
           final IntentionAction action = pair.getFirst().getAction();
-          if (action.getClass() == aClass) {
+          if (aClass == null || action.getClass() == aClass) {
             actions.add(action);
           }
         }
diff --git a/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java b/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java
index 3b2fa82..33d9c7f 100644
--- a/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java
+++ b/android/testSrc/org/jetbrains/android/dom/AndroidLayoutDomTest.java
@@ -15,6 +15,7 @@
 import com.intellij.openapi.util.TextRange;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.*;
+import com.intellij.spellchecker.inspections.SpellCheckingInspection;
 import com.intellij.testFramework.PlatformTestUtil;
 import com.intellij.testFramework.UsefulTestCase;
 import com.intellij.util.ThrowableRunnable;
@@ -279,7 +280,6 @@
     VirtualFile file = copyFileToProject("tn1.xml");
     myFixture.configureFromExistingVirtualFile(file);
     myFixture.complete(CompletionType.BASIC);
-    myFixture.type('\n');
     myFixture.checkResultByFile(testFolder + '/' + "tn1_after.xml");
   }
 
@@ -350,7 +350,10 @@
   }
 
   public void testTagNameCompletion2() throws Throwable {
-    doTestCompletionVariants("tn2.xml", "EditText", "ExpandableListView", "ExtractEditText");
+    VirtualFile file = copyFileToProject("tn2.xml");
+    myFixture.configureFromExistingVirtualFile(file);
+    myFixture.complete(CompletionType.BASIC);
+    myFixture.assertPreferredCompletionItems(0, "EditText", "ExpandableListView", "ExtractEditText");
   }
 
   public void testTagNameCompletion3() throws Throwable {
@@ -984,6 +987,17 @@
     assertEmpty(fixes);
   }
 
+  public void testSpellchecker() throws Throwable {
+    myFixture.enableInspections(SpellCheckingInspection.class);
+    myFixture.copyFileToProject(testFolder + "/spellchecker_resources.xml", "res/values/sr.xml");
+    doTestHighlighting();
+  }
+
+  public void testSpellcheckerQuickfix() throws Throwable {
+    myFixture.copyFileToProject(testFolder + "/spellchecker_resources.xml", "res/values/sr.xml");
+    doTestSpellcheckerQuickFixes();
+  }
+
   private void doTestAttrReferenceCompletion(String textToType) throws IOException {
     copyFileToProject("attrReferences_attrs.xml", "res/values/attrReferences_attrs.xml");
     VirtualFile file = copyFileToProject(getTestName(true) + ".xml");
diff --git a/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java b/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java
index 8a5353a..a2560ea 100644
--- a/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java
+++ b/android/testSrc/org/jetbrains/android/dom/AndroidManifestDomTest.java
@@ -6,6 +6,7 @@
 import com.intellij.openapi.projectRoots.ProjectJdkTable;
 import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.openapi.roots.ModuleRootManager;
+import com.intellij.spellchecker.inspections.SpellCheckingInspection;
 import org.jetbrains.android.inspections.AndroidElementNotAllowedInspection;
 import org.jetbrains.android.inspections.AndroidUnknownAttributeInspection;
 
@@ -322,6 +323,15 @@
     doTestSdkVersionAttributeValueCompletion();
   }
 
+  public void testSpellchecker1() throws Throwable {
+    myFixture.enableInspections(SpellCheckingInspection.class);
+    doTestHighlighting();
+  }
+  public void testSpellchecker2() throws Throwable {
+    doTestSpellcheckerQuickFixes();
+  }
+
+
   private void doTestSdkVersionAttributeValueCompletion() throws Throwable {
     final ProjectJdkTable projectJdkTable = ProjectJdkTable.getInstance();
     final Sdk sdk = ModuleRootManager.getInstance(myModule).getSdk();
diff --git a/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java b/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java
index 75763f1..61edfc2 100644
--- a/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java
+++ b/android/testSrc/org/jetbrains/android/dom/AndroidValueResourcesTest.java
@@ -36,6 +36,7 @@
 import com.intellij.psi.xml.XmlTag;
 import com.intellij.refactoring.actions.InlineAction;
 import com.intellij.refactoring.util.CommonRefactoringUtil;
+import com.intellij.spellchecker.inspections.SpellCheckingInspection;
 import org.jetbrains.android.dom.wrappers.LazyValueResourceElementWrapper;
 import org.jetbrains.android.inspections.CreateValueResourceQuickFix;
 
@@ -401,6 +402,15 @@
     assertEquals(file, targetElement.getContainingFile().getVirtualFile());
   }
 
+  public void testSpellchecker1() throws Throwable {
+    myFixture.enableInspections(SpellCheckingInspection.class);
+    doTestHighlighting();
+  }
+
+  public void testSpellchecker2() throws Throwable {
+    doTestSpellcheckerQuickFixes();
+  }
+
   private void doCreateValueResourceFromUsage(VirtualFile virtualFile) {
     myFixture.configureFromExistingVirtualFile(virtualFile);
     final List<HighlightInfo> infos = myFixture.doHighlighting();