diff --git a/java/java-tests/java-tests.iml b/java/java-tests/java-tests.iml
index 01e606b..294b5de 100644
--- a/java/java-tests/java-tests.iml
+++ b/java/java-tests/java-tests.iml
@@ -31,6 +31,7 @@
     <orderEntry type="module" module-name="external-system-impl" scope="RUNTIME" />
     <orderEntry type="module" module-name="junit_rt" scope="TEST" />
     <orderEntry type="module" module-name="xml-psi-impl" scope="TEST" />
+    <orderEntry type="module" module-name="properties-psi-api" scope="TEST" />
   </component>
 </module>
 
diff --git a/java/java-tests/testData/codeInsight/completion/smartType/ExpectedReturnType-out.java b/java/java-tests/testData/codeInsight/completion/smartType/ExpectedReturnType-out.java
index c96328d..a99c498 100644
--- a/java/java-tests/testData/codeInsight/completion/smartType/ExpectedReturnType-out.java
+++ b/java/java-tests/testData/codeInsight/completion/smartType/ExpectedReturnType-out.java
@@ -19,7 +19,7 @@
 public class Test {
   public int m() {
     I i = s -> {
-      return s.contains();
+      return s.isEmpty();
     };
     return 0;
   }
diff --git a/java/java-tests/testData/codeInsight/completion/smartType/ExpectedReturnType1-out.java b/java/java-tests/testData/codeInsight/completion/smartType/ExpectedReturnType1-out.java
index 73a03e4..1947277 100644
--- a/java/java-tests/testData/codeInsight/completion/smartType/ExpectedReturnType1-out.java
+++ b/java/java-tests/testData/codeInsight/completion/smartType/ExpectedReturnType1-out.java
@@ -18,7 +18,7 @@
 }
 public class Test {
   public int m() {
-    I i = s -> s.contains();
+    I i = s -> s.isEmpty();
     return 0;
   }
 }
diff --git a/java/java-tests/testData/codeInsight/completion/smartType/FilterAmbiguity.java b/java/java-tests/testData/codeInsight/completion/smartType/FilterAmbiguity.java
new file mode 100644
index 0000000..58eb8c7
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/smartType/FilterAmbiguity.java
@@ -0,0 +1,14 @@
+import java.util.ArrayList;
+import java.util.List;
+
+class A {
+  {
+    List<A> s = new ArrayList<>();
+    s.stream().filter(A::<caret>);
+  }
+
+  public boolean accept(String s) {
+    return true;
+  }
+}
+
diff --git a/java/java-tests/testData/codeInsight/completion/smartType/FilterWrongParamsMethods-out.java b/java/java-tests/testData/codeInsight/completion/smartType/FilterWrongParamsMethods-out.java
new file mode 100644
index 0000000..9f14315
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/smartType/FilterWrongParamsMethods-out.java
@@ -0,0 +1,18 @@
+import java.util.ArrayList;
+import java.util.List;
+
+class A {
+  {
+    List<A> s = new ArrayList<>();
+    s.stream().filter(A::accept);
+  }
+
+  static <K> boolean accept(K k) {
+    return false;
+  }
+
+  public boolean accept1(String s) {
+    return true;
+  }
+}
+
diff --git a/java/java-tests/testData/codeInsight/completion/smartType/FilterWrongParamsMethods.java b/java/java-tests/testData/codeInsight/completion/smartType/FilterWrongParamsMethods.java
new file mode 100644
index 0000000..25af850
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/smartType/FilterWrongParamsMethods.java
@@ -0,0 +1,18 @@
+import java.util.ArrayList;
+import java.util.List;
+
+class A {
+  {
+    List<A> s = new ArrayList<>();
+    s.stream().filter(A::<caret>);
+  }
+
+  static <K> boolean accept(K k) {
+    return false;
+  }
+
+  public boolean accept1(String s) {
+    return true;
+  }
+}
+
diff --git a/java/java-tests/testData/codeInsight/completion/smartType/FilteredStaticMethods-out.java b/java/java-tests/testData/codeInsight/completion/smartType/FilteredStaticMethods-out.java
new file mode 100644
index 0000000..c714230
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/smartType/FilteredStaticMethods-out.java
@@ -0,0 +1,14 @@
+import java.util.ArrayList;
+import java.util.List;
+
+class A {
+  {
+    List<A> s = new ArrayList<>();
+    s.stream().filter(A::accept);
+  }
+
+  public boolean accept() {
+    return true;
+  }
+}
+
diff --git a/java/java-tests/testData/codeInsight/completion/smartType/FilteredStaticMethods.java b/java/java-tests/testData/codeInsight/completion/smartType/FilteredStaticMethods.java
new file mode 100644
index 0000000..3f9a20a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/completion/smartType/FilteredStaticMethods.java
@@ -0,0 +1,14 @@
+import java.util.ArrayList;
+import java.util.List;
+
+class A {
+  {
+    List<A> s = new ArrayList<>();
+    s.stream().filter(A::<caret>);
+  }
+
+  public boolean accept() {
+    return true;
+  }
+}
+
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/AgentPremain.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/AgentPremain.java
new file mode 100644
index 0000000..2fe9b41
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/AgentPremain.java
@@ -0,0 +1,11 @@
+package java.lang.instrument;
+
+class Instrumentation {} 
+
+class Foo {
+
+  public void agentmain(String args, Instrumentation i) {
+    System.out.println(args);
+    System.out.println(i);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/IDEA79251.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/IDEA79251.java
new file mode 100644
index 0000000..b26587f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/IDEA79251.java
@@ -0,0 +1,10 @@
+class Main {
+  public static class InnerClass {
+    private String field;
+  }
+  public static class InnerSubClass extends InnerClass {
+    public String getParentField() {
+      return this.<error descr="'field' has private access in 'Main.InnerClass'">field</error>;
+    }
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnsupportedFeatures7.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnsupportedFeatures7.java
index d0d4dbc..ac3eb04 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnsupportedFeatures7.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting6/UnsupportedFeatures7.java
@@ -45,5 +45,6 @@
 
   interface I {
     <error descr="Extension methods are not supported at this language level">default void m() { }</error>
+    <error descr="Extension methods are not supported at this language level">static void m() { }</error>
   }
 }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/Externalizable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/Externalizable.java
new file mode 100644
index 0000000..3f81f49
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/Externalizable.java
@@ -0,0 +1,36 @@
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+
+class SerializationProxy implements Externalizable
+{
+  private static final long serialVersionUID = 1L;
+
+  private Object object;
+
+  public SerializationProxy()
+  {
+    // Empty constructor for Externalizable class
+  }
+
+  private <warning descr="Private constructor 'SerializationProxy(java.lang.Object)' is never used">SerializationProxy</warning>(Object object)
+  {
+    this.object = object;
+  }
+
+  public void writeExternal(ObjectOutput out) throws IOException
+  {
+    out.writeObject(this.object);
+  }
+
+  public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
+  {
+    this.object = in.readObject();
+  }
+
+  protected Object readResolve()
+  {
+    return this.object;
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IDEA122519EnclosingInstance.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IDEA122519EnclosingInstance.java
new file mode 100644
index 0000000..3de0841
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/IDEA122519EnclosingInstance.java
@@ -0,0 +1,20 @@
+class ClassA {
+  public abstract class InnerAbstractA {
+  }
+}
+
+class ClassC {
+  static ClassA classA = new ClassA();
+
+  public static ClassA getClassA() {
+    return classA;
+  }
+}
+
+class ClassB {
+  public static class InnerClassA extends ClassA.InnerAbstractA {
+    public InnerClassA() {
+      ClassC.getClassA().super();
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousInheritance/pck/AmbiguousMethodCall.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousInheritance/pck/AmbiguousMethodCall.java
index 580a30a..5eab22e 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousInheritance/pck/AmbiguousMethodCall.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting7/ambiguousInheritance/pck/AmbiguousMethodCall.java
@@ -7,7 +7,7 @@
 
 interface B<T> extends A<T[]> { }
 
-class C<T extends A<Object[]> & B<?>>
+class C<T extends A<Object[]> & B<Object>>
 {
     void foo(T x)
     {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA120563.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA120563.java
new file mode 100644
index 0000000..fb60ea5
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA120563.java
@@ -0,0 +1,33 @@
+
+import java.util.Set;
+
+public class WrongGenerics {
+
+  @SuppressWarnings("unchecked")
+  <T> Set<Foo<? extends T>> foo(Set<Foo<?>> foo) {
+    return <error descr="Inconvertible types; cannot cast 'java.util.Set<Foo<?>>' to 'java.util.Set<Foo<? extends T>>'">(Set<Foo<?  extends T>>)foo</error>;
+  }
+
+  @SuppressWarnings("unchecked")
+  <T> Set<Foo<? extends T>> bar(Set<Foo<? extends T>> foo) {
+    return <error descr="Inconvertible types; cannot cast 'java.util.Set<Foo<? extends T>>' to 'java.util.Set<Foo<?>>'">(Set<Foo<?>>) foo</error>;
+  }
+
+  @SuppressWarnings("unchecked")
+  <T> Foo<? extends T> bothSucceed(Foo<?> foo) {
+    return (Foo<? extends  T>) foo;
+  }
+
+  @SuppressWarnings("unchecked")
+  <T> Foo<Foo<? extends T>> bothFail(Foo<Foo<?>> foo) {
+    return <error descr="Inconvertible types; cannot cast 'Foo<Foo<?>>' to 'Foo<Foo<? extends T>>'">(Foo<Foo<? extends T>>) foo</error>;
+  }
+
+  @SuppressWarnings("unchecked")
+  <T> Set<Foo<? extends T>> onlyIntelliJSucceeds(Set<Foo<?>> foo) {
+    return <error descr="Inconvertible types; cannot cast 'java.util.Set<Foo<?>>' to 'java.util.Set<Foo<? extends T>>'">(Set<Foo<? extends T>>) foo</error>;
+  }
+}
+
+class Foo<T> {
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA121400.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA121400.java
new file mode 100644
index 0000000..bab56b8
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA121400.java
@@ -0,0 +1,13 @@
+import java.util.*;
+
+class Test<K,V> {
+  private final Map<? extends K, ? extends V> m = null;
+
+  {
+    f(m.entrySet());
+  }
+
+  private static <A, B> void f(Set<? extends Map.Entry<? extends A, ? extends B>> s) {}
+
+}
+
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123316.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123316.java
new file mode 100644
index 0000000..101c8f3
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123316.java
@@ -0,0 +1,24 @@
+class Temp {
+
+  interface Future<F> {}
+
+  class Message {
+  }
+
+  interface Client<C extends Client, M> {
+    <T> Future<T> request(M request);
+  }
+
+  interface MessageClient extends Client<MessageClient, Message> {
+    Future<Message> request(Message request);
+  }
+
+  abstract class AbstractClient implements MessageClient {
+  }
+
+  class ConcreteClient extends AbstractClient {
+    public Future<Message> request(Message request) {
+      return null;
+    }
+  }
+} 
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123338.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123338.java
new file mode 100644
index 0000000..fdef475
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123338.java
@@ -0,0 +1,12 @@
+class Aaa<Ta> {
+  class Inner {}
+  void doSmth(final Inner inner) {}
+}
+
+class Bbb<T> extends Aaa<T> {
+  class SubInner extends Aaa<T>.Inner {}
+  void doSmth(final SubInner inner) {}
+  void ambiguousCall() {
+    doSmth (new SubInner());
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123352.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123352.java
new file mode 100644
index 0000000..1c49b58
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123352.java
@@ -0,0 +1,17 @@
+import java.util.*;
+
+class Test {
+  class Predicate<T> {
+    <S extends T> boolean test(final Collection<T> src) {
+      return true;
+    }
+    <S extends T> boolean test(final Iterable<T> iterable) {
+      return false;
+    }
+  }
+
+  public void testPredicate() {
+    final Predicate<Integer> predicate = new Predicate<>();
+    predicate.test(new ArrayList<Integer>());
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123518.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123518.java
new file mode 100644
index 0000000..0440475
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA123518.java
@@ -0,0 +1,21 @@
+import java.util.*;
+
+class sTest {
+
+  public void shouldCallListConstructor(){
+    List<String>stringList=new ArrayList<String>();
+    ClassUnderTest<Date> cut=new ClassUnderTest<>(stringList);
+  }
+
+  private class ClassUnderTest<T extends Date> {
+
+    public String constructorString;
+    private ClassUnderTest(List<T>stringList) {
+      constructorString="Using List Constructor";
+    }
+
+    private ClassUnderTest(Iterable<String> iterables) {
+      constructorString="Using Iterables Constructor";
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57311.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57311.java
index 9ed409c..2be9a4f 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57311.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57311.java
@@ -4,7 +4,7 @@
     }
 
     void bar(A<?> x){
-        baz<error descr="'baz(A<A<? extends S>>)' in 'A' cannot be applied to '(A<A<capture<?>>>)'">(x.foo())</error>;
+        baz<error descr="'baz(A<A<?>>)' in 'A' cannot be applied to '(A<A<capture<?>>>)'">(x.foo())</error>;
     }
 
     <S> void baz(A<A<? extends S>> x){}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57439.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57439.java
index 544d6c1..2ca8dee 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57439.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA57439.java
@@ -17,14 +17,14 @@
         foo2(sb);
         foo2(s);
     
-        foo3<error descr="'foo3(A<A<? extends T>>)' in 'B' cannot be applied to '(B<capture<?>>)'">(b)</error>;
-        foo3<error descr="'foo3(A<A<? extends T>>)' in 'B' cannot be applied to '(B<capture<? extends java.lang.String>>)'">(eb)</error>;
-        foo3<error descr="'foo3(A<A<? extends T>>)' in 'B' cannot be applied to '(B<capture<? super java.lang.String>>)'">(sb)</error>;
+        foo3<error descr="'foo3(A<A<?>>)' in 'B' cannot be applied to '(B<capture<?>>)'">(b)</error>;
+        foo3<error descr="'foo3(A<A<? extends java.lang.String>>)' in 'B' cannot be applied to '(B<capture<? extends java.lang.String>>)'">(eb)</error>;
+        foo3<error descr="'foo3(A<A<?>>)' in 'B' cannot be applied to '(B<capture<? super java.lang.String>>)'">(sb)</error>;
         foo3<error descr="'foo3(A<A<? extends java.lang.String>>)' in 'B' cannot be applied to '(B<java.lang.String>)'">(s)</error>;
 
-        foo4<error descr="'foo4(A<A<? super T>>)' in 'B' cannot be applied to '(B<capture<?>>)'">(b)</error>;
-        foo4<error descr="'foo4(A<A<? super T>>)' in 'B' cannot be applied to '(B<capture<? extends java.lang.String>>)'">(eb)</error>;
-        foo4<error descr="'foo4(A<A<? super T>>)' in 'B' cannot be applied to '(B<capture<? super java.lang.String>>)'">(sb)</error>;
+        foo4<error descr="'foo4(A<A<? super java.lang.Object>>)' in 'B' cannot be applied to '(B<capture<?>>)'">(b)</error>;
+        foo4<error descr="'foo4(A<A<? super java.lang.Object>>)' in 'B' cannot be applied to '(B<capture<? extends java.lang.String>>)'">(eb)</error>;
+        foo4<error descr="'foo4(A<A<? super java.lang.String>>)' in 'B' cannot be applied to '(B<capture<? super java.lang.String>>)'">(sb)</error>;
         foo4<error descr="'foo4(A<A<? super java.lang.String>>)' in 'B' cannot be applied to '(B<java.lang.String>)'">(s)</error>;
 
         foo5(b);
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA64103.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA64103.java
new file mode 100644
index 0000000..fd85609
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA64103.java
@@ -0,0 +1,37 @@
+import java.util.*;
+
+class Test {
+
+  public static <R, E, RC extends Collection<R>, C extends Collection<E>> RC collectionGenericTest(C collection, Lambda<R, E> lambda) {
+    return (RC) new Vector<R>();
+  }
+
+  public static <R, E, RC extends List<R>, C extends List<E>> RC listGenericTest(C list, Lambda<R, E> lambda) {
+    return (RC) new Vector<R>();
+  }
+
+  public static void testGeneric() {
+    Collection<String> testCollection = collectionGenericTest(new Vector<Integer>(), new Lambda<String, Integer>() {
+      @Override
+      public String lambda(Integer l) {
+        return null;
+      }
+    });
+
+    List<String> testList = listGenericTest(new Vector<Integer>(), new Lambda<String, Integer>() {
+      @Override
+      public String lambda(Integer l) {
+        return null;
+      }
+    });
+  }
+
+  private interface Lambda<R, A> {
+    public R lambda(A l);
+  }
+
+  <error descr="Class 'Vector' must either be declared abstract or implement abstract method 'get(int)' in 'AbstractList'">private static class Vector<A> extends AbstractList<A> implements List<A></error> {
+    public Vector() {
+    }
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritedWithDifferentArgsInTypeParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritedWithDifferentArgsInTypeParams.java
index 2adff2f..180b755 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritedWithDifferentArgsInTypeParams.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritedWithDifferentArgsInTypeParams.java
@@ -18,7 +18,7 @@
 interface IB2<T> extends IA2<T[]> {}
 
 class A2 {
-    <T extends IA2<Object[]> & IB2<?>> void foo(){}
+    <T extends IA2<Object[]> & IB2<Object>> void foo(){}
 }
 
 
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritedWithDifferentArgsInTypeParams1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritedWithDifferentArgsInTypeParams1.java
new file mode 100644
index 0000000..f7fda29
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/InheritedWithDifferentArgsInTypeParams1.java
@@ -0,0 +1,10 @@
+import java.util.List;
+
+interface Base<T> {
+}
+
+interface Middle<T> extends Base<List<? super T>> {
+}
+
+<error descr="'Base' cannot be inherited with different type arguments: 'java.util.List<? super T>' and 'java.util.List<T>'">interface Child<T> extends Middle<T>, Base<List<T>></error> {
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/CaptureInsideNestedCalls.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/CaptureInsideNestedCalls.java
new file mode 100644
index 0000000..38b6998
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/CaptureInsideNestedCalls.java
@@ -0,0 +1,15 @@
+import java.util.Iterator;
+
+class Test<K, V> {
+
+  private final Iterator<? extends Foo<? extends K, ? extends V>> i = null;
+
+  public Foo<K, V> next() {
+    return new Bar<>(i.next());
+  }
+
+  interface Foo<T, K> {}
+  private static class Bar<K, V> implements Foo<K, V> {
+    Bar(Foo<? extends K, ? extends V> e) {}
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Erasure.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Erasure.java
new file mode 100644
index 0000000..0d38ade
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Erasure.java
@@ -0,0 +1,9 @@
+import java.util.Collection;
+
+abstract class NCollections {
+  public <T> void foo(Collection<? extends T> coll) {
+    bar((Collection)coll);
+  }
+
+  public abstract <T2 extends Object & Comparable<? super T2>> T2 bar(Collection<? extends T2> coll);
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA122401.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA122401.java
new file mode 100644
index 0000000..95b8efc
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/IDEA122401.java
@@ -0,0 +1,26 @@
+import java.util.Comparator;
+
+class NullComparator<T> {
+  private final Comparator<T> real = null;
+  private Comparator<? super T> other;
+  private Comparator<T> another;
+
+  NullComparator(Comparator<? super T> real) {
+  }
+
+  public NullComparator<T> thenComparing() {
+    return new NullComparator<>(real == null ? other : another);
+  }
+
+  Comparator<T> a() {
+    return null;
+  }
+
+  Comparator<? super T> b() {
+    return null;
+  }
+
+  public NullComparator<T> thenComparing1() {
+    return new NullComparator<>(real == null ? a() : b());
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/InheritedWithDifferentArgsInTypeParams.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/InheritedWithDifferentArgsInTypeParams.java
index 2adff2f..a1c0d83 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/InheritedWithDifferentArgsInTypeParams.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/InheritedWithDifferentArgsInTypeParams.java
@@ -18,7 +18,7 @@
 interface IB2<T> extends IA2<T[]> {}
 
 class A2 {
-    <T extends IA2<Object[]> & IB2<?>> void foo(){}
+    <<error descr="'IA2' cannot be inherited with different type arguments: 'java.lang.Object[]' and 'capture<?>[]'"></error>T extends IA2<Object[]> & IB2<?>> void foo(){}
 }
 
 
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SOEInLeastUpperClass.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SOEInLeastUpperClass.java
index 70ad266..20d377a 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SOEInLeastUpperClass.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SOEInLeastUpperClass.java
@@ -7,6 +7,6 @@
     }
 
     void bar (boolean a, A a1, B b1){
-        <error descr="Incompatible types. Found: 'java.lang.Object', required: 'T'">T t = a ? a1 : b1;</error>
+        T t = a ? <error descr="Incompatible types. Found: 'A', required: 'T'">a1</error> : <error descr="Incompatible types. Found: 'B', required: 'T'">b1</error>;
     }
 }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SuperWildcardWithBoundPromotion.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SuperWildcardWithBoundPromotion.java
similarity index 76%
rename from java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SuperWildcardWithBoundPromotion.java
rename to java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SuperWildcardWithBoundPromotion.java
index cfdc2a5..f1a5330 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/SuperWildcardWithBoundPromotion.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/SuperWildcardWithBoundPromotion.java
@@ -20,7 +20,7 @@
   }
 
   void bug1(Parametrized<? super T> param) {
-    foo(param);
+    <error descr="Inferred type 'capture<? super T>' for type parameter 'I' is not within its bound; should extend 'java.lang.Number'">foo(param)</error>;
   }
 
 
@@ -47,7 +47,7 @@
     }
 
     void bug1(Parametrized<? super T> param) {
-      <error descr="Inferred type 'java.io.Serializable' for type parameter 'I' is not within its bound; should extend 'java.lang.Number'">foo(param)</error>;
+      <error descr="Inferred type 'capture<? super T>' for type parameter 'I' is not within its bound; should extend 'java.lang.Number'">foo(param)</error>;
     }
 
 
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Variance.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Variance.java
index 298a33d..7556292 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Variance.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/Variance.java
@@ -142,7 +142,7 @@
     }
 
     void bar(List<? extends S1> k) {
-        f<error descr="'f(java.util.List<capture<? extends S1>>, capture<? extends S1>)' in 'S1' cannot be applied to '(java.util.List<capture<? extends S1>>, capture<? extends S1>)'">(k,  k.get(0))</error>;
+        f<error descr="'f(java.util.List<capture<? extends S1>>, capture<? extends S1>)' in 'S1' cannot be applied to '(java.util.List<capture<? extends S1>>, S1)'">(k,  k.get(0))</error>;
     }
 }
 
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardBoundsCombination.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardBoundsCombination.java
new file mode 100644
index 0000000..d621979
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardBoundsCombination.java
@@ -0,0 +1,16 @@
+import java.util.*;
+import java.util.function.Consumer;
+
+class NachCollections<K,V> {
+  <K1, V1> Consumer<Map.Entry<K1, V1>> consumer(Consumer<Map.Entry<K1, V1>> c) {
+    return null;
+  }
+
+  public void forEach(Collection<? extends Map.Entry<K,V>> c1,
+                      Collection<? super Map.Entry<K,V>> c2,
+                      Consumer<Map.Entry<K, V>> a) {
+    c1.forEach(consumer(a));
+    c2.forEach(consumer<error descr="'consumer(java.util.function.Consumer<java.util.Map.Entry<K1,V1>>)' in 'NachCollections' cannot be applied to '(java.util.function.Consumer<java.util.Map.Entry<K,V>>)'">(a)</error>);
+  }
+}
+
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardsBoundsIntersection.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardsBoundsIntersection.java
index cf8ad1c..6385fe5 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardsBoundsIntersection.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting8/WildcardsBoundsIntersection.java
@@ -10,6 +10,6 @@
 
 class Main {
     public static void main(NodeProperty<NumberExpression, Integer> nval,  Node<? extends NodeType> expr) {
-        int val = expr.get<error descr="'get(NodeProperty<? super capture<? extends NodeType>,java.lang.Object>)' in 'Node' cannot be applied to '(NodeProperty<NumberExpression,java.lang.Integer>)'">(nval)</error>;
+        int val = expr.get<error descr="'get(NodeProperty<? super capture<? extends NodeType>,java.lang.Integer>)' in 'Node' cannot be applied to '(NodeProperty<NumberExpression,java.lang.Integer>)'">(nval)</error>;
     }
 }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched.java
new file mode 100644
index 0000000..3edf10d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched.java
@@ -0,0 +1,12 @@
+interface SAM {
+  default void <caret>foo(){}
+  void bar();
+}
+
+class Test {
+  {
+    bar(() -> {});
+  }
+  
+  void bar(SAM sam){}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched_after.java
new file mode 100644
index 0000000..b833d50
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/DefaultMethodTouched_after.java
@@ -0,0 +1,12 @@
+interface SAM {
+  default void foo(boolean b){}
+  void bar();
+}
+
+class Test {
+  {
+    bar(() -> {});
+  }
+  
+  void bar(SAM sam){}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/MethodArgument.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/MethodArgument.java
new file mode 100644
index 0000000..2a28ea7
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/MethodArgument.java
@@ -0,0 +1,11 @@
+interface SAM {
+  void <caret>foo();
+}
+
+class Test {
+  {
+    bar(() -> {});
+  }
+  
+  void bar(SAM sam){}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/VariableDeclaration.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/VariableDeclaration.java
new file mode 100644
index 0000000..b28339f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/VariableDeclaration.java
@@ -0,0 +1,9 @@
+interface SAM {
+  void <caret>foo();
+}
+
+class Test {
+  {
+    SAM sam = () -> {};
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/FieldFromAnonymousClassScope.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/FieldFromAnonymousClassScope.java
new file mode 100644
index 0000000..db563c0
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/FieldFromAnonymousClassScope.java
@@ -0,0 +1,21 @@
+import java.util.Collection;
+import java.util.Map;
+
+class Test{
+
+  public static void main(String[] args) {
+    Map<String, Collection<Integer>> myMap = null;
+
+    myMap.entrySet().stream()
+      .flatMap(entry -> entry.getValue().stream()
+        .map(val -> new Object() {
+          String key = entry.getKey();
+          Integer va<caret>lue = val;
+        }))
+      .forEachOrdered(o -> {
+        final String key = o.key;
+        final Integer value = o.value;
+        System.out.println("key: " + key + " value: " + value);
+      });
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/MethodArgument.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/MethodArgument.java
new file mode 100644
index 0000000..2fe6964
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/findUsages/MethodArgument.java
@@ -0,0 +1,11 @@
+interface SA<caret>M {
+  void foo();
+}
+
+class Test {
+  {
+    bar(() -> {});
+  }
+
+  void bar(SAM sam){}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/AmbiguitySpecificReturn.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/AmbiguitySpecificReturn.java
index 5ecd4f5..5b9d5d7 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/AmbiguitySpecificReturn.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/AmbiguitySpecificReturn.java
@@ -1,8 +1,8 @@
 class IntStream {
   private void foo(IntStream s) {
-    s.map(i -> <error descr="Operator '<<' cannot be applied to 'int', '<lambda parameter>'">1 << i</error>);
+    s.map<error descr="Ambiguous method call: both 'IntStream.map(IntUnaryOperator)' and 'IntStream.map(ObjIntFunction<Integer>)' match">(i -> 1 << i)</error>;
     s.map<error descr="Ambiguous method call: both 'IntStream.map(IntUnaryOperator)' and 'IntStream.map(ObjIntFunction<Integer>)' match">(i -> 1)</error>;
-    s.map<error descr="Ambiguous method call: both 'IntStream.map(IntUnaryOperator)' and 'IntStream.map(ObjIntFunction<T>)' match">(i -> i)</error>;
+    s.map<error descr="Ambiguous method call: both 'IntStream.map(IntUnaryOperator)' and 'IntStream.map(ObjIntFunction<Integer>)' match">(i -> i)</error>;
   }
 
   public static void main(String[] args) {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/IDEA123308.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/IDEA123308.java
new file mode 100644
index 0000000..b650fd9
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/IDEA123308.java
@@ -0,0 +1,14 @@
+class Test {
+  private final int a;
+
+  public Test() {
+    a = 1;
+    run(() -> {
+      <error descr="Cannot assign a value to final variable 'a'">a</error> = 2;
+    });
+  }
+
+  public void run(Runnable r) {
+    r.run();
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ReturnTypeCompatibility.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ReturnTypeCompatibility.java
index 0f7aa70..10cd3ff 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ReturnTypeCompatibility.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/ReturnTypeCompatibility.java
@@ -25,7 +25,7 @@
     }
 
     public static void main(String[] args) {
-        call<error descr="Ambiguous method call: both 'ReturnTypeIncompatibility.call(I1<P>)' and 'ReturnTypeIncompatibility.call(I2<P>)' match">(i-> {return i;})</error>;
+        call<error descr="Ambiguous method call: both 'ReturnTypeIncompatibility.call(I1<Integer>)' and 'ReturnTypeIncompatibility.call(I2<P>)' match">(i-> {return i;})</error>;
     }
 }
 
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/TypeArgsConsistency.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/TypeArgsConsistency.java
index 0c79d84..911f35c 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/TypeArgsConsistency.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/highlighting/TypeArgsConsistency.java
@@ -12,7 +12,7 @@
       I<Integer> i1 = (i, j) -> i + j;
       foo((i, j) -> i + j);
       I<Integer> i2 = bar((i, j) -> i + j);
-      I<Integer> i3 = bar(<error descr="Cyclic inference">(i, j) -> "" + i + j</error>);
+      I<Integer> i3 = bar(<error descr="Incompatible return type String in lambda expression">(i, j) -> "" + i + j</error>);
     }
 }
 
@@ -43,7 +43,7 @@
         I<Integer> i1 = bar(x -> x);
         I1<Integer> i2 = bar1(x -> 1);
         I2<String> aI2 = bar2(x -> "");
-        I2<Integer> aI28 = bar2( <error descr="Cyclic inference">x-> ""</error>);
+        I2<Integer> aI28 = bar2( <error descr="Incompatible return type String in lambda expression">x-> ""</error>);
         I2<Integer> i3 = bar2(x -> x);
         I2<Integer> i4 = bar2(x -> foooI());
         System.out.println(i4.foo(2));
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/IDEA120498.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/IDEA120498.java
new file mode 100644
index 0000000..8316f9e
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/IDEA120498.java
@@ -0,0 +1,11 @@
+
+interface X<T> { void m(T arg); }
+interface Y<T> { void m(T arg); }
+interface Z<T> extends X<T>, Y<T> {}
+
+class App {
+  public static void main(String[] args) {
+    Z<String> z = (String s) -> System.out.println(s);
+    z.m("Hello, world");
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/IDEA122720.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/IDEA122720.java
new file mode 100644
index 0000000..84fcdcd
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/IDEA122720.java
@@ -0,0 +1,21 @@
+interface I {
+  default void f() {}
+}
+
+class P {
+  public void f() {}
+}
+
+class AP extends P implements I {
+  @Override
+  public void f() {
+    I.super.f();
+  }
+}
+
+class AC implements Cloneable {
+
+  public Object clone() throws CloneNotSupportedException {
+    return Cloneable.super.<error descr="'clone()' has protected access in 'java.lang.Object'">clone</error>();
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/IDEA123839.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/IDEA123839.java
new file mode 100644
index 0000000..d79effb
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/IDEA123839.java
@@ -0,0 +1,13 @@
+import java.util.Iterator;
+
+interface A4 {
+  default Iterator iterator() {
+    return null;
+  }
+}
+
+interface A5 {
+  Iterator  iterator();
+}
+
+abstract class <error descr="B inherits unrelated defaults for iterator() from types A5 and A4">B</error> implements A5, A4 {}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/NotInheritFromUnrelatedDefault.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/NotInheritFromUnrelatedDefault.java
index 79f310b..9cea478 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/NotInheritFromUnrelatedDefault.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/NotInheritFromUnrelatedDefault.java
@@ -12,7 +12,7 @@
 
 class <error descr="Class 'SecondParent' must either be declared abstract or implement abstract method 'doSomething()' in 'SecondParent'">FirstSon</error> implements FirstParent, SecondParent {}
 
-<error descr="Class 'SecondSon' must either be declared abstract or implement abstract method 'doSomething()' in 'SecondParent'">class SecondSon implements SecondParent, FirstParent</error> {}
+<error descr="Class 'SecondSon' must either be declared abstract or implement abstract method 'doSomething()' in 'SecondParent'">class <error descr="SecondSon inherits unrelated defaults for doSomething() from types SecondParent and FirstParent">SecondSon</error> implements SecondParent, FirstParent</error> {}
 
 interface A {
   default int foo() {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/SuperProtectedCalls.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/SuperProtectedCalls.java
new file mode 100644
index 0000000..feaf0d4
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/SuperProtectedCalls.java
@@ -0,0 +1,9 @@
+package p2;
+
+import p.*;
+
+class Test extends Foo {
+  {
+    Test.super.foo();
+  }
+} 
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java
index bc235b2..cb76d74 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/AccessModifiers.java
@@ -25,9 +25,9 @@
     }
 
     static {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'AlienTest.IInt'">IInt i1 = MyTest::abracadabra;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'AlienTest.IInt'">IInt i2 = MyTest::foo;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'AlienTest.IInt'">IInt i3 = MyTest::bar;</error>
+        IInt i1 = MyTest::<error descr="Cannot resolve method 'abracadabra'">abracadabra</error>;
+        IInt i2 = MyTest::<error descr="Cannot resolve method 'foo'">foo</error>;
+        IInt i3 = MyTest::<error descr="Cannot resolve method 'bar'">bar</error>;
         <error descr="Incompatible types. Found: '<method reference>', required: 'AlienTest.IIntInt'">IIntInt i4 = MyTest::bar;</error>
         IInt i5 = <error descr="Non-static method cannot be referenced from a static context">MyTest::baz</error>;
         IInt i6 = <error descr="'foo(int)' is not public in 'MyTest.Foo'. Cannot be accessed from outside package">MyTest.foo::foo</error>;
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Ambiguity.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Ambiguity.java
index c7f2194..475ae43 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Ambiguity.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Ambiguity.java
@@ -54,7 +54,7 @@
     }
 
     {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'todelete.MyTest1.Bar1'">Bar1 b1 = MyTest2 :: foo;</error>
+        Bar1 b1 = MyTest2 :: <error descr="Cannot resolve method 'foo'">foo</error>;
         bar(MyTest1 :: foo);
     }
 }
@@ -80,7 +80,7 @@
     }*/
 
     {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'todelete.MyTest2.Bar1'">Bar1 b1 = MyTest2 :: foo;</error>
+        Bar1 b1 = MyTest2 :: <error descr="Cannot resolve method 'foo'">foo</error>;
         bar(MyTest2 :: foo);
     }
 }
@@ -106,8 +106,8 @@
     }
 
     {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'todelete.MyTest3.Bar1'">Bar1 b1 = MyTest2 :: foo;</error>
-        bar<error descr="'bar(todelete.MyTest3.Bar2)' in 'todelete.MyTest3' cannot be applied to '(<method reference>)'">(MyTest3 :: foo)</error>;
+        Bar1 b1 = MyTest2 :: <error descr="Cannot resolve method 'foo'">foo</error>;
+        bar(MyTest3 :: <error descr="Cannot resolve method 'foo'">foo</error>);
     }
 }
 
@@ -129,7 +129,7 @@
     }
 
     {
-         bar<error descr="'bar(todelete.MyTest4.Bar1)' in 'todelete.MyTest4' cannot be applied to '(<method reference>)'">(MyTest4:: foo)</error>;
+         bar(MyTest4:: <error descr="Cannot resolve method 'foo'">foo</error>);
     }
 }
 
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Assignability.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Assignability.java
index 6b8d1fb..a5dbcd0 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Assignability.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Assignability.java
@@ -1,8 +1,8 @@
 class Test {
   {
-      <error descr="Incompatible types. Found: '<method reference>', required: 'java.lang.Runnable'">Runnable b = Test :: length;</error>
+      Runnable b = Test :: <error descr="Cannot resolve method 'length'">length</error>;
       Comparable<String> c = Test :: length;
-      <error descr="Incompatible types. Found: '<method reference>', required: 'java.lang.Comparable<java.lang.Integer>'">Comparable<Integer> c1 =  Test :: length;</error>
+      Comparable<Integer> c1 =  Test :: <error descr="Cannot resolve method 'length'">length</error>;
   }
 
   public static Integer length(String s) {
@@ -16,7 +16,7 @@
 
 class Test1 {
     {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'java.lang.Runnable'">Runnable b = Test1 :: length;</error>
+        Runnable b = Test1 :: <error descr="Cannot resolve method 'length'">length</error>;
         Comparable<String> c = Test1 :: length;
         Comparable<Integer> c1 =  Test1 :: length;
     }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefInnerFromSuper.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefInnerFromSuper.java
index 7c3bff9..145823f 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefInnerFromSuper.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefInnerFromSuper.java
@@ -13,7 +13,7 @@
         }
 
         void test() {
-            <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.Child.I'">I var = Child.Inner::new;</error>
+            I var = Child.Inner::<error descr="Cannot resolve constructor 'Inner'">new</error>;
         }
     }
 }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefs.java
index c9cb53a..1b0893c 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefs.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefs.java
@@ -70,8 +70,8 @@
     static void test(I<Integer> s) {   }
 
     public static void main(String[] args) {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest3.I<java.lang.Integer>'">I<Integer> s = MyTest3<String>::new;</error>
-        test<error descr="'test(MyTest3.I<java.lang.Integer>)' in 'MyTest3' cannot be applied to '(<method reference>)'">(MyTest3<String>::new)</error>;
+        I<Integer> s = MyTest3<String>::<error descr="Cannot resolve constructor 'MyTest3'">new</error>;
+        test(MyTest3<String>::<error descr="Cannot resolve constructor 'MyTest3'">new</error>);
     }
 }
 
@@ -99,6 +99,6 @@
     interface I {
       A foo();
     }
-    <error descr="Incompatible types. Found: '<method reference>', required: 'MyTestInvalidQ.A.I'">I i = A :: new;</error>
+    I i = <error descr="'A' is abstract; cannot be instantiated">A :: new</error>;
   }
 }
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefsInnerClasses.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefsInnerClasses.java
index 99337ff..887a776 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefsInnerClasses.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ConstructorRefsInnerClasses.java
@@ -88,11 +88,11 @@
 
 
   static {
-     <error descr="Incompatible types. Found: '<method reference>', required: 'StaticInner2.I1'">I1 i1 = StaticInner2.Inner :: new;</error>
+     I1 i1 = StaticInner2.Inner :: <error descr="Cannot resolve constructor 'Inner'">new</error>;
   }
 
   {
-     <error descr="Incompatible types. Found: '<method reference>', required: 'StaticInner2.I1'">I1 i1 = StaticInner2.Inner :: new;</error>
+     I1 i1 = StaticInner2.Inner :: <error descr="Cannot resolve constructor 'Inner'">new</error>;
   }
 }
 
@@ -109,11 +109,11 @@
 
 
   static {
-     <error descr="Incompatible types. Found: '<method reference>', required: 'NonStaticInner2.I1'">I1 i1 = NonStaticInner2.Inner :: new;</error>
+     I1 i1 = NonStaticInner2.Inner :: <error descr="Cannot resolve constructor 'Inner'">new</error>;
   }
 
   {
-     <error descr="Incompatible types. Found: '<method reference>', required: 'NonStaticInner2.I1'">I1 i1 = NonStaticInner2.Inner :: new;</error>
+     I1 i1 = NonStaticInner2.Inner :: <error descr="Cannot resolve constructor 'Inner'">new</error>;
   }
 }
 
@@ -145,7 +145,7 @@
     }
 
     {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'NonStaticInner3.I3<NonStaticInner3.Foo>'">I3<Foo> b1 = Foo::new;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'NonStaticInner3.I4<NonStaticInner3.Foo>'">I4<Foo> b2 = Foo::new;</error>
+        I3<Foo> b1 = Foo::<error descr="Cannot resolve constructor 'Foo'">new</error>;
+        I4<Foo> b2 = Foo::<error descr="Cannot resolve constructor 'Foo'">new</error>;
     }
 }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/DefaultConstructor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/DefaultConstructor.java
index 2534997..53cd638 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/DefaultConstructor.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/DefaultConstructor.java
@@ -13,25 +13,25 @@
         }
         
         static void test1() {
-            <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor.I2<DefaultConstructor.Outer.Inner,DefaultConstructor.Outer>'">I2<Inner, Outer> i2 = Inner :: new;</error>
-            <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor.I2<DefaultConstructor.Outer.Inner,java.lang.String>'">I2<Inner, String> i2str = Inner :: new;</error>
+            I2<Inner, Outer> i2 = Inner :: <error descr="Cannot resolve constructor 'Inner'">new</error>;
+            I2<Inner, String> i2str = Inner :: <error descr="Cannot resolve constructor 'Inner'">new</error>;
         }
         
         void test2() {
             I1<Inner> i1 = Inner :: new;
             <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor.I1<java.lang.Integer>'">I1<Integer> i1Int = Inner :: new;</error>
-            <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor.I2<DefaultConstructor.Outer.Inner,DefaultConstructor.Outer>'">I2<Inner, Outer> i2 =  Inner :: new;</error>
+            I2<Inner, Outer> i2 =  Inner :: <error descr="Cannot resolve constructor 'Inner'">new</error>;
         }
     }
     
     static void test1() {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor.I2<DefaultConstructor.Outer.Inner,DefaultConstructor.Outer>'">I2<Outer.Inner, Outer> i2 = Outer.Inner::new;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor.I2<DefaultConstructor.Outer.Inner,java.lang.String>'">I2<Outer.Inner, String> i2str = Outer.Inner::new;</error>
+        I2<Outer.Inner, Outer> i2 = Outer.Inner::<error descr="Cannot resolve constructor 'Inner'">new</error>;
+        I2<Outer.Inner, String> i2str = Outer.Inner::<error descr="Cannot resolve constructor 'Inner'">new</error>;
     }
     
     void test2() {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor.I2<DefaultConstructor.Outer.Inner,DefaultConstructor.Outer>'">I2<Outer.Inner, Outer> i2 = Outer.Inner::new;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor.I2<DefaultConstructor.Outer.Inner,java.lang.String>'">I2<Outer.Inner, String> i2str = Outer.Inner::new;</error>
+        I2<Outer.Inner, Outer> i2 = Outer.Inner::<error descr="Cannot resolve constructor 'Inner'">new</error>;
+        I2<Outer.Inner, String> i2str = Outer.Inner::<error descr="Cannot resolve constructor 'Inner'">new</error>;
     }
 }
 
@@ -52,7 +52,7 @@
 
 
     void f() {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor2.I'">I i1 = DefaultConstructor2 :: new;</error>
+        I i1 = DefaultConstructor2 :: <error descr="Cannot resolve constructor 'DefaultConstructor2'">new</error>;
         I i2 = <error descr="Cannot find class this">this</error>::new;
     }
 }
@@ -61,7 +61,7 @@
    public class Inner {}
    public static class StaticInner {}
    
-   static <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor3.I'">I i = Inner::new;</error>
+   static I i = Inner::<error descr="Cannot resolve constructor 'Inner'">new</error>;
    static I1 i1 = StaticInner::new;
    interface I {
      Inner foo();
@@ -76,8 +76,8 @@
    public class Inner {}
    public static class StaticInner {}
    
-   static <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor4.I'">I i = Inner::new;</error>
-   static <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor4.I1'">I1 i1 = StaticInner::new;</error>
+   static I i = Inner::<error descr="Cannot resolve constructor 'Inner'">new</error>;
+   static I1 i1 = StaticInner::<error descr="Cannot resolve constructor 'StaticInner'">new</error>;
    interface I {
      Inner foo(DefaultConstructor4 receiver);
    }
@@ -91,7 +91,7 @@
     public class Inner {}
 
     static void test() {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'DefaultConstructor5.I'">I i = Inner::new;</error>
+        I i = Inner::<error descr="Cannot resolve constructor 'Inner'">new</error>;
     }
 
     void test1() {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ExprReceiver.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ExprReceiver.java
index f3bc8d4..632f83b 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ExprReceiver.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/ExprReceiver.java
@@ -5,7 +5,7 @@
     }
     {
         A a = new A();
-        <error descr="Incompatible types. Found: '<method reference>', required: 'ThreadExample.Function<? super ThreadExample.A,? extends java.lang.String>'">Function<? super A,? extends String> foo = a::foo;</error>
+        Function<? super A,? extends String> foo = a::<error descr="Cannot resolve method 'foo'">foo</error>;
     }
 
     static class A {
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodRefAcceptance.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodRefAcceptance.java
index 315a8e0..75f049f 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodRefAcceptance.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodRefAcceptance.java
@@ -22,20 +22,20 @@
     void foo(IFactory cf) { }
 
     void testAssign() {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'Test.IFactory'">IFactory c1 = Anno::new;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'Test.IFactory'">IFactory c2 = E::new;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'Test.IFactory'">IFactory c3 = I::new;</error>
+        IFactory c1 = <error descr="'Anno' is abstract; cannot be instantiated">Anno::new</error>;
+        IFactory c2 = <error descr="Enum types cannot be instantiated">E::new</error>;
+        IFactory c3 = <error descr="'I' is abstract; cannot be instantiated">I::new</error>;
         IFactory c4 = <error descr="Unexpected wildcard">Foo<?></error>::new;
         IFactory c5 = <error descr="Cannot find class 1">1</error>::new;
-        <error descr="Incompatible types. Found: '<method reference>', required: 'Test.IFactory'">IFactory c6 = ABar::new;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'Test.IFactory'">IFactory c7 = ABaz::new;</error>
+        IFactory c6 = <error descr="'ABar' is abstract; cannot be instantiated">ABar::new</error>;
+        IFactory c7 = <error descr="'ABaz' is abstract; cannot be instantiated">ABaz::new</error>;
 
-        foo<error descr="'foo(Test.IFactory)' in 'Test' cannot be applied to '(<method reference>)'">(Anno::new)</error>;
-        foo<error descr="'foo(Test.IFactory)' in 'Test' cannot be applied to '(<method reference>)'">(E::new)</error>;
-        foo<error descr="'foo(Test.IFactory)' in 'Test' cannot be applied to '(<method reference>)'">(I::new)</error>;
+        foo(<error descr="'Anno' is abstract; cannot be instantiated">Anno::new</error>);
+        foo(<error descr="Enum types cannot be instantiated">E::new</error>);
+        foo(<error descr="'I' is abstract; cannot be instantiated">I::new</error>);
         foo(<error descr="Unexpected wildcard">Foo<?></error>::new);
         foo(<error descr="Cannot find class 1">1</error>::new);
-        foo<error descr="'foo(Test.IFactory)' in 'Test' cannot be applied to '(<method reference>)'">(ABar::new)</error>;
-        foo<error descr="'foo(Test.IFactory)' in 'Test' cannot be applied to '(<method reference>)'">(ABaz::new)</error>;
+        foo(<error descr="'ABar' is abstract; cannot be instantiated">ABar::new</error>);
+        foo(<error descr="'ABaz' is abstract; cannot be instantiated">ABaz::new</error>);
     }
 }
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodRefMisc1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodRefMisc1.java
index bd9c9ca..14b9a2b 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodRefMisc1.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/MethodRefMisc1.java
@@ -144,10 +144,10 @@
     enum E { }
     
     void test() {
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest7.I'">I s1 = A::new;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest7.I'">I s2 = I::new;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest7.I'">I s3 = AC::new;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest7.I'">I s4 = E::new;</error>
+        I s1 = <error descr="'A' is abstract; cannot be instantiated">A::new</error>;
+        I s2 = <error descr="'I' is abstract; cannot be instantiated">I::new</error>;
+        I s3 = <error descr="'AC' is abstract; cannot be instantiated">AC::new</error>;
+        I s4 = <error descr="Enum types cannot be instantiated">E::new</error>;
     }
 }
 
@@ -165,7 +165,7 @@
         }
 
         void test() {
-            <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest8.Sub.I'">I var = Sub.Inner::new;</error>;
+            I var = Sub.Inner::<error descr="Cannot resolve constructor 'Inner'">new</error>;;
         }
     }
 }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/QualifierTypeArgs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/QualifierTypeArgs.java
index 7c1e04f..f88c5bf 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/QualifierTypeArgs.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/QualifierTypeArgs.java
@@ -12,7 +12,7 @@
 
     {
       I i = Foo<String> :: foo;
-      <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I'">I i1 = Foo<Integer> :: foo;</error>
+      I i1 = Foo<Integer> :: <error descr="Cannot resolve method 'foo'">foo</error>;
     }
   }
 }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/RefOnArrayDeclaration.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/RefOnArrayDeclaration.java
index ed1efe8..f11a6de 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/RefOnArrayDeclaration.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/RefOnArrayDeclaration.java
@@ -34,7 +34,7 @@
         Cln s =  int[]::clone;
         IA a =  int[]::new;
         <error descr="Incompatible types. Found: '<method reference>', required: 'OnArrayTest.I'">I i = int[]::new;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'OnArrayTest.Len<java.lang.String>'">Len<String> strLen = String[]::length;</error>
+        Len<String> strLen = String[]::<error descr="Cannot resolve method 'length'">length</error>;
         ToStr<Integer> toStr = Integer[]::toString;
 
         ArrayReturnType<String[]> a1 = String[]::new;
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java
index e521df2..db0dd15 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/Varargs.java
@@ -48,27 +48,27 @@
 
     static {
         I1 i1 = MyTest::static_1;
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I1'">I1 i2 = MyTest::static_2;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I1'">I1 i3 = MyTest::static_3;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I1'">I1 i4 = MyTest::static_4;</error>
+        I1 i2 = MyTest::<error descr="Cannot resolve method 'static_2'">static_2</error>;
+        I1 i3 = MyTest::<error descr="Cannot resolve method 'static_3'">static_3</error>;
+        I1 i4 = MyTest::<error descr="Cannot resolve method 'static_4'">static_4</error>;
     }
 
 
     {
         I1 i_1 = <error descr="Non-static method cannot be referenced from a static context">MyTest::_1</error>;
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I1'">I1 i_2 = MyTest::_2;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I1'">I1 i_3 = MyTest::_3;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I1'">I1 i_4 = MyTest::_4;</error>
+        I1 i_2 = MyTest::<error descr="Cannot resolve method '_2'">_2</error>;
+        I1 i_3 = MyTest::<error descr="Cannot resolve method '_3'">_3</error>;
+        I1 i_4 = MyTest::<error descr="Cannot resolve method '_4'">_4</error>;
 
         I1 i1 = this::_1;
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I1'">I1 i2 = this::_2;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I1'">I1 i3 = this::_3;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I1'">I1 i4 = this::_4;</error>
+        I1 i2 = this::<error descr="Cannot resolve method '_2'">_2</error>;
+        I1 i3 = this::<error descr="Cannot resolve method '_3'">_3</error>;
+        I1 i4 = this::<error descr="Cannot resolve method '_4'">_4</error>;
 
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I2'">I2 i21 = MyTest::m1;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I2'">I2 i22 = MyTest::m2;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I2'">I2 i23 = MyTest::m3;</error>
-        <error descr="Incompatible types. Found: '<method reference>', required: 'MyTest.I2'">I2 i24 = MyTest::m4;</error>
+        I2 i21 = MyTest::<error descr="Cannot resolve method 'm1'">m1</error>;
+        I2 i22 = MyTest::<error descr="Cannot resolve method 'm2'">m2</error>;
+        I2 i23 = MyTest::<error descr="Cannot resolve method 'm3'">m3</error>;
+        I2 i24 = MyTest::<error descr="Cannot resolve method 'm4'">m4</error>;
     }
 }
 
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/VarargsInReceiverPosition.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/VarargsInReceiverPosition.java
index cf2151d..b34634c 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/VarargsInReceiverPosition.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/methodRef/VarargsInReceiverPosition.java
@@ -4,7 +4,7 @@
     void test() {
         Comparator<Test> r2 = Test::yyy;
         Comparator1<Test> c1 = <error descr="Non-static method cannot be referenced from a static context">Test::yyy</error>;
-        <error descr="Incompatible types. Found: '<method reference>', required: 'Comparator1<Test>'">Comparator1<Test> c2 = Test::xxx;</error>
+        Comparator1<Test> c2 = Test::<error descr="Cannot resolve method 'xxx'">xxx</error>;
     }
     int yyy(Test... p) { return 1; }
     int xxx(Test t) {return 42;}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA123352.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA123352.java
new file mode 100644
index 0000000..77f04cb
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/IDEA123352.java
@@ -0,0 +1,19 @@
+import java.util.*;
+
+class Test {
+  class Predicate<T> {
+    private <<warning descr="Type parameter 'S' is never used">S</warning> extends T> boolean test(final Collection<T> src) {
+      System.out.println(src);
+      return true;
+    }
+    private <<warning descr="Type parameter 'S' is never used">S</warning> extends T> boolean <warning descr="Private method 'test(java.lang.Iterable<T>)' is never used">test</warning>(final Iterable<T> iterable) {
+      System.out.println(iterable);
+      return false;
+    }
+  }
+
+  public void testPredicate() {
+    final Predicate<Integer> predicate = new Predicate<>();
+    predicate.test(new ArrayList<Integer>());
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/JDK8034223.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/JDK8034223.java
new file mode 100644
index 0000000..e5469ab
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/JDK8034223.java
@@ -0,0 +1,18 @@
+class MS {
+  interface GetInt { int get(); }
+  interface GetInteger { Integer get(); }
+
+  private void m(GetInt getter) {
+    System.out.println(getter);
+  }
+
+  private void m(GetInteger getter) {
+    System.out.println(getter);
+  }
+
+  void test(boolean cond) {
+    m(cond ? () -> 26 : () -> 24);
+    m<error descr="Cannot resolve method 'm(?)'">(cond ? () -> 26 : () -> new Integer(42))</error>;
+    m(cond ? () -> new Integer(26) : () -> new Integer(42));
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/RelatedSAMErasures.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/RelatedSAMErasures.java
new file mode 100644
index 0000000..e2ac37c
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/mostSpecific/RelatedSAMErasures.java
@@ -0,0 +1,53 @@
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+
+class Test {
+  interface RunnableX extends Callable<String> {
+    void run() throws Exception;
+
+    default String call() throws Exception
+    {
+      run();
+      return null;
+    }
+  }
+
+  static void foo(RunnableX r){
+    System.out.println(r);
+  }
+  static void foo(Callable<List<?>> c){
+    System.out.println(c);
+  }
+
+  public void test() {
+    foo<error descr="Ambiguous method call: both 'Test.foo(RunnableX)' and 'Test.foo(Callable<List<?>>)' match">(()->  new ArrayList<Void>() )</error>;
+  }
+
+}
+
+class Test1 {
+  interface RunnableX extends Callable<List<?>> {
+    void run() throws Exception;
+
+    default List<?> call() throws Exception
+    {
+      run();
+      return null;
+    }
+  }
+
+  static void foo(RunnableX r){
+    System.out.println(r);
+  }
+  static void foo(Callable<List<?>> c){
+    System.out.println(c);
+  }
+
+  public void test() {
+    foo(()->  new ArrayList<Void>() );
+  }
+
+}
+
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/AdditionalConstraintDependsOnNonMentionedVars.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/AdditionalConstraintDependsOnNonMentionedVars.java
new file mode 100644
index 0000000..9bf687c
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/AdditionalConstraintDependsOnNonMentionedVars.java
@@ -0,0 +1,13 @@
+import java.util.function.Function;
+
+abstract class Test {
+  abstract <T, A, R> Collector<T, A, R> create(Foo<A> foo, Function<A,R> fun);
+  abstract <Ts> Foo<Ts[]> toArray(Ts identity);
+
+  <Tf> Collector<Tf, ?, Tf> foo(Tf t) {
+    return create(toArray(t), a -> a[0]);
+  }
+
+  interface Collector<T1, A1, R1> {}
+  class Foo<D> {}
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119003.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119003.java
new file mode 100644
index 0000000..f56af02
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119003.java
@@ -0,0 +1,84 @@
+package problems;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+
+import static java.util.stream.Collectors.*;
+
+class Test {
+
+  enum CaloricLevel { DIET, NORMAL, FAT }
+
+  public static void main(String[] args) {
+    List<Dish> menu = Arrays.asList(
+      new Dish("pork", false, 800, Dish.Type.MEAT),
+      new Dish("beef", false, 700, Dish.Type.MEAT),
+      new Dish("chicken", false, 400, Dish.Type.MEAT),
+      new Dish("french fries", true, 530, Dish.Type.OTHER),
+      new Dish("rice", true, 350, Dish.Type.OTHER),
+      new Dish("season fruit", true, 120, Dish.Type.OTHER),
+      new Dish("pizza", true, 550, Dish.Type.OTHER),
+      new Dish("prawns", false, 400, Dish.Type.FISH),
+      new Dish("salmon", false, 450, Dish.Type.FISH)
+    );
+
+    System.out.println(
+      menu.stream().collect(reducing(0, Dish::getCalories, (Integer i, Integer j) -> i + j))
+    );
+
+    System.out.println(
+      menu.stream().collect(
+        groupingBy(Dish::getType, mapping(
+          dish -> { if (dish.getCalories() <= 400) return CaloricLevel.DIET;
+          else if (dish.getCalories() <= 700) return CaloricLevel.NORMAL;
+          else return CaloricLevel.FAT; },
+          toSet())))
+    );
+
+    System.out.println(
+      menu.stream().collect(
+        groupingBy(Dish::getType,
+                   collectingAndThen(
+                     reducing((d1, d2) -> d1.getCalories() > d2.getCalories() ? d1 : d2),
+                     Optional::get)))
+    );
+  }
+}
+
+class Dish {
+  private final String name;
+  private final boolean vegetarian;
+  private final int calories;
+  private final Type type;
+
+  public Dish(String name, boolean vegetarian, int calories, Type type) {
+    this.name = name;
+    this.vegetarian = vegetarian;
+    this.calories = calories;
+    this.type = type;
+  }
+
+  public String getName() {
+    return name;
+  }
+
+  public boolean isVegetarian() {
+    return vegetarian;
+  }
+
+  public int getCalories() {
+    return calories;
+  }
+
+  public Type getType() {
+    return type;
+  }
+
+  public enum Type { MEAT, FISH, OTHER }
+
+  @Override
+  public String toString() {
+    return name;
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119535.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119535.java
index 9c88330..414b2bd 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119535.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA119535.java
@@ -1,3 +1,4 @@
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
@@ -5,6 +6,8 @@
 import java.util.function.Function;
 import java.util.stream.Collector;
 
+import static java.util.stream.Collectors.*;
+
 class Stuff {
   public enum Type { A }
   private final int value;
@@ -41,4 +44,31 @@
                                         Collector<? super T, A, D> downstream) {
     return null;
   }
+}
+
+class FakeErrorsComplete {
+  public static List<Stuff> elems(){
+    return Arrays.asList(
+      new Stuff(800, Stuff.Type.A));
+  }
+
+  public static void main(String ... args){
+
+    Map<Stuff.Type, Optional<Stuff>> bar =
+      elems()
+        .stream()
+        .collect(groupingBy(Stuff::getType,
+                            reducing((d1, d2) -> d1.getValue() > d2.getValue() ? d1 : d2)));
+
+    System.out.println(bar);
+
+    Map<Stuff.Type, Stuff> baz =
+      elems()
+        .stream()
+        .collect(groupingBy(Stuff::getType,
+                            collectingAndThen(reducing((Stuff d1, Stuff d2) -> d1.getValue() > d2.getValue() ? d1 : d2),
+                                              Optional::get)));
+
+    System.out.println(baz);
+  }
 }
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122074.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122074.java
new file mode 100644
index 0000000..02cdd6c
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122074.java
@@ -0,0 +1,15 @@
+class CyclicInferenceBug {
+  interface Func1<T1, R> {
+    R apply(T1 v1);
+    void other();
+  }
+  interface F1<T1, R> extends Func1<T1, R> {
+    default void other() {}
+  }
+
+  <T1, R> Func1<T1, R> func(F1<T1, R> f1) { return f1; }
+
+  void test() {
+    Func1<String, String> f1 = func(s -> s);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122084.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122084.java
new file mode 100644
index 0000000..1995793
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122084.java
@@ -0,0 +1,18 @@
+class InferenceFailBug {
+  interface Func1<T1, R> {
+    R apply(T1 v1);
+    void other();
+  }
+  interface F1<T1, R> extends Func1<T1, R> {
+    default void other() {}
+  }
+
+  <T1, R> Func1<T1, R> func(F1<T1, R> f1) { return f1; }
+
+  interface Future<T> {
+    <R> Future<R> map(Func1<T, R> f1);
+  }
+  private Future<Integer> futureExample(Future<String> future) {
+    return future.map(func(s -> s.toUpperCase())).map(func(s -> s.length()));
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122406.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122406.java
new file mode 100644
index 0000000..2d350a8
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122406.java
@@ -0,0 +1,41 @@
+import java.util.*;
+import java.util.function.Predicate;
+
+abstract class Test {
+  public long countTweetsLongerThan(int numberOfChars, final List<String> tweetList) {
+    //numberOfChars = 100; //TODO uncomment to show it must be effectively final
+
+    long totalByFor = 0;
+    for (String tweet : tweetList) {
+      if (tweet.length() > numberOfChars) {
+        totalByFor++;
+      }
+    }
+
+    final ArrayList<String> guavaList = newArrayList(filter(tweetList, new Predicate<String>() {
+      @Override
+      public boolean test(String tweet) {
+        return false;
+      }
+    }));
+    final long totalFromGuava = guavaList.size();
+
+
+    final long totalFromLambda = tweetList.stream()
+      .filter(t -> t.length() > numberOfChars)
+      .count();
+
+    if (totalByFor != totalFromLambda | totalByFor != totalFromGuava) {
+      throw new RuntimeException("");
+    }
+    return totalFromLambda;
+  }
+
+  abstract <E> ArrayList<E> newArrayList(Iterable<? extends E> elements);
+  abstract <E> ArrayList<E> newArrayList();
+  abstract <E> ArrayList<E> newArrayList(E... elements);
+
+  abstract <T> Iterable<T> filter(Iterable<T> unfiltered, Predicate<? super T> predicate);
+  abstract <T> Iterable<T> filter(Iterable<?> unfiltered, Class<T> type);
+
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122616.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122616.java
new file mode 100644
index 0000000..5963ad3
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122616.java
@@ -0,0 +1,18 @@
+import java.util.function.Function;
+
+class ChoiceBox<T> {
+  static {
+    ChoiceBox<Item> confParamField1 = new ChoiceBox<>("", p -> p.getName());
+    ChoiceBox<Item> confParamField2 = new ChoiceBox<Item>("", p -> p.getName());
+  }
+
+  public ChoiceBox(T... options) {}
+
+  public ChoiceBox(String caption, Function<T, String> itemCaption) {}
+
+  public static class Item {
+    public String getName() {
+      return null;
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122700.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122700.java
new file mode 100644
index 0000000..03b0dec
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA122700.java
@@ -0,0 +1,26 @@
+class Test {
+  class Event {}
+  class KeyEvent extends Event {
+    int getCode() {
+      return 0;
+    }
+  }
+  interface EventListener<T extends Event> {
+    void handle(T event);
+  }
+
+  class EventType<T extends Event>{}
+  static final EventType<KeyEvent> KEY_PRESSED = null;
+
+  {
+    addEventHandler(KEY_PRESSED, keyEvent -> {
+      int i = keyEvent.getCode();
+    });
+
+  }
+
+
+
+  public final <T extends Event> void addEventHandler(final EventType<T> eventType, final EventListener<? super T> listener) {}
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA123731.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA123731.java
new file mode 100644
index 0000000..f5a0b63
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA123731.java
@@ -0,0 +1,21 @@
+import java.util.Collection;
+import java.util.Map;
+
+class Test{
+
+  public static void main(String[] args) {
+    Map<String, Collection<Integer>> myMap = null;
+
+    myMap.entrySet().stream()
+      .flatMap(entry -> entry.getValue().stream()
+        .map(val -> new Object() {
+          String key = entry.getKey();
+          Integer value = val;
+        }))
+      .forEachOrdered(o -> {
+        final String key = o.key;
+        final Integer value = o.value;
+        System.out.println("key: " + key + " value: " + value);
+      });
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA123848.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA123848.java
new file mode 100644
index 0000000..0d1cec6
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA123848.java
@@ -0,0 +1,27 @@
+import java.util.*;
+
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.mapping;
+import static java.util.stream.Collectors.toList;
+
+class Test {
+
+  private static void run() {
+    List<R> list = Arrays.asList(new R());
+
+    System.out.println(
+      list.stream()
+        .collect(groupingBy(r -> r.get(String.class), mapping(r -> r.get(String.class),toList())
+        ))
+    );
+  }
+
+  static class R {
+    <T> T get(Class<T> clazz) {
+      if (clazz == String.class)
+        return (T) "string";
+
+      throw new IllegalArgumentException();
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA123869.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA123869.java
new file mode 100644
index 0000000..14318d3
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/IDEA123869.java
@@ -0,0 +1,19 @@
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Set;
+
+class Test {
+
+  {
+    Map<String, ? extends Set<Integer>> myMap = null;
+
+    myMap.entrySet().parallelStream()
+      .map(it -> {
+        final ArrayList<Integer> myList = newArrayList(it.getValue());
+        return myList.size();
+      })
+      .forEach(System.out::println);
+  }
+  
+  public static <E> ArrayList<E> newArrayList(Iterable<? extends E> elements) { return null; }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/NestedCallsInsideLambdaReturnExpression.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/NestedCallsInsideLambdaReturnExpression.java
new file mode 100644
index 0000000..b8db3c4
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newLambda/NestedCallsInsideLambdaReturnExpression.java
@@ -0,0 +1,59 @@
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.stream.Stream;
+
+abstract class Play {
+  public void main(Stream<String> stream, Stream<String> anotherStream) {
+    Stream<String> stringStream = stream.map(o -> foo(i -> "")).flatMap(l -> l);
+  }
+
+  abstract <RF > Stream<RF> foo(Function<Integer, ? extends RF> mapper);
+
+  static int foo() {
+    return 6;
+  }
+}
+
+
+
+class SimplePlay {
+  {
+    foo(y -> bar(x ->  "")).substring(0);
+  }
+
+  interface Res<R> {
+    R apply(String s);
+  }
+
+  <T> T foo(Res<T> f) {return null;}
+  <K> K bar(Res<K> f) {return null;}
+}
+
+class Test19 {
+  interface Seq<E> extends Iterable<E> {
+    static <E> Seq<E> of(Iterable<? extends E> source) {
+      return null;
+    }
+
+    <R> Seq<R> map(Function<? super E, ? extends R> mapper);
+    <R, V> Seq<R> zip(BiFunction<? super E, ? super V, ? extends R> zipper, Seq<V> other);
+  }
+
+  interface S extends Seq<String> {
+    static S copyOf(Iterable<String> source) {
+      return null;
+    }
+  }
+
+  interface D extends S {
+
+  }
+
+  void test(Seq<D> dseq) {
+    BiFunction<D, List<Integer>, Seq<S>> f =
+      (d, nums) -> dseq.map(s -> s.zip((text, num) -> text + num, Seq.of(nums)))
+        .map(s -> S.copyOf(s));
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/AfterDistinctOps.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/AfterDistinctOps.java
index c2ee24b..ee24b8c 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/AfterDistinctOps.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/AfterDistinctOps.java
@@ -77,7 +77,7 @@
     public boolean add(E e) {
         return true;
     }
-    public boolean addAll(Collection<? extends E> <warning descr="Parameter 'c' is never used">c</warning>) {
+    public boolean addAll(Collection<? extends E> c) {
         boolean modified = false;
         return modified;
     }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/AssertNumberOfParameters.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/AssertNumberOfParameters.java
index 77c6700..9449054 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/AssertNumberOfParameters.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/AssertNumberOfParameters.java
@@ -10,6 +10,6 @@
     <T> void bar(I i) {}
 
     void test() {
-        bar<error descr="'bar(Test.I)' in 'Test' cannot be applied to '(<method reference>)'">(Foo::foo)</error>;
+        bar(Foo::<error descr="Cannot resolve method 'foo'">foo</error>);
     }
 }
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/FromReferenceWithTypeArgs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/FromReferenceWithTypeArgs.java
new file mode 100644
index 0000000..df39491
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/FromReferenceWithTypeArgs.java
@@ -0,0 +1,17 @@
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+class Box<T>
+{
+  public T getValue()
+  {
+    return null;
+  }
+
+  void f(Stream<Box<String>> stream) {
+    List<String> l3 = stream
+      .map(Box<String>::getValue)
+      .collect(Collectors.toList());
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/GenericArrayCreation.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/GenericArrayCreation.java
index f985da2..ad3ed71 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/GenericArrayCreation.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/GenericArrayCreation.java
@@ -6,11 +6,11 @@
         Test m(List<Integer> l1, List<Integer> l2);
     }
 
-    static Test meth(List<Integer>... <warning descr="Parameter 'lli' is never used">lli</warning>) {
+    static Test meth(List<Integer>... lli) {
         return null;
     }
 
-    Test(List<Integer>... <warning descr="Parameter 'lli' is never used">lli</warning>) {}
+    Test(List<Integer>... lli) {}
 
     {
         I <warning descr="Variable 'i1' is never used">i1</warning> = <warning descr="Unchecked generics array creation for varargs parameter">Test::meth</warning>;
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA112191.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA112191.java
new file mode 100644
index 0000000..273107e
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA112191.java
@@ -0,0 +1,15 @@
+import java.util.function.ToIntFunction;
+class Test {
+  {
+    fooBar(String::length);
+  }
+
+  class Foo<K> {
+    Foo<K> then() {
+      return null;
+    }
+  }
+  static <T> Foo<T> fooBar(ToIntFunction<? super T> keyExtractor) {
+    return null;
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122018comment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122018comment.java
new file mode 100644
index 0000000..ca9bf69
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122018comment.java
@@ -0,0 +1,20 @@
+import java.util.List;
+import java.util.function.Function;
+class Base {
+
+  interface Seq<Eq> extends Iterable<Eq> {
+    static <E> Seq<E> of(Iterable<? extends E> source) {
+      return null;
+    }
+
+    <R> Seq<R> map(Function<? super Eq, ? extends R> mapper);
+  }
+
+}
+
+class Test3 extends Base {
+
+  void test4(Seq<List<String>> map) {
+    Seq<Seq<String>> mapped = map.map(Seq::of);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122100.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122100.java
new file mode 100644
index 0000000..e6b44e4
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122100.java
@@ -0,0 +1,20 @@
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+
+class InferenceExample<E> {
+  public <Output> List<Output> convertAll(Function<E, Output> converter) {
+    return invoke (MyArrayList::convertAll, converter);
+  }
+
+  protected <A, R> R invoke(BiFunction<MyArrayList<E>, A, R> action, A arg) {
+    return null;
+  }
+
+  public class MyArrayList<T> extends ArrayList<T> {
+    public <Output1> List<Output1> convertAll(Function<T,  Output1> converter) {
+      return null;
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122509.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122509.java
new file mode 100644
index 0000000..7ed7987
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122509.java
@@ -0,0 +1,19 @@
+import java.util.Arrays;
+import java.util.List;
+
+class ListComprehensionSample {
+  public static void main(String[] args) {
+    new ListComprehensionSample().run();
+  }
+
+  interface Function1<ResultType, ParameterType1> {
+    ResultType invoke(ParameterType1 parameter1);
+  }
+
+  private void run() {
+    Function1<Integer, String> stringToInt = Integer::parseInt;
+    Function1<Double, Integer> intToPercent = i -> i / 100.0;
+    List<String> values = Arrays.asList("12", "23", "34", "45", "56", "67", "78", "89");
+    values.stream().map(stringToInt::invoke).map(intToPercent::invoke).forEach(System.out::println);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122681.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122681.java
new file mode 100644
index 0000000..562f03d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA122681.java
@@ -0,0 +1,21 @@
+import java.util.Set;
+import java.util.function.Supplier;
+
+class IDEA122681 {
+  private static <E> Set<E> getSet(E element) {
+    return null;
+  }
+
+  private static <T> T getObject(Supplier<T> supplier) {
+    return null;
+  }
+
+  private static Object getObjectFromString(String string) {
+    return null;
+  }
+
+  private static void callGetSet() {
+    getSet(getObjectFromString(getObject(String ::new)));
+  }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123223.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123223.java
new file mode 100644
index 0000000..becb426
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123223.java
@@ -0,0 +1,31 @@
+import java.util.List;
+import java.util.function.Function;
+
+class FluTr<K> {
+
+  class Group {
+    List<Authority> getAuthorities() {
+      return null;
+    }
+  }
+
+  class Authority {
+    String getPermission() {
+      return null;
+    }
+  }
+
+  public void filterForPermission(final String permission) {
+    transformAndConcat(Group::getAuthorities)
+      .transform(Authority::getPermission)
+      .contains(permission);
+  }
+
+  boolean contains(String f) {
+    return false;
+  }
+
+  public final <T> FluTr<T> transform(Function<? super K,T> function) { return null; }
+  public <T> FluTr<T> transformAndConcat(Function<? super Group,? extends Iterable<? extends T>> function) { return null; }
+
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123248.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123248.java
new file mode 100644
index 0000000..bedd4e2
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123248.java
@@ -0,0 +1,11 @@
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.Stream;
+
+class App {
+
+  void foo(Stream<Integer> boxed) {
+    final Map<Integer, Integer> count = boxed.collect(HashMap::new, null, HashMap::putAll);
+  }
+
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123366.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123366.java
new file mode 100644
index 0000000..b54dc8f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123366.java
@@ -0,0 +1,18 @@
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+class MyClass {
+  private static void test() {
+    List<String> collect = Arrays.asList("foo", "bar")
+      .stream()
+      .flatMap(MyClass::mapper)
+      .filter(s -> s.startsWith("foo"))
+      .collect(Collectors.toList());
+  }
+
+  private static Stream<String> mapper(String s) {
+    return Stream.of(s);
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123366comment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123366comment.java
new file mode 100644
index 0000000..f360a9c
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/newMethodRef/IDEA123366comment.java
@@ -0,0 +1,49 @@
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+class MethodReferenceTest {
+
+  private final List<String> strings = Arrays.asList("One,Two", "Three,Four,Five");
+
+  public static Stream<String> split(String csv) {
+    return Arrays.asList(csv.split(",")).stream();
+  }
+
+  public void testMethodReference() {
+    List<String> list = strings.stream()
+      .flatMap(MethodReferenceTest::split)
+      .collect(Collectors.toList());
+
+  }
+
+  public void testLambda() {
+    List<String> list = strings.stream()
+      .flatMap((t) -> MethodReferenceTest.split(t))
+      .collect(Collectors.toList());
+  }
+
+  public void testMethodReferenceWithCast() {
+    List<String> list = strings.stream()
+      .flatMap((Function<String,Stream<String>>)MethodReferenceTest::split)
+      .collect(Collectors.toList());
+
+  }
+
+  public void testAnonymousInnerClass() {
+    List<String> strings = Arrays.asList("One,Two", "Three,Four,Five");
+
+    List<String> list = strings.stream()
+      .flatMap(new Function<String, Stream<String>>() {
+        @Override
+        public Stream<String> apply(String s) {
+          return Arrays.asList(s.split(",")).stream();
+        }
+      })
+      .collect(Collectors.toList());
+
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/resolve/IDEA122406.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/resolve/IDEA122406.java
new file mode 100644
index 0000000..b40ccbc
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/resolve/IDEA122406.java
@@ -0,0 +1,41 @@
+import java.util.*;
+import java.util.function.Predicate;
+
+abstract class Test {
+  public long countTweetsLongerThan(int numberOfChars, final List<String> tweetList) {
+    //numberOfChars = 100; //TODO uncomment to show it must be effectively final
+
+    long totalByFor = 0;
+    for (String tweet : tweetList) {
+      if (tweet.length() > numberOfChars) {
+        totalByFor++;
+      }
+    }
+
+    final ArrayList<String> guavaList = newArrayList(fil<ref>ter(tweetList, new Predicate<String>() {
+      @Override
+      public boolean test(String tweet) {
+        return false;
+      }
+    }));
+    final long totalFromGuava = guavaList.size();
+
+
+    final long totalFromLambda = tweetList.stream()
+      .filter(t -> t.length() > numberOfChars)
+      .count();
+
+    if (totalByFor != totalFromLambda | totalByFor != totalFromGuava) {
+      throw new RuntimeException("");
+    }
+    return totalFromLambda;
+  }
+
+  abstract <E> ArrayList<E> newArrayList(Iterable<? extends E> elements);
+  abstract <E> ArrayList<E> newArrayList();
+  abstract <E> ArrayList<E> newArrayList(E... elements);
+
+  abstract <T> Iterable<T> filter(Iterable<T> unfiltered, Predicate<? super T> predicate);
+  abstract <T> Iterable<T> filter(Iterable<?> unfiltered, Class<T> type);
+
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAssert/afterLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAssert/afterLambda.java
new file mode 100644
index 0000000..6f1a450
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAssert/afterLambda.java
@@ -0,0 +1,10 @@
+// "Assert 'container != null'" "true"
+class A{
+  void test(){
+    Object container = null;
+    Runnable r = () -> {
+        assert container != null;
+        container == null ? container.toString() : "";
+    };
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAssert/beforeLambda.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAssert/beforeLambda.java
new file mode 100644
index 0000000..47ec64c
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addAssert/beforeLambda.java
@@ -0,0 +1,7 @@
+// "Assert 'container != null'" "true"
+class A{
+  void test(){
+    Object container = null;
+    Runnable r = () -> container == null ? conta<caret>iner.toString() : "";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/afterFQN.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/afterFQN.java
new file mode 100644
index 0000000..a69afc2
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/afterFQN.java
@@ -0,0 +1,14 @@
+// "Add explicit type arguments" "true"
+import java.util.Date;
+import java.util.List;
+import java.util.Collections;
+
+class Bar {
+  public static void main(String[] args) {
+    new Foo().foo(Collections.<Date>emptyList());
+  }
+}
+
+class Foo {
+  void foo(List<java.util.Date> dates) { }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/afterPrimitives.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/afterPrimitives.java
new file mode 100644
index 0000000..0884158
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/afterPrimitives.java
@@ -0,0 +1,14 @@
+// "Add explicit type arguments to 2nd argument" "true"
+import java.util.Collections;
+import java.util.List;
+
+class Foo {
+
+  public static void main(String[] args) {
+    new Foo(1, Collections.<String>emptyList());
+  }
+
+  public Foo(Integer i, List<String> list) {
+
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/beforeFQN.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/beforeFQN.java
new file mode 100644
index 0000000..64b582f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/beforeFQN.java
@@ -0,0 +1,13 @@
+// "Add explicit type arguments" "true"
+import java.util.List;
+import java.util.Collections;
+
+class Bar {
+  public static void main(String[] args) {
+    new Foo().fo<caret>o(Collections.emptyList());
+  }
+}
+
+class Foo {
+  void foo(List<java.util.Date> dates) { }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/beforePrimitives.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/beforePrimitives.java
new file mode 100644
index 0000000..52a2dff
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeArguments/beforePrimitives.java
@@ -0,0 +1,14 @@
+// "Add explicit type arguments to 2nd argument" "true"
+import java.util.Collections;
+import java.util.List;
+
+class Foo {
+
+  public static void main(String[] args) {
+    new Foo(1, Collections.empt<caret>yList());
+  }
+
+  public Foo(Integer i, List<String> list) {
+
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterTernary.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterTernary.java
index 1ed19b5..e9c1922 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterTernary.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/afterTernary.java
@@ -1,7 +1,7 @@
 // "Cast to 'B'" "true"
 class A {
  void f(B b) {
-   B s = <caret>b == null ? (B) this : b;
+   B s = b == null ? <caret>(B) this : b;
  }
 }
 class B extends A {}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeTernary.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeTernary.java
index 3c07995..c19e116 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeTernary.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addTypeCast/beforeTernary.java
@@ -1,7 +1,7 @@
 // "Cast to 'B'" "true"
 class A {
  void f(B b) {
-   B s = <caret>b == null ? this : b;
+   B s = b == null ? <caret>this : b;
  }
 }
 class B extends A {}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterCallToDefaultFromFunctionalInterfaceInsideInheritor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterCallToDefaultFromFunctionalInterfaceInsideInheritor.java
new file mode 100644
index 0000000..234ad18
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterCallToDefaultFromFunctionalInterfaceInsideInheritor.java
@@ -0,0 +1,13 @@
+// "Replace with lambda" "true"
+class Test {
+  interface InOut {
+    void run() throws IOException;
+    default void foo(){}
+  }
+
+  interface InOutEx extends InOut {
+    InOut bind() {
+      return () -> foo();
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterCallToStaticFromFunctionalInterface.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterCallToStaticFromFunctionalInterface.java
new file mode 100644
index 0000000..5004921
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterCallToStaticFromFunctionalInterface.java
@@ -0,0 +1,11 @@
+// "Replace with lambda" "true"
+class Test {
+  interface InOut {
+    void run() throws IOException;
+    static void foo(){}
+  }
+
+  InOut bind() {
+    return () -> InOut.foo();
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterConflictingLocal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterConflictingLocal.java
new file mode 100644
index 0000000..2d931e5
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterConflictingLocal.java
@@ -0,0 +1,9 @@
+// "Replace with lambda" "true"
+class X1 {
+  Runnable m() {
+    String s;
+    return () -> {
+      String s1;
+    };
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterFinalFieldInitializedBeforeAnonymInConstructor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterFinalFieldInitializedBeforeAnonymInConstructor.java
index e481f9b..c6dec3d 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterFinalFieldInitializedBeforeAnonymInConstructor.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterFinalFieldInitializedBeforeAnonymInConstructor.java
@@ -4,10 +4,7 @@
 
   HelloLambda() {
     x = 1;
-    Runnable r = () -> {
-      System.out.println(x);
-
-    };
+    Runnable r = () -> System.out.println(x);
 
   }
 
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterForwardStaticFieldReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterForwardStaticFieldReference.java
index 16ed145..813d851 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterForwardStaticFieldReference.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterForwardStaticFieldReference.java
@@ -1,7 +1,5 @@
 // "Replace with lambda" "true"
 class HelloLambda {
-  private final Runnable r = () -> {
-    System.out.println(x);
-  };
+  private final Runnable r = () -> System.out.println(x);
   private static int x = 0;
 }
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterRunnable.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterRunnable.java
index 8860a7c..c92f237 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterRunnable.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterRunnable.java
@@ -1,8 +1,6 @@
 // "Replace with lambda" "true"
 class Test {
   {
-    Runnable r = () -> {
-      System.out.println("");
-    };
+    Runnable r = () -> System.out.println("");
   }
 }
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterRunnableInArrayInitializer.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterRunnableInArrayInitializer.java
index 0688e8b..83ad2f6 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterRunnableInArrayInitializer.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/afterRunnableInArrayInitializer.java
@@ -1,8 +1,6 @@
 // "Replace with lambda" "true"
 class Test {
   {
-    Runnable[] r = new Runnable[] {() -> {
-      System.out.println("");
-    }};
+    Runnable[] r = new Runnable[] {() -> System.out.println("")};
   }
 }
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeCallToDefaultFromFunctionalInterface.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeCallToDefaultFromFunctionalInterface.java
new file mode 100644
index 0000000..0a91eea
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeCallToDefaultFromFunctionalInterface.java
@@ -0,0 +1,16 @@
+// "Replace with lambda" "false"
+class Test {
+  interface InOut {
+    void run() throws IOException;
+    default void foo(){}
+  }
+
+  InOut bind() {
+    return new In<caret>Out() {
+      @Override
+      public void run() throws IOException {
+        foo();
+      }
+    };
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeCallToDefaultFromFunctionalInterfaceInsideInheritor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeCallToDefaultFromFunctionalInterfaceInsideInheritor.java
new file mode 100644
index 0000000..5432bb9
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeCallToDefaultFromFunctionalInterfaceInsideInheritor.java
@@ -0,0 +1,18 @@
+// "Replace with lambda" "true"
+class Test {
+  interface InOut {
+    void run() throws IOException;
+    default void foo(){}
+  }
+
+  interface InOutEx extends InOut {
+    InOut bind() {
+      return new In<caret>Out() {
+        @Override
+        public void run() throws IOException {
+          foo();
+        }
+      };
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeCallToStaticFromFunctionalInterface.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeCallToStaticFromFunctionalInterface.java
new file mode 100644
index 0000000..acfb975
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeCallToStaticFromFunctionalInterface.java
@@ -0,0 +1,16 @@
+// "Replace with lambda" "true"
+class Test {
+  interface InOut {
+    void run() throws IOException;
+    static void foo(){}
+  }
+
+  InOut bind() {
+    return new In<caret>Out() {
+      @Override
+      public void run() throws IOException {
+        foo();
+      }
+    };
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeConflictingLocal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeConflictingLocal.java
new file mode 100644
index 0000000..5b1035b
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2lambda/beforeConflictingLocal.java
@@ -0,0 +1,12 @@
+// "Replace with lambda" "true"
+class X1 {
+  Runnable m() {
+    String s;
+    return new Run<caret>nable() {
+      @Override
+      public void run() {
+        String s;
+      }
+    };
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeCallToDefault.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeCallToDefault.java
new file mode 100644
index 0000000..34c118c
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/anonymous2methodReference/beforeCallToDefault.java
@@ -0,0 +1,16 @@
+// "Replace with method reference" "false"
+class Test {
+  interface InOut {
+    void run() throws IOException;
+    default void foo(){}
+  }
+
+  InOut bind() {
+    return new In<caret>Out() {
+      @Override
+      public void run() throws IOException {
+        foo();
+      }
+    };
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterBlocksInSameMethod.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterBlocksInSameMethod.java
new file mode 100644
index 0000000..9f5a157
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/afterBlocksInSameMethod.java
@@ -0,0 +1,21 @@
+// "Convert to local" "true"
+import java.util.ArrayList;
+
+class ITest {
+
+    public IntelliJBugConvertToLocal(int x, int z) {
+
+        ArrayList<String> mayBeLocal = new ArrayList<String>();
+        if (x == 5) {
+      mayBeLocal.add("jjj");
+    }
+
+    if (x > z) {
+      useIt(mayBeLocal);
+    }
+  }
+  @SuppressWarnings("UnusedParameters")
+  private void useIt(Object data) {
+    System.out.println(data);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeBlocksInSameMethod.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeBlocksInSameMethod.java
new file mode 100644
index 0000000..b4e42ef
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/convert2Local/beforeBlocksInSameMethod.java
@@ -0,0 +1,22 @@
+// "Convert to local" "true"
+import java.util.ArrayList;
+
+class ITest {
+
+  private ArrayList<String> may<caret>BeLocal = new ArrayList<String>();
+
+  public IntelliJBugConvertToLocal(int x, int z) {
+
+    if (x == 5) {
+      mayBeLocal.add("jjj");
+    }
+
+    if (x > z) {
+      useIt(mayBeLocal);
+    }
+  }
+  @SuppressWarnings("UnusedParameters")
+  private void useIt(Object data) {
+    System.out.println(data);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/afterStaticImport.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/afterStaticImport.java
new file mode 100644
index 0000000..27470ff
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/afterStaticImport.java
@@ -0,0 +1,21 @@
+// "Create Enum Constant 'CRIME'" "true"
+import java.util.Arrays;
+import java.util.List;
+
+import static AutomaticTypeInference.E.*;
+
+class AutomaticTypeInference {
+
+  AutomaticTypeInference(List<E> gs) {
+  }
+
+  public static void main(String[] args) {
+
+    new AutomaticTypeInference(Arrays.asList(ACTION, CRIME));
+
+  }
+
+  enum E {
+    ACTION, CRIME;
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/afterVarargs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/afterVarargs.java
new file mode 100644
index 0000000..3c48ba6
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/afterVarargs.java
@@ -0,0 +1,18 @@
+// "Create Enum Constant 'CRIME'" "true"
+import java.util.*;
+
+class AutomaticTypeInference {
+
+  AutomaticTypeInference(List<E> gs) {
+  }
+
+  public static void main(String[] args) {
+
+    new AutomaticTypeInference(Arrays.asList(E.ACTION, E.CRIME));
+
+  }
+
+  enum E {
+    ACTION, CRIME;
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/beforeStaticImport.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/beforeStaticImport.java
new file mode 100644
index 0000000..e34874c
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/beforeStaticImport.java
@@ -0,0 +1,21 @@
+// "Create Enum Constant 'CRIME'" "true"
+import java.util.Arrays;
+import java.util.List;
+
+import static AutomaticTypeInference.E.*;
+
+class AutomaticTypeInference {
+
+  AutomaticTypeInference(List<E> gs) {
+  }
+
+  public static void main(String[] args) {
+
+    new AutomaticTypeInference(Arrays.asList(ACTION, CRI<caret>ME));
+
+  }
+
+  enum E {
+    ACTION;
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/beforeVarargs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/beforeVarargs.java
new file mode 100644
index 0000000..3ce84a9
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createEnumConstantFromUsage/beforeVarargs.java
@@ -0,0 +1,18 @@
+// "Create Enum Constant 'CRIME'" "true"
+import java.util.*;
+
+class AutomaticTypeInference {
+
+  AutomaticTypeInference(List<E> gs) {
+  }
+
+  public static void main(String[] args) {
+
+    new AutomaticTypeInference(Arrays.asList(E.ACTION, E.CRI<caret>ME));
+
+  }
+
+  enum E {
+    ACTION;
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/afterNull.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/afterNull.java
new file mode 100644
index 0000000..a7ffa69
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/afterNull.java
@@ -0,0 +1,9 @@
+// "Create Local Variable 'str'" "true"
+public class A {
+    void foo() {
+        String str;
+        String s = str;
+        str = null;
+    }
+
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/beforeNull.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/beforeNull.java
new file mode 100644
index 0000000..7589950
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalFromUsage/beforeNull.java
@@ -0,0 +1,8 @@
+// "Create Local Variable 'str'" "true"
+public class A {
+    void foo() {
+        String s = s<caret>tr;
+        str = null;
+    }
+
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterFormatting.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterFormatting.java
new file mode 100644
index 0000000..f96cba4
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/afterFormatting.java
@@ -0,0 +1,13 @@
+// "Insert '(IOException)o' declaration" "true"
+import java.io.IOException;
+
+class C {
+  void f(Object o) {
+    if (o instanceof IOException) {
+        IOException ioException = (IOException) o;
+        
+
+    }
+  }
+}
+
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/beforeFormatting.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/beforeFormatting.java
new file mode 100644
index 0000000..8303c6d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createLocalVarFromInstanceof/beforeFormatting.java
@@ -0,0 +1,11 @@
+// "Insert '(IOException)o' declaration" "true"
+import java.io.IOException;
+
+class C {
+  void f(Object o) {
+    if (o instanceof IOException) {
+      <caret>
+    }
+  }
+}
+
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/afterConstructor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/afterConstructor.java
new file mode 100644
index 0000000..4c5e012
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/afterConstructor.java
@@ -0,0 +1,13 @@
+// "Create Constructor" "true"
+class FooBar {
+  FooBar(int i) {
+  }
+
+  {
+    Runnable r = FooBar::new;
+  }
+
+    public FooBar() {
+        
+    }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/afterReferenceType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/afterReferenceType.java
new file mode 100644
index 0000000..7c81889
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/afterReferenceType.java
@@ -0,0 +1,10 @@
+// "Create Method 'fooBar'" "true"
+class FooBar {
+  {
+    Runnable r = FooBar::fooBar;
+  }
+
+    private static void fooBar() {
+        
+    }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/afterThisType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/afterThisType.java
new file mode 100644
index 0000000..f1d2b64
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/afterThisType.java
@@ -0,0 +1,10 @@
+// "Create Method 'fooBar'" "true"
+class FooBar {
+  {
+    Runnable r = this::fooBar;
+  }
+
+    private void fooBar() {
+        
+    }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/beforeConstructor.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/beforeConstructor.java
new file mode 100644
index 0000000..5660b9f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/beforeConstructor.java
@@ -0,0 +1,9 @@
+// "Create Constructor" "true"
+class FooBar {
+  FooBar(int i) {
+  }
+
+  {
+    Runnable r = FooBar::ne<caret>w;
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/beforeReferenceType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/beforeReferenceType.java
new file mode 100644
index 0000000..6430bdb
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/beforeReferenceType.java
@@ -0,0 +1,6 @@
+// "Create Method 'fooBar'" "true"
+class FooBar {
+  {
+    Runnable r = FooBar::foo<caret>Bar;
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/beforeThisType.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/beforeThisType.java
new file mode 100644
index 0000000..9f3e0d8
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef/beforeThisType.java
@@ -0,0 +1,6 @@
+// "Create Method 'fooBar'" "true"
+class FooBar {
+  {
+    Runnable r = this::foo<caret>Bar;
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterParameterNameFirstSuggestion.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterParameterNameFirstSuggestion.java
new file mode 100644
index 0000000..62e163e
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/afterParameterNameFirstSuggestion.java
@@ -0,0 +1,9 @@
+// "Create Method 'test2'" "true"
+class Foo {
+  static String FOO_BAR = "Bar"; 
+  void test1() { test2(FOO_BAR); }
+
+    private void test2(String fooBar) {
+        
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeParameterNameFirstSuggestion.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeParameterNameFirstSuggestion.java
new file mode 100644
index 0000000..2275135
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromUsage/beforeParameterNameFirstSuggestion.java
@@ -0,0 +1,5 @@
+// "Create Method 'test2'" "true"
+class Foo {
+  static String FOO_BAR = "Bar"; 
+  void test1() { tes<caret>t2(FOO_BAR); } 
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createParameterFromUsage/afterDefaultValueAtCallPlace.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createParameterFromUsage/afterDefaultValueAtCallPlace.java
new file mode 100644
index 0000000..8bc0f57
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createParameterFromUsage/afterDefaultValueAtCallPlace.java
@@ -0,0 +1,10 @@
+// "Create Parameter 'popop'" "true"
+class Calculator {
+    public void printError(int popop) {
+        int i = popop;
+    }
+
+    {
+        printError(popop);
+    }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createParameterFromUsage/beforeDefaultValueAtCallPlace.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createParameterFromUsage/beforeDefaultValueAtCallPlace.java
new file mode 100644
index 0000000..4ab4d2a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/createParameterFromUsage/beforeDefaultValueAtCallPlace.java
@@ -0,0 +1,10 @@
+// "Create Parameter 'popop'" "true"
+class Calculator {
+    public void printError() {
+        int i = <caret>popop;
+    }
+
+    {
+        printError();
+    }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/afterEq.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/afterEq.java
new file mode 100644
index 0000000..485bc37
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/afterEq.java
@@ -0,0 +1,6 @@
+// "Join declaration and assignment" "true"
+class Test {
+  {
+    String ss = "hello";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/afterMultiDeclr.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/afterMultiDeclr.java
new file mode 100644
index 0000000..8109062
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/afterMultiDeclr.java
@@ -0,0 +1,6 @@
+// "Join declaration and assignment" "true"
+class Test {
+  {
+    String ss = "hello", a = "";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/afterPlusEq.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/afterPlusEq.java
new file mode 100644
index 0000000..c8e9c3d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/afterPlusEq.java
@@ -0,0 +1,6 @@
+// "Join declaration and assignment" "true"
+class Test {
+  {
+    String ss = "hello" + "world";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeEq.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeEq.java
new file mode 100644
index 0000000..b44568a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeEq.java
@@ -0,0 +1,7 @@
+// "Join declaration and assignment" "true"
+class Test {
+  {
+    String s<caret>s = "";
+    ss = "hello";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeForeignExprBetween.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeForeignExprBetween.java
new file mode 100644
index 0000000..9756619
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeForeignExprBetween.java
@@ -0,0 +1,8 @@
+// "Join declaration and assignment" "false"
+class Test {
+  {
+    String s<caret>s = "";
+    System.out.println(ss);
+    ss = "hello";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeMultiDeclr.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeMultiDeclr.java
new file mode 100644
index 0000000..b488a53
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeMultiDeclr.java
@@ -0,0 +1,7 @@
+// "Join declaration and assignment" "true"
+class Test {
+  {
+    String s<caret>s = "", a = "";
+    ss = "hello";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforePlusEq.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforePlusEq.java
new file mode 100644
index 0000000..5932445
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforePlusEq.java
@@ -0,0 +1,7 @@
+// "Join declaration and assignment" "true"
+class Test {
+  {
+    String ss = "hello";
+    ss +<caret>= "world";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeUsedInRightPart.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeUsedInRightPart.java
new file mode 100644
index 0000000..9b84b9c
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration/beforeUsedInRightPart.java
@@ -0,0 +1,7 @@
+// "Join declaration and assignment" "false"
+class Test {
+  {
+    String ss = "hello";
+    ss +<caret>= ss;
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterCollapseToBeInferredTypeArgs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterCollapseToBeInferredTypeArgs.java
new file mode 100644
index 0000000..e3e2ad0
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterCollapseToBeInferredTypeArgs.java
@@ -0,0 +1,29 @@
+// "Replace lambda with method reference" "true"
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+class Box<T>
+{
+  public Box(T value)
+  {
+    this._value = value;
+  }
+
+  private final T _value;
+
+  public T getValue()
+  {
+    return this._value;
+  }
+
+  {
+    List<Box<String>> l1 = new ArrayList<>();
+    l1.add(new Box<>("Foo"));
+    l1.add(new Box<>("Bar"));
+
+    List<String> l3 = l1.stream()
+      .map(Box::getValue)
+      .collect(Collectors.toList());
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterNoCollapseTypeArgs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterNoCollapseTypeArgs.java
new file mode 100644
index 0000000..6502965
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/afterNoCollapseTypeArgs.java
@@ -0,0 +1,23 @@
+// "Replace lambda with method reference" "true"
+import java.util.function.Function;
+
+class Box<T>
+{
+  public Box(T value)
+  {
+    this._value = value;
+  }
+
+  private final T _value;
+
+  public T getValue()
+  {
+    return this._value;
+  }
+
+  {
+    foo(Box<String>::getValue);
+  }
+  
+  <K> void foo(Function<Box<K>, K> f){}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeCollapseToBeInferredTypeArgs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeCollapseToBeInferredTypeArgs.java
new file mode 100644
index 0000000..f147127
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeCollapseToBeInferredTypeArgs.java
@@ -0,0 +1,29 @@
+// "Replace lambda with method reference" "true"
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+class Box<T>
+{
+  public Box(T value)
+  {
+    this._value = value;
+  }
+
+  private final T _value;
+
+  public T getValue()
+  {
+    return this._value;
+  }
+
+  {
+    List<Box<String>> l1 = new ArrayList<>();
+    l1.add(new Box<>("Foo"));
+    l1.add(new Box<>("Bar"));
+
+    List<String> l3 = l1.stream()
+      .map((t) -> t.get<caret>Value())
+      .collect(Collectors.toList());
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeNoCollapseTypeArgs.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeNoCollapseTypeArgs.java
new file mode 100644
index 0000000..13b324d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference/beforeNoCollapseTypeArgs.java
@@ -0,0 +1,23 @@
+// "Replace lambda with method reference" "true"
+import java.util.function.Function;
+
+class Box<T>
+{
+  public Box(T value)
+  {
+    this._value = value;
+  }
+
+  private final T _value;
+
+  public T getValue()
+  {
+    return this._value;
+  }
+
+  {
+    foo((Box<String> t) -> t.get<caret>Value());
+  }
+  
+  <K> void foo(Function<Box<K>, K> f){}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterReturnTypeInExpressionStatement.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterReturnTypeInExpressionStatement.java
new file mode 100644
index 0000000..159cd79
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/afterReturnTypeInExpressionStatement.java
@@ -0,0 +1,8 @@
+// "Replace with expression lambda" "true"
+class Test {
+  {
+    Runnable c = () -> foo();
+  }
+  
+  int foo() {return 1;}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeReturnTypeInExpressionStatement.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeReturnTypeInExpressionStatement.java
index e5be2cd..4e73771 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeReturnTypeInExpressionStatement.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/lambdaCodeBlock2Expr/beforeReturnTypeInExpressionStatement.java
@@ -1,4 +1,4 @@
-// "Replace with expression lambda" "false"
+// "Replace with expression lambda" "true"
 class Test {
   {
     Runnable c = () -> <caret>{foo();};
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterIncorrectInHierarchy.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterIncorrectInHierarchy.java
new file mode 100644
index 0000000..b1b6566
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/afterIncorrectInHierarchy.java
@@ -0,0 +1,18 @@
+// "Make 'get' return 'Callable<java.lang.Integer>'" "true"
+interface Gettable<T> {
+  Callable<Integer> get();
+}
+
+public class Issue<T> implements Gettable<T> {
+  public Callable<Integer> get() {
+
+    return new Callable<Integer>() {
+      public Integer call() {
+        return 0;
+      }
+    };
+
+  }
+}
+
+class Callable<T> {}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeIncorrectInHierarchy.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeIncorrectInHierarchy.java
new file mode 100644
index 0000000..53d46b6
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/methodReturn/beforeIncorrectInHierarchy.java
@@ -0,0 +1,18 @@
+// "Make 'get' return 'Callable<java.lang.Integer>'" "true"
+interface Gettable<T> {
+  Callable<Integer> get();
+}
+
+public class Issue<T> implements Gettable<T> {
+  public void get() {
+
+    return new Call<caret>able<Integer>() {
+      public Integer call() {
+        return 0;
+      }
+    };
+
+  }
+}
+
+class Callable<T> {}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantTypeArgs/afterMethodReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantTypeArgs/afterMethodReference.java
new file mode 100644
index 0000000..84b4cc2
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantTypeArgs/afterMethodReference.java
@@ -0,0 +1,18 @@
+// "Remove explicit type arguments" "true"
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+class Box<T>
+{
+  public T getValue()
+  {
+    return null;
+  }
+
+  void f(Stream<Box<String>> stream) {
+    List<String> l3 = stream
+      .map(Box::getValue)
+      .collect(Collectors.toList());
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantTypeArgs/beforeMethodReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantTypeArgs/beforeMethodReference.java
new file mode 100644
index 0000000..6f812c0
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/redundantTypeArgs/beforeMethodReference.java
@@ -0,0 +1,18 @@
+// "Remove explicit type arguments" "true"
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+class Box<T>
+{
+  public T getValue()
+  {
+    return null;
+  }
+
+  void f(Stream<Box<String>> stream) {
+    List<String> l3 = stream
+      .map(Box<Stri<caret>ng>::getValue)
+      .collect(Collectors.toList());
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithConstant/afterStaticNotFinal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithConstant/afterStaticNotFinal.java
new file mode 100644
index 0000000..17546ac
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithConstant/afterStaticNotFinal.java
@@ -0,0 +1,10 @@
+// "Replace with 'A.RADIUS'" "true"
+
+class A {
+  public static String RADIUS = "radius";
+
+  public void myMethod(String propertyName) {
+    if (RADIUS.equals(propertyName)) {
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithConstant/beforeStaticNotFinal.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithConstant/beforeStaticNotFinal.java
new file mode 100644
index 0000000..30b6308
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithConstant/beforeStaticNotFinal.java
@@ -0,0 +1,10 @@
+// "Replace with 'A.RADIUS'" "true"
+
+class A {
+  public static String RADIUS = "radius";
+
+  public void myMethod(String propertyName) {
+    if ("rad<caret>ius".equals(propertyName)) {
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCastInIterValue.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCastInIterValue.java
new file mode 100644
index 0000000..e6a5527
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCastInIterValue.java
@@ -0,0 +1,11 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+class Sample {
+  List<String> foo = new ArrayList<>();
+  String foo(){
+      ((List<String>) foo).stream().filter(s -> s == null).forEach(System.out::println);
+    return null;
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectIdentityMap.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectIdentityMap.java
new file mode 100644
index 0000000..ea95020
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectIdentityMap.java
@@ -0,0 +1,11 @@
+// "Replace with collect" "true"
+import java.util.*;
+import java.util.stream.Collectors;
+
+public class Collect {
+  class Person {}
+
+  void collectNames(List<Person> persons){
+    List<Person> names = persons.stream().collect(Collectors.toList());
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter.java
new file mode 100644
index 0000000..8686570
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter.java
@@ -0,0 +1,13 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+class Sample {
+  public static void main(List<String> testTags) {
+    final List<String> resultJava7 = new ArrayList<>(testTags.size());
+      testTags.stream().filter(tag -> !resultJava7.contains(tag.trim())).forEach(tag -> {
+          resultJava7.add(tag.trim());
+      });
+
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter1.java
new file mode 100644
index 0000000..c081b1b
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter1.java
@@ -0,0 +1,11 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+abstract class Sample implements List<String> {
+  void main() {
+      this.stream().filter(tag -> !contains(tag.trim())).forEach(tag -> {
+          add(tag.trim());
+      });
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter2.java
new file mode 100644
index 0000000..c0a135f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter2.java
@@ -0,0 +1,13 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+abstract class Sample implements List<String> {
+  void main() {
+      this.stream().filter(tag -> !foo(this)).forEach(tag -> {
+          add(tag.trim());
+      });
+  }
+  
+  static boolean foo(List<String> a){ return false;}
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter3.java
new file mode 100644
index 0000000..2813cdf
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter3.java
@@ -0,0 +1,13 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+class Sample extends ArrayList<String> {
+  void main() {
+      this.stream().filter(tag -> !super.contains(tag)).forEach(tag -> {
+          add(tag.trim());
+      });
+  }
+  
+  static boolean foo(List<String> a){ return false;}
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter4.java
new file mode 100644
index 0000000..8488d78
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterCollectionDependencyInFilter4.java
@@ -0,0 +1,17 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+class Sample {
+  public static void main(List<String> testTags) {
+    final List<String> resultJava7 = new ArrayList<>(testTags.size());
+      testTags.stream().filter(tag -> !foo(resultJava7)).forEach(tag -> {
+          resultJava7.add(tag.trim());
+      });
+
+  }
+  
+  static boolean foo(List<String> l) {
+    return false;
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterMissedBraces.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterMissedBraces.java
new file mode 100644
index 0000000..6cfe43a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/afterMissedBraces.java
@@ -0,0 +1,13 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+class Sample {
+  List<String> foo = new ArrayList<>();
+  String foo(){
+      foo.stream().filter(s -> s == null).forEach(s -> {
+          int i = 0;
+      });
+    return null;
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCastInIterValue.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCastInIterValue.java
new file mode 100644
index 0000000..12a4d0e
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCastInIterValue.java
@@ -0,0 +1,15 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+class Sample {
+  List<String> foo = new ArrayList<>();
+  String foo(){
+    for (String s : (List<String>)fo<caret>o) {
+      if (s == null) {
+        System.out.println(s);
+      }
+    }
+    return null;
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectIdentityMap.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectIdentityMap.java
new file mode 100644
index 0000000..9f708f6
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectIdentityMap.java
@@ -0,0 +1,13 @@
+// "Replace with collect" "true"
+import java.util.*;
+
+public class Collect {
+  class Person {}
+
+  void collectNames(List<Person> persons){
+    List<Person> names = new ArrayList<>();
+    for (Person person : pers<caret>ons) {
+      names.add(person);
+    }
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter.java
new file mode 100644
index 0000000..b0844f2
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter.java
@@ -0,0 +1,15 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+class Sample {
+  public static void main(List<String> testTags) {
+    final List<String> resultJava7 = new ArrayList<>(testTags.size());
+    for (final String tag : tes<caret>tTags) {
+      if (!resultJava7.contains(tag.trim())) {
+        resultJava7.add(tag.trim());
+      }
+    }
+
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter1.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter1.java
new file mode 100644
index 0000000..0cfc956
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter1.java
@@ -0,0 +1,13 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+abstract class Sample implements List<String> {
+  void main() {
+    for (final String tag : t<caret>his) {
+      if (!contains(tag.trim())) {
+        add(tag.trim());
+      }
+    }
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter2.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter2.java
new file mode 100644
index 0000000..aae55cf
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter2.java
@@ -0,0 +1,15 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+abstract class Sample implements List<String> {
+  void main() {
+    for (final String tag : t<caret>his) {
+      if (!foo(this)) {
+        add(tag.trim());
+      }
+    }
+  }
+  
+  static boolean foo(List<String> a){ return false;}
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter3.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter3.java
new file mode 100644
index 0000000..16f612a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter3.java
@@ -0,0 +1,15 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+class Sample extends ArrayList<String> {
+  void main() {
+    for (final String tag : t<caret>his) {
+      if (!super.contains(tag)) {
+        add(tag.trim());
+      }
+    }
+  }
+  
+  static boolean foo(List<String> a){ return false;}
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter4.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter4.java
new file mode 100644
index 0000000..92831a2
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeCollectionDependencyInFilter4.java
@@ -0,0 +1,19 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+class Sample {
+  public static void main(List<String> testTags) {
+    final List<String> resultJava7 = new ArrayList<>(testTags.size());
+    for (final String tag : tes<caret>tTags) {
+      if (!foo(resultJava7)) {
+        resultJava7.add(tag.trim());
+      }
+    }
+
+  }
+  
+  static boolean foo(List<String> l) {
+    return false;
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeMissedBraces.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeMissedBraces.java
new file mode 100644
index 0000000..f366f2f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/streamApiMigration/beforeMissedBraces.java
@@ -0,0 +1,13 @@
+// "Replace with forEach" "true"
+import java.util.ArrayList;
+import java.util.List;
+
+class Sample {
+  List<String> foo = new ArrayList<>();
+  String foo(){
+    for (String s : fo<caret>o) {
+      if (s == null) int i = 0;
+    }
+    return null;
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterInsideExpression.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterInsideExpression.java
new file mode 100644
index 0000000..8fe63b4
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterInsideExpression.java
@@ -0,0 +1,7 @@
+// "Remove redundant assignment" "true"
+class A {
+  public static void main(String[] args) {
+    int x = 3 * 4;
+    System.out.println(x);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterNoSideEffect.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterNoSideEffect.java
new file mode 100644
index 0000000..6819587
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterNoSideEffect.java
@@ -0,0 +1,8 @@
+// "Remove redundant assignment" "true"
+class A {
+    void m() {
+        int i;
+        i = 0;
+        System.out.println(i);
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterParameterAssignment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterParameterAssignment.java
new file mode 100644
index 0000000..6d20a3f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterParameterAssignment.java
@@ -0,0 +1,7 @@
+// "Remove redundant assignment" "true"
+class A {
+    void m(int i) {
+        i = 0;
+        System.out.println(i);
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterSideEffect.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterSideEffect.java
new file mode 100644
index 0000000..acbbf18
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/afterSideEffect.java
@@ -0,0 +1,15 @@
+// "Remove redundant assignment" "true"
+class A {
+  A a = null;
+  String m(String str) {
+    return str;
+  }
+
+  {
+    String ss = "";
+
+    System.out.println();
+
+      a.m(ss);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeInsideExpression.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeInsideExpression.java
new file mode 100644
index 0000000..4449c9c
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeInsideExpression.java
@@ -0,0 +1,7 @@
+// "Remove redundant assignment" "true"
+class A {
+  public static void main(String[] args) {
+    int x = (<caret>x = 3) * 4;
+    System.out.println(x);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeNoSideEffect.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeNoSideEffect.java
new file mode 100644
index 0000000..1c8b767
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeNoSideEffect.java
@@ -0,0 +1,9 @@
+// "Remove redundant assignment" "true"
+class A {
+    void m() {
+        int i;
+        <caret>i = 9;
+        i = 0;
+        System.out.println(i);
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeParameterAssignment.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeParameterAssignment.java
new file mode 100644
index 0000000..d65c371
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeParameterAssignment.java
@@ -0,0 +1,8 @@
+// "Remove redundant assignment" "true"
+class A {
+    void m(int i) {
+        <caret>i = 9;
+        i = 0;
+        System.out.println(i);
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeSideEffect.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeSideEffect.java
new file mode 100644
index 0000000..014f3fc
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment/beforeSideEffect.java
@@ -0,0 +1,15 @@
+// "Remove redundant assignment" "true"
+class A {
+  A a = null;
+  String m(String str) {
+    return str;
+  }
+
+  {
+    String ss = "";
+
+    System.out.println();
+
+    s<caret>s = a.m(ss);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enter.java b/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enter.java
new file mode 100644
index 0000000..7294483
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enter.java
@@ -0,0 +1,5 @@
+public class Shakespeare {
+  void quote() {
+    String theQuote = "A fool thinks himself to be wise, <caret>but a wise man knows himself to be a fool.";
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enterOpSignOnNextLine.java b/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enterOpSignOnNextLine.java
new file mode 100644
index 0000000..7294483
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enterOpSignOnNextLine.java
@@ -0,0 +1,5 @@
+public class Shakespeare {
+  void quote() {
+    String theQuote = "A fool thinks himself to be wise, <caret>but a wise man knows himself to be a fool.";
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enterOpSignOnNextLine_after.java b/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enterOpSignOnNextLine_after.java
new file mode 100644
index 0000000..b557643
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enterOpSignOnNextLine_after.java
@@ -0,0 +1,6 @@
+public class Shakespeare {
+  void quote() {
+    String theQuote = "A fool thinks himself to be wise, " 
+            + "<caret>but a wise man knows himself to be a fool.";
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enter_after.java b/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enter_after.java
new file mode 100644
index 0000000..d920597
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/editorActions/stringLiteral/enter_after.java
@@ -0,0 +1,6 @@
+public class Shakespeare {
+  void quote() {
+    String theQuote = "A fool thinks himself to be wise, " +
+            "<caret>but a wise man knows himself to be a fool.";
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterAbstractClass.java b/java/java-tests/testData/codeInsight/generateConstructor/afterAbstractClass.java
index 6e850b1..bbf363c 100644
--- a/java/java-tests/testData/codeInsight/generateConstructor/afterAbstractClass.java
+++ b/java/java-tests/testData/codeInsight/generateConstructor/afterAbstractClass.java
@@ -1,4 +1,4 @@
 public abstract class Test {
-    protected Test() {<caret>
+    public Test() {<caret>
     }
 }
diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence.java b/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence.java
index 9ae5a0b..d783ba3 100644
--- a/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence.java
+++ b/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence.java
@@ -1,7 +1,7 @@
 class Parent {
     Object menu;
 
-    Parent(Object menu) {
+    public Parent(Object menu) {
         this.menu = menu;
     }
 }
diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence1.java b/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence1.java
index 29be0de..3b3c4ac 100644
--- a/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence1.java
+++ b/java/java-tests/testData/codeInsight/generateConstructor/afterFieldPrefixCoincidence1.java
@@ -1,7 +1,7 @@
 class Test {
   private int _foo;
 
-    Test(int foo) {
+    public Test(int foo) {
         _foo = foo;
     }
 }
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java b/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java
index bd402a9..afac816 100644
--- a/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java
+++ b/java/java-tests/testData/codeInsight/generateConstructor/afterFinalFieldPreselection.java
@@ -4,7 +4,7 @@
     private int c;
     private final int d;
 
-    Test(int b, int d) {
+    public Test(int b, int d) {
         this.b = b;
         this.d = d;
     }
diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterImmediatelyAfterRBrace.java b/java/java-tests/testData/codeInsight/generateConstructor/afterImmediatelyAfterRBrace.java
index f5b9858..84e94c5 100644
--- a/java/java-tests/testData/codeInsight/generateConstructor/afterImmediatelyAfterRBrace.java
+++ b/java/java-tests/testData/codeInsight/generateConstructor/afterImmediatelyAfterRBrace.java
@@ -1,5 +1,5 @@
 class A
 {
-    A() {
+    public A() {<caret>
     }
 }
diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterPackageLocalClass.java b/java/java-tests/testData/codeInsight/generateConstructor/afterPackageLocalClass.java
index 0d9b0ad..8a88580 100644
--- a/java/java-tests/testData/codeInsight/generateConstructor/afterPackageLocalClass.java
+++ b/java/java-tests/testData/codeInsight/generateConstructor/afterPackageLocalClass.java
@@ -1,4 +1,4 @@
 class Test {
-    Test() {<caret>
+    public Test() {<caret>
     }
 }
diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterPrivateClass.java b/java/java-tests/testData/codeInsight/generateConstructor/afterPrivateClass.java
index 1990616..e0f4177 100644
--- a/java/java-tests/testData/codeInsight/generateConstructor/afterPrivateClass.java
+++ b/java/java-tests/testData/codeInsight/generateConstructor/afterPrivateClass.java
@@ -1,6 +1,6 @@
 class Test {
   private class Foo {
-      private Foo() {<caret>
+      public Foo() {<caret>
       }
   }
 }
diff --git a/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java b/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java
index f457956..696adcc 100644
--- a/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java
+++ b/java/java-tests/testData/codeInsight/generateConstructor/afterSubstitution.java
@@ -7,7 +7,7 @@
 }
 
 class Child<Integer> extends Parent<Integer> {
-    Child(Integer field) {
+    public Child(Integer field) {
         super(field);
     }
 }
diff --git a/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIf.java b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIf.java
new file mode 100644
index 0000000..9fab2d2
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIf.java
@@ -0,0 +1,11 @@
+class Test {
+  boolean foo() {
+    return true;
+  }
+  
+  void bar() {
+    if (true) {
+    }
+    else <selection>foo()</selection>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIfElse.java b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIfElse.java
new file mode 100644
index 0000000..9fab2d2
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIfElse.java
@@ -0,0 +1,11 @@
+class Test {
+  boolean foo() {
+    return true;
+  }
+  
+  void bar() {
+    if (true) {
+    }
+    else <selection>foo()</selection>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIfElse_after.java b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIfElse_after.java
new file mode 100644
index 0000000..1735bec
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIfElse_after.java
@@ -0,0 +1,14 @@
+class Test {
+  boolean foo() {
+    return true;
+  }
+  
+  void bar() {
+    if (true) {
+    }
+    else if (foo()) {
+        <caret>
+    } else {
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIf_after.java b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIf_after.java
new file mode 100644
index 0000000..f410dc4
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/generation/surroundWith/java/SurroundExpressionWithElseIf_after.java
@@ -0,0 +1,13 @@
+class Test {
+  boolean foo() {
+    return true;
+  }
+  
+  void bar() {
+    if (true) {
+    }
+    else if (foo()) {
+        <caret>
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/javadocIG/classTypeParamsPresentation.html b/java/java-tests/testData/codeInsight/javadocIG/classTypeParamsPresentation.html
index 789ba10..ea45f5f 100644
--- a/java/java-tests/testData/codeInsight/javadocIG/classTypeParamsPresentation.html
+++ b/java/java-tests/testData/codeInsight/javadocIG/classTypeParamsPresentation.html
@@ -1,3 +1,3 @@
 [&lt; java 1.7 &gt;] java.util
- public class java.util.ArrayList&lt;E&gt; extends java.util.AbstractList&lt;E&gt;
+ public class ArrayList&lt;E&gt; extends java.util.AbstractList&lt;E&gt;
  implements java.util.List&lt;E&gt;, java.util.RandomAccess, java.lang.Cloneable, java.io.Serializable
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/completion/doNotCompleteTemplateInMultiCaretMode.java b/java/java-tests/testData/codeInsight/template/postfix/completion/doNotCompleteTemplateInMultiCaretMode.java
new file mode 100644
index 0000000..31f0bd6
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/completion/doNotCompleteTemplateInMultiCaretMode.java
@@ -0,0 +1,8 @@
+import java.lang.Object;
+
+public class Foo {
+  void m() {
+    new Object().inst<caret>
+    new Object().inst<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/completion/doNotCompleteTemplateInMultiCaretMode_after.java b/java/java-tests/testData/codeInsight/template/postfix/completion/doNotCompleteTemplateInMultiCaretMode_after.java
new file mode 100644
index 0000000..31f0bd6
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/completion/doNotCompleteTemplateInMultiCaretMode_after.java
@@ -0,0 +1,8 @@
+import java.lang.Object;
+
+public class Foo {
+  void m() {
+    new Object().inst<caret>
+    new Object().inst<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/completion/doNotShowTemplateInMultiCaretMode.java b/java/java-tests/testData/codeInsight/template/postfix/completion/doNotShowTemplateInMultiCaretMode.java
new file mode 100644
index 0000000..8cedb76
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/completion/doNotShowTemplateInMultiCaretMode.java
@@ -0,0 +1,8 @@
+import java.lang.Object;
+
+public class Foo {
+    void m() {
+        new Object().<caret>
+        new Object().<caret>
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/completion/shouldNotExpandInMultiCaretMode.java b/java/java-tests/testData/codeInsight/template/postfix/completion/shouldNotExpandInMultiCaretMode.java
new file mode 100644
index 0000000..7a4651f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/completion/shouldNotExpandInMultiCaretMode.java
@@ -0,0 +1,9 @@
+class A {
+  Object foo;
+  Object bar;
+
+  public static void main(String[] args) {
+    foo == null<caret>
+    bar == null<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/completion/shouldNotExpandInMultiCaretMode_after.java b/java/java-tests/testData/codeInsight/template/postfix/completion/shouldNotExpandInMultiCaretMode_after.java
new file mode 100644
index 0000000..076ce16
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/completion/shouldNotExpandInMultiCaretMode_after.java
@@ -0,0 +1,9 @@
+class A {
+  Object foo;
+  Object bar;
+
+  public static void main(String[] args) {
+    foo == null.if  <caret>
+    bar == null.if  <caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/format/notString.java b/java/java-tests/testData/codeInsight/template/postfix/templates/format/notString.java
new file mode 100644
index 0000000..f95b6df
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/format/notString.java
@@ -0,0 +1,7 @@
+package templates;
+
+public class Foo {
+  void m(boolean b, int value) {
+    b.format<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/format/notString_after.java b/java/java-tests/testData/codeInsight/template/postfix/templates/format/notString_after.java
new file mode 100644
index 0000000..e828f4d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/format/notString_after.java
@@ -0,0 +1,7 @@
+package templates;
+
+public class Foo {
+  void m(boolean b, int value) {
+    b.format    <caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/format/string.java b/java/java-tests/testData/codeInsight/template/postfix/templates/format/string.java
new file mode 100644
index 0000000..0cd8302
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/format/string.java
@@ -0,0 +1,7 @@
+package templates;
+
+public class Foo {
+  void m(boolean b, int value) {
+      "m()".format<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/format/string_after.java b/java/java-tests/testData/codeInsight/template/postfix/templates/format/string_after.java
new file mode 100644
index 0000000..a0b3172
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/format/string_after.java
@@ -0,0 +1,7 @@
+package templates;
+
+public class Foo {
+  void m(boolean b, int value) {
+      String.format("m()", <caret>);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/notnull/elseStatement.java b/java/java-tests/testData/codeInsight/template/postfix/templates/notnull/elseStatement.java
new file mode 100644
index 0000000..477a154
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/notnull/elseStatement.java
@@ -0,0 +1,8 @@
+public class Foo {
+    void m(Object o) {
+        if (true) {
+          
+        }
+        else o.notnull<caret>
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/notnull/elseStatement_after.java b/java/java-tests/testData/codeInsight/template/postfix/templates/notnull/elseStatement_after.java
new file mode 100644
index 0000000..97da48f
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/notnull/elseStatement_after.java
@@ -0,0 +1,10 @@
+public class Foo {
+    void m(Object o) {
+        if (true) {
+
+        }
+        else if (o != null) {
+            <caret>
+        }
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/sout/simple.java b/java/java-tests/testData/codeInsight/template/postfix/templates/sout/simple.java
new file mode 100644
index 0000000..80da2b8
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/sout/simple.java
@@ -0,0 +1,7 @@
+package templates;
+
+public class Foo {
+  void m(boolean b, int value) {
+    b.sout<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/sout/simple_after.java b/java/java-tests/testData/codeInsight/template/postfix/templates/sout/simple_after.java
new file mode 100644
index 0000000..3b0a8dd
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/sout/simple_after.java
@@ -0,0 +1,7 @@
+package templates;
+
+public class Foo {
+  void m(boolean b, int value) {
+      System.out.println(b);<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/sout/void.java b/java/java-tests/testData/codeInsight/template/postfix/templates/sout/void.java
new file mode 100644
index 0000000..b99a577
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/sout/void.java
@@ -0,0 +1,7 @@
+package templates;
+
+public class Foo {
+  void m(boolean b, int value) {
+    m().sout<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/sout/void_after.java b/java/java-tests/testData/codeInsight/template/postfix/templates/sout/void_after.java
new file mode 100644
index 0000000..4e08abc
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/sout/void_after.java
@@ -0,0 +1,7 @@
+package templates;
+
+public class Foo {
+  void m(boolean b, int value) {
+    m().sout    <caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/try/multiStatement.java b/java/java-tests/testData/codeInsight/template/postfix/templates/try/multiStatement.java
new file mode 100644
index 0000000..6b64472
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/try/multiStatement.java
@@ -0,0 +1,7 @@
+public class Foo {
+    void m() {
+        somevalue.try<caret>
+        int i=0;
+
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/try/multiStatement_after.java b/java/java-tests/testData/codeInsight/template/postfix/templates/try/multiStatement_after.java
new file mode 100644
index 0000000..cf2395d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/try/multiStatement_after.java
@@ -0,0 +1,11 @@
+public class Foo {
+    void m() {
+        try {
+            somevalue<caret>
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        int i=0;
+
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/try/notStatement.java b/java/java-tests/testData/codeInsight/template/postfix/templates/try/notStatement.java
new file mode 100644
index 0000000..bec0827
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/try/notStatement.java
@@ -0,0 +1,3 @@
+public class Foo.try<caret> {
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/try/notStatement_after.java b/java/java-tests/testData/codeInsight/template/postfix/templates/try/notStatement_after.java
new file mode 100644
index 0000000..59c9b04
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/try/notStatement_after.java
@@ -0,0 +1,3 @@
+public class Foo.try    <caret> {
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/try/simple.java b/java/java-tests/testData/codeInsight/template/postfix/templates/try/simple.java
new file mode 100644
index 0000000..d77e002
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/try/simple.java
@@ -0,0 +1,5 @@
+public class Foo {
+    void m() {
+        somevalue.try<caret>
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/try/simple_after.java b/java/java-tests/testData/codeInsight/template/postfix/templates/try/simple_after.java
new file mode 100644
index 0000000..bf0347a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/try/simple_after.java
@@ -0,0 +1,9 @@
+public class Foo {
+    void m() {
+        try {
+            somevalue<caret>
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/try/statement.java b/java/java-tests/testData/codeInsight/template/postfix/templates/try/statement.java
new file mode 100644
index 0000000..e68cb69
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/try/statement.java
@@ -0,0 +1,5 @@
+public class Foo {
+    void m() {
+        Object o = new Object().try<caret>
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/template/postfix/templates/try/statement_after.java b/java/java-tests/testData/codeInsight/template/postfix/templates/try/statement_after.java
new file mode 100644
index 0000000..41f8cc1
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/template/postfix/templates/try/statement_after.java
@@ -0,0 +1,9 @@
+public class Foo {
+    void m() {
+        try {
+            Object o = new Object()<caret>
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretIndentLBrace_after.java b/java/java-tests/testData/codeInsight/typing/multicaretIndentLBrace_after.java
new file mode 100644
index 0000000..31d1689
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretIndentLBrace_after.java
@@ -0,0 +1,8 @@
+class Foo {
+  void m() {
+    if (true)
+    {<caret>
+    if (true)
+    {<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretIndentLBrace_before.java b/java/java-tests/testData/codeInsight/typing/multicaretIndentLBrace_before.java
new file mode 100644
index 0000000..cc7542d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretIndentLBrace_before.java
@@ -0,0 +1,8 @@
+class Foo {
+  void m() {
+    if (true)
+      <caret>
+    if (true)
+      <caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretIndentRBrace_after.java b/java/java-tests/testData/codeInsight/typing/multicaretIndentRBrace_after.java
new file mode 100644
index 0000000..dd2d47d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretIndentRBrace_after.java
@@ -0,0 +1,10 @@
+class Foo {
+  void m() {
+    if (true) {
+        System.out.println();
+    }<caret>
+    if (true) {
+        System.out.println();
+    }<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretIndentRBrace_before.java b/java/java-tests/testData/codeInsight/typing/multicaretIndentRBrace_before.java
new file mode 100644
index 0000000..386e2e2
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretIndentRBrace_before.java
@@ -0,0 +1,10 @@
+class Foo {
+  void m() {
+    if (true) {
+    System.out.println();
+    <caret>
+    if (true) {
+    System.out.println();
+    <caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretInsertGt_after.java b/java/java-tests/testData/codeInsight/typing/multicaretInsertGt_after.java
new file mode 100644
index 0000000..5779f88
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretInsertGt_after.java
@@ -0,0 +1,10 @@
+class Foo {
+  void m() {
+    if (true) {
+      List<<caret>>
+    }
+    if (true) {
+      List<<caret>>
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretInsertGt_before.java b/java/java-tests/testData/codeInsight/typing/multicaretInsertGt_before.java
new file mode 100644
index 0000000..fa17fc8
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretInsertGt_before.java
@@ -0,0 +1,10 @@
+class Foo {
+  void m() {
+    if (true) {
+      List<caret>
+    }
+    if (true) {
+      List<caret>
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretInsertQuote_after.java b/java/java-tests/testData/codeInsight/typing/multicaretInsertQuote_after.java
new file mode 100644
index 0000000..bef6962
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretInsertQuote_after.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    System.out.println("<caret>");
+    System.out.println("<caret>");
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretInsertQuote_before.java b/java/java-tests/testData/codeInsight/typing/multicaretInsertQuote_before.java
new file mode 100644
index 0000000..c0716b5
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretInsertQuote_before.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    System.out.println(<caret>);
+    System.out.println(<caret>);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretInsertRParen_after.java b/java/java-tests/testData/codeInsight/typing/multicaretInsertRParen_after.java
new file mode 100644
index 0000000..ec85a67
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretInsertRParen_after.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    System.exit(<caret>)
+    System.exit(<caret>)
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretInsertRParen_before.java b/java/java-tests/testData/codeInsight/typing/multicaretInsertRParen_before.java
new file mode 100644
index 0000000..594fa91
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretInsertRParen_before.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    System.exit<caret>
+    System.exit<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretSkipGt_after.java b/java/java-tests/testData/codeInsight/typing/multicaretSkipGt_after.java
new file mode 100644
index 0000000..432129e
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretSkipGt_after.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    java.util.List<String> l1 = new java.util.ArrayList<><caret>();
+    java.util.List<String> l2 = new java.util.ArrayList<><caret>();
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretSkipGt_before.java b/java/java-tests/testData/codeInsight/typing/multicaretSkipGt_before.java
new file mode 100644
index 0000000..7fe0a60
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretSkipGt_before.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    java.util.List<String> l1 = new java.util.ArrayList<<caret>>();
+    java.util.List<String> l2 = new java.util.ArrayList<<caret>>();
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretSkipQuote_after.java b/java/java-tests/testData/codeInsight/typing/multicaretSkipQuote_after.java
new file mode 100644
index 0000000..a2ce5c5
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretSkipQuote_after.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    System.out.println(""<caret>);
+    System.out.println(""<caret>);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretSkipQuote_before.java b/java/java-tests/testData/codeInsight/typing/multicaretSkipQuote_before.java
new file mode 100644
index 0000000..bef6962
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretSkipQuote_before.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    System.out.println("<caret>");
+    System.out.println("<caret>");
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretSkipRParen_after.java b/java/java-tests/testData/codeInsight/typing/multicaretSkipRParen_after.java
new file mode 100644
index 0000000..45324ed
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretSkipRParen_after.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    System.exit()<caret>
+    System.exit()<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretSkipRParen_before.java b/java/java-tests/testData/codeInsight/typing/multicaretSkipRParen_before.java
new file mode 100644
index 0000000..ec85a67
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretSkipRParen_before.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    System.exit(<caret>)
+    System.exit(<caret>)
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretSkipSemicolon_after.java b/java/java-tests/testData/codeInsight/typing/multicaretSkipSemicolon_after.java
new file mode 100644
index 0000000..0e0ddba
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretSkipSemicolon_after.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    System.out.println();<caret>
+    System.out.println();<caret>
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/typing/multicaretSkipSemicolon_before.java b/java/java-tests/testData/codeInsight/typing/multicaretSkipSemicolon_before.java
new file mode 100644
index 0000000..cadfb33
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/typing/multicaretSkipSemicolon_before.java
@@ -0,0 +1,6 @@
+class Foo {
+  void m() {
+    System.out.println()<caret>;
+    System.out.println()<caret>;
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput.log b/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput.log
new file mode 100644
index 0000000..1f87c34
--- /dev/null
+++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput.log
@@ -0,0 +1,15 @@
+Compiling files:
+moduleA/src/com/ppp/Inner.java
+End of files
+Cleaning output files:
+out/com/ppp/B.class
+End of files
+Compiling files:
+moduleB/src/com/ppp/B.java
+End of files
+Cleaning output files:
+out/com/ppp/B.class
+End of files
+Compiling files:
+moduleB/src/com/ppp/B.java
+End of files
diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleA/src/com/ppp/Inner.java.new b/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleA/src/com/ppp/Inner.java.new
new file mode 100644
index 0000000..b274897
--- /dev/null
+++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleA/src/com/ppp/Inner.java.new
@@ -0,0 +1,4 @@
+package com.ppp;
+
+class Inner {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleB/src/com/ppp/B.java b/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleB/src/com/ppp/B.java
new file mode 100644
index 0000000..da7cb3f
--- /dev/null
+++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleB/src/com/ppp/B.java
@@ -0,0 +1,6 @@
+package com.ppp;
+
+public class B {
+  private Inner inner;
+}
+
diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleB/src/com/ppp/Inner.java b/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleB/src/com/ppp/Inner.java
new file mode 100644
index 0000000..5ffa576
--- /dev/null
+++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleB/src/com/ppp/Inner.java
@@ -0,0 +1,5 @@
+package com.ppp;
+
+class Inner {
+}
+
diff --git a/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleB/src/com/ppp/Inner.java.remove b/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleB/src/com/ppp/Inner.java.remove
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/java/java-tests/testData/compileServer/incremental/common/moveClassToDependentModuleWithSameOutput/moduleB/src/com/ppp/Inner.java.remove
diff --git a/java/java-tests/testData/inspection/dataFlow/boxingBoolean/expected.xml b/java/java-tests/testData/inspection/dataFlow/boxingBoolean/expected.xml
index d04ea28..e04ae9d 100644
--- a/java/java-tests/testData/inspection/dataFlow/boxingBoolean/expected.xml
+++ b/java/java-tests/testData/inspection/dataFlow/boxingBoolean/expected.xml
@@ -33,7 +33,7 @@
   <problem>
     <file>Test.java</file>
     <line>51</line>
-    <description>Condition &lt;code&gt;o&lt;/code&gt; at the left side of assignment expression is always &lt;code&gt;false&lt;/code&gt;. Can be simplified to normal assignment.</description>
+    <description>Condition &lt;code&gt;o&lt;/code&gt; at the left side of assignment expression is always &lt;code&gt;false&lt;/code&gt;. Can be simplified.</description>
   </problem>
 
 </problems>
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ComparingToNotNullShouldNotAffectNullity.java b/java/java-tests/testData/inspection/dataFlow/fixture/ComparingToNotNullShouldNotAffectNullity.java
index fed3d1b..98c26df 100644
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ComparingToNotNullShouldNotAffectNullity.java
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/ComparingToNotNullShouldNotAffectNullity.java
@@ -18,6 +18,27 @@
       if (first == getObj() || collection.size() > 0) {
         System.out.println(first.hashCode());
       }
+      if (<warning descr="Condition 'first == null' is always 'false'">first == null</warning>) {
+        System.out.println(first.hashCode());
+      }
+    }
+  }
+
+  void foo2(Collection<Object> collection) {
+    if (!collection.isEmpty()) {
+      Object first = collection.iterator().next();
+      if (first != getObj() || collection.size() > 0) {
+        first.hashCode();
+      }
+    }
+  }
+
+  void foo3(Collection<Object> collection) {
+    if (!collection.isEmpty()) {
+      Object first = collection.iterator().next();
+      if (first == getObj() || collection.size() > 2) {
+        System.out.println(first.hashCode());
+      }
       if (first == null) {
         System.out.println(<warning descr="Method invocation 'first.hashCode()' may produce 'java.lang.NullPointerException'">first.hashCode()</warning>);
       }
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ContractVarargs.java b/java/java-tests/testData/inspection/dataFlow/fixture/ContractVarargs.java
new file mode 100644
index 0000000..e65bc87
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/ContractVarargs.java
@@ -0,0 +1,39 @@
+import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+class Contracts {
+
+  public void simpleFail(@Nullable String message) {
+    notBlank(message);
+    log(message);
+  }
+
+  @Contract("_->fail")
+  private void notBlank(@Nullable Object message) {
+
+  }
+
+  @Contract("_,_,_->fail")
+  private void notBlank(@Nullable Object o, String message, Object... args) {
+
+  }
+
+  public void varargFail(@Nullable String message) {
+    notBlank(message, "Message should not be blank");
+    log(message);
+  }
+
+  public void vararg1(@Nullable String message) {
+    notBlank(message, "Message should not be blank", new Object());
+    log(message);
+  }
+  public void vararg2(@Nullable String message) {
+    notBlank(message, "Message should not be blank", new Object(), new Object());
+    log(message);
+  }
+
+  public void log(@NotNull String message) {
+    System.out.println(message);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NotNullAfterDereference.java b/java/java-tests/testData/inspection/dataFlow/fixture/NotNullAfterDereference.java
new file mode 100644
index 0000000..5c6dc81
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/NotNullAfterDereference.java
@@ -0,0 +1,9 @@
+class Foo {
+
+  private void someMethod(String someArg) {
+    someArg.getClass();
+    if (<warning descr="Condition 'someArg == null' is always 'false'">someArg == null</warning>) {
+      System.err.println("Wrong argument");
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/NullableBoolean.java b/java/java-tests/testData/inspection/dataFlow/fixture/NullableBoolean.java
new file mode 100644
index 0000000..3675633
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/NullableBoolean.java
@@ -0,0 +1,23 @@
+import org.jetbrains.annotations.Nullable;
+
+import java.util.List;
+
+class Foo {
+
+  public static void main(@Nullable Boolean hasMissingGems, List<String> missing) {
+    if (hasMissingGems != null && hasMissingGems) {
+      return;
+    }
+
+    if (hasMissingGems == null && missing.size() > 0) {
+
+    }
+
+  }
+  public static void main2(@Nullable Boolean hasMissingGems, List<String> missing) {
+    if ((hasMissingGems != null && hasMissingGems) || (hasMissingGems == null && missing.size() > 0)) {
+
+    }
+
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences.java
index 7f727f9..d81b467 100644
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences.java
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences.java
@@ -16,4 +16,10 @@
     return foo;
   }
 
+  public void testDontReplaceQualifierWithNull(Object bar) {
+    if (bar == null) {
+      <warning descr="Method invocation 'bar.hashCode()' may produce 'java.lang.NullPointerException'">bar.hashCode()</warning>;
+    }
+  }
+
 }
\ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_after.java b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_after.java
index feb147c..0d18739 100644
--- a/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_after.java
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/ReportConstantReferences_after.java
@@ -16,4 +16,10 @@
     return foo;
   }
 
+  public void testDontReplaceQualifierWithNull(Object bar) {
+    if (bar == null) {
+      bar.hashCode();
+    }
+  }
+
 }
\ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/TrueOrEqualsSomething.java b/java/java-tests/testData/inspection/dataFlow/fixture/TrueOrEqualsSomething.java
new file mode 100644
index 0000000..a41172b
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/TrueOrEqualsSomething.java
@@ -0,0 +1,9 @@
+class Contracts {
+
+  private boolean method(boolean a) {
+      boolean b = true;
+      <warning descr="Condition 'b' at the left side of assignment expression is always 'true'. Can be simplified"><caret>b</warning> |= a;
+      return b;
+  }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/inspection/dataFlow/fixture/TrueOrEqualsSomething_after.java b/java/java-tests/testData/inspection/dataFlow/fixture/TrueOrEqualsSomething_after.java
new file mode 100644
index 0000000..8e7695f
--- /dev/null
+++ b/java/java-tests/testData/inspection/dataFlow/fixture/TrueOrEqualsSomething_after.java
@@ -0,0 +1,8 @@
+class Contracts {
+
+  private boolean method(boolean a) {
+      boolean b = true;
+      return b;
+  }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/inspection/redundantCast/generics/BoxingTopCast/expected.xml b/java/java-tests/testData/inspection/redundantCast/generics/BoxingTopCast/expected.xml
new file mode 100644
index 0000000..4704d91
--- /dev/null
+++ b/java/java-tests/testData/inspection/redundantCast/generics/BoxingTopCast/expected.xml
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<problems/>
\ No newline at end of file
diff --git a/java/java-tests/testData/inspection/redundantCast/generics/BoxingTopCast/src/BoxingTopCast.java b/java/java-tests/testData/inspection/redundantCast/generics/BoxingTopCast/src/BoxingTopCast.java
new file mode 100644
index 0000000..148422b
--- /dev/null
+++ b/java/java-tests/testData/inspection/redundantCast/generics/BoxingTopCast/src/BoxingTopCast.java
@@ -0,0 +1,20 @@
+class TestCasting
+{
+  public void testRedundantCast() throws Exception
+  {
+    Object o = getObject();
+    double d = 0.0;
+
+    if( o instanceof Integer )
+    {
+      d = (double) (Integer)o;
+    }
+
+    System.out.println( "d = " + d );
+  }
+
+  private Object getObject()
+  {
+    return new Integer(42);
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/moduleRootManager/rootsChanged/emptyModule/a.iml b/java/java-tests/testData/moduleRootManager/rootsChanged/emptyModule/a.iml
new file mode 100644
index 0000000..ddf828e
--- /dev/null
+++ b/java/java-tests/testData/moduleRootManager/rootsChanged/emptyModule/a.iml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
+
diff --git a/java/java-tests/testData/psi/cls/mirror/Class.txt b/java/java-tests/testData/psi/cls/mirror/Class.txt
new file mode 100644
index 0000000..59d7e4d
--- /dev/null
+++ b/java/java-tests/testData/psi/cls/mirror/Class.txt
@@ -0,0 +1,385 @@
+
+  // IntelliJ API Decompiler stub source generated from a class file
+  // Implementation of methods is not available
+
+package java.lang;
+
+public final class Class <T> implements java.io.Serializable, java.lang.reflect.GenericDeclaration, java.lang.reflect.Type, java.lang.reflect.AnnotatedElement {
+    private static final int ANNOTATION = 8192;
+    private static final int ENUM = 16384;
+    private static final int SYNTHETIC = 4096;
+    private transient volatile java.lang.reflect.Constructor<T> cachedConstructor;
+    private transient volatile java.lang.Class<?> newInstanceCallerCache;
+    private transient java.lang.String name;
+    private static java.security.ProtectionDomain allPermDomain;
+    private static boolean useCaches;
+    private transient volatile java.lang.ref.SoftReference<java.lang.Class.ReflectionData<T>> reflectionData;
+    private transient volatile int classRedefinedCount;
+    private transient volatile sun.reflect.generics.repository.ClassRepository genericInfo;
+    private static final long serialVersionUID = 3206093459760846163L;
+    private static final java.io.ObjectStreamField[] serialPersistentFields;
+    private static sun.reflect.ReflectionFactory reflectionFactory;
+    private static boolean initted;
+    private transient volatile T[] enumConstants;
+    private transient volatile java.util.Map<java.lang.String,T> enumConstantDirectory;
+    private transient volatile java.lang.Class.AnnotationData annotationData;
+    private transient volatile sun.reflect.annotation.AnnotationType annotationType;
+    transient java.lang.ClassValue.ClassValueMap classValueMap;
+
+    private static native void registerNatives();
+
+    private Class() { /* compiled code */ }
+
+    public java.lang.String toString() { /* compiled code */ }
+
+    public java.lang.String toGenericString() { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public static java.lang.Class<?> forName(java.lang.String s) throws java.lang.ClassNotFoundException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public static java.lang.Class<?> forName(java.lang.String s, boolean b, java.lang.ClassLoader classLoader) throws java.lang.ClassNotFoundException { /* compiled code */ }
+
+    private static native java.lang.Class<?> forName0(java.lang.String s, boolean b, java.lang.ClassLoader classLoader) throws java.lang.ClassNotFoundException;
+
+    @sun.reflect.CallerSensitive
+    public T newInstance() throws java.lang.InstantiationException, java.lang.IllegalAccessException { /* compiled code */ }
+
+    public native boolean isInstance(java.lang.Object o);
+
+    public native boolean isAssignableFrom(java.lang.Class<?> aClass);
+
+    public native boolean isInterface();
+
+    public native boolean isArray();
+
+    public native boolean isPrimitive();
+
+    public boolean isAnnotation() { /* compiled code */ }
+
+    public boolean isSynthetic() { /* compiled code */ }
+
+    public java.lang.String getName() { /* compiled code */ }
+
+    private native java.lang.String getName0();
+
+    @sun.reflect.CallerSensitive
+    public java.lang.ClassLoader getClassLoader() { /* compiled code */ }
+
+    native java.lang.ClassLoader getClassLoader0();
+
+    public java.lang.reflect.TypeVariable<java.lang.Class<T>>[] getTypeParameters() { /* compiled code */ }
+
+    public native java.lang.Class<? super T> getSuperclass();
+
+    public java.lang.reflect.Type getGenericSuperclass() { /* compiled code */ }
+
+    public java.lang.Package getPackage() { /* compiled code */ }
+
+    public java.lang.Class<?>[] getInterfaces() { /* compiled code */ }
+
+    private native java.lang.Class<?>[] getInterfaces0();
+
+    public java.lang.reflect.Type[] getGenericInterfaces() { /* compiled code */ }
+
+    public native java.lang.Class<?> getComponentType();
+
+    public native int getModifiers();
+
+    public native java.lang.Object[] getSigners();
+
+    native void setSigners(java.lang.Object[] objects);
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Method getEnclosingMethod() throws java.lang.SecurityException { /* compiled code */ }
+
+    private native java.lang.Object[] getEnclosingMethod0();
+
+    private java.lang.Class.EnclosingMethodInfo getEnclosingMethodInfo() { /* compiled code */ }
+
+    private static java.lang.Class<?> toClass(java.lang.reflect.Type type) { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Constructor<?> getEnclosingConstructor() throws java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.Class<?> getDeclaringClass() throws java.lang.SecurityException { /* compiled code */ }
+
+    private native java.lang.Class<?> getDeclaringClass0();
+
+    @sun.reflect.CallerSensitive
+    public java.lang.Class<?> getEnclosingClass() throws java.lang.SecurityException { /* compiled code */ }
+
+    public java.lang.String getSimpleName() { /* compiled code */ }
+
+    public java.lang.String getTypeName() { /* compiled code */ }
+
+    private static boolean isAsciiDigit(char c) { /* compiled code */ }
+
+    public java.lang.String getCanonicalName() { /* compiled code */ }
+
+    public boolean isAnonymousClass() { /* compiled code */ }
+
+    public boolean isLocalClass() { /* compiled code */ }
+
+    public boolean isMemberClass() { /* compiled code */ }
+
+    private java.lang.String getSimpleBinaryName() { /* compiled code */ }
+
+    private boolean isLocalOrAnonymousClass() { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.Class<?>[] getClasses() { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Field[] getFields() throws java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Method[] getMethods() throws java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Constructor<?>[] getConstructors() throws java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Field getField(java.lang.String s) throws java.lang.NoSuchFieldException, java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Method getMethod(java.lang.String s, java.lang.Class<?>... classes) throws java.lang.NoSuchMethodException, java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Constructor<T> getConstructor(java.lang.Class<?>... classes) throws java.lang.NoSuchMethodException, java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.Class<?>[] getDeclaredClasses() throws java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Field[] getDeclaredFields() throws java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Method[] getDeclaredMethods() throws java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Constructor<?>[] getDeclaredConstructors() throws java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Field getDeclaredField(java.lang.String s) throws java.lang.NoSuchFieldException, java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Method getDeclaredMethod(java.lang.String s, java.lang.Class<?>... classes) throws java.lang.NoSuchMethodException, java.lang.SecurityException { /* compiled code */ }
+
+    @sun.reflect.CallerSensitive
+    public java.lang.reflect.Constructor<T> getDeclaredConstructor(java.lang.Class<?>... classes) throws java.lang.NoSuchMethodException, java.lang.SecurityException { /* compiled code */ }
+
+    public java.io.InputStream getResourceAsStream(java.lang.String s) { /* compiled code */ }
+
+    public java.net.URL getResource(java.lang.String s) { /* compiled code */ }
+
+    public java.security.ProtectionDomain getProtectionDomain() { /* compiled code */ }
+
+    private native java.security.ProtectionDomain getProtectionDomain0();
+
+    static native java.lang.Class<?> getPrimitiveClass(java.lang.String s);
+
+    private void checkMemberAccess(int i, java.lang.Class<?> aClass, boolean b) { /* compiled code */ }
+
+    private void checkPackageAccess(java.lang.ClassLoader classLoader, boolean b) { /* compiled code */ }
+
+    private java.lang.String resolveName(java.lang.String s) { /* compiled code */ }
+
+    private java.lang.Class.ReflectionData<T> reflectionData() { /* compiled code */ }
+
+    private java.lang.Class.ReflectionData<T> newReflectionData(java.lang.ref.SoftReference<java.lang.Class.ReflectionData<T>> softReference, int i) { /* compiled code */ }
+
+    private native java.lang.String getGenericSignature0();
+
+    private sun.reflect.generics.factory.GenericsFactory getFactory() { /* compiled code */ }
+
+    private sun.reflect.generics.repository.ClassRepository getGenericInfo() { /* compiled code */ }
+
+    native byte[] getRawAnnotations();
+
+    native byte[] getRawTypeAnnotations();
+
+    static byte[] getExecutableTypeAnnotationBytes(java.lang.reflect.Executable executable) { /* compiled code */ }
+
+    native sun.reflect.ConstantPool getConstantPool();
+
+    private java.lang.reflect.Field[] privateGetDeclaredFields(boolean b) { /* compiled code */ }
+
+    private java.lang.reflect.Field[] privateGetPublicFields(java.util.Set<java.lang.Class<?>> set) { /* compiled code */ }
+
+    private static void addAll(java.util.Collection<java.lang.reflect.Field> collection, java.lang.reflect.Field[] fields) { /* compiled code */ }
+
+    private java.lang.reflect.Constructor<T>[] privateGetDeclaredConstructors(boolean b) { /* compiled code */ }
+
+    private java.lang.reflect.Method[] privateGetDeclaredMethods(boolean b) { /* compiled code */ }
+
+    private java.lang.reflect.Method[] privateGetPublicMethods() { /* compiled code */ }
+
+    private static java.lang.reflect.Field searchFields(java.lang.reflect.Field[] fields, java.lang.String s) { /* compiled code */ }
+
+    private java.lang.reflect.Field getField0(java.lang.String s) throws java.lang.NoSuchFieldException { /* compiled code */ }
+
+    private static java.lang.reflect.Method searchMethods(java.lang.reflect.Method[] methods, java.lang.String s, java.lang.Class<?>[] classes) { /* compiled code */ }
+
+    private java.lang.reflect.Method getMethod0(java.lang.String s, java.lang.Class<?>[] classes, boolean b) { /* compiled code */ }
+
+    private java.lang.reflect.Constructor<T> getConstructor0(java.lang.Class<?>[] classes, int i) throws java.lang.NoSuchMethodException { /* compiled code */ }
+
+    private static boolean arrayContentsEq(java.lang.Object[] objects, java.lang.Object[] objects1) { /* compiled code */ }
+
+    private static java.lang.reflect.Field[] copyFields(java.lang.reflect.Field[] fields) { /* compiled code */ }
+
+    private static java.lang.reflect.Method[] copyMethods(java.lang.reflect.Method[] methods) { /* compiled code */ }
+
+    private static <U> java.lang.reflect.Constructor<U>[] copyConstructors(java.lang.reflect.Constructor<U>[] constructors) { /* compiled code */ }
+
+    private native java.lang.reflect.Field[] getDeclaredFields0(boolean b);
+
+    private native java.lang.reflect.Method[] getDeclaredMethods0(boolean b);
+
+    private native java.lang.reflect.Constructor<T>[] getDeclaredConstructors0(boolean b);
+
+    private native java.lang.Class<?>[] getDeclaredClasses0();
+
+    private static java.lang.String argumentTypesToString(java.lang.Class<?>[] classes) { /* compiled code */ }
+
+    public boolean desiredAssertionStatus() { /* compiled code */ }
+
+    private static native boolean desiredAssertionStatus0(java.lang.Class<?> aClass);
+
+    public boolean isEnum() { /* compiled code */ }
+
+    private static sun.reflect.ReflectionFactory getReflectionFactory() { /* compiled code */ }
+
+    private static void checkInitted() { /* compiled code */ }
+
+    public T[] getEnumConstants() { /* compiled code */ }
+
+    T[] getEnumConstantsShared() { /* compiled code */ }
+
+    java.util.Map<java.lang.String,T> enumConstantDirectory() { /* compiled code */ }
+
+    public T cast(java.lang.Object o) { /* compiled code */ }
+
+    private java.lang.String cannotCastMsg(java.lang.Object o) { /* compiled code */ }
+
+    public <U> java.lang.Class<? extends U> asSubclass(java.lang.Class<U> aClass) { /* compiled code */ }
+
+    public <A extends java.lang.annotation.Annotation> A getAnnotation(java.lang.Class<A> aClass) { /* compiled code */ }
+
+    public boolean isAnnotationPresent(java.lang.Class<? extends java.lang.annotation.Annotation> aClass) { /* compiled code */ }
+
+    public <A extends java.lang.annotation.Annotation> A[] getAnnotationsByType(java.lang.Class<A> aClass) { /* compiled code */ }
+
+    public java.lang.annotation.Annotation[] getAnnotations() { /* compiled code */ }
+
+    public <A extends java.lang.annotation.Annotation> A getDeclaredAnnotation(java.lang.Class<A> aClass) { /* compiled code */ }
+
+    public <A extends java.lang.annotation.Annotation> A[] getDeclaredAnnotationsByType(java.lang.Class<A> aClass) { /* compiled code */ }
+
+    public java.lang.annotation.Annotation[] getDeclaredAnnotations() { /* compiled code */ }
+
+    private java.lang.Class.AnnotationData annotationData() { /* compiled code */ }
+
+    private java.lang.Class.AnnotationData createAnnotationData(int i) { /* compiled code */ }
+
+    boolean casAnnotationType(sun.reflect.annotation.AnnotationType annotationType, sun.reflect.annotation.AnnotationType annotationType1) { /* compiled code */ }
+
+    sun.reflect.annotation.AnnotationType getAnnotationType() { /* compiled code */ }
+
+    java.util.Map<java.lang.Class<? extends java.lang.annotation.Annotation>,java.lang.annotation.Annotation> getDeclaredAnnotationMap() { /* compiled code */ }
+
+    public java.lang.reflect.AnnotatedType getAnnotatedSuperclass() { /* compiled code */ }
+
+    public java.lang.reflect.AnnotatedType[] getAnnotatedInterfaces() { /* compiled code */ }
+
+    private static class AnnotationData {
+        final java.util.Map<java.lang.Class<? extends java.lang.annotation.Annotation>,java.lang.annotation.Annotation> annotations;
+        final java.util.Map<java.lang.Class<? extends java.lang.annotation.Annotation>,java.lang.annotation.Annotation> declaredAnnotations;
+        final int redefinedCount;
+
+        AnnotationData(java.util.Map<java.lang.Class<? extends java.lang.annotation.Annotation>,java.lang.annotation.Annotation> map, java.util.Map<java.lang.Class<? extends java.lang.annotation.Annotation>,java.lang.annotation.Annotation> map1, int i) { /* compiled code */ }
+    }
+
+    private static class Atomic {
+        private static final sun.misc.Unsafe unsafe;
+        private static final long reflectionDataOffset;
+        private static final long annotationTypeOffset;
+        private static final long annotationDataOffset;
+
+        private Atomic() { /* compiled code */ }
+
+        private static long objectFieldOffset(java.lang.reflect.Field[] fields, java.lang.String s) { /* compiled code */ }
+
+        static <T> boolean casReflectionData(java.lang.Class<?> aClass, java.lang.ref.SoftReference<java.lang.Class.ReflectionData<T>> softReference, java.lang.ref.SoftReference<java.lang.Class.ReflectionData<T>> softReference1) { /* compiled code */ }
+
+        static <T> boolean casAnnotationType(java.lang.Class<?> aClass, sun.reflect.annotation.AnnotationType annotationType, sun.reflect.annotation.AnnotationType annotationType1) { /* compiled code */ }
+
+        static <T> boolean casAnnotationData(java.lang.Class<?> aClass, java.lang.Class.AnnotationData annotationData, java.lang.Class.AnnotationData annotationData1) { /* compiled code */ }
+    }
+
+    private static final class EnclosingMethodInfo {
+        private java.lang.Class<?> enclosingClass;
+        private java.lang.String name;
+        private java.lang.String descriptor;
+
+        private EnclosingMethodInfo(java.lang.Object[] objects) { /* compiled code */ }
+
+        boolean isPartial() { /* compiled code */ }
+
+        boolean isConstructor() { /* compiled code */ }
+
+        boolean isMethod() { /* compiled code */ }
+
+        java.lang.Class<?> getEnclosingClass() { /* compiled code */ }
+
+        java.lang.String getName() { /* compiled code */ }
+
+        java.lang.String getDescriptor() { /* compiled code */ }
+    }
+
+    static class MethodArray {
+        private java.lang.reflect.Method[] methods;
+        private int length;
+
+        MethodArray() { /* compiled code */ }
+
+        void add(java.lang.reflect.Method method) { /* compiled code */ }
+
+        void addAll(java.lang.reflect.Method[] methods) { /* compiled code */ }
+
+        void addAll(java.lang.Class.MethodArray methodArray) { /* compiled code */ }
+
+        void addIfNotPresent(java.lang.reflect.Method method) { /* compiled code */ }
+
+        void addAllIfNotPresent(java.lang.Class.MethodArray methodArray) { /* compiled code */ }
+
+        void addAllNonStatic(java.lang.reflect.Method[] methods) { /* compiled code */ }
+
+        int length() { /* compiled code */ }
+
+        java.lang.reflect.Method get(int i) { /* compiled code */ }
+
+        void removeByNameAndSignature(java.lang.reflect.Method method) { /* compiled code */ }
+
+        void compactAndTrim() { /* compiled code */ }
+
+        java.lang.reflect.Method[] getArray() { /* compiled code */ }
+    }
+
+    private static class ReflectionData <T> {
+        volatile java.lang.reflect.Field[] declaredFields;
+        volatile java.lang.reflect.Field[] publicFields;
+        volatile java.lang.reflect.Method[] declaredMethods;
+        volatile java.lang.reflect.Method[] publicMethods;
+        volatile java.lang.reflect.Constructor<T>[] declaredConstructors;
+        volatile java.lang.reflect.Constructor<T>[] publicConstructors;
+        volatile java.lang.reflect.Field[] declaredPublicFields;
+        volatile java.lang.reflect.Method[] declaredPublicMethods;
+        volatile java.lang.Class<?>[] interfaces;
+        final int redefinedCount;
+
+        ReflectionData(int i) { /* compiled code */ }
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/changeSignature/TypeAnnotationsAllAround.java b/java/java-tests/testData/refactoring/changeSignature/TypeAnnotationsAllAround.java
new file mode 100644
index 0000000..c9387c2
--- /dev/null
+++ b/java/java-tests/testData/refactoring/changeSignature/TypeAnnotationsAllAround.java
@@ -0,0 +1,14 @@
+import java.lang.annotation.*;
+import java.util.List;
+
+@Target({ElementType.TYPE_USE})
+@interface TA { int value() default 0; }
+
+class C {
+  class Inner { }
+
+  //public @TA(0) List<@TA(1) C.@TA(1) Inner> m(@TA(2) int @TA(3) [] p1, @TA(4) List<@TA(5) Class<@TA(6) ?>> p2, @TA(7) String @TA(8) ... p3) throws @TA(42) IllegalArgumentException, @TA(43) IllegalStateException {
+  public List<Inner> m<caret>() {
+    return null;
+  }
+}
diff --git a/java/java-tests/testData/refactoring/changeSignature/TypeAnnotationsAllAround_after.java b/java/java-tests/testData/refactoring/changeSignature/TypeAnnotationsAllAround_after.java
new file mode 100644
index 0000000..7b21bd1
--- /dev/null
+++ b/java/java-tests/testData/refactoring/changeSignature/TypeAnnotationsAllAround_after.java
@@ -0,0 +1,14 @@
+import java.lang.annotation.*;
+import java.util.List;
+
+@Target({ElementType.TYPE_USE})
+@interface TA { int value() default 0; }
+
+class C {
+  class Inner { }
+
+  //public @TA(0) List<@TA(1) C.@TA(1) Inner> m(@TA(2) int @TA(3) [] p1, @TA(4) List<@TA(5) Class<@TA(6) ?>> p2, @TA(7) String @TA(8) ... p3) throws @TA(42) IllegalArgumentException, @TA(43) IllegalStateException {
+  public @TA(0) List<@TA(1) Inner> m(@TA(2) int @TA(3) [] p1, @TA(4) List<@TA(5) Class<@TA(6) ?>> p2, @TA(7) String @TA(8) ... p3) {
+    return null;
+  }
+}
diff --git a/java/java-tests/testData/refactoring/inlineMethod/MethodInsideChangeIfStatement.java b/java/java-tests/testData/refactoring/inlineMethod/MethodInsideChangeIfStatement.java
new file mode 100644
index 0000000..1df5d47
--- /dev/null
+++ b/java/java-tests/testData/refactoring/inlineMethod/MethodInsideChangeIfStatement.java
@@ -0,0 +1,26 @@
+import java.util.ArrayList;
+import java.util.List;
+
+class Test {
+  List<String> foo(String[] strs)
+  {
+    final List<String> result = new ArrayList<String>();
+    int start = -1;
+    for (int i = 0; i < strs.length; i++)
+    {
+      if (idx(i) == 42 && start == -1)
+      {
+        start = i;
+      } else if (idx(i) != 24 && start != -1)
+      {
+        result.add("".substring(id<caret>x(start)));
+      }
+    }
+    return result;
+  }
+
+  private static int idx(int i) {
+    return i;
+  }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/inlineMethod/MethodInsideChangeIfStatement.java.after b/java/java-tests/testData/refactoring/inlineMethod/MethodInsideChangeIfStatement.java.after
new file mode 100644
index 0000000..e43e7e8
--- /dev/null
+++ b/java/java-tests/testData/refactoring/inlineMethod/MethodInsideChangeIfStatement.java.after
@@ -0,0 +1,22 @@
+import java.util.ArrayList;
+import java.util.List;
+
+class Test {
+  List<String> foo(String[] strs)
+  {
+    final List<String> result = new ArrayList<String>();
+    int start = -1;
+    for (int i = 0; i < strs.length; i++)
+    {
+        if (i == 42 && start == -1)
+      {
+        start = i;
+      } else if (i != 24 && start != -1)
+      {
+          result.add("".substring(start));
+      }
+    }
+    return result;
+  }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceConstant/replaceAllInsideParenthesized.java b/java/java-tests/testData/refactoring/inplaceIntroduceConstant/replaceAllInsideParenthesized.java
new file mode 100644
index 0000000..671fc5a
--- /dev/null
+++ b/java/java-tests/testData/refactoring/inplaceIntroduceConstant/replaceAllInsideParenthesized.java
@@ -0,0 +1,13 @@
+class Test {
+
+  Test foo(long l) {
+    return this;
+  }
+
+  {
+    Test t = new Test()
+      .foo(-(5<caret>L))
+      .foo(7L)
+      .foo(-(5L));
+  }
+}
diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceConstant/replaceAllInsideParenthesized_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceConstant/replaceAllInsideParenthesized_after.java
new file mode 100644
index 0000000..a67368d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/inplaceIntroduceConstant/replaceAllInsideParenthesized_after.java
@@ -0,0 +1,15 @@
+class Test {
+
+  Test foo(long l) {
+    return this;
+  }
+
+    public static final long LONG = 5L;
+
+    {
+    Test t = new Test()
+      .foo(-LONG)
+      .foo(7L)
+      .foo(-LONG);
+  }
+}
diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceParameter/localInsideAnonymous.java b/java/java-tests/testData/refactoring/inplaceIntroduceParameter/localInsideAnonymous.java
new file mode 100644
index 0000000..932201e
--- /dev/null
+++ b/java/java-tests/testData/refactoring/inplaceIntroduceParameter/localInsideAnonymous.java
@@ -0,0 +1,18 @@
+class Abc {
+  void foo() {
+    final String name = "name";
+
+    new Runnable(){
+      @Override
+      public void run() {
+        foo();
+
+      }
+
+      private void foo() {
+        System.out.println(na<caret>me);
+      }
+    };
+  }
+}
+
diff --git a/java/java-tests/testData/refactoring/inplaceIntroduceParameter/localInsideAnonymous_after.java b/java/java-tests/testData/refactoring/inplaceIntroduceParameter/localInsideAnonymous_after.java
new file mode 100644
index 0000000..172bbd1
--- /dev/null
+++ b/java/java-tests/testData/refactoring/inplaceIntroduceParameter/localInsideAnonymous_after.java
@@ -0,0 +1,18 @@
+class Abc {
+  void foo() {
+    final String name = "name";
+
+    new Runnable(){
+      @Override
+      public void run() {
+        foo(name);
+
+      }
+
+      private void foo(String name1) {
+        System.out.println(name1);
+      }
+    };
+  }
+}
+
diff --git a/java/java-tests/testData/refactoring/introduceVariable/LambdaExprNotAccepted.after.java b/java/java-tests/testData/refactoring/introduceVariable/LambdaExprNotAccepted.after.java
index a4b5330..6e02ab0 100644
--- a/java/java-tests/testData/refactoring/introduceVariable/LambdaExprNotAccepted.after.java
+++ b/java/java-tests/testData/refactoring/introduceVariable/LambdaExprNotAccepted.after.java
@@ -4,7 +4,7 @@
 
 class Foo {  
     void test() {
-        SAM<X> c = (i, j) -> "" + i + j;
+        SAM<Integer> c = (i, j) -> "" + i + j;
         SAM<Integer> s3 = m(c);
     }
     <X> SAM<X> m(SAM<X> s) { return null; }
diff --git a/java/java-tests/testData/refactoring/invertBoolean/BooleanFieldWithoutInitializer.java b/java/java-tests/testData/refactoring/invertBoolean/BooleanFieldWithoutInitializer.java
new file mode 100644
index 0000000..01d5a1d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/invertBoolean/BooleanFieldWithoutInitializer.java
@@ -0,0 +1,10 @@
+class Test {
+  private boolean notInitial<caret>ized;
+
+  public void foo() {
+    if (notInitialized) {
+      notInitialized = false;
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/invertBoolean/BooleanFieldWithoutInitializer_after.java b/java/java-tests/testData/refactoring/invertBoolean/BooleanFieldWithoutInitializer_after.java
new file mode 100644
index 0000000..20b31fa
--- /dev/null
+++ b/java/java-tests/testData/refactoring/invertBoolean/BooleanFieldWithoutInitializer_after.java
@@ -0,0 +1,10 @@
+class Test {
+  private boolean notInitializedInverted = true;
+
+  public void foo() {
+    if (!notInitializedInverted) {
+      notInitializedInverted = true;
+    }
+  }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/methodDuplicates/SkipNonRelatedCalls.java b/java/java-tests/testData/refactoring/methodDuplicates/SkipNonRelatedCalls.java
new file mode 100644
index 0000000..fbda8f3
--- /dev/null
+++ b/java/java-tests/testData/refactoring/methodDuplicates/SkipNonRelatedCalls.java
@@ -0,0 +1,16 @@
+class CommonParent {
+  void foo() {}
+}
+
+public class A extends CommonParent {
+
+  private void <caret>f() {
+    foo();
+  }
+
+  private class B extends CommonParent {
+    void g() {
+      foo();
+    }
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/A.java b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/A.java
new file mode 100644
index 0000000..077abf4
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/A.java
@@ -0,0 +1,8 @@
+package p;
+
+class A {
+    public void test() {
+        B.foo();
+    }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/B.java b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/B.java
new file mode 100644
index 0000000..218cf83
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/after/p/B.java
@@ -0,0 +1,9 @@
+package p;
+
+class B {
+    private B() {
+        System.out.println("Constructor");
+    }
+
+    static void foo(){}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/before/p/A.java b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/before/p/A.java
new file mode 100644
index 0000000..8597534
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveInner/constructorUtilClassVisibility/before/p/A.java
@@ -0,0 +1,15 @@
+package p;
+
+class A {
+    public void test() {
+        B.foo();
+    }
+
+    private class B {
+        private B() {
+            System.out.println("Constructor");
+        }
+
+        static void foo(){}
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/pullUp/NotFunctionalAnymore.java b/java/java-tests/testData/refactoring/pullUp/NotFunctionalAnymore.java
new file mode 100644
index 0000000..df7683e
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pullUp/NotFunctionalAnymore.java
@@ -0,0 +1,12 @@
+interface I {
+  void foo();
+}
+
+class IImpl implements I {
+  public void foo(){}
+  public void g<caret>et() {}
+
+  {
+    I i = () -> {};
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/pullUp/StillFunctional.java b/java/java-tests/testData/refactoring/pullUp/StillFunctional.java
new file mode 100644
index 0000000..657a296
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pullUp/StillFunctional.java
@@ -0,0 +1,9 @@
+@FunctionalInterface
+interface I {
+  void foo();
+}
+
+class IImpl implements I {
+  public void foo(){}
+  public void g<caret>et() {}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/pullUp/StillFunctional_after.java b/java/java-tests/testData/refactoring/pullUp/StillFunctional_after.java
new file mode 100644
index 0000000..d4380a3
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pullUp/StillFunctional_after.java
@@ -0,0 +1,10 @@
+@FunctionalInterface
+interface I {
+  void foo();
+
+    default void get() {}
+}
+
+class IImpl implements I {
+  public void foo(){}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/pushDown/FunctionalExpression.java b/java/java-tests/testData/refactoring/pushDown/FunctionalExpression.java
new file mode 100644
index 0000000..36975cf
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pushDown/FunctionalExpression.java
@@ -0,0 +1,12 @@
+interface Base {
+    default void foo() {
+        System.out.println("Hi there.");
+    }
+    void ba<caret>r();
+}
+
+class Test {
+  {
+    Base base = () -> {};
+  }
+}
diff --git a/java/java-tests/testData/refactoring/pushDown/FunctionalExpressionDefaultMethod.java b/java/java-tests/testData/refactoring/pushDown/FunctionalExpressionDefaultMethod.java
new file mode 100644
index 0000000..f3a6b82
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pushDown/FunctionalExpressionDefaultMethod.java
@@ -0,0 +1,14 @@
+interface Base {
+    default void foo<caret>() {
+        System.out.println("Hi there.");
+    }
+    void bar();
+}
+
+class Test {
+  {
+    Base base = () -> {};
+  }
+}
+
+class Child implements Base {}
diff --git a/java/java-tests/testData/refactoring/pushDown/FunctionalExpressionDefaultMethod_after.java b/java/java-tests/testData/refactoring/pushDown/FunctionalExpressionDefaultMethod_after.java
new file mode 100644
index 0000000..50fd08d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pushDown/FunctionalExpressionDefaultMethod_after.java
@@ -0,0 +1,15 @@
+interface Base {
+    void bar();
+}
+
+class Test {
+  {
+    Base base = () -> {};
+  }
+}
+
+class Child implements Base {
+    public void foo() {
+    System.out.println("Hi there.");
+}
+}
diff --git a/java/java-tests/testData/refactoring/pushDown/FunctionalExpression_after.java b/java/java-tests/testData/refactoring/pushDown/FunctionalExpression_after.java
new file mode 100644
index 0000000..1ddc1ab
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pushDown/FunctionalExpression_after.java
@@ -0,0 +1,11 @@
+interface Base {
+    default void foo() {
+        System.out.println("Hi there.");
+    }
+}
+
+class Test {
+  {
+    Base base = () -> {};
+  }
+}
diff --git a/java/java-tests/testData/refactoring/pushDown/FunctionalInterface.java b/java/java-tests/testData/refactoring/pushDown/FunctionalInterface.java
new file mode 100644
index 0000000..331ac89
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pushDown/FunctionalInterface.java
@@ -0,0 +1,10 @@
+@FunctionalInterface
+interface Base {
+    default void foo() {
+        System.out.println("Hi there.");
+    }
+    void ba<caret>r();
+}
+
+class Child implements Base {
+}
diff --git a/java/java-tests/testData/refactoring/pushDown/FunctionalInterface_after.java b/java/java-tests/testData/refactoring/pushDown/FunctionalInterface_after.java
new file mode 100644
index 0000000..e834360
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pushDown/FunctionalInterface_after.java
@@ -0,0 +1,10 @@
+@FunctionalInterface
+interface Base {
+    default void foo() {
+        System.out.println("Hi there.");
+    }
+}
+
+class Child implements Base {
+    public abstract void bar();
+}
diff --git a/java/java-tests/testData/refactoring/pushDown/InterfaceConstants.java b/java/java-tests/testData/refactoring/pushDown/InterfaceConstants.java
new file mode 100644
index 0000000..d510a84
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pushDown/InterfaceConstants.java
@@ -0,0 +1,7 @@
+interface SimpleDialogPresenter {
+  int BUT<caret>TON_POSITIVE = 1;
+  int BUTTON_NEGATIVE = 2;
+  int BUTTON_NEUTRAL = 3;
+}
+
+class SimpleDialogPresenterImpl implements SimpleDialogPresenter {}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/pushDown/InterfaceConstants_after.java b/java/java-tests/testData/refactoring/pushDown/InterfaceConstants_after.java
new file mode 100644
index 0000000..4a7044e
--- /dev/null
+++ b/java/java-tests/testData/refactoring/pushDown/InterfaceConstants_after.java
@@ -0,0 +1,8 @@
+interface SimpleDialogPresenter {
+    int BUTTON_NEGATIVE = 2;
+  int BUTTON_NEUTRAL = 3;
+}
+
+class SimpleDialogPresenterImpl implements SimpleDialogPresenter {
+    public static final int BUTTON_POSITIVE = 1;
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod.java b/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod.java
new file mode 100644
index 0000000..e9c4a91
--- /dev/null
+++ b/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod.java
@@ -0,0 +1,12 @@
+interface SAM {
+  default void fo<caret>o(int i){}
+  void bar(int i);
+}
+
+class Test {
+
+  {
+    SAM sam = (i) -> {};
+  }
+
+}
diff --git a/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod_after.java b/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod_after.java
new file mode 100644
index 0000000..2530d0f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceDefaultMethod_after.java
@@ -0,0 +1,11 @@
+interface SAM {
+    void bar(int i);
+}
+
+class Test {
+
+  {
+    SAM sam = (i) -> {};
+  }
+
+}
diff --git a/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceMethod.java b/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceMethod.java
new file mode 100644
index 0000000..2f1c097
--- /dev/null
+++ b/java/java-tests/testData/refactoring/safeDelete/FunctionalInterfaceMethod.java
@@ -0,0 +1,11 @@
+interface SAM {
+  void fo<caret>o(int i);
+}
+
+class Test {
+
+  {
+    SAM sam = (i) -> {};
+  }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/safeDelete/ParameterFromFunctionalInterface.java b/java/java-tests/testData/refactoring/safeDelete/ParameterFromFunctionalInterface.java
new file mode 100644
index 0000000..61f666d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/safeDelete/ParameterFromFunctionalInterface.java
@@ -0,0 +1,11 @@
+interface SAM {
+  void foo(int <caret>i);
+}
+
+class Test {
+
+  {
+    SAM sam = (i) -> {};
+  }
+
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/vfs/maven-toolchain-1.0.jar b/java/java-tests/testData/vfs/maven-toolchain-1.0.jar
new file mode 100644
index 0000000..ace00cf
--- /dev/null
+++ b/java/java-tests/testData/vfs/maven-toolchain-1.0.jar
Binary files differ
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java
new file mode 100644
index 0000000..8c3837f
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/JavaTypingTest.java
@@ -0,0 +1,70 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight;
+
+import com.intellij.testFramework.PlatformTestUtil;
+import com.intellij.testFramework.fixtures.LightPlatformCodeInsightFixtureTestCase;
+
+import java.io.File;
+
+public class JavaTypingTest extends LightPlatformCodeInsightFixtureTestCase {
+  public void testMulticaretIndentLBrace() {
+    doTest('{');
+  }
+
+  public void testMulticaretIndentRBrace() {
+    doTest('}');
+  }
+
+  public void testMulticaretSkipSemicolon() {
+    doTest(';');
+  }
+
+  public void testMulticaretSkipGt() {
+    doTest('>');
+  }
+
+  public void testMulticaretInsertGt() {
+    doTest('<');
+  }
+
+  public void testMulticaretSkipRParen() {
+    doTest(')');
+  }
+
+  public void testMulticaretInsertRParen() {
+    doTest('(');
+  }
+
+  public void testMulticaretSkipQuote() {
+    doTest('"');
+  }
+
+  public void testMulticaretInsertQuote() {
+    doTest('"');
+  }
+
+  private void doTest(char c) {
+    myFixture.configureByFile(getTestName(true) + "_before.java");
+    myFixture.type(c);
+    myFixture.checkResultByFile(getTestName(true) + "_after.java");
+  }
+
+  @Override
+  protected String getTestDataPath() {
+    return PlatformTestUtil.getCommunityPath().replace(File.separatorChar, '/') + "/java/java-tests/testData/codeInsight/typing";
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy
index e626fd4..d789ce2 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/JavaAutoPopupTest.groovy
@@ -812,7 +812,7 @@
     }
     def l = lookup
     edt {
-      assert lookup.calculating
+      if (!lookup.calculating) println "testRestartWithVisibleLookup couldn't be faster than LongContributor"
       myFixture.type 'c'
     }
     joinCommit {
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java
index a981198..66051a9 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/completion/SmartType18CompletionTest.java
@@ -37,7 +37,7 @@
   @NotNull
   @Override
   protected LightProjectDescriptor getProjectDescriptor() {
-    return JAVA_LATEST;
+    return JAVA_8;
   }
 
 
@@ -82,7 +82,21 @@
   }
 
   public void testFilteredMethodReference() throws Exception {
-    doTest();
+    doTest(false);
+  }
+
+  public void testFilteredStaticMethods() throws Exception {
+    doTest(false);
+  }
+
+  public void testFilterWrongParamsMethods() throws Exception {
+    doTest(false);
+  }
+
+  public void testFilterAmbiguity() throws Exception {
+    configureByFile("/" + getTestName(false) + ".java");
+    assertNotNull(myItems);
+    assertTrue(myItems.length == 0);
   }
 
   public void testNotAvailableInLambdaPositionAfterQualifier() throws Exception {
@@ -105,17 +119,22 @@
   }
 
   public void testDiamondsInsideMethodCall() throws Exception {
-    configureByFile("/" + getTestName(false) + ".java");
-    checkResultByFile("/" + getTestName(false) + "-out.java");
+    doTest(false);
   }
 
   private void doTest() {
+    doTest(true);
+  }
+
+  private void doTest(boolean checkItems) {
     configureByFile("/" + getTestName(false) + ".java");
-    assertNotNull(myItems);
-    assertTrue(myItems.length > 0);
-    final Lookup lookup = getLookup();
-    if (lookup != null) {
-      selectItem(lookup.getCurrentItem(), Lookup.NORMAL_SELECT_CHAR);
+    if (checkItems) {
+      assertNotNull(myItems);
+      assertTrue(myItems.length > 0);
+      final Lookup lookup = getLookup();
+      if (lookup != null) {
+        selectItem(lookup.getCurrentItem(), Lookup.NORMAL_SELECT_CHAR);
+      }
     }
     checkResultByFile("/" + getTestName(false) + "-out.java");
   }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java
index 2ed84c6..f4e40bd 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java
@@ -238,6 +238,7 @@
   public void testIDEA106964() throws Exception { doTest5(false);}
   public void testIDEA107782() throws Exception { doTest5(false);}
   public void testInheritedWithDifferentArgsInTypeParams() throws Exception { doTest5(false);}
+  public void testInheritedWithDifferentArgsInTypeParams1() throws Exception { doTest5(false);}
   public void testIllegalForwardReferenceInTypeParameterDefinition() throws Exception { doTest5(false);}
 
   public void testIDEA57877() throws Exception { doTest5(false);}
@@ -337,8 +338,13 @@
   public void testIDEA119546() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
   public void testIDEA118527() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
   public void testIDEA120153() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
-
-  public void testSuperWildcardWithBoundPromotion() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false);}
+  public void testIDEA120563() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
+  public void testIDEA121400() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
+  public void testIDEA123316() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
+  public void testIDEA123352() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
+  public void testIDEA123518() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
+  public void testIDEA64103() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
+  public void testIDEA123338() { doTest(LanguageLevel.JDK_1_7, JavaSdkVersion.JDK_1_7, false); }
 
   public void testJavaUtilCollections_NoVerify() throws Exception {
     PsiClass collectionsClass = getJavaFacade().findClass("java.util.Collections", GlobalSearchScope.moduleWithLibrariesScope(getModule()));
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java
index 6e3b0cc..d12e720 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/ImplementationsViewTest.java
@@ -2,12 +2,14 @@
 
 import com.intellij.codeInsight.TargetElementUtilBase;
 import com.intellij.codeInsight.hint.ImplementationViewComponent;
+import com.intellij.codeInsight.navigation.ClassImplementationsSearch;
+import com.intellij.codeInsight.navigation.MethodImplementationsSearch;
 import com.intellij.psi.PsiClass;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiMethod;
-import com.intellij.psi.search.searches.ClassInheritorsSearch;
 import com.intellij.psi.search.searches.OverridingMethodsSearch;
 import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
+import com.intellij.util.CommonProcessors;
 import org.junit.Assert;
 
 import java.util.*;
@@ -80,6 +82,20 @@
                  "    }", newText);
   }
 
+  private static Collection<PsiElement> getClassImplementations(final PsiClass psiClass) {
+    CommonProcessors.CollectProcessor<PsiElement> processor = new CommonProcessors.CollectProcessor<PsiElement>();
+    ClassImplementationsSearch.processImplementations(psiClass, processor, psiClass.getUseScope());
+
+    return processor.getResults();
+  }
+
+  private static Collection<PsiElement> getMethodImplementations(final PsiMethod psiMethod) {
+    CommonProcessors.CollectProcessor<PsiElement> processor = new CommonProcessors.CollectProcessor<PsiElement>();
+    MethodImplementationsSearch.processImplementations( psiMethod, processor, psiMethod.getUseScope());
+
+    return processor.getResults();
+  }
+
   public void testInnerClasses() {
     myFixture.configureByText("a.java", "abstract class AF<caret>oo{\n" +
                                         "    abstract boolean aaa();\n" +
@@ -107,14 +123,17 @@
       (PsiClass)TargetElementUtilBase.findTargetElement(myFixture.getEditor(), TargetElementUtilBase.getInstance().getAllAccepted());
 
     assert psiClass != null;
-    final Collection<PsiClass> classes = ClassInheritorsSearch.search(psiClass).findAll();
-    List<PsiClass> all = new ArrayList<PsiClass>();
+    final Collection<PsiElement> classes = getClassImplementations(psiClass);
+    List<PsiElement> all = new ArrayList<PsiElement>();
     all.add(psiClass);
     all.addAll(classes);
     final ImplementationViewComponent component =
       new ImplementationViewComponent(all.toArray(new PsiElement[all.size()]), 0);
     try {
       final String[] visibleFiles = component.getVisibleFiles();
+      assertTrue(visibleFiles.length > 0);
+      assertEquals(visibleFiles[0], "a.java (AFoo)");
+      Arrays.sort(visibleFiles);
       Assert.assertArrayEquals(Arrays.toString(visibleFiles),
                                new String[]{"a.java (AFoo)", "a.java (AFoo1 in AFoo)", "a.java (AFoo2 in AFoo)", "a.java (AFoo3 in AFoo)"}, visibleFiles);
     }
@@ -123,6 +142,70 @@
     }
   }
 
+  public void testFunctionalInterface() {
+    myFixture.configureByText("a.java", "interface AF<caret>oo{\n" +
+                                        "    boolean aaa();\n" +
+                                        "}\n" +
+                                        "class AFooImpl {\n" +
+                                        "        {\n" +
+                                        "             AFoo a = () -> {return false;};\n" +            
+                                        "        }\n" +
+                                        "}");
+    PsiClass psiClass =
+      (PsiClass)TargetElementUtilBase.findTargetElement(myFixture.getEditor(), TargetElementUtilBase.getInstance().getAllAccepted());
+
+    assert psiClass != null;
+    final Collection<PsiElement> classes = getClassImplementations(psiClass);
+    List<PsiElement> all = new ArrayList<PsiElement>();
+    all.add(psiClass);
+    all.addAll(classes);
+    final ImplementationViewComponent component = new ImplementationViewComponent(all.toArray(new PsiElement[all.size()]), 0);
+    assertContent(component, new String[]{"a.java (AFoo)", "a.java"});
+  }
+
+  public void testInterfaceMethodOfFunctionalInterface() {
+    myFixture.configureByText("a.java", "interface AFoo{\n" +
+                                        "    boolean a<caret>aa();\n" +
+                                        "}\n" +
+                                        "class AFooImpl {\n" +
+                                        "        {\n" +
+                                        "             AFoo a = () -> {return false;};\n" +            
+                                        "        }\n" +
+                                        "}");
+    PsiMethod psiMethod =
+      (PsiMethod)TargetElementUtilBase.findTargetElement(myFixture.getEditor(), TargetElementUtilBase.getInstance().getAllAccepted());
+
+    assert psiMethod != null;
+    final Collection<PsiElement> methods = getMethodImplementations(psiMethod);
+    List<PsiElement> all = new ArrayList<PsiElement>();
+    all.add(psiMethod);
+    all.addAll(methods);
+    final ImplementationViewComponent component = new ImplementationViewComponent(all.toArray(new PsiElement[all.size()]), 0);
+    assertContent(component, new String[]{"a.java (AFoo)", "a.java"});
+  }
+
+  public void testDefaultMethodOfFunctionalInterface() {
+    myFixture.configureByText("a.java", "interface AFoo{\n" +
+                                        "    default boolean a<caret>aa(){}\n" +
+                                        "    boolean bbb();" +
+                                        "}\n" +
+                                        "class AFooImpl {\n" +
+                                        "        {\n" +
+                                        "             AFoo a = () -> {return false;};\n" +            
+                                        "        }\n" +
+                                        "}");
+    PsiMethod psiMethod =
+      (PsiMethod)TargetElementUtilBase.findTargetElement(myFixture.getEditor(), TargetElementUtilBase.getInstance().getAllAccepted());
+
+    assert psiMethod != null;
+    final Collection<PsiElement> methods = getMethodImplementations(psiMethod);
+    List<PsiElement> all = new ArrayList<PsiElement>();
+    all.add(psiMethod);
+    all.addAll(methods);
+    final ImplementationViewComponent component = new ImplementationViewComponent(all.toArray(new PsiElement[all.size()]), 0);
+    assertContent(component, new String[]{"a.java (AFoo)"});
+  }
+
   public void testMethodsInInnerClasses() {
       myFixture.configureByText("a.java", "abstract class AFoo{\n" +
                                           "    abstract boolean a<caret>aa();\n" +
@@ -165,10 +248,13 @@
     });
     final ImplementationViewComponent component =
       new ImplementationViewComponent(all.toArray(new PsiElement[all.size()]), 0);
+    assertContent(component, new String[]{"a.java (AFoo)", "a.java (AFoo1 in AFoo)", "a.java (AFoo2 in AFoo)", "a.java (AFoo3 in AFoo)"});
+  }
+
+  public static void assertContent(ImplementationViewComponent component, String[] expects) {
     try {
       final String[] visibleFiles = component.getVisibleFiles();
-      Assert.assertArrayEquals(Arrays.toString(visibleFiles),
-                               new String[]{"a.java (AFoo)", "a.java (AFoo1 in AFoo)", "a.java (AFoo2 in AFoo)", "a.java (AFoo3 in AFoo)"}, visibleFiles);
+      Assert.assertArrayEquals(Arrays.toString(visibleFiles), expects, visibleFiles);
     }
     finally {
       component.removeNotify();
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
index 7ebb887..8d2c815 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
@@ -62,4 +62,8 @@
   public void testUnhandledExceptionsValueOf() { doTest(true, false); }
   public void testUnsupportedFeatures7() { doTest(false, false); }
   public void testEnumInitializers() { doTest(false, false); }
+  public void testIDEA79251() { doTest(false, false); }
+  public void testAgentPremain() {
+    doTest(false, false); 
+  }
 }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java
index ec16061..9f14615 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk7Test.java
@@ -165,6 +165,7 @@
   public void testUncheckedWarningIDEA26738() { doTest(true, false); }
   public void testUncheckedWarningIDEA99536() { doTest(true, false); }
   public void testEnclosingInstance() { doTest(false, false); }
+  public void testIDEA122519EnclosingInstance() { doTest(false, false); }
   public void testWrongArgsAndUnknownTypeParams() { doTest(false, false); }
   public void testAmbiguousMethodCallIDEA97983() { doTest(false, false); }
   public void testAmbiguousMethodCallIDEA100314() { doTest(false, false); }
@@ -180,4 +181,5 @@
   public void testIDEA78916() { doTest(false, false); }
   public void testIDEA111420() { doTest(false, false); }
   public void testIDEA111450() { doTest(true, false); }
+  public void testExternalizable() { doTest(true, false); }
 }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java
new file mode 100644
index 0000000..e7c19bf
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/ChangeSignatureTouchLambdaTest.java
@@ -0,0 +1,50 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.daemon.lambda;
+
+import com.intellij.psi.PsiType;
+import com.intellij.refactoring.BaseRefactoringProcessor;
+import com.intellij.refactoring.ChangeSignatureBaseTest;
+import com.intellij.refactoring.changeSignature.ParameterInfoImpl;
+import com.intellij.refactoring.changeSignature.ThrownExceptionInfo;
+
+public class ChangeSignatureTouchLambdaTest extends ChangeSignatureBaseTest {
+ 
+  public void testVariableDeclaration() {
+    doTestConflict();
+  }
+
+  public void testMethodArgument() throws Exception {
+    doTestConflict();
+  }
+
+  public void testDefaultMethodTouched() throws Exception {
+    doTest(null, null, null, new ParameterInfoImpl[] {new ParameterInfoImpl(-1, "b", PsiType.BOOLEAN)}, new ThrownExceptionInfo[0], false);
+  }
+
+  private void doTestConflict() {
+    try {
+      doTest(null, null, null, new ParameterInfoImpl[] {new ParameterInfoImpl(-1, "b", PsiType.BOOLEAN)}, new ThrownExceptionInfo[0], false);
+      fail("Conflict expected");
+    }
+    catch (BaseRefactoringProcessor.ConflictsInTestsException ignored) { }
+  }
+
+  @Override
+  protected String getRelativePath() {
+    return "/codeInsight/daemonCodeAnalyzer/lambda/changeSignature/";
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java
new file mode 100644
index 0000000..a6a75b7
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/FindFunctionalInterfaceTest.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.daemon.lambda;
+
+import com.intellij.JavaTestUtil;
+import com.intellij.psi.*;
+import com.intellij.psi.search.searches.FunctionalExpressionSearch;
+import com.intellij.psi.search.searches.ReferencesSearch;
+import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.testFramework.LightProjectDescriptor;
+import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+
+public class FindFunctionalInterfaceTest extends LightCodeInsightFixtureTestCase {
+  public void testMethodArgument() throws Exception {
+    myFixture.configureByFile(getTestName(false) + ".java");
+    final PsiElement elementAtCaret = myFixture.getElementAtCaret();
+    assertNotNull(elementAtCaret);
+    final PsiClass psiClass = PsiTreeUtil.getParentOfType(elementAtCaret, PsiClass.class, false);
+    assertTrue(psiClass != null && psiClass.isInterface());
+    final Collection<PsiFunctionalExpression> expressions = FunctionalExpressionSearch.search(psiClass).findAll();
+    assertTrue(expressions.size() == 1);
+    final PsiFunctionalExpression next = expressions.iterator().next();
+    assertNotNull(next);
+    assertEquals("() -> {}", next.getText());
+  }
+
+  public void testFieldFromAnonymousClassScope() throws Exception {
+    myFixture.configureByFile(getTestName(false) + ".java");
+    final PsiElement elementAtCaret = myFixture.getElementAtCaret();
+    assertNotNull(elementAtCaret);
+    final PsiField field = PsiTreeUtil.getParentOfType(elementAtCaret, PsiField.class, false);
+    assertNotNull(field);
+    final PsiClass aClass = field.getContainingClass();
+    assertTrue(aClass instanceof PsiAnonymousClass);
+    final Collection<PsiReference> references = ReferencesSearch.search(field).findAll();
+    assertFalse(references.isEmpty());
+    assertEquals(1, references.size());
+  }
+
+  @Override
+  protected String getBasePath() {
+    return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/daemonCodeAnalyzer/lambda/findUsages/";
+  }
+
+  @NotNull
+  @Override
+  protected LightProjectDescriptor getProjectDescriptor() {
+    return JAVA_8;
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java
index 161d864..8f9167d 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/GenericsHighlighting8Test.java
@@ -743,6 +743,22 @@
     doTest();
   }
 
+  public void testIDEA122401() throws Exception {
+    doTest();
+  }
+
+  public void testCaptureInsideNestedCalls() throws Exception {
+    doTest();
+  }
+
+  public void testSuperWildcardWithBoundPromotion() { doTest();}
+
+  public void testErasure() throws Exception { doTest(); }
+
+  public void testWildcardBoundsCombination() throws Exception {
+    doTest();
+  }
+
   private void doTest() {
     doTest(false);
   }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java
index f43c937..dfc6a73 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/Interface8MethodsHighlightingTest.java
@@ -15,10 +15,13 @@
  */
 package com.intellij.codeInsight.daemon.lambda;
 
-import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase;
+import com.intellij.JavaTestUtil;
+import com.intellij.testFramework.LightProjectDescriptor;
+import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase;
 import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
 
-public class Interface8MethodsHighlightingTest extends LightDaemonAnalyzerTestCase {
+public class Interface8MethodsHighlightingTest extends LightCodeInsightFixtureTestCase {
   @NonNls static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods";
 
   public void testStaticMethod() { doTest(); }
@@ -34,15 +37,39 @@
   public void testDefaultMethodOverrideEquivalentObject() { doTest(false, false); }
   public void testStaticMethods() { doTest(false, false); }
   public void testFinalStaticDefaultMethods() { doTest(false, false); }
+  public void testIDEA122720() { doTest(false, false); }
+  public void testIDEA123839() { doTest(false, false); }
   public void testDefaultSupersInStaticContext() {
     doTest(false, false);
   }
 
+  public void testSuperProtectedCalls() throws Exception {
+    myFixture.addClass("package p; public class Foo {" +
+                       "  protected void foo(){}" +
+                       "}");
+    doTest();
+  }
+
+  public void testIDEA120498() { doTest(false, false); }
+
   private void doTest() {
     doTest(false, false);
   }
 
   private void doTest(boolean checkWarnings, boolean checkInfos) {
-    doTestNewInference(BASE_PATH + "/" + getTestName(false) + ".java", checkWarnings, checkInfos);
+    String filePath = BASE_PATH + "/" + getTestName(false) + ".java";
+    myFixture.configureByFile(filePath);
+    myFixture.checkHighlighting(checkWarnings, checkInfos, false);
+  }
+
+  @Override
+  protected String getTestDataPath() {
+    return JavaTestUtil.getJavaTestDataPath();
+  }
+
+  @NotNull
+  @Override
+  protected LightProjectDescriptor getProjectDescriptor() {
+    return JAVA_8;
   }
 }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java
index cf8f43b..aa18173 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaHighlightingTest.java
@@ -99,6 +99,7 @@
   public void testFinalInitializer() {doTest();}
   public void testBreakContinueInside() {doTest();}
   public void testSameLambdaParamNames() {doTest();}
+  public void testIDEA123308() {doTest();}
 
   private void doTest() {
     doTest(false);
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java
index 5f4d01e..a46036c 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/MostSpecificResolutionTest.java
@@ -63,6 +63,18 @@
     doTest();
   }
 
+  public void testRelatedSAMErasures() throws Exception {
+    doTest();
+  }
+
+  public void testJDK8034223() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA123352() throws Exception {
+    doTest();
+  }
+
   private void doTest() {
     doTest(true);
   }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java
index a3c2b12..5e21a82 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewLambdaHighlightingTest.java
@@ -130,6 +130,10 @@
     doTest();
   }
 
+  public void testIDEA119003() throws Exception {
+    doTest();
+  }
+
   public void testIDEA117124() throws Exception {
     doTest();
   }
@@ -154,6 +158,46 @@
     doTest();
   }
 
+  public void testIDEA122074() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA122084() throws Exception {
+    doTest();
+  }
+
+  public void testAdditionalConstraintDependsOnNonMentionedVars() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA122616() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA122700() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA122406() throws Exception {
+    doTest();
+  }
+
+  public void testNestedCallsInsideLambdaReturnExpression() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA123731() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA123869() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA123848() throws Exception {
+    doTest();
+  }
+
   private void doTest() {
     doTest(false);
   }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java
index f18ae82..54ee87c 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/NewMethodRefHighlightingTest.java
@@ -197,6 +197,46 @@
     doTest();
   }
 
+  public void testIDEA122100() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA122509() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA122681() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA112191() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA122018comment() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA123223() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA123248() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA123366() throws Exception {
+    doTest();
+  }
+
+  public void testIDEA123366comment() throws Exception {
+    doTest();
+  }
+
+  public void testFromReferenceWithTypeArgs() throws Exception {
+    doTest();
+  }
+
   private void doTest() {
     doTest(false);
   }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/TypeInference18Test.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/TypeInference18Test.java
new file mode 100644
index 0000000..8a9a451
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/TypeInference18Test.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.daemon.lambda;
+
+import com.intellij.JavaTestUtil;
+import com.intellij.openapi.projectRoots.JavaSdkVersion;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.roots.LanguageLevelProjectExtension;
+import com.intellij.pom.java.LanguageLevel;
+import com.intellij.psi.*;
+import com.intellij.testFramework.IdeaTestUtil;
+import com.intellij.testFramework.ResolveTestCase;
+
+public class TypeInference18Test extends ResolveTestCase {
+
+  public void testIDEA122406() throws Exception {
+    doTest();
+  }
+
+  private LanguageLevel myOldLanguageLevel;
+
+  @Override
+  protected void setUp() throws Exception {
+    super.setUp();
+    myOldLanguageLevel = LanguageLevelProjectExtension.getInstance(myJavaFacade.getProject()).getLanguageLevel();
+    LanguageLevelProjectExtension.getInstance(myJavaFacade.getProject()).setLanguageLevel(LanguageLevel.JDK_1_8);
+    IdeaTestUtil.setTestVersion(JavaSdkVersion.JDK_1_8, getModule(), getTestRootDisposable());
+  }
+
+  @Override
+  protected void tearDown() throws Exception {
+    LanguageLevelProjectExtension.getInstance(myJavaFacade.getProject()).setLanguageLevel(myOldLanguageLevel);
+    super.tearDown();
+  }
+
+  private void doTest() throws Exception {
+    PsiReference ref = configureByFile("/codeInsight/daemonCodeAnalyzer/lambda/resolve/" + getTestName(false) + ".java");
+    assertNotNull(ref);
+    assertNotNull(ref.resolve());
+  }
+
+  @Override
+  protected Sdk getTestProjectJdk() {
+    return IdeaTestUtil.getMockJdk18();
+  }
+
+  @Override
+  protected String getTestDataPath() {
+    return JavaTestUtil.getJavaTestDataPath();
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateMethodFromMethodReferenceFixTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateMethodFromMethodReferenceFixTest.java
new file mode 100644
index 0000000..6182f87
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/CreateMethodFromMethodReferenceFixTest.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.daemon.quickFix;
+
+public class CreateMethodFromMethodReferenceFixTest extends LightQuickFixParameterizedTestCase {
+  public void test() throws Exception { doAllTests(); }
+
+  @Override
+  protected String getBasePath() {
+    return "/codeInsight/daemonCodeAnalyzer/quickFix/createMethodFromMethodRef";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/EmptyIntentionInspectionQuickFixTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/EmptyIntentionInspectionQuickFixTest.java
index 579081a..50258fd 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/EmptyIntentionInspectionQuickFixTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/EmptyIntentionInspectionQuickFixTest.java
@@ -5,6 +5,7 @@
 import com.intellij.codeInspection.LocalInspectionTool;
 import com.intellij.codeInspection.ProblemsHolder;
 import com.intellij.codeInspection.defUse.DefUseInspection;
+import com.intellij.codeInspection.ex.EditInspectionToolsSettingsAction;
 import com.intellij.psi.JavaElementVisitor;
 import com.intellij.psi.PsiElementVisitor;
 import com.intellij.psi.PsiLiteralExpression;
@@ -88,7 +89,7 @@
     }
     assertTrue(i < emptyActions.size());
     for (; i < emptyActions.size(); i++) {
-      if (emptyActions.get(i) instanceof EmptyIntentionAction) {
+      if (emptyActions.get(i) instanceof EditInspectionToolsSettingsAction) {
         return;
       }
     }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Lambda2MethodReferenceInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Lambda2MethodReferenceInspectionTest.java
index 2bbe041..125aaf4 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Lambda2MethodReferenceInspectionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/Lambda2MethodReferenceInspectionTest.java
@@ -17,6 +17,8 @@
 
 import com.intellij.codeInspection.LambdaCanBeMethodReferenceInspection;
 import com.intellij.codeInspection.LocalInspectionTool;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.testFramework.IdeaTestUtil;
 import org.jetbrains.annotations.NotNull;
 
 
@@ -36,4 +38,8 @@
     return "/codeInsight/daemonCodeAnalyzer/quickFix/lambda2methodReference";
   }
 
+  @Override
+  protected Sdk getProjectJDK() {
+    return IdeaTestUtil.getMockJdk18();
+  }
 }
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RedundantTypeArgsInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RedundantTypeArgsInspectionTest.java
new file mode 100644
index 0000000..67659c1
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RedundantTypeArgsInspectionTest.java
@@ -0,0 +1,43 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.daemon.quickFix;
+
+import com.intellij.codeInspection.LocalInspectionTool;
+import com.intellij.codeInspection.miscGenerics.RedundantTypeArgsInspection;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.testFramework.IdeaTestUtil;
+import org.jetbrains.annotations.NotNull;
+
+
+public class RedundantTypeArgsInspectionTest extends LightQuickFixParameterizedTestCase {
+  @NotNull
+  @Override
+  protected LocalInspectionTool[] configureLocalInspectionTools() {
+    return new LocalInspectionTool[]{ new RedundantTypeArgsInspection()};
+  }
+
+  public void test() throws Exception { doAllTests(); }
+
+  @Override
+  protected String getBasePath() {
+    return "/codeInsight/daemonCodeAnalyzer/quickFix/redundantTypeArgs";
+  }
+
+  @Override
+  protected Sdk getProjectJDK() {
+    return IdeaTestUtil.getMockJdk18();
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RemoveUnusedAssignmentTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RemoveUnusedAssignmentTest.java
new file mode 100644
index 0000000..a8816f8
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/RemoveUnusedAssignmentTest.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.daemon.quickFix;
+
+import com.intellij.codeInspection.LocalInspectionTool;
+import com.intellij.codeInspection.defUse.DefUseInspection;
+import com.intellij.pom.java.LanguageLevel;
+import org.jetbrains.annotations.NotNull;
+
+public class RemoveUnusedAssignmentTest extends LightQuickFixTestCase {
+  public void test() throws Exception { doAllTests(); }
+
+  @NotNull
+  @Override
+  protected LocalInspectionTool[] configureLocalInspectionTools() {
+    return new LocalInspectionTool[] {new DefUseInspection()};
+  }
+
+  @Override
+  protected String getBasePath() {
+    return "/codeInsight/daemonCodeAnalyzer/quickFix/unusedAssignment";
+  }
+
+  @Override
+  protected LanguageLevel getLanguageLevel() {
+    return LanguageLevel.JDK_1_5;
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/ReplaceWithConstantFixTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/ReplaceWithConstantFixTest.java
new file mode 100644
index 0000000..f0b6201
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/quickFix/ReplaceWithConstantFixTest.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.daemon.quickFix;
+
+import com.intellij.codeInspection.LocalInspectionTool;
+import com.intellij.codeInspection.duplicateStringLiteral.DuplicateStringLiteralInspection;
+import org.jetbrains.annotations.NotNull;
+
+public class ReplaceWithConstantFixTest extends LightQuickFixParameterizedTestCase {
+  @NotNull
+  @Override
+  protected LocalInspectionTool[] configureLocalInspectionTools() {
+    return new LocalInspectionTool[]{new DuplicateStringLiteralInspection()};
+  }
+
+  public void test() throws Exception {
+     doAllTests();
+   }
+
+  @Override
+  protected String getBasePath() {
+    return "/codeInsight/daemonCodeAnalyzer/quickFix/replaceWithConstant";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/editorActions/JavaEnterInStringLiteralTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/editorActions/JavaEnterInStringLiteralTest.java
new file mode 100644
index 0000000..f8feec3
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/editorActions/JavaEnterInStringLiteralTest.java
@@ -0,0 +1,52 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.editorActions;
+
+import com.intellij.lang.java.JavaLanguage;
+import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
+import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
+import com.intellij.testFramework.EditorTestUtil;
+import com.intellij.testFramework.LightCodeInsightTestCase;
+
+/**
+ * @author Rustam Vishnyakov
+ */
+public class JavaEnterInStringLiteralTest extends LightCodeInsightTestCase {
+  private static final String BASE_PATH = "/codeInsight/editorActions/stringLiteral/";
+
+  public void testEnter() {
+    doTest();
+  }
+
+  public void testEnterOpSignOnNextLine() {
+    CommonCodeStyleSettings settings = CodeStyleSettingsManager.getSettings(getProject()).getCommonSettings(JavaLanguage.INSTANCE);
+    boolean opSignOnNextLine = settings.BINARY_OPERATION_SIGN_ON_NEXT_LINE;
+    try {
+      settings.BINARY_OPERATION_SIGN_ON_NEXT_LINE =  true;
+      doTest();
+    }
+    finally {
+      settings.BINARY_OPERATION_SIGN_ON_NEXT_LINE = opSignOnNextLine;
+    }
+  }
+
+  private void doTest() {
+    String testName = getTestName(true);
+    configureByFile(BASE_PATH + testName + ".java");
+    EditorTestUtil.performTypingAction(getEditor(), '\n');
+    checkResultByFile(BASE_PATH + testName + "_after.java");
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy
index b462263..ffe09fd 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/folding/JavaFoldingTest.groovy
@@ -29,6 +29,7 @@
 import com.intellij.psi.PsiClass
 import com.intellij.psi.PsiMethod
 import com.intellij.psi.search.GlobalSearchScope
+import com.intellij.testFramework.LightProjectDescriptor
 import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
 
 /**
@@ -41,6 +42,11 @@
   def JavaCodeFoldingSettingsImpl myFoldingStateToRestore
 
   @Override
+  protected LightProjectDescriptor getProjectDescriptor() {
+    return JAVA_1_7
+  }
+
+  @Override
   public void setUp() {
     super.setUp()
     myFoldingSettings = JavaCodeFoldingSettings.instance as JavaCodeFoldingSettingsImpl
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/generation/surroundWith/JavaSurroundWithTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/generation/surroundWith/JavaSurroundWithTest.java
index 6f31786..60be917 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/generation/surroundWith/JavaSurroundWithTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/generation/surroundWith/JavaSurroundWithTest.java
@@ -145,6 +145,16 @@
     TemplateManagerImpl.setTemplateTesting(getProject(), getTestRootDisposable());
     doTest(getTestName(false), new JavaWithNotSurrounder());
   }
+  
+  public void testSurroundExpressionWithElseIf() {
+    TemplateManagerImpl.setTemplateTesting(getProject(), getTestRootDisposable());
+    doTest(getTestName(false), new JavaWithIfExpressionSurrounder());
+  }
+  
+  public void testSurroundExpressionWithElseIfElse() {
+    TemplateManagerImpl.setTemplateTesting(getProject(), getTestRootDisposable());
+    doTest(getTestName(false), new JavaWithIfElseExpressionSurrounder());
+  }
 
   private void doTest(@NotNull String fileName, final Surrounder surrounder) {
     configureByFile(BASE_PATH + fileName + ".java");
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/highlighting/HighlightUsagesHandlerTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/highlighting/HighlightUsagesHandlerTest.groovy
index 02d52a5..6237f9c 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/highlighting/HighlightUsagesHandlerTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/highlighting/HighlightUsagesHandlerTest.groovy
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -14,11 +14,10 @@
  * limitations under the License.
  */
 package com.intellij.codeInsight.highlighting
-
 import com.intellij.JavaTestUtil
+import com.intellij.codeInsight.daemon.impl.HighlightInfoType
 import com.intellij.codeInsight.daemon.impl.IdentifierHighlighterPassFactory
 import com.intellij.codeInspection.sillyAssignment.SillyAssignmentInspection
-import com.intellij.lang.annotation.HighlightSeverity
 import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
 import org.jetbrains.annotations.NonNls
 /**
@@ -233,7 +232,7 @@
     try {
       def infos = myFixture.doHighlighting()
       //import highlighted twice: for each overloaded usage target
-      assert infos.findAll { it.severity == HighlightSeverity.INFORMATION && myFixture.file.text.substring(it.startOffset, it.endOffset) == 'foo' }.size() == 3
+      assert infos.findAll { it.severity == HighlightInfoType.ELEMENT_UNDER_CARET_SEVERITY && myFixture.file.text.substring(it.startOffset, it.endOffset) == 'foo' }.size() == 3
     }
     finally {
       IdentifierHighlighterPassFactory.ourTestingIdentifierHighlighting = false
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/intention/JoinDeclarationTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/intention/JoinDeclarationTest.java
new file mode 100644
index 0000000..d0e1d9f
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/intention/JoinDeclarationTest.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.intention;
+
+import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase;
+
+public class JoinDeclarationTest extends LightQuickFixParameterizedTestCase {
+
+  @Override
+  protected String getBasePath() {
+    return "/codeInsight/daemonCodeAnalyzer/quickFix/joinDeclaration";
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/intention/SplitDeclarationTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/intention/SplitDeclarationTest.java
index 50e46ab..9d7693a 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/intention/SplitDeclarationTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/intention/SplitDeclarationTest.java
@@ -16,9 +16,6 @@
 package com.intellij.codeInsight.intention;
 
 import com.intellij.codeInsight.daemon.quickFix.LightQuickFixParameterizedTestCase;
-import com.intellij.codeInsight.intention.impl.SplitIfAction;
-import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
-import com.intellij.testFramework.LightCodeInsightTestCase;
 
 public class SplitDeclarationTest extends LightQuickFixParameterizedTestCase {
 
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy
index cef42e9..8f7efee 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/LiveTemplateTest.groovy
@@ -35,6 +35,7 @@
 import com.intellij.psi.codeStyle.CommonCodeStyleSettings
 import com.intellij.testFramework.fixtures.LightCodeInsightFixtureTestCase
 import com.intellij.util.containers.ContainerUtil
+import com.intellij.util.ui.UIUtil
 import org.jetbrains.annotations.NotNull
 
 import static com.intellij.codeInsight.template.Template.Property.USE_STATIC_IMPORT_IF_POSSIBLE
@@ -80,6 +81,7 @@
     addTemplate(template, testRootDisposable)
 
     manager.startTemplate(editor, (char)'\t');
+    UIUtil.dispatchAllInvocationEvents()
     checkResultByText(expected);
   }
   
@@ -110,6 +112,7 @@
     addTemplate(template, testRootDisposable)
 
     startTemplate(templateName, templateGroup)
+    UIUtil.dispatchAllInvocationEvents()
     if (firstDefaultValue.empty) myFixture.type("TestValue1")
     myFixture.type("\t")
     if (secondDefaultValue.empty) myFixture.type("TestValue2")
@@ -137,9 +140,8 @@
     final TemplateManager manager = TemplateManager.getInstance(getProject());
     final Template template = manager.createTemplate("empty", "user", '$VAR$');
     template.addVariable("VAR", "", "", false);
-    final Editor editor = getEditor();
 
-    manager.startTemplate(editor, template);
+    startTemplate(template);
     checkResultByText("");
 
   }
@@ -150,9 +152,8 @@
     final Template template = manager.createTemplate("empty", "user", '$VAR$$END$');
     template.addVariable("VAR", "bar", "bar", true);
     template.setToReformat(true);
-    final Editor editor = getEditor();
 
-    manager.startTemplate(editor, template);
+    startTemplate(template);
     myFixture.type("foo");
     checkResultByText("foo");
   }
@@ -168,7 +169,7 @@
                                                                 '  $END$\n' +
                                                                 'foo()');
     template.setToReformat(true);
-    manager.startTemplate(getEditor(), template);
+    startTemplate(template);
     checkResultByText("class C {\n" +
                       "  bar() {\n" +
                       "      foo()\n" +
@@ -196,7 +197,7 @@
                                                                     "frame.pack();");
     template.setToShortenLongNames(false);
     template.setToReformat(true);
-    manager.startTemplate(getEditor(), template);
+    startTemplate(template);
     checkResult();
   }
 
@@ -210,7 +211,7 @@
     final TemplateManager manager = TemplateManager.getInstance(getProject());
     final Template template = manager.createTemplate("frm", "user", '$VAR$');
     template.addVariable('VAR', new MacroCallNode(new CompleteMacro()), new EmptyNode(), true)
-    manager.startTemplate(getEditor(), template);
+    startTemplate(template);
     myFixture.type('fo\n')
     myFixture.checkResult '''
 class Foo {
@@ -231,7 +232,7 @@
     final TemplateManager manager = TemplateManager.getInstance(getProject());
     final Template template = manager.createTemplate("frm", "user", '$VAR$');
     template.addVariable('VAR', new MacroCallNode(new CompleteMacro()), new EmptyNode(), true)
-    manager.startTemplate(getEditor(), template);
+    startTemplate(template);
     myFixture.type('fo\n')
     myFixture.checkResult '''
 class Foo {
@@ -253,7 +254,7 @@
     final TemplateManager manager = TemplateManager.getInstance(getProject());
     final Template template = manager.createTemplate("frm", "user", '$VAR$');
     template.addVariable('VAR', new MacroCallNode(new ClassNameCompleteMacro()), new EmptyNode(), true)
-    manager.startTemplate(getEditor(), template);
+    startTemplate(template);
     assert !state.finished
     assert 'Bar' in myFixture.lookupElementStrings
   }
@@ -278,7 +279,12 @@
   }
 
   def startTemplate(String name, String group) {
-    TemplateManager.getInstance(getProject()).startTemplate(getEditor(), TemplateSettings.getInstance().getTemplate(name, group));
+    startTemplate(TemplateSettings.getInstance().getTemplate(name, group));
+  }
+
+  def startTemplate(Template template) {
+    TemplateManager.getInstance(getProject()).startTemplate(getEditor(), template)
+    UIUtil.dispatchAllInvocationEvents()
   }
 
   private static <T extends TemplateContextType> T contextType(Class<T> clazz) {
@@ -533,7 +539,7 @@
     template.addVariable("V3", "", "", true);
     final Editor editor = getEditor();
 
-    writeCommand { manager.startTemplate(editor, template) }
+    writeCommand { startTemplate(template) }
 
     final TemplateState state = getState();
 
@@ -575,7 +581,7 @@
     template.addVariable("V1", "", "", true);
     template.addVariable("V2", "", '"239"', true);
 
-    writeCommand { manager.startTemplate(editor, template) }
+    writeCommand { startTemplate(template) }
 
     myFixture.checkResult '<caret> var = 239;'
 
@@ -596,7 +602,7 @@
 
     addTemplate(template, testRootDisposable)
     myFixture.type '\t'
-    myFixture.checkResult 'class A { void f() { Stri    "; } }'
+    myFixture.checkResult 'class A { void f() { Stri   "; } }'
   }
 
   static void addTemplate(Template template, Disposable parentDisposable) {
@@ -659,7 +665,7 @@
     template.addVariable('T', new MacroCallNode(new MethodReturnTypeMacro()), new EmptyNode(), false)
     template.toReformat = true
     
-    manager.startTemplate(getEditor(), template);
+    startTemplate(template);
     assert myFixture.editor.document.text.contains('List<Map.Entry<String, Integer>> result;')
   }
 
@@ -705,7 +711,7 @@
     final Template template = manager.createTemplate("xxx", "user", 'foo $ARG$ bar $END$ goo $SELECTION$ after');
     template.addVariable("ARG", "", "", true);
     
-    manager.startTemplate(editor, template);
+    startTemplate(template);
     myFixture.type('arg')
     state.nextTab()
     assert !state
@@ -731,7 +737,7 @@
     final Template template = manager.createTemplate("xxx", "user", 'foo.Bar.someMethod($END$)');
     template.setValue(USE_STATIC_IMPORT_IF_POSSIBLE, true);
 
-    manager.startTemplate(editor, template);
+    startTemplate(template);
     myFixture.checkResult """
 import static foo.Bar.someMethod;
 
@@ -754,7 +760,7 @@
     template.addVariable('B', macroCallNode, false)
 
     myFixture.configureByText "a.txt", "<caret>"
-    manager.startTemplate(editor, template);
+    startTemplate(template);
     myFixture.type('-foo-bar_goo-')
     state.nextTab()
     assert !state
@@ -779,7 +785,7 @@
     final Template template = manager.createTemplate("xxx", "user", 'foo.Bar.someMethod($END$)');
     template.setValue(USE_STATIC_IMPORT_IF_POSSIBLE, true);
 
-    manager.startTemplate(editor, template);
+    startTemplate(template);
     myFixture.checkResult """import static foo.Bar.someMethod;
 
 class Foo {
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/completion/TemplatesCompletionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/completion/TemplatesCompletionTest.java
index 39fd2fb..9fa0063 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/completion/TemplatesCompletionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/completion/TemplatesCompletionTest.java
@@ -17,6 +17,7 @@
 
 import com.intellij.JavaTestUtil;
 import com.intellij.codeInsight.completion.CompletionAutoPopupTestCase;
+import com.intellij.codeInsight.completion.CompletionType;
 import com.intellij.codeInsight.lookup.LookupElement;
 import com.intellij.codeInsight.lookup.impl.LookupImpl;
 import com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor;
@@ -27,10 +28,18 @@
 import org.jetbrains.annotations.Nullable;
 
 public class TemplatesCompletionTest extends CompletionAutoPopupTestCase {
+  private boolean shotTemplatesInTestsOldValue;
+
+  @Override
+  public void setUp() {
+    super.setUp();
+    shotTemplatesInTestsOldValue = LiveTemplateCompletionContributor.ourShowTemplatesInTests;
+    LiveTemplateCompletionContributor.ourShowTemplatesInTests = false;
+  }
 
   @Override
   public void tearDown() throws Exception {
-    LiveTemplateCompletionContributor.ourShowTemplatesInTests = false;
+    LiveTemplateCompletionContributor.ourShowTemplatesInTests = shotTemplatesInTestsOldValue;
 
     PostfixTemplatesSettings settings = PostfixTemplatesSettings.getInstance();
     assertNotNull(settings);
@@ -95,6 +104,17 @@
     doAutoPopupTest("instanceof", null);
   }
 
+  public void testDoNotShowTemplateInMultiCaretMode() {
+    doAutoPopupTest("instanceof", null);
+  }
+
+  public void testDoNotCompleteTemplateInMultiCaretMode() {
+    LiveTemplateCompletionContributor.ourShowTemplatesInTests = true;
+    configureByFile();
+    assertEmpty(myFixture.complete(CompletionType.BASIC));
+    checkResultByFile();
+  }
+
   public void testShowTemplateOnDoubleLiteral() {
     doAutoPopupTest("switch", SwitchStatementPostfixTemplate.class);
   }
@@ -146,7 +166,7 @@
   
   public void testTabCompletionWithTemplatesInAutopopup() {
     LiveTemplateCompletionContributor.ourShowTemplatesInTests = true;
-    
+
     configureByFile();
     type(".");
     myFixture.assertPreferredCompletionItems(0, "parents");
@@ -156,6 +176,12 @@
     checkResultByFile();
   }
 
+  public void testShouldNotExpandInMultiCaretMode() {
+    configureByFile();
+    type(".if\t");
+    checkResultByFile();
+  }
+  
   @Override
   protected String getBasePath() {
     return JavaTestUtil.getRelativeJavaTestDataPath() + "/codeInsight/template/postfix/completion";
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/FormatPostfixTemplateTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/FormatPostfixTemplateTest.java
new file mode 100644
index 0000000..fc336e0
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/FormatPostfixTemplateTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.template.postfix.templates;
+
+import org.jetbrains.annotations.NotNull;
+
+public class FormatPostfixTemplateTest extends PostfixTemplateTestCase {
+  @NotNull
+  @Override
+  protected String getSuffix() { return "format"; }
+
+  public void testString()      { doTest(); }
+  public void testNotString()   { doTest(); }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/NotNullPostfixTemplateTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/NotNullPostfixTemplateTest.java
index ca08b68..bbac7ff 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/NotNullPostfixTemplateTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/NotNullPostfixTemplateTest.java
@@ -17,9 +17,6 @@
 
 import org.jetbrains.annotations.NotNull;
 
-/**
- * @author ignatov
- */
 public class NotNullPostfixTemplateTest extends PostfixTemplateTestCase {
   @NotNull
   @Override
@@ -29,4 +26,5 @@
   public void testPrimitive()         { doTest(); }
   public void testNn()                { doTest(); }
   public void testSecondStatement()   { doTest(); }
+  public void testElseStatement()     { doTest(); }
 }
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/SoutPostfixTemplateTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/SoutPostfixTemplateTest.java
new file mode 100644
index 0000000..d3bcc74
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/SoutPostfixTemplateTest.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.template.postfix.templates;
+
+import org.jetbrains.annotations.NotNull;
+
+public class SoutPostfixTemplateTest extends PostfixTemplateTestCase {
+  @NotNull
+  @Override
+  protected String getSuffix() { return "sout"; }
+
+  public void testSimple() { doTest(); }
+  public void testVoid()   { doTest(); }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/TryPostfixTemplateTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/TryPostfixTemplateTest.java
new file mode 100644
index 0000000..7183883
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/template/postfix/templates/TryPostfixTemplateTest.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.codeInsight.template.postfix.templates;
+
+import org.jetbrains.annotations.NotNull;
+
+
+public class TryPostfixTemplateTest extends PostfixTemplateTestCase {
+
+  @NotNull
+  @Override
+  protected String getSuffix() {
+    return "try";
+  }
+
+  public void testSimple() {
+    doTest();
+  }
+
+  public void testStatement() {
+    doTest();
+  }
+
+  public void testMultiStatement() {
+    doTest();
+  }
+
+  public void testNotStatement() {
+    doTest();
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java
index f636c11..af69793 100644
--- a/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/DataFlowInspectionTest.java
@@ -274,6 +274,7 @@
   public void testContractWithNullable() { doTest(); }
   public void testContractPreservesUnknownNullability() { doTest(); }
   public void testContractSeveralClauses() { doTest(); }
+  public void testContractVarargs() { doTest(); }
 
   public void testBoxingImpliesNotNull() { doTest(); }
   public void testLargeIntegersAreNotEqualWhenBoxed() { doTest(); }
@@ -308,6 +309,10 @@
 
   public void testUnusedCallDoesNotMakeUnknown() { doTest(); }
   public void testGettersAndPureNoFlushing() { doTest(); }
+  
+  public void testNotNullAfterDereference() { doTest(); }
+
+  public void testNullableBoolean() { doTest(); }
 
   public void testSameComparisonTwice() { doTest(); }
 
@@ -320,6 +325,12 @@
     
     doTest(); 
   }
+
+  public void testTrueOrEqualsSomething() {
+    doTest();
+    myFixture.launchAction(myFixture.findSingleIntention("Remove redundant assignment"));
+    myFixture.checkResultByFile(getTestName(false) + "_after.java");
+  }
   
   public void _testNullCheckBeforeInstanceof() { doTest(); } // http://youtrack.jetbrains.com/issue/IDEA-113220
 }
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/JavaAPIUsagesInspectionTest.java b/java/java-tests/testSrc/com/intellij/codeInspection/JavaAPIUsagesInspectionTest.java
index 8414b7f..18b9656 100644
--- a/java/java-tests/testSrc/com/intellij/codeInspection/JavaAPIUsagesInspectionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/JavaAPIUsagesInspectionTest.java
@@ -23,17 +23,7 @@
 import com.intellij.JavaTestUtil;
 import com.intellij.codeInspection.ex.LocalInspectionToolWrapper;
 import com.intellij.codeInspection.java15api.Java15APIUsageInspection;
-import com.intellij.openapi.roots.ContentIterator;
-import com.intellij.openapi.util.Comparing;
-import com.intellij.openapi.vfs.JarFileSystem;
-import com.intellij.openapi.vfs.VfsUtilCore;
-import com.intellij.openapi.vfs.VirtualFile;
-import com.intellij.openapi.vfs.VirtualFileFilter;
 import com.intellij.pom.java.LanguageLevel;
-import com.intellij.psi.*;
-import com.intellij.psi.javadoc.PsiDocComment;
-import com.intellij.psi.javadoc.PsiDocTag;
-import com.intellij.psi.javadoc.PsiDocTagValue;
 import com.intellij.testFramework.IdeaTestUtil;
 import com.intellij.testFramework.InspectionTestCase;
 
@@ -70,9 +60,10 @@
     });
   }
 
-  @SuppressWarnings("UnusedDeclaration")
-  public void _testCollectSinceApiUsages() {
-    final String version = "1.7";
+  //generate apiXXX.txt
+  /*
+  public void testCollectSinceApiUsages() {
+    final String version = "1.8";
     final ContentIterator contentIterator = new ContentIterator() {
       @Override
       public boolean processFile(VirtualFile fileOrDir) {
@@ -102,15 +93,15 @@
         return true;
       }
     };
-    final VirtualFile srcFile = JarFileSystem.getInstance().findFileByPath("c:/program files/java/jdk1.6.0_12/src.zip!/");
+    final VirtualFile srcFile = JarFileSystem.getInstance().findFileByPath("c:/tools/jdk8/src.zip!/");
     assert srcFile != null;
     VfsUtilCore.iterateChildrenRecursively(srcFile, VirtualFileFilter.ALL, contentIterator);
   }
-/*
+
   @Override
   protected void setUpJdk() {
     Module[] modules = ModuleManager.getInstance(myProject).getModules();
-    final Sdk sdk = JavaSdk.getInstance().createJdk("1.7", "c:/program files (x86)/java/jdk1.7.0_09/", false);
+    final Sdk sdk = JavaSdk.getInstance().createJdk("1.8", "c:/tools/jdk8/", false);
     for (Module module : modules) {
       ModuleRootModificationUtil.setModuleSdk(module, sdk);
     }
diff --git a/java/java-tests/testSrc/com/intellij/codeInspection/RedundantCast15Test.java b/java/java-tests/testSrc/com/intellij/codeInspection/RedundantCast15Test.java
index ca3065d..4dd2964 100644
--- a/java/java-tests/testSrc/com/intellij/codeInspection/RedundantCast15Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInspection/RedundantCast15Test.java
@@ -57,6 +57,11 @@
     doTest();
   }
 
+  public void testBoxingTopCast() throws Exception {
+    IdeaTestUtil.setTestVersion(JavaSdkVersion.JDK_1_7, getModule(), getTestRootDisposable());
+    doTest();
+  }
+
   public void testIgnore() throws Exception {
     final RedundantCastInspection castInspection = new RedundantCastInspection();
     castInspection.IGNORE_ANNOTATED_METHODS = true;
diff --git a/java/java-tests/testSrc/com/intellij/execution/BaseConfigurationTestCase.java b/java/java-tests/testSrc/com/intellij/execution/BaseConfigurationTestCase.java
index 9092e25..9a88daa 100644
--- a/java/java-tests/testSrc/com/intellij/execution/BaseConfigurationTestCase.java
+++ b/java/java-tests/testSrc/com/intellij/execution/BaseConfigurationTestCase.java
@@ -32,6 +32,7 @@
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.roots.ModuleRootManager;
 import com.intellij.openapi.roots.ModuleRootModificationUtil;
+import com.intellij.openapi.util.Computable;
 import com.intellij.openapi.vfs.LocalFileSystem;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.JavaPsiFacade;
@@ -96,20 +97,21 @@
     return module;
   }
 
-  private Module createTempModule() throws IOException {
+  private Module createTempModule() {
     return createTempModule(myTempFiles, myProject);
   }
 
+  @NotNull
   public static Module createTempModule(TempFiles tempFiles, final Project project) {
     final String tempPath = tempFiles.createTempPath();
-    final Module[] module = new Module[1];
-    ApplicationManager.getApplication().runWriteAction(new Runnable() {
+    return ApplicationManager.getApplication().runWriteAction(new Computable<Module>() {
       @Override
-      public void run() {
-        module[0] = ModuleManager.getInstance(project).newModule(tempPath, StdModuleTypes.JAVA.getId());
+      public Module compute() {
+        Module result = ModuleManager.getInstance(project).newModule(tempPath, StdModuleTypes.JAVA.getId());
+        project.save();
+        return result;
       }
     });
-    return module[0];
   }
 
   protected static VirtualFile findFile(String path) {
diff --git a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java
index b0bc587..86d79fb 100644
--- a/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java
+++ b/java/java-tests/testSrc/com/intellij/find/FindManagerTest.java
@@ -28,7 +28,7 @@
 import com.intellij.openapi.command.WriteCommandAction;
 import com.intellij.openapi.fileEditor.FileDocumentManager;
 import com.intellij.openapi.fileTypes.FileTypes;
-import com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl;
+import com.intellij.openapi.fileTypes.PlainTextFileType;
 import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.openapi.util.ProperTextRange;
 import com.intellij.openapi.util.io.FileUtil;
@@ -302,8 +302,7 @@
     }.execute().getResultObject();
     
     assertNull(FileDocumentManager.getInstance().getCachedDocument(custom));
-    assertEquals(FileTypes.UNKNOWN, custom.getFileType());
-    assertFalse(FileTypeManagerImpl.isFileTypeDetectedFromContent(custom));
+    assertEquals(PlainTextFileType.INSTANCE, custom.getFileType());
 
     FindModel findModel = new FindModel();
     findModel.setWholeWordsOnly(true);
@@ -318,7 +317,6 @@
     // and we should get the same with text loaded
     assertNotNull(FileDocumentManager.getInstance().getDocument(custom));
     assertEquals(FileTypes.PLAIN_TEXT, custom.getFileType());
-    assertTrue(FileTypeManagerImpl.isFileTypeDetectedFromContent(custom));
 
     assertSize(2, findUsages(findModel));
   }
@@ -539,6 +537,22 @@
     }
   }
 
+  public void testFindInDirectoryOutsideProject() throws Exception {
+    final TempDirTestFixture tempDirFixture = new TempDirTestFixtureImpl();
+    tempDirFixture.setUp();
+    try {
+      tempDirFixture.createFile("a.txt", "foo bar foo");
+      FindModel findModel = FindManagerTestUtils.configureFindModel("foo");
+      findModel.setWholeWordsOnly(true);
+      findModel.setProjectScope(false);
+      findModel.setDirectoryName(tempDirFixture.getFile("").getPath());
+      assertSize(2, findUsages(findModel));
+    }
+    finally {
+      tempDirFixture.tearDown();
+    }
+  }
+
   public void testFindInJavaDocs() {
     FindModel findModel = FindManagerTestUtils.configureFindModel("done");
     String text = "/** done done done */";
diff --git a/java/java-tests/testSrc/com/intellij/ide/fileTemplates/SimpleTemplatesTest.java b/java/java-tests/testSrc/com/intellij/ide/fileTemplates/SimpleTemplatesTest.java
new file mode 100644
index 0000000..193dd7d
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/ide/fileTemplates/SimpleTemplatesTest.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.ide.fileTemplates;
+
+import com.intellij.ide.fileTemplates.impl.CustomFileTemplate;
+import com.intellij.testFramework.IdeaTestCase;
+import com.intellij.testFramework.LightPlatformTestCase;
+
+import java.util.Properties;
+
+/**
+ * @author Dmitry Avdeev
+ */
+public class SimpleTemplatesTest extends LightPlatformTestCase {
+
+  @SuppressWarnings("JUnitTestCaseWithNonTrivialConstructors")
+  public SimpleTemplatesTest() {
+    IdeaTestCase.initPlatformPrefix();
+  }
+
+  public void testConditional() throws Exception {
+    CustomFileTemplate template = new CustomFileTemplate("foo", "bar");
+    template.setText("#set($flag = \"$!IJ_BASE_PACKAGE\" != \"\")\n" +
+                     "<option name=\"MAIN_CLASS_NAME\" value=\"$IJ_BASE_PACKAGE#if($flag).#{end}Main\" />"
+    );
+    Properties attributes = new Properties();
+    attributes.setProperty("IJ_BASE_PACKAGE", "");
+    assertEquals("<option name=\"MAIN_CLASS_NAME\" value=\"Main\" />", template.getText(attributes));
+    attributes.setProperty("IJ_BASE_PACKAGE", "foo.bar");
+    assertEquals("<option name=\"MAIN_CLASS_NAME\" value=\"foo.bar.Main\" />", template.getText(attributes));
+  }
+
+  public void testInline() throws Exception {
+    CustomFileTemplate template = new CustomFileTemplate("foo", "bar");
+    template.setText("$IJ_BASE_PACKAGE.replace(\".\", \"/\")");
+    Properties attributes = new Properties();
+    attributes.setProperty("IJ_BASE_PACKAGE", "foo.bar");
+    assertEquals("foo/bar", template.getText(attributes));
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/index/IndexTest.java b/java/java-tests/testSrc/com/intellij/index/IndexTest.java
index 7770c5e..4fcb402 100644
--- a/java/java-tests/testSrc/com/intellij/index/IndexTest.java
+++ b/java/java-tests/testSrc/com/intellij/index/IndexTest.java
@@ -18,7 +18,7 @@
 import com.intellij.openapi.command.WriteCommandAction;
 import com.intellij.openapi.editor.Document;
 import com.intellij.openapi.fileEditor.FileDocumentManager;
-import com.intellij.openapi.fileTypes.UnknownFileType;
+import com.intellij.openapi.fileTypes.PlainTextFileType;
 import com.intellij.openapi.util.Factory;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.openapi.vfs.VfsUtil;
@@ -276,8 +276,8 @@
 
     final VirtualFile vFile = createChildData(dir, "Foo.test");
     VfsUtil.saveText(vFile, "Foo");
-    assertEquals(UnknownFileType.INSTANCE, vFile.getFileType());
-    assertEmpty(PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithPlainTextWords("Foo"));
+    assertEquals(PlainTextFileType.INSTANCE, vFile.getFileType());
+    assertOneElement(PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithPlainTextWords("Foo"));
 
     final Document document = FileDocumentManager.getInstance().getDocument(vFile);
     //todo should file type be changed silently without events?
@@ -287,22 +287,22 @@
     assertInstanceOf(file, PsiPlainTextFile.class);
     assertEquals("Foo", file.getText());
 
-    assertEmpty(PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithPlainTextWords("Foo"));
+    assertOneElement(PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithPlainTextWords("Foo"));
 
     WriteCommandAction.runWriteCommandAction(myProject, new Runnable() {
       @Override
       public void run() {
         document.insertString(0, " ");
         assertEquals("Foo", file.getText());
-        assertEmpty(PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithPlainTextWords("Foo"));
+        assertOneElement(PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithPlainTextWords("Foo"));
 
         FileDocumentManager.getInstance().saveDocument(document);
         assertEquals("Foo", file.getText());
-        assertEmpty(PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithPlainTextWords("Foo"));
+        assertOneElement(PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithPlainTextWords("Foo"));
 
         PsiDocumentManager.getInstance(myProject).commitAllDocuments();
         assertEquals(" Foo", file.getText());
-        assertEmpty(PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithPlainTextWords("Foo"));
+        assertOneElement(PsiSearchHelper.SERVICE.getInstance(myProject).findFilesWithPlainTextWords("Foo"));
 
       }
     });
diff --git a/java/java-tests/testSrc/com/intellij/index/StringIndex.java b/java/java-tests/testSrc/com/intellij/index/StringIndex.java
index 7d2dd10..0b5d48d 100644
--- a/java/java-tests/testSrc/com/intellij/index/StringIndex.java
+++ b/java/java-tests/testSrc/com/intellij/index/StringIndex.java
@@ -59,7 +59,7 @@
   private static class Indexer implements DataIndexer<String, String, PathContentPair> {
     @Override
     @NotNull
-    public Map<String,String> map(final PathContentPair inputData) {
+    public Map<String,String> map(@NotNull final PathContentPair inputData) {
       final Map<String,String> _map = new HashMap<String, String>();
       final StringBuilder builder = new StringBuilder();
       final String content = inputData.content;
diff --git a/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationTest.java b/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationTest.java
index da1de92..cba853e 100644
--- a/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationTest.java
+++ b/java/java-tests/testSrc/com/intellij/navigation/GotoImplementationTest.java
@@ -12,6 +12,7 @@
 import com.intellij.openapi.vfs.LocalFileSystem;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiClass;
+import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiMethod;
 import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.util.CommonProcessors;
@@ -26,8 +27,8 @@
  */
 public class GotoImplementationTest extends CodeInsightTestCase {
 
-  private static Collection<PsiClass> getClassImplementations(final PsiClass psiClass) {
-    CommonProcessors.CollectProcessor<PsiClass> processor = new CommonProcessors.CollectProcessor<PsiClass>();
+  private static Collection<PsiElement> getClassImplementations(final PsiClass psiClass) {
+    CommonProcessors.CollectProcessor<PsiElement> processor = new CommonProcessors.CollectProcessor<PsiElement>();
     ClassImplementationsSearch.processImplementations(psiClass, processor, psiClass.getUseScope());
 
     return processor.getResults();
@@ -64,29 +65,31 @@
     PsiClass test1 = myJavaFacade.findClass("com.test.TestI", moduleScope);
     PsiClass test2 = myJavaFacade.findClass("com.test.TestI", GlobalSearchScope.moduleScope(module2));
     PsiClass test3 = myJavaFacade.findClass("com.test.TestI", GlobalSearchScope.moduleScope(module3));
-    HashSet<PsiClass> expectedImpls1 = new HashSet<PsiClass>(Arrays.asList(
+    HashSet<PsiElement> expectedImpls1 = new HashSet<PsiElement>(Arrays.asList(
       myJavaFacade.findClass("com.test.TestIImpl1", moduleScope),
       myJavaFacade.findClass("com.test.TestIImpl2", moduleScope)
     ));
-    assertEquals(expectedImpls1, new HashSet<PsiClass>(getClassImplementations(test1)));
+    assertEquals(expectedImpls1, new HashSet<PsiElement>(getClassImplementations(test1)));
 
     PsiMethod psiMethod = test1.findMethodsByName("test", false)[0];
-    Set<PsiMethod> expectedMethodImpl1 = new HashSet<PsiMethod>(Arrays.asList(
+    Set<PsiElement> expectedMethodImpl1 = new HashSet<PsiElement>(Arrays.asList(
       myJavaFacade.findClass("com.test.TestIImpl1", moduleScope).findMethodsByName("test",false)[0],
       myJavaFacade.findClass("com.test.TestIImpl2", moduleScope).findMethodsByName("test",false)[0]
     ));
-    assertEquals(expectedMethodImpl1, new HashSet<PsiMethod>(Arrays.asList(MethodImplementationsSearch.getMethodImplementations(psiMethod, moduleScope))));
+    CommonProcessors.CollectProcessor<PsiElement> processor = new CommonProcessors.CollectProcessor<PsiElement>();
+    MethodImplementationsSearch.processImplementations(psiMethod, processor, moduleScope);
+    assertEquals(expectedMethodImpl1, new HashSet<PsiElement>(processor.getResults()));
 
-    HashSet<PsiClass> expectedImpls2 = new HashSet<PsiClass>(Arrays.asList(
+    HashSet<PsiElement> expectedImpls2 = new HashSet<PsiElement>(Arrays.asList(
       myJavaFacade.findClass("com.test.TestIImpl1", GlobalSearchScope.moduleScope(module2)),
       myJavaFacade.findClass("com.test.TestIImpl3", GlobalSearchScope.moduleScope(module2))
     ));
-    assertEquals(expectedImpls2, new HashSet<PsiClass>(getClassImplementations(test2)));
+    assertEquals(expectedImpls2, new HashSet<PsiElement>(getClassImplementations(test2)));
 
-    HashSet<PsiClass> expectedImpls3 = new HashSet<PsiClass>(Arrays.asList(
+    HashSet<PsiElement> expectedImpls3 = new HashSet<PsiElement>(Arrays.asList(
       myJavaFacade.findClass("com.test.TestIImpl1", GlobalSearchScope.moduleScope(module3))
     ));
-    assertEquals(expectedImpls3, new HashSet<PsiClass>(getClassImplementations(test3)));
+    assertEquals(expectedImpls3, new HashSet<PsiElement>(getClassImplementations(test3)));
 
   }
 
diff --git a/java/java-tests/testSrc/com/intellij/openapi/editor/impl/JavaFileEditorManagerTest.java b/java/java-tests/testSrc/com/intellij/openapi/editor/impl/JavaFileEditorManagerTest.java
index 2a985b8..4773532 100644
--- a/java/java-tests/testSrc/com/intellij/openapi/editor/impl/JavaFileEditorManagerTest.java
+++ b/java/java-tests/testSrc/com/intellij/openapi/editor/impl/JavaFileEditorManagerTest.java
@@ -15,7 +15,7 @@
  */
 package com.intellij.openapi.editor.impl;
 
-import com.intellij.openapi.fileEditor.FileEditorManagerTestCase;
+import com.intellij.testFramework.FileEditorManagerTestCase;
 import com.intellij.testFramework.PlatformTestUtil;
 import org.jdom.JDOMException;
 
diff --git a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java
index 23334b6..cf6f11e 100644
--- a/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java
+++ b/java/java-tests/testSrc/com/intellij/openapi/roots/impl/DirectoryIndexTest.java
@@ -20,6 +20,7 @@
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.fileTypes.FileTypeManager;
 import com.intellij.openapi.fileTypes.ex.FileTypeManagerEx;
+import com.intellij.openapi.module.ModifiableModuleModel;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleManager;
 import com.intellij.openapi.module.StdModuleTypes;
@@ -31,6 +32,7 @@
 import com.intellij.testFramework.IdeaTestCase;
 import com.intellij.testFramework.PlatformTestCase;
 import com.intellij.testFramework.PsiTestUtil;
+import gnu.trove.THashSet;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.jetbrains.jps.model.java.JavaResourceRootType;
@@ -39,10 +41,7 @@
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
+import java.util.*;
 
 import static java.util.Collections.singletonList;
 
@@ -330,9 +329,10 @@
   }
 
   public void testChangeIgnoreList() throws Exception {
-    myModule1Dir.createChildDirectory(this, "newDir");
-
+    VirtualFile newDir = myModule1Dir.createChildDirectory(this, "newDir");
+    
     myIndex.checkConsistency();
+    checkInfoNotNull(newDir);
 
     final FileTypeManagerEx fileTypeManager = (FileTypeManagerEx)FileTypeManager.getInstance();
     final String list = fileTypeManager.getIgnoredFilesList();
@@ -344,8 +344,8 @@
           fileTypeManager.setIgnoredFilesList(list1);
         }
       });
-
       myIndex.checkConsistency();
+      checkInfoNull(newDir);
     }
     finally {
       ApplicationManager.getApplication().runWriteAction(new Runnable() {
@@ -354,6 +354,7 @@
           fileTypeManager.setIgnoredFilesList(list);
         }
       });
+      checkInfoNotNull(newDir);
     }
   }
 
@@ -375,6 +376,45 @@
     myIndex.checkConsistency();
   }
 
+  public void testModuleUnderIgnoredDir() throws IOException {
+    final VirtualFile ignored = myRootVFile.createChildDirectory(this, "RCS");
+    assertTrue(FileTypeManager.getInstance().isFileIgnored(ignored));
+    final VirtualFile module4 = ignored.createChildDirectory(this, "module4");
+    assertFalse(FileTypeManager.getInstance().isFileIgnored(module4));
+    
+    new WriteCommandAction.Simple(getProject()) {
+      @Override
+      protected void run() throws Throwable {
+        ModuleManager moduleManager = ModuleManager.getInstance(myProject);
+        Module module = moduleManager.newModule(myRootVFile.getPath() + "/newModule.iml", StdModuleTypes.JAVA.getId());
+        PsiTestUtil.addContentRoot(module, module4);
+        checkInfoNull(ignored);
+        checkInfo(module4, module, false, false, null, null);
+      }
+    }.execute().throwException();
+
+  }
+
+  public void testModuleInIgnoredDir() throws IOException {
+    final VirtualFile ignored = myRootVFile.createChildDirectory(this, "RCS");
+    assertTrue(FileTypeManager.getInstance().isFileIgnored(ignored));
+    
+    new WriteCommandAction.Simple(getProject()) {
+      @Override
+      protected void run() throws Throwable {
+        ModuleManager moduleManager = ModuleManager.getInstance(myProject);
+        ModifiableModuleModel model = moduleManager.getModifiableModel();
+        model.disposeModule(myModule);
+        model.disposeModule(myModule2);
+        model.disposeModule(myModule3);
+        model.commit();
+        Module module = moduleManager.newModule(myRootVFile.getPath() + "/newModule.iml", StdModuleTypes.JAVA.getId());
+        PsiTestUtil.addContentRoot(module, ignored);
+        checkInfo(ignored, module, false, false, null, null);
+      }
+    }.execute().throwException();
+  }
+
   public void testExcludedDirsInLibraries() {
     ProjectFileIndex index = ProjectRootManager.getInstance(myProject).getFileIndex();
     assertFalse(index.isInLibraryClasses(myExcludedLibClsDir));
@@ -678,6 +718,203 @@
     assertFalse(myIndex.isProjectExcludeRoot(projectOutputUnderContent));
   }
 
+  public void testFileContentAndSourceRoots() throws IOException {
+    ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
+
+    VirtualFile fileRoot = myRootVFile.createChildData(this, "fileRoot.txt");
+    VirtualFile fileSourceRoot = myRootVFile.createChildData(this, "fileSourceRoot.txt");
+    VirtualFile fileTestSourceRoot = myRootVFile.createChildData(this, "fileTestSourceRoot.txt");
+
+    checkInfoNull(fileRoot);
+    assertFalse(fileIndex.isInContent(fileRoot));
+    assertIteratedContent(fileIndex, null, Arrays.asList(fileRoot, fileSourceRoot, fileTestSourceRoot));
+
+    ContentEntry contentEntry = PsiTestUtil.addContentRoot(myModule, fileRoot);
+    assertSame(fileRoot, contentEntry.getFile());
+    checkInfo(fileRoot, myModule, false, false, "", null);
+    assertTrue(fileIndex.isInContent(fileRoot));
+    assertFalse(fileIndex.isInSource(fileRoot));
+ 
+    PsiTestUtil.addContentRoot(myModule, fileSourceRoot);
+    PsiTestUtil.addSourceRoot(myModule, fileSourceRoot);
+    checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule);
+    assertTrue(fileIndex.isInContent(fileSourceRoot));
+    assertTrue(fileIndex.isInSource(fileSourceRoot));
+ 
+    PsiTestUtil.addContentRoot(myModule, fileTestSourceRoot);
+    PsiTestUtil.addSourceRoot(myModule, fileTestSourceRoot, true);
+    checkInfo(fileTestSourceRoot, myModule, false, false, "", JavaSourceRootType.TEST_SOURCE, myModule);
+    assertTrue(fileIndex.isInContent(fileTestSourceRoot));
+    assertTrue(fileIndex.isInSource(fileTestSourceRoot));
+
+    assertIteratedContent(fileIndex, Arrays.asList(fileRoot, fileSourceRoot, fileTestSourceRoot), null);
+
+    // removing file source root
+    PsiTestUtil.removeSourceRoot(myModule, fileTestSourceRoot);
+    checkInfo(fileTestSourceRoot, myModule, false, false, "", null);
+    assertTrue(fileIndex.isInContent(fileTestSourceRoot));
+    assertFalse(fileIndex.isInSource(fileTestSourceRoot));
+    assertIteratedContent(fileIndex, Arrays.asList(fileRoot, fileSourceRoot, fileTestSourceRoot), null);
+ 
+    // removing file content root
+    PsiTestUtil.removeContentEntry(myModule, contentEntry);
+    checkInfoNull(fileRoot);
+    assertFalse(fileIndex.isInContent(fileRoot));
+    assertFalse(fileIndex.isInSource(fileRoot));
+    assertIteratedContent(fileIndex, Arrays.asList(fileSourceRoot, fileTestSourceRoot), Arrays.asList(fileRoot));
+  }
+
+  private void assertIteratedContent(ProjectFileIndex fileIndex,
+                                     @Nullable List<VirtualFile> contains,
+                                     @Nullable List<VirtualFile> doesntContain) {
+    final Set<VirtualFile> collected = new THashSet<VirtualFile>();
+    fileIndex.iterateContent(new ContentIterator() {
+      @Override
+      public boolean processFile(VirtualFile fileOrDir) {
+        collected.add(fileOrDir);
+        return true;
+      }
+    });
+    if (contains != null) assertContainsElements(collected, contains);
+    if (doesntContain != null) assertDoesntContain(collected, doesntContain);
+  }
+
+  public void testFileSourceRootsUnderDirContentRoot() throws IOException {
+    ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
+
+    VirtualFile fileSourceRoot = myModule1Dir.createChildData(this, "fileSourceRoot.txt");
+    assertTrue(fileIndex.isInContent(fileSourceRoot));
+    assertFalse(fileIndex.isInSource(fileSourceRoot));
+    checkInfoNull(fileSourceRoot);
+
+    PsiTestUtil.addSourceRoot(myModule, fileSourceRoot);
+    assertTrue(fileIndex.isInContent(fileSourceRoot));
+    assertTrue(fileIndex.isInSource(fileSourceRoot));
+    checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule);
+
+    // removing file source root
+    PsiTestUtil.removeSourceRoot(myModule, fileSourceRoot);
+    assertTrue(fileIndex.isInContent(fileSourceRoot));
+    assertFalse(fileIndex.isInSource(fileSourceRoot));
+    checkInfoNull(fileSourceRoot);
+  }
+
+  public void testFileModuleExcludeRootUnderDirectoryRoot() throws IOException {
+    ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
+
+    VirtualFile fileExcludeRoot = mySrcDir1.createChildData(this, "fileExcludeRoot.txt");
+    assertTrue(fileIndex.isInContent(fileExcludeRoot));
+    assertTrue(fileIndex.isInSource(fileExcludeRoot));
+    checkInfoNull(fileExcludeRoot);
+    assertIteratedContent(fileIndex, Arrays.asList(fileExcludeRoot), null);
+
+    PsiTestUtil.addExcludedRoot(myModule, fileExcludeRoot);
+    assertFalse(fileIndex.isInContent(fileExcludeRoot));
+    assertFalse(fileIndex.isInSource(fileExcludeRoot));
+    checkInfoNull(fileExcludeRoot);
+    assertIteratedContent(fileIndex, null, Arrays.asList(fileExcludeRoot));
+
+    // removing file exclude root
+    PsiTestUtil.removeExcludedRoot(myModule, fileExcludeRoot);
+    assertTrue(fileIndex.isInContent(fileExcludeRoot));
+    assertTrue(fileIndex.isInSource(fileExcludeRoot));
+    checkInfoNull(fileExcludeRoot);
+    assertIteratedContent(fileIndex, Arrays.asList(fileExcludeRoot), null);
+  }
+
+  public void testFileModuleExcludeRootUnderFileRoot() throws IOException {
+    ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
+
+    VirtualFile fileRoot = myRootVFile.createChildData(this, "fileRoot.txt");
+    PsiTestUtil.addContentRoot(myModule, fileRoot);
+    checkInfo(fileRoot, myModule, false, false, "", null);
+    assertTrue(fileIndex.isInContent(fileRoot));
+    assertIteratedContent(fileIndex, Arrays.asList(fileRoot), null);
+    
+    PsiTestUtil.addExcludedRoot(myModule, fileRoot);
+    assertFalse(fileIndex.isInContent(fileRoot));
+    checkInfoNull(fileRoot);
+    assertIteratedContent(fileIndex, null, Arrays.asList(fileRoot));
+ 
+    // removing file exclude root
+    PsiTestUtil.removeExcludedRoot(myModule, fileRoot);
+    checkInfo(fileRoot, myModule, false, false, "", null);
+    assertTrue(fileIndex.isInContent(fileRoot));
+    assertIteratedContent(fileIndex, Arrays.asList(fileRoot), null);
+  }
+
+  public void testFileLibraryInsideFolderLibrary() throws IOException {
+    VirtualFile file = myLibSrcDir.createChildData(this, "empty.txt");
+    ModuleRootModificationUtil.addModuleLibrary(myModule2, "lib2",
+                                                Collections.<String>emptyList(), singletonList(file.getUrl()),
+                                                Collections.<String>emptyList(), DependencyScope.COMPILE, true);
+
+    // same for the dir and for the file
+    checkInfo(file, myModule, false, true, "", null, myModule2, myModule3);
+    checkInfo(myLibSrcDir, myModule, false, true, "", null, myModule2, myModule3);
+  }
+
+  public void testFileContentRootsModifications() throws IOException {
+    ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myProject).getFileIndex();
+
+    VirtualFile temp = myRootVFile.createChildDirectory(this, "temp");
+
+    VirtualFile fileSourceRoot = myRootVFile.createChildData(this, "fileSourceRoot.txt");
+    checkInfoNull(fileSourceRoot);
+
+    PsiTestUtil.addContentRoot(myModule, fileSourceRoot);
+    PsiTestUtil.addSourceRoot(myModule, fileSourceRoot);
+    checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule);
+    assertTrue(fileIndex.isInContent(fileSourceRoot));
+    assertTrue(fileIndex.isInSource(fileSourceRoot));
+
+    // delete and recreate
+    fileSourceRoot.delete(this);
+    checkInfoNull(fileSourceRoot);
+    assertFalse(fileIndex.isInContent(fileSourceRoot));
+    assertFalse(fileIndex.isInSource(fileSourceRoot));
+    fileSourceRoot = myRootVFile.createChildData(this, "fileSourceRoot.txt");
+    checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule);
+    assertTrue(fileIndex.isInContent(fileSourceRoot));
+    assertTrue(fileIndex.isInSource(fileSourceRoot));
+
+    // delete and move from another dir 
+    fileSourceRoot.delete(this);
+    checkInfoNull(fileSourceRoot);
+    assertFalse(fileIndex.isInContent(fileSourceRoot));
+    assertFalse(fileIndex.isInSource(fileSourceRoot));
+    fileSourceRoot = temp.createChildData(this, "fileSourceRoot.txt");
+    checkInfoNull(fileSourceRoot);
+    fileSourceRoot.move(this, myRootVFile);
+    checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule);
+    assertTrue(fileIndex.isInContent(fileSourceRoot));
+    assertTrue(fileIndex.isInSource(fileSourceRoot));
+
+    // delete and copy from another dir 
+    fileSourceRoot.delete(this);
+    checkInfoNull(fileSourceRoot);
+    assertFalse(fileIndex.isInContent(fileSourceRoot));
+    assertFalse(fileIndex.isInSource(fileSourceRoot));
+    fileSourceRoot = temp.createChildData(this, "fileSourceRoot.txt");
+    checkInfoNull(fileSourceRoot);
+    fileSourceRoot = fileSourceRoot.copy(this, myRootVFile, "fileSourceRoot.txt");
+    checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule);
+    assertTrue(fileIndex.isInContent(fileSourceRoot));
+    assertTrue(fileIndex.isInSource(fileSourceRoot));
+    
+    // delete and rename from another file
+    fileSourceRoot.delete(this);
+    checkInfoNull(fileSourceRoot);
+    assertFalse(fileIndex.isInContent(fileSourceRoot));
+    assertFalse(fileIndex.isInSource(fileSourceRoot));
+    fileSourceRoot = myRootVFile.createChildData(this, "temp_file.txt");
+    checkInfoNull(fileSourceRoot);
+    fileSourceRoot.rename(this, "fileSourceRoot.txt");
+    checkInfo(fileSourceRoot, myModule, false, false, "", JavaSourceRootType.SOURCE, myModule);
+    assertTrue(fileIndex.isInContent(fileSourceRoot));
+    assertTrue(fileIndex.isInSource(fileSourceRoot));
+  }
+
   private void checkInfo(VirtualFile dir,
                          @Nullable Module module,
                          boolean isInLibrary,
@@ -688,11 +925,11 @@
     DirectoryInfo info = checkInfoNotNull(dir);
     assertEquals(module, info.getModule());
     if (moduleSourceRootType != null) {
-      assertTrue(info.isInModuleSource());
+      assertTrue("isInModuleSource", info.isInModuleSource());
       assertEquals(moduleSourceRootType, myIndex.getSourceRootType(info));
     }
     else {
-      assertFalse(info.isInModuleSource());
+      assertFalse("isInModuleSource", info.isInModuleSource());
     }
     assertEquals(isInLibrary, info.hasLibraryClassRoot());
     assertEquals(isInLibrarySource, info.isInLibrarySource());
@@ -725,12 +962,4 @@
     assertOrderedEquals(actualDirs, expectedDirs);
   }
 
-  public void testFileLibraryInsideFolderLibrary() throws IOException {
-    VirtualFile file = myLibSrcDir.createChildData(this, "empty.txt");
-    ModuleRootModificationUtil.addModuleLibrary(myModule2, "lib2",
-                                                Collections.<String>emptyList(), singletonList(file.getUrl()),
-                                                Collections.<String>emptyList(), DependencyScope.COMPILE, true);
-    checkInfo(file, null, false, true, "", null, myModule2, myModule3);
-
-  }
 }
diff --git a/java/java-tests/testSrc/com/intellij/openapi/vfs/JarFileSystemTest.java b/java/java-tests/testSrc/com/intellij/openapi/vfs/JarFileSystemTest.java
deleted file mode 100644
index d1154ef..0000000
--- a/java/java-tests/testSrc/com/intellij/openapi/vfs/JarFileSystemTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright 2000-2013 JetBrains s.r.o.
- *
- * 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.intellij.openapi.vfs;
-
-import com.intellij.openapi.application.ApplicationManager;
-import com.intellij.openapi.projectRoots.Sdk;
-import com.intellij.openapi.roots.ModuleRootManager;
-import com.intellij.openapi.util.Ref;
-import com.intellij.openapi.util.io.IoTestUtil;
-import com.intellij.openapi.vfs.newvfs.BulkFileListener;
-import com.intellij.openapi.vfs.newvfs.events.VFileContentChangeEvent;
-import com.intellij.openapi.vfs.newvfs.events.VFileEvent;
-import com.intellij.testFramework.IdeaTestCase;
-import org.jetbrains.annotations.NotNull;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.List;
-
-import static com.intellij.testFramework.PlatformTestUtil.assertPathsEqual;
-
-public class JarFileSystemTest extends IdeaTestCase {
-  public void testFindFile() throws IOException {
-    String rtJarPath = getJdkRtPath("src.zip");
-
-    VirtualFile jarRoot = findByPath(rtJarPath + JarFileSystem.JAR_SEPARATOR);
-    assertTrue(jarRoot.isDirectory());
-
-    VirtualFile file2 = findByPath(rtJarPath + JarFileSystem.JAR_SEPARATOR + "java");
-    assertTrue(file2.isDirectory());
-
-    VirtualFile file3 = jarRoot.findChild("java");
-    assertEquals(file2, file3);
-
-    VirtualFile file4 = findByPath(rtJarPath + JarFileSystem.JAR_SEPARATOR + "java/lang/Object.java");
-    assertTrue(!file4.isDirectory());
-
-    byte[] bytes = file4.contentsToByteArray();
-    assertNotNull(bytes);
-    assertTrue(bytes.length > 10);
-  }
-
-  public void testMetaInf() {
-    String rtJarPath = getJdkRtPath("jre/lib/rt.jar");
-
-    VirtualFile jarRoot = findByPath(rtJarPath + JarFileSystem.JAR_SEPARATOR);
-    assertTrue(jarRoot.isDirectory());
-
-    VirtualFile metaInf = jarRoot.findChild("META-INF");
-    assertNotNull(metaInf);
-
-    VirtualFile[] children = metaInf.getChildren();
-    assertEquals(1, children.length);
-  }
-
-  public void testJarRefresh() throws IOException {
-    File jar = IoTestUtil.createTestJar();
-    assertTrue(jar.setLastModified(jar.lastModified() - 1000));
-    VirtualFile vFile = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(jar);
-    assertNotNull(vFile);
-
-    final VirtualFile entry = findByPath(jar.getPath() + JarFileSystem.JAR_SEPARATOR + "entry.txt");
-    assertContent(entry, "test");
-
-    final Ref<Boolean> updated = Ref.create(false);
-    ApplicationManager.getApplication().getMessageBus().connect(myTestRootDisposable).subscribe(
-      VirtualFileManager.VFS_CHANGES,
-      new BulkFileListener.Adapter() {
-        @Override
-        public void before(@NotNull List<? extends VFileEvent> events) {
-          for (VFileEvent event : events) {
-            if (event instanceof VFileContentChangeEvent && entry.equals(event.getFile())) {
-              updated.set(true);
-              break;
-            }
-          }
-        }
-      }
-    );
-
-    IoTestUtil.writeEntry(jar, "entry.txt", "update");
-    vFile.refresh(false, false);
-
-    assertTrue(updated.get());
-    assertTrue(entry.isValid());
-    assertContent(entry, "update");
-  }
-
-  private String getJdkRtPath(String relativePath) {
-    Sdk jdk = ModuleRootManager.getInstance(myModule).getSdk();
-    assertNotNull(jdk);
-    VirtualFile jdkHome = jdk.getHomeDirectory();
-    assertNotNull(jdkHome);
-    return jdkHome.getPath() + "/" + relativePath;
-  }
-
-  private static VirtualFile findByPath(String path) {
-    VirtualFile file = JarFileSystem.getInstance().findFileByPath(path);
-    assertNotNull(file);
-    assertPathsEqual(path, file.getPath());
-    return file;
-  }
-
-  private static void assertContent(VirtualFile file, String expected) throws IOException {
-    String content = new String(file.contentsToByteArray());
-    assertEquals(expected, content);
-  }
-}
diff --git a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java
index 7523e5b..4ac4bfb 100644
--- a/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java
+++ b/java/java-tests/testSrc/com/intellij/psi/ClsMirrorBuildingTest.java
@@ -18,8 +18,10 @@
 import com.intellij.JavaTestUtil;
 import com.intellij.ide.highlighter.JavaFileType;
 import com.intellij.openapi.util.text.StringUtil;
+import com.intellij.openapi.vfs.JarFileSystem;
 import com.intellij.openapi.vfs.LocalFileSystem;
 import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.openapi.vfs.VirtualFileSystem;
 import com.intellij.psi.codeStyle.CodeStyleSettingsManager;
 import com.intellij.psi.codeStyle.CommonCodeStyleSettings;
 import com.intellij.psi.impl.compiled.ClsFileImpl;
@@ -52,7 +54,7 @@
   public void testLocalClass() { doTest(); }
   public void testBounds() { doTest(); }
 
-  public void testTextPsiMismatch() throws Exception {
+  public void testTextPsiMismatch() {
     CommonCodeStyleSettings.IndentOptions options =
       CodeStyleSettingsManager.getInstance(getProject()).getCurrentSettings().getIndentOptions(JavaFileType.INSTANCE);
     int indent = options.INDENT_SIZE;
@@ -65,22 +67,31 @@
     }
   }
 
+  public void testJdk8Class() {
+    String testDir = JavaTestUtil.getJavaTestDataPath();
+    String clsPath = testDir + "/../../mockJDK-1.8/jre/lib/rt.jar!/java/lang/Class.class";
+    String txtPath = testDir + "/psi/cls/mirror/" + "Class.txt";
+    doTest(clsPath, txtPath);
+  }
+
   private void doTest() {
     doTest(getTestName(false));
   }
 
   private static void doTest(String name) {
     String testDir = JavaTestUtil.getJavaTestDataPath() + "/psi/cls/mirror/";
+    doTest(testDir + "pkg/" + name + ".class", testDir + name + ".txt");
+  }
 
-    String clsPath = testDir + "pkg/" + name + ".class";
-    VirtualFile vFile = LocalFileSystem.getInstance().findFileByPath(clsPath);
+  private static void doTest(String clsPath, String txtPath) {
+    VirtualFileSystem fs = clsPath.contains("!/") ? JarFileSystem.getInstance() : LocalFileSystem.getInstance();
+    VirtualFile vFile = fs.findFileByPath(clsPath);
     assertNotNull(clsPath, vFile);
     PsiFile clsFile = getPsiManager().findFile(vFile);
     assertNotNull(vFile.getPath(), clsFile);
 
     String expected;
     try {
-      String txtPath = testDir + name + ".txt";
       expected = StringUtil.trimTrailing(PlatformTestUtil.loadFileText(txtPath));
     }
     catch (IOException e) {
diff --git a/java/java-tests/testSrc/com/intellij/psi/ClsRepositoryUseTest.java b/java/java-tests/testSrc/com/intellij/psi/ClsRepositoryUseTest.java
index 504838c..709eb88 100644
--- a/java/java-tests/testSrc/com/intellij/psi/ClsRepositoryUseTest.java
+++ b/java/java-tests/testSrc/com/intellij/psi/ClsRepositoryUseTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,7 +18,6 @@
 import com.intellij.ide.highlighter.JavaFileType;
 import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.application.ex.PathManagerEx;
-import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.roots.ModuleRootModificationUtil;
 import com.intellij.openapi.roots.OrderRootType;
 import com.intellij.openapi.util.io.FileUtil;
@@ -37,9 +36,8 @@
 
 @PlatformTestCase.WrapInCommand
 public class ClsRepositoryUseTest extends PsiTestCase {
-  private static final Logger LOG = Logger.getInstance("#com.intellij.psi.ClsRepositoryUseTest");
-
   private static final String TEST_ROOT = PathManagerEx.getTestDataPath() + "/psi/repositoryUse/cls";
+
   private GlobalSearchScope RESOLVE_SCOPE;
 
   @Override
@@ -50,15 +48,9 @@
       new Runnable() {
         @Override
         public void run() {
-          try {
-            VirtualFile vDir = getRootFile();
-            PsiTestUtil.removeAllRoots(myModule, IdeaTestUtil.getMockJdk17());
-            addLibraryToRoots(vDir, OrderRootType.CLASSES);
-//            PsiTestUtil.addSourceContentToRoots(myProject, vDir);
-          }
-          catch (Exception e) {
-            LOG.error(e);
-          }
+          VirtualFile vDir = getRootFile();
+          PsiTestUtil.removeAllRoots(myModule, IdeaTestUtil.getMockJdk17());
+          addLibraryToRoots(vDir, OrderRootType.CLASSES);
         }
       }
     );
@@ -76,28 +68,21 @@
     final File classes = createTempDir("classes", false);
 
     final File com = new File(classes, "com");
-    //noinspection ResultOfMethodCallIgnored
-    com.mkdir();
+    FileUtil.ensureExists(com);
 
     File dataPath = new File(PathManagerEx.getTestDataPath() + "/psi/cls");
 
     final File target = new File(com, "TestClass.class");
     FileUtil.copy(new File(dataPath, "1/TestClass.class"), target);
-    //noinspection ResultOfMethodCallIgnored
-    target.setLastModified(System.currentTimeMillis());
+    assertTrue(target.setLastModified(System.currentTimeMillis()));
 
     ApplicationManager.getApplication().runWriteAction(
       new Runnable() {
         @Override
         public void run() {
-          try {
-            VirtualFile vDir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(classes);
-            assertNotNull(vDir);
-            addLibraryToRoots(vDir, OrderRootType.CLASSES);
-          }
-          catch (Exception e) {
-            LOG.error(e);
-          }
+          VirtualFile vDir = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(classes);
+          assertNotNull(vDir);
+          addLibraryToRoots(vDir, OrderRootType.CLASSES);
         }
       }
     );
@@ -123,20 +108,14 @@
     assertEquals("method1", psiClass.getMethods()[1].getName());
 
     FileUtil.copy(new File(dataPath, "2/TestClass.class"), target);
-    //noinspection ResultOfMethodCallIgnored
-    target.setLastModified(System.currentTimeMillis() + 5000);
+    assertTrue(target.setLastModified(System.currentTimeMillis() + 5000));
 
     assert vFile != null;
     ApplicationManager.getApplication().runWriteAction(
       new Runnable() {
         @Override
         public void run() {
-          try {
-            vFile.refresh(false, false);
-          }
-          catch (Exception e) {
-            LOG.error(e);
-          }
+          vFile.refresh(false, false);
         }
       }
     );
@@ -375,7 +354,6 @@
 
     assertEquals("void", type1.getText());
     assertTrue(type1.getType() instanceof PsiPrimitiveType);
-    assertTrue(!(type1.getType() instanceof PsiArrayType));
 
     PsiMethod method3 = aClass.getMethods()[2];
     assertNull(method3.getReturnType());
@@ -400,7 +378,7 @@
 
     PsiField field = aClass.getFields()[1];
     PsiType type = field.getType();
-    LOG.assertTrue(type instanceof PsiArrayType);
+    assertTrue(type instanceof PsiArrayType);
     PsiType componentType = ((PsiArrayType)type).getComponentType();
 
     assertTrue(componentType.equalsToText(CommonClassNames.JAVA_LANG_OBJECT));
@@ -497,7 +475,6 @@
     assertEquals("java.io.IOException", refs[1].getCanonicalText());
   }
 
-
   public void testParameters() throws Exception {
     PsiClass aClass = myJavaFacade.findClass("pack.MyClass", GlobalSearchScope.allScope(myProject));
     assert aClass != null;
@@ -524,7 +501,11 @@
     PsiClass objectClass = myJavaFacade.findClasses(CommonClassNames.JAVA_LANG_OBJECT, RESOLVE_SCOPE)[1];
     assertEquals(objectClass, target2);
 
-    parameters[0].getModifierList();
+    assertNotNull(parameters[0].getModifierList());
+    assertNotNull(parameters[1].getModifierList());
+
+    assertEquals("ints", parameters[0].getName());
+    assertEquals("o", parameters[1].getName());
   }
 
   public void testGenericClass() throws Exception {
@@ -706,10 +687,6 @@
     final PsiType returnType = methodsWithReturnType.getReturnType();
     assert returnType != null : methodsWithReturnType;
     assertEquals("pack.Parametrized<? extends T>", returnType.getCanonicalText());
-
-    //TODO[ven, max]: After fix for loading decompiled stuff the result had been change. Need to discuss whether this is important
-    //enough to try to conform old output.
-    //assertEquals("public Parametrized<? extends T> method() { /* compiled code */ }", methodsWithReturnType.getText());
     assertEquals("public pack.Parametrized<? extends T> method() { /* compiled code */ }", methodsWithReturnType.getText());
   }
 
diff --git a/java/java-tests/testSrc/com/intellij/psi/ConstantValuesTest.java b/java/java-tests/testSrc/com/intellij/psi/ConstantValuesTest.java
index 5c3b631..af68ad6 100644
--- a/java/java-tests/testSrc/com/intellij/psi/ConstantValuesTest.java
+++ b/java/java-tests/testSrc/com/intellij/psi/ConstantValuesTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2013 JetBrains s.r.o.
+ * Copyright 2000-2014 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -25,6 +25,7 @@
 import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.testFramework.PsiTestCase;
 import com.intellij.testFramework.PsiTestUtil;
+import org.jetbrains.annotations.NotNull;
 
 import java.io.IOException;
 
@@ -57,7 +58,7 @@
   }
 
   @Override
-  protected void invokeTestRunnable(Runnable runnable) throws Exception {
+  protected void invokeTestRunnable(@NotNull Runnable runnable) throws Exception {
     super.invokeTestRunnable(runnable);
     final PsiJavaFile file = (PsiJavaFile)myClass.getContainingFile();
 
diff --git a/java/java-tests/testSrc/com/intellij/psi/PsiConcurrencyStressTest.java b/java/java-tests/testSrc/com/intellij/psi/PsiConcurrencyStressTest.java
index 9250602..8316fe7 100644
--- a/java/java-tests/testSrc/com/intellij/psi/PsiConcurrencyStressTest.java
+++ b/java/java-tests/testSrc/com/intellij/psi/PsiConcurrencyStressTest.java
@@ -33,6 +33,7 @@
 import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.testFramework.*;
 import com.intellij.util.IncorrectOperationException;
+import org.jetbrains.annotations.NotNull;
 
 import java.util.Random;
 import java.util.concurrent.CountDownLatch;
@@ -193,7 +194,7 @@
   }
 
   @Override
-  protected void invokeTestRunnable(final Runnable runnable) throws Exception {
+  protected void invokeTestRunnable(@NotNull final Runnable runnable) throws Exception {
     runnable.run();
   }
 }
diff --git a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerSpecialRuleTest.groovy b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerSpecialRuleTest.groovy
index 024f0cd..71959e5 100644
--- a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerSpecialRuleTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerSpecialRuleTest.groovy
@@ -15,6 +15,7 @@
  */
 package com.intellij.psi.codeStyle.arrangement
 
+import static com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.EntryType.*
 import static com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.Modifier.*
 import static com.intellij.psi.codeStyle.arrangement.std.StdArrangementTokens.Order.BY_NAME
 
@@ -112,4 +113,23 @@
       rules: [ruleWithOrder(BY_NAME, rule(PUBLIC)), ruleWithOrder(BY_NAME, rule(PUBLIC, STATIC))]
     )
   }
+
+  void "test different entries type with modifier conditions"() {
+    doTest(
+      initial: '''\
+class Test {
+  public static void b() {}
+  public void a() {}
+}
+''',
+      expected: '''\
+class Test {
+  public void a() {}
+  public static void b() {}
+}
+''',
+      rules: [rule(FIELD, PUBLIC), rule(FIELD), rule(METHOD, PUBLIC), rule(METHOD), rule(METHOD, PUBLIC, ABSTRACT), rule(METHOD, ABSTRACT),
+              rule(FIELD, PUBLIC, STATIC), rule(FIELD, STATIC), rule(METHOD, PUBLIC, STATIC), rule(METHOD, STATIC)]
+    )
+  }
 }
diff --git a/java/java-tests/testSrc/com/intellij/psi/search/FindUsagesTest.java b/java/java-tests/testSrc/com/intellij/psi/search/FindUsagesTest.java
index 185ec30..d6e5e9d 100644
--- a/java/java-tests/testSrc/com/intellij/psi/search/FindUsagesTest.java
+++ b/java/java-tests/testSrc/com/intellij/psi/search/FindUsagesTest.java
@@ -89,7 +89,7 @@
   public void testLibraryClassUsageFromDecompiledSource() {
     PsiElement decompiled =
       ((PsiCompiledElement)myJavaFacade.findClass("javax.swing.JLabel", GlobalSearchScope.allScope(myProject))).getMirror();
-    assertEquals(2, ReferencesSearch.search(decompiled).findAll().size());
+    assertEquals(2, ReferencesSearch.search(decompiled, GlobalSearchScope.projectScope(myProject)).findAll().size());
   }
 
   public void testImplicitConstructorUsage() throws Throwable {
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/AbstractJavaInplaceIntroduceTest.java b/java/java-tests/testSrc/com/intellij/refactoring/AbstractJavaInplaceIntroduceTest.java
index 5c760ce..82b047c 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/AbstractJavaInplaceIntroduceTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/AbstractJavaInplaceIntroduceTest.java
@@ -42,7 +42,7 @@
   }
 
   @Nullable
-  protected static PsiExpression getExpressionFromEditor() {
+  protected PsiExpression getExpressionFromEditor() {
     final PsiExpression expression = PsiTreeUtil.getParentOfType(getFile().findElementAt(getEditor().getCaretModel().getOffset()), PsiExpression.class);
     if (expression instanceof PsiReferenceExpression && expression.getParent() instanceof PsiMethodCallExpression) {
       return (PsiExpression)expression.getParent();
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureBaseTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureBaseTest.java
new file mode 100644
index 0000000..69b5cc0
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureBaseTest.java
@@ -0,0 +1,172 @@
+/*
+ * Copyright 2000-2014 JetBrains s.r.o.
+ *
+ * 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.intellij.refactoring;
+
+import com.intellij.JavaTestUtil;
+import com.intellij.codeInsight.TargetElementUtilBase;
+import com.intellij.psi.*;
+import com.intellij.refactoring.changeSignature.ChangeSignatureProcessor;
+import com.intellij.refactoring.changeSignature.JavaThrownExceptionInfo;
+import com.intellij.refactoring.changeSignature.ParameterInfoImpl;
+import com.intellij.refactoring.changeSignature.ThrownExceptionInfo;
+import com.intellij.util.IncorrectOperationException;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public abstract class ChangeSignatureBaseTest extends LightRefactoringTestCase {
+  protected PsiElementFactory myFactory;
+
+  @NotNull
+  @Override
+  protected String getTestDataPath() {
+    return JavaTestUtil.getJavaTestDataPath();
+  }
+
+  @Override
+  public void setUp() throws Exception {
+    super.setUp();
+    myFactory = JavaPsiFacade.getInstance(getProject()).getElementFactory();
+  }
+
+  protected void doTest(@Nullable String returnType,
+                        @Nullable final String[] parameters,
+                        @Nullable final String[] exceptions,
+                        boolean delegate) {
+    GenParams genParams = parameters == null ? new SimpleParameterGen() : new GenParams() {
+      @Override
+      public ParameterInfoImpl[] genParams(PsiMethod method) throws IncorrectOperationException {
+        ParameterInfoImpl[] parameterInfos = new ParameterInfoImpl[parameters.length];
+        for (int i = 0; i < parameters.length; i++) {
+          PsiType type = myFactory.createTypeFromText(parameters[i], method);
+          parameterInfos[i] = new ParameterInfoImpl(-1, "p" + (i + 1), type);
+        }
+        return parameterInfos;
+      }
+    };
+
+    GenExceptions genExceptions = exceptions == null ? new SimpleExceptionsGen() : new GenExceptions() {
+      @Override
+      public ThrownExceptionInfo[] genExceptions(PsiMethod method) throws IncorrectOperationException {
+        ThrownExceptionInfo[] exceptionInfos = new ThrownExceptionInfo[exceptions.length];
+        for (int i = 0; i < exceptions.length; i++) {
+          PsiType type = myFactory.createTypeFromText(exceptions[i], method);
+          exceptionInfos[i] = new JavaThrownExceptionInfo(-1, (PsiClassType)type);
+        }
+        return exceptionInfos;
+      }
+    };
+
+    doTest(null, null, returnType, genParams, genExceptions, delegate);
+  }
+
+  protected void doTest(@Nullable String newReturnType, ParameterInfoImpl[] parameterInfos, boolean generateDelegate) {
+    doTest(null, null, newReturnType, parameterInfos, new ThrownExceptionInfo[0], generateDelegate);
+  }
+
+  protected void doTest(@PsiModifier.ModifierConstant @Nullable String newVisibility,
+                        @Nullable String newName,
+                        @Nullable String newReturnType,
+                        ParameterInfoImpl[] parameterInfo,
+                        ThrownExceptionInfo[] exceptionInfo,
+                        boolean generateDelegate) {
+    SimpleParameterGen params = new SimpleParameterGen(parameterInfo);
+    SimpleExceptionsGen exceptions = new SimpleExceptionsGen(exceptionInfo);
+    doTest(newVisibility, newName, newReturnType, params, exceptions, generateDelegate);
+  }
+
+  protected void doTest(@PsiModifier.ModifierConstant @Nullable String newVisibility,
+                        @Nullable String newName,
+                        @Nullable @NonNls String newReturnType,
+                        GenParams genParams,
+                        boolean generateDelegate) {
+    doTest(newVisibility, newName, newReturnType, genParams, new SimpleExceptionsGen(), generateDelegate);
+  }
+
+  protected void doTest(@PsiModifier.ModifierConstant @Nullable String newVisibility,
+                        @Nullable String newName,
+                        @Nullable String newReturnType,
+                        GenParams genParams,
+                        GenExceptions genExceptions,
+                        boolean generateDelegate) {
+    String basePath = getRelativePath() + getTestName(false);
+    configureByFile(basePath + ".java");
+    PsiElement targetElement = TargetElementUtilBase.findTargetElement(getEditor(), TargetElementUtilBase.ELEMENT_NAME_ACCEPTED);
+    assertTrue("<caret> is not on method name", targetElement instanceof PsiMethod);
+    PsiMethod method = (PsiMethod)targetElement;
+    PsiType newType = newReturnType != null ? myFactory.createTypeFromText(newReturnType, method) : method.getReturnType();
+    new ChangeSignatureProcessor(getProject(), method, generateDelegate, newVisibility,
+                                 newName != null ? newName : method.getName(),
+                                 newType, genParams.genParams(method), genExceptions.genExceptions(method)).run();
+    checkResultByFile(basePath + "_after.java");
+  }
+
+  protected String getRelativePath() {
+    return "/refactoring/changeSignature/";
+  }
+
+  protected interface GenParams {
+    ParameterInfoImpl[] genParams(PsiMethod method) throws IncorrectOperationException;
+  }
+
+  protected interface GenExceptions {
+    ThrownExceptionInfo[] genExceptions(PsiMethod method) throws IncorrectOperationException;
+  }
+
+  protected static class SimpleParameterGen implements GenParams {
+    private ParameterInfoImpl[] myInfos;
+
+    public SimpleParameterGen() { }
+
+    public SimpleParameterGen(ParameterInfoImpl[] infos) {
+      myInfos = infos;
+    }
+
+    @Override
+    public ParameterInfoImpl[] genParams(PsiMethod method) {
+      if (myInfos == null) {
+        myInfos = new ParameterInfoImpl[method.getParameterList().getParametersCount()];
+        for (int i = 0; i < myInfos.length; i++) {
+          myInfos[i] = new ParameterInfoImpl(i);
+        }
+      }
+      for (ParameterInfoImpl info : myInfos) {
+        info.updateFromMethod(method);
+      }
+      return myInfos;
+    }
+  }
+
+  protected static class SimpleExceptionsGen implements GenExceptions {
+    private final ThrownExceptionInfo[] myInfos;
+
+    public SimpleExceptionsGen() {
+      myInfos = new ThrownExceptionInfo[0];
+    }
+
+    public SimpleExceptionsGen(ThrownExceptionInfo[] infos) {
+      myInfos = infos;
+    }
+
+    @Override
+    public ThrownExceptionInfo[] genExceptions(PsiMethod method) {
+      for (ThrownExceptionInfo info : myInfos) {
+        info.updateFromMethod(method);
+      }
+      return myInfos;
+    }
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java
index 4f6c448..4cd9936 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/ChangeSignatureTest.java
@@ -15,7 +15,6 @@
  */
 package com.intellij.refactoring;
 
-import com.intellij.JavaTestUtil;
 import com.intellij.codeInsight.TargetElementUtilBase;
 import com.intellij.psi.*;
 import com.intellij.refactoring.changeSignature.ChangeSignatureProcessor;
@@ -24,22 +23,13 @@
 import com.intellij.refactoring.changeSignature.ThrownExceptionInfo;
 import com.intellij.refactoring.util.CanonicalTypes;
 import com.intellij.util.IncorrectOperationException;
-import org.jetbrains.annotations.NonNls;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
 
 import java.util.HashSet;
 
 /**
  * @author dsl
  */
-public class ChangeSignatureTest extends LightRefactoringTestCase {
-  private PsiElementFactory myFactory;
-
-  public void setUp() throws Exception {
-    super.setUp();
-    myFactory = JavaPsiFacade.getInstance(getProject()).getElementFactory();
-  }
+public class ChangeSignatureTest extends ChangeSignatureBaseTest {
 
   public void testSimple() {
     doTest(null, null, null, new ParameterInfoImpl[0], new ThrownExceptionInfo[0], false);
@@ -392,7 +382,7 @@
   }
 
   public void testPropagateParameter() {
-    String basePath = "/refactoring/changeSignature/" + getTestName(false);
+    String basePath = getRelativePath() + getTestName(false);
     configureByFile(basePath + ".java");
     final PsiElement targetElement = TargetElementUtilBase.findTargetElement(getEditor(), TargetElementUtilBase.ELEMENT_NAME_ACCEPTED);
     assertTrue("<caret> is not on method name", targetElement instanceof PsiMethod);
@@ -413,102 +403,14 @@
     checkResultByFile(basePath + "_after.java");
   }
 
+  public void testTypeAnnotationsAllAround() {
+    //String[] ps = {"@TA(1) int @TA(2) []", "java.util.@TA(4) List<@TA(5) Class<@TA(6) ?>>", "@TA(7) String @TA(8) ..."};
+    //String[] ex = {"@TA(42) IllegalArgumentException", "java.lang.@TA(43) IllegalStateException"};
+    //doTest("java.util.@TA(0) List<@TA(1) C.@TA(1) Inner>", ps, ex, false);
+    String[] ps = {"@TA(2) int @TA(3) []", "@TA(4) List<@TA(5) Class<@TA(6) ?>>", "@TA(7) String @TA(8) ..."};
+    String[] ex = {};
+    doTest("@TA(0) List<@TA(1) Inner>", ps, ex, false);
+  }
+
   /* workers */
-
-  private void doTest(@Nullable String newReturnType, ParameterInfoImpl[] parameterInfos, boolean generateDelegate) {
-    doTest(null, null, newReturnType, parameterInfos, new ThrownExceptionInfo[0], generateDelegate);
-  }
-
-  private void doTest(@PsiModifier.ModifierConstant @Nullable String newVisibility,
-                      @Nullable String newName,
-                      @Nullable String newReturnType,
-                      ParameterInfoImpl[] parameterInfo,
-                      ThrownExceptionInfo[] exceptionInfo,
-                      boolean generateDelegate) {
-    doTest(newVisibility, newName, newReturnType, new SimpleParameterGen(parameterInfo), new SimpleExceptionsGen(exceptionInfo), generateDelegate);
-  }
-
-  private void doTest(@PsiModifier.ModifierConstant @Nullable String newVisibility,
-                      @Nullable String newName,
-                      @Nullable @NonNls String newReturnType,
-                      GenParams gen,
-                      boolean generateDelegate) {
-    doTest(newVisibility, newName, newReturnType, gen, new SimpleExceptionsGen(), generateDelegate);
-  }
-
-  private void doTest(@PsiModifier.ModifierConstant @Nullable String newVisibility,
-                      @Nullable String newName,
-                      @Nullable String newReturnType,
-                      GenParams genParams,
-                      GenExceptions genExceptions,
-                      boolean generateDelegate) {
-    String basePath = "/refactoring/changeSignature/" + getTestName(false);
-    configureByFile(basePath + ".java");
-    PsiElement targetElement = TargetElementUtilBase.findTargetElement(getEditor(), TargetElementUtilBase.ELEMENT_NAME_ACCEPTED);
-    assertTrue("<caret> is not on method name", targetElement instanceof PsiMethod);
-    PsiMethod method = (PsiMethod)targetElement;
-    PsiType newType = newReturnType != null ? myFactory.createTypeFromText(newReturnType, method) : method.getReturnType();
-    new ChangeSignatureProcessor(getProject(), method, generateDelegate, newVisibility,
-                                 newName != null ? newName : method.getName(),
-                                 newType, genParams.genParams(method), genExceptions.genExceptions(method)).run();
-    checkResultByFile(basePath + "_after.java");
-  }
-
-  private interface GenParams {
-    ParameterInfoImpl[] genParams(PsiMethod method) throws IncorrectOperationException;
-  }
-
-  private static class SimpleParameterGen implements GenParams {
-    private ParameterInfoImpl[] myInfos;
-
-    private SimpleParameterGen() { }
-
-    private SimpleParameterGen(ParameterInfoImpl[] infos) {
-      myInfos = infos;
-    }
-
-    @Override
-    public ParameterInfoImpl[] genParams(PsiMethod method) {
-      if (myInfos == null) {
-        myInfos = new ParameterInfoImpl[method.getParameterList().getParametersCount()];
-        for (int i = 0; i < myInfos.length; i++) {
-          myInfos[i] = new ParameterInfoImpl(i);
-        }
-      }
-      for (ParameterInfoImpl info : myInfos) {
-        info.updateFromMethod(method);
-      }
-      return myInfos;
-    }
-  }
-
-  private interface GenExceptions {
-    ThrownExceptionInfo[] genExceptions(PsiMethod method) throws IncorrectOperationException;
-  }
-
-  private static class SimpleExceptionsGen implements GenExceptions {
-    private final ThrownExceptionInfo[] myInfos;
-
-    public SimpleExceptionsGen() {
-      myInfos = new ThrownExceptionInfo[0];
-    }
-
-    private SimpleExceptionsGen(ThrownExceptionInfo[] infos) {
-      myInfos = infos;
-    }
-
-    @Override
-    public ThrownExceptionInfo[] genExceptions(PsiMethod method) {
-      for (ThrownExceptionInfo info : myInfos) {
-        info.updateFromMethod(method);
-      }
-      return myInfos;
-    }
-  }
-
-  @NotNull
-  @Override
-  protected String getTestDataPath() {
-    return JavaTestUtil.getJavaTestDataPath();
-  }
 }
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/FindMethodDuplicatesTest.java b/java/java-tests/testSrc/com/intellij/refactoring/FindMethodDuplicatesTest.java
index ecabfb0..b841cb7 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/FindMethodDuplicatesTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/FindMethodDuplicatesTest.java
@@ -51,6 +51,10 @@
     doTest();
   }
 
+  public void testSkipNonRelatedCalls() throws Exception {
+    doTest(false);
+  }
+
   public void testMappingAny2ParameterPrimitiveLvalue() throws Exception {
     doTest(false);
   }
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceConstantTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceConstantTest.java
index 14a53f4..2eefaa1 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceConstantTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceConstantTest.java
@@ -19,10 +19,13 @@
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.util.Pass;
 import com.intellij.psi.PsiExpression;
+import com.intellij.psi.PsiLiteralExpression;
 import com.intellij.psi.PsiLocalVariable;
+import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.refactoring.introduce.inplace.AbstractInplaceIntroducer;
 import com.intellij.refactoring.introduceField.IntroduceConstantHandler;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * User: anna
@@ -43,6 +46,28 @@
     });
   }
 
+  @Nullable
+  @Override
+  protected PsiExpression getExpressionFromEditor() {
+    final PsiExpression expression = super.getExpressionFromEditor();
+    if (expression != null) {
+      return expression;
+    }
+    final PsiExpression expr = PsiTreeUtil.getParentOfType(getFile().findElementAt(getEditor().getCaretModel().getOffset()), PsiExpression.class);
+    return expr instanceof PsiLiteralExpression ? expr : null;
+  }
+
+  public void testReplaceAllInsideParenthesized() throws Exception {
+
+    doTest(new Pass<AbstractInplaceIntroducer>() {
+      @Override
+      public void pass(AbstractInplaceIntroducer inplaceIntroduceFieldPopup) {
+        inplaceIntroduceFieldPopup.setReplaceAllOccurrences(true);
+
+      }
+    });
+  }
+
   public void testReplaceAllWithClassRefType() throws Exception {
 
     doTest(new Pass<AbstractInplaceIntroducer>() {
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceParameterTest.java b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceParameterTest.java
index 697b423..841a67e 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceParameterTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/InplaceIntroduceParameterTest.java
@@ -86,6 +86,14 @@
     });
   }
 
+  public void testLocalInsideAnonymous() throws Exception {
+    doTest(new Pass<AbstractInplaceIntroducer>() {
+      @Override
+      public void pass(AbstractInplaceIntroducer inplaceIntroducePopup) {
+      }
+    });
+  }
+
   @Override
   protected String getBasePath() {
     return BASE_PATH;
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java
index fcadcd1..3474537 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/IntroduceVariableTest.java
@@ -28,7 +28,6 @@
 import com.intellij.refactoring.ui.TypeSelectorManagerImpl;
 import com.intellij.testFramework.LightCodeInsightTestCase;
 import com.intellij.util.containers.MultiMap;
-import org.jetbrains.annotations.NonNls;
 import org.jetbrains.annotations.NotNull;
 
 import java.util.Collection;
@@ -37,66 +36,65 @@
  * @author dsl
  */
 public class IntroduceVariableTest extends LightCodeInsightTestCase {
-
   @NotNull
   @Override
   protected String getTestDataPath() {
     return JavaTestUtil.getJavaTestDataPath();
   }
 
-  public void testSimpleExpression() throws Exception {
+  public void testSimpleExpression() {
     doTest(new MockIntroduceVariableHandler("i", false, false, true, "int"));
   }
 
-  public void testInsideFor() throws Exception {
+  public void testInsideFor() {
     doTest(new MockIntroduceVariableHandler("temp", false, false, true, "int"));
   }
 
-  public void testReplaceAll() throws Exception {
-    doTest(new MockIntroduceVariableHandler("s", true, true, true, "java.lang.String"));
+  public void testReplaceAll() {
+    doTest(new MockIntroduceVariableHandler("s", true, true, true, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testIDEADEV3678() throws Exception {
+  public void testIDEADEV3678() {
     doTest(new MockIntroduceVariableHandler("component", true, true, true, CommonClassNames.JAVA_LANG_OBJECT));
   }
 
-  public void testIDEADEV13369() throws Exception {
+  public void testIDEADEV13369() {
     doTest(new MockIntroduceVariableHandler("ints", true, true, true, "int[]"));
   }
 
-  public void testAnonymousClass() throws Exception {
+  public void testAnonymousClass() {
     doTest(new MockIntroduceVariableHandler("temp", true, false, true, "int"));
   }
 
-  public void testAnonymousClass1() throws Exception {
+  public void testAnonymousClass1() {
     doTest(new MockIntroduceVariableHandler("runnable", false, false, false, CommonClassNames.JAVA_LANG_RUNNABLE));
   }
 
-  public void testAnonymousClass2() throws Exception {
+  public void testAnonymousClass2() {
     doTest(new MockIntroduceVariableHandler("j", true, false, false, "int"));
   }
 
-  public void testAnonymousClass3() throws Exception {
+  public void testAnonymousClass3() {
     doTest(new MockIntroduceVariableHandler("j", true, false, false, "Foo"));
   }
 
-  public void testAnonymousClass4() throws Exception {
+  public void testAnonymousClass4() {
     doTest(new MockIntroduceVariableHandler("j", true, false, false, "int"));
   }
 
-  public void testAnonymousClass5() throws Exception {
+  public void testAnonymousClass5() {
     doTest(new MockIntroduceVariableHandler("j", true, false, false, "int"));
   }
 
-  public void testLambda() throws Exception {
+  public void testLambda() {
     doTest(new MockIntroduceVariableHandler("j", true, false, false, "int"));
   }
 
-  public void testParenthized() throws Exception {
+  public void testParenthized() {
     doTest(new MockIntroduceVariableHandler("temp", true, false, false, "int"));
   }
 
-  public void testExpectedType8Inference() throws Exception {
+  public void testExpectedType8Inference() {
     final PsiResolveHelperImpl helper = (PsiResolveHelperImpl)JavaPsiFacade.getInstance(getProject()).getResolveHelper();
     helper.setTestHelper(new PsiGraphInferenceHelper(getPsiManager()));
     try {
@@ -108,64 +106,64 @@
     }
   }
 
-  public void testMethodCall() throws Exception {
+  public void testMethodCall() {
     doTest(new MockIntroduceVariableHandler("temp", true, true, true, CommonClassNames.JAVA_LANG_OBJECT));
   }
 
-  public void testMethodCallInSwitch() throws Exception {
+  public void testMethodCallInSwitch() {
     doTest(new MockIntroduceVariableHandler("i", true, true, true, "int"));
   }
 
-  public void testParenthizedOccurence() throws Exception {
+  public void testParenthizedOccurence() {
     doTest(new MockIntroduceVariableHandler("empty", true, true, true, "boolean"));
   }
 
-  public void testParenthizedOccurence1() throws Exception {
-    doTest(new MockIntroduceVariableHandler("s", true, true, true, "java.lang.String"));
+  public void testParenthizedOccurence1() {
+    doTest(new MockIntroduceVariableHandler("s", true, true, true, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testConflictingField() throws Exception {
-    doTest(new MockIntroduceVariableHandler("name", true, false, true, "java.lang.String"));
+  public void testConflictingField() {
+    doTest(new MockIntroduceVariableHandler("name", true, false, true, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testConflictingFieldInExpression() throws Exception {
+  public void testConflictingFieldInExpression() {
     doTest(new MockIntroduceVariableHandler("name", false, false, true, "int"));
   }
 
-  public void testStaticConflictingField() throws Exception {
+  public void testStaticConflictingField() {
     doTest(new MockIntroduceVariableHandler("name", false, false, true, "int"));
   }
 
-  public void testNonConflictingField() throws Exception {
+  public void testNonConflictingField() {
      doTest(new MockIntroduceVariableHandler("name", false, false, true, "int"));
   }
 
-  public void testScr16910() throws Exception {
+  public void testScr16910() {
     doTest(new MockIntroduceVariableHandler("i", true, true, false, "int"));
   }
 
-  public void testSCR18295() throws Exception {
-    doTest(new MockIntroduceVariableHandler("it", true, false, false, "java.lang.String"));
+  public void testSCR18295() {
+    doTest(new MockIntroduceVariableHandler("it", true, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testSCR18295a() throws Exception {
-    doTest(new MockIntroduceVariableHandler("it", false, false, false, "java.lang.String"));
+  public void testSCR18295a() {
+    doTest(new MockIntroduceVariableHandler("it", false, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testFromInjected() throws Exception {
-    doTest(new MockIntroduceVariableHandler("regexp", false, false, false, "java.lang.String"));
+  public void testFromInjected() {
+    doTest(new MockIntroduceVariableHandler("regexp", false, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testSCR10412() throws Exception {
+  public void testSCR10412() {
     doTest(new MockIntroduceVariableHandler("newVar", false, false, false, "java.lang.String[]"));
   }
 
-  public void testSCR22718() throws Exception {
+  public void testSCR22718() {
     doTest(new MockIntroduceVariableHandler("object", true, true, false, CommonClassNames.JAVA_LANG_OBJECT));
   }
 
-  public void testSCR26075() throws Exception {
-    doTest(new MockIntroduceVariableHandler("wrong", false, false, false, "java.lang.String") {
+  public void testSCR26075() {
+    doTest(new MockIntroduceVariableHandler("wrong", false, false, false, CommonClassNames.JAVA_LANG_STRING) {
       @Override
       protected void assertValidationResult(boolean validationResult) {
         assertFalse(validationResult);
@@ -182,59 +180,59 @@
     });
   }
 
-  public void testConflictingFieldInOuterClass() throws Exception {
-    doTest(new MockIntroduceVariableHandler("text", true, true, false, "java.lang.String"));
+  public void testConflictingFieldInOuterClass() {
+    doTest(new MockIntroduceVariableHandler("text", true, true, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testSkipSemicolon() throws Exception {
+  public void testSkipSemicolon() {
     doTest(new MockIntroduceVariableHandler("mi5", false, false, false, "int"));
   }
 
-  public void testInsideIf() throws Exception {
-    doTest(new MockIntroduceVariableHandler("s1", false, false, false, "java.lang.String"));
+  public void testInsideIf() {
+    doTest(new MockIntroduceVariableHandler("s1", false, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testInsideElse() throws Exception {
-    doTest(new MockIntroduceVariableHandler("s1", false, false, false, "java.lang.String"));
+  public void testInsideElse() {
+    doTest(new MockIntroduceVariableHandler("s1", false, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testInsideWhile() throws Exception {
+  public void testInsideWhile() {
     doTest(new MockIntroduceVariableHandler("temp", false, false, false, "int"));
   }
 
-  public void testSCR40281() throws Exception {
+  public void testSCR40281() {
     doTest(new MockIntroduceVariableHandler("temp", false, false, false, "Set<? extends Map<?,java.lang.String>.Entry<?,java.lang.String>>"));
   }
 
-  public void testWithIfBranches() throws Exception {
+  public void testWithIfBranches() {
     doTest(new MockIntroduceVariableHandler("temp", true, false, false, "int"));
   }
 
-  public void testInsideForLoop() throws Exception {
+  public void testInsideForLoop() {
     doTest(new MockIntroduceVariableHandler("temp", true, false, false, "int"));
   }
 
-  public void testDuplicateGenericExpressions() throws Exception {
+  public void testDuplicateGenericExpressions() {
     doTest(new MockIntroduceVariableHandler("temp", true, false, false, "Foo2<? extends java.lang.Runnable>"));
   }
 
-  public void testStaticImport() throws Exception {
+  public void testStaticImport() {
     doTest(new MockIntroduceVariableHandler("i", true, true, false, "int"));
   }
 
-  public void testThisQualifier() throws Exception {
+  public void testThisQualifier() {
     doTest(new MockIntroduceVariableHandler("count", true, true, false, "int"));
   }
 
-  public void testSubLiteral() throws Exception {
-    doTest(new MockIntroduceVariableHandler("str", false, false, false, "java.lang.String"));
+  public void testSubLiteral() {
+    doTest(new MockIntroduceVariableHandler("str", false, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testSubLiteral1() throws Exception {
-    doTest(new MockIntroduceVariableHandler("str", false, false, false, "java.lang.String"));
+  public void testSubLiteral1() {
+    doTest(new MockIntroduceVariableHandler("str", false, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testSubLiteralFailure() throws Exception {
+  public void testSubLiteralFailure() {
     try {
       doTest(new MockIntroduceVariableHandler("str", false, false, false, "int"));
     }
@@ -246,35 +244,35 @@
     fail("Should not be able to perform refactoring");
   }
 
-  public void testSubLiteralFromExpression() throws Exception {
-    doTest(new MockIntroduceVariableHandler("str", false, false, false, "java.lang.String"));
+  public void testSubLiteralFromExpression() {
+    doTest(new MockIntroduceVariableHandler("str", false, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testSubExpressionFromIntellijidearulezzz() throws Exception {
-    doTest(new MockIntroduceVariableHandler("str", false, false, false, "java.lang.String"));
+  public void testSubExpressionFromIntellijidearulezzz() {
+    doTest(new MockIntroduceVariableHandler("str", false, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testSubPrimitiveLiteral() throws Exception {
+  public void testSubPrimitiveLiteral() {
     doTest(new MockIntroduceVariableHandler("str", false, false, false, "boolean"));
   }
 
-  public void testArrayFromVarargs() throws Exception {
+  public void testArrayFromVarargs() {
     doTest(new MockIntroduceVariableHandler("strs", false, false, false, "java.lang.String[]"));
   }
 
-  public void testArrayFromVarargs1() throws Exception {
+  public void testArrayFromVarargs1() {
     doTest(new MockIntroduceVariableHandler("strs", false, false, false, "java.lang.String[]"));
   }
 
-  public void testEnumArrayFromVarargs() throws Exception {
+  public void testEnumArrayFromVarargs() {
     doTest(new MockIntroduceVariableHandler("strs", false, false, false, "E[]"));
   }
 
-  public void testFromFinalFieldOnAssignment() throws Exception {
-    doTest(new MockIntroduceVariableHandler("strs", false, false, false, "java.lang.String"));
+  public void testFromFinalFieldOnAssignment() {
+    doTest(new MockIntroduceVariableHandler("strs", false, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testNoArrayFromVarargs() throws Exception {
+  public void testNoArrayFromVarargs() {
     try {
       doTest(new MockIntroduceVariableHandler("strs", false, false, false, "java.lang.String[]"));
     }
@@ -286,7 +284,7 @@
     fail("Should not be able to perform refactoring");
   }
 
-   public void testNoArrayFromVarargs1() throws Exception {
+   public void testNoArrayFromVarargs1() {
     try {
       doTest(new MockIntroduceVariableHandler("strs", false, false, false, "java.lang.String[]"));
     }
@@ -298,59 +296,59 @@
     fail("Should not be able to perform refactoring");
   }
 
-  public void testNonExpression() throws Exception {
+  public void testNonExpression() {
     doTest(new MockIntroduceVariableHandler("sum", true, true, false, "int"));
   }
 
-  public void testTypeAnnotations() throws Exception {
+  public void testTypeAnnotations() {
     doTest(new MockIntroduceVariableHandler("y1", true, false, false, "@TA C"));
   }
 
-  public void testReturnStatementWithoutSemicolon() throws Exception {
-    doTest(new MockIntroduceVariableHandler("b", true, true, false, "java.lang.String"));
+  public void testReturnStatementWithoutSemicolon() {
+    doTest(new MockIntroduceVariableHandler("b", true, true, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testAndAndSubexpression() throws Exception {
+  public void testAndAndSubexpression() {
     doTest(new MockIntroduceVariableHandler("ab", true, true, false, "boolean"));
   }
 
-  public void testSubexpressionWithSpacesInSelection() throws Exception {
+  public void testSubexpressionWithSpacesInSelection() {
     doTest(new MockIntroduceVariableHandler("ab", true, true, false, "boolean"));
   }
 
-  public void testDuplicatesAnonymousClassCreationWithSimilarParameters () throws Exception {
+  public void testDuplicatesAnonymousClassCreationWithSimilarParameters () {
     doTest(new MockIntroduceVariableHandler("foo1", true, true, false, "Foo"));
   }
 
-  public void testDifferentForeachParameters () throws Exception {
-    doTest(new MockIntroduceVariableHandler("tostr", true, true, false, "java.lang.String"));
+  public void testDifferentForeachParameters () {
+    doTest(new MockIntroduceVariableHandler("tostr", true, true, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testCollapsedToDiamond() throws Exception {
+  public void testCollapsedToDiamond() {
     doTest(new MockIntroduceVariableHandler("a", true, true, true, "java.util.ArrayList<java.lang.String>"));
   }
 
-  public void testCantCollapsedToDiamond() throws Exception {
+  public void testCantCollapsedToDiamond() {
     doTest(new MockIntroduceVariableHandler("a", true, true, true, "Foo<java.lang.Number>"));
   }
 
-  public void testFromForInitializer() throws Exception {
+  public void testFromForInitializer() {
     doTest(new MockIntroduceVariableHandler("list", true, true, true, "java.util.List"));
   }
 
-  public void testInvalidPostfixExpr() throws Exception {
+  public void testInvalidPostfixExpr() {
     doTest(new MockIntroduceVariableHandler("a1", true, false, true, "int[]"));
   }
 
-  public void testPolyadic() throws Exception {
+  public void testPolyadic() {
     doTest(new MockIntroduceVariableHandler("b1", true, true, true, "boolean"));
   }
 
-  public void testAssignmentToUnresolvedReference() throws Exception {
+  public void testAssignmentToUnresolvedReference() {
     doTest(new MockIntroduceVariableHandler("collection", true, true, true, "java.util.List<? extends java.util.Collection<?>>"));
   }
 
-  public void testNameSuggestion() throws Exception {
+  public void testNameSuggestion() {
     final String expectedTypeName = "Path";
     doTest(new MockIntroduceVariableHandler("path", true, false, false, expectedTypeName) {
       @Override
@@ -370,7 +368,7 @@
     });
   }
 
-  public void testSiblingInnerClassType() throws Exception {
+  public void testSiblingInnerClassType() {
     doTest(new MockIntroduceVariableHandler("vari", true, false, false, "A.B") {
       @Override
       public IntroduceVariableSettings getSettings(Project project, Editor editor,
@@ -388,7 +386,7 @@
     });
   }
 
-  public void testNonExpressionPriorityFailure() throws Exception {
+  public void testNonExpressionPriorityFailure() {
     doTest(new MockIntroduceVariableHandler("sum", true, true, false, "int"){
       @Override
       protected void showErrorMessage(Project project, Editor editor, String message) {
@@ -398,10 +396,9 @@
     });
   }
 
-
-  public void testIncorrectExpressionSelected() throws Exception {
+  public void testIncorrectExpressionSelected() {
     try {
-      doTest(new MockIntroduceVariableHandler("toString", false, false, false, "java.lang.String"));
+      doTest(new MockIntroduceVariableHandler("toString", false, false, false, CommonClassNames.JAVA_LANG_STRING));
     }
     catch (Exception e) {
       assertEquals(e.getMessage(), "Error message:Cannot perform refactoring.\n" +
@@ -411,51 +408,50 @@
     fail("Should not be able to perform refactoring");
   }
 
-  public void testMultiCatchSimple() throws Exception {
+  public void testMultiCatchSimple() {
     doTest(new MockIntroduceVariableHandler("e", true, true, false, "java.lang.Exception", true));
   }
 
-  public void testMultiCatchTyped() throws Exception {
+  public void testMultiCatchTyped() {
     doTest(new MockIntroduceVariableHandler("b", true, true, false, "java.lang.Exception", true));
   }
 
-  public void testBeforeVoidStatement() throws Exception {
+  public void testBeforeVoidStatement() {
     doTest(new MockIntroduceVariableHandler("c", false, false, false, CommonClassNames.JAVA_LANG_OBJECT));
   }
 
-  public void testWriteUsages() throws Exception {
+  public void testWriteUsages() {
     doTest(new MockIntroduceVariableHandler("c", true, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
 
-  public void testLambdaExpr() throws Exception {
-
+  public void testLambdaExpr() {
     doTest(new MockIntroduceVariableHandler("c", false, false, false, "SAM<java.lang.Integer>"));
   }
 
-  public void testMethodRef() throws Exception {
+  public void testMethodRef() {
     doTest(new MockIntroduceVariableHandler("c", false, false, false, "Test.Bar"));
   }
 
-  public void testLambdaExprNotAccepted() throws Exception {
-    doTest(new MockIntroduceVariableHandler("c", false, false, false, "SAM<X>"));
+  public void testLambdaExprNotAccepted() {
+    doTest(new MockIntroduceVariableHandler("c", false, false, false, "SAM<java.lang.Integer>"));
   }
 
-  public void testOneLineLambdaVoidCompatible() throws Exception {
-    doTest(new MockIntroduceVariableHandler("c", false, false, false, "java.lang.String"));
+  public void testOneLineLambdaVoidCompatible() {
+    doTest(new MockIntroduceVariableHandler("c", false, false, false, CommonClassNames.JAVA_LANG_STRING));
   }
-  public void testOneLineLambdaValueCompatible() throws Exception {
+  public void testOneLineLambdaValueCompatible() {
     doTest(new MockIntroduceVariableHandler("c", false, false, false, "int"));
   }
 
-  public void testNormalizeDeclarations() throws Exception {
+  public void testNormalizeDeclarations() {
     doTest(new MockIntroduceVariableHandler("i3", false, false, false, "int"));
   }
 
-  public void testMethodReferenceExpr() throws Exception {
+  public void testMethodReferenceExpr() {
     doTest(new MockIntroduceVariableHandler("m", false, false, false, "Foo.I"));
   }
 
-  public void testReturnNonExportedArray() throws Exception {
+  public void testReturnNonExportedArray() {
     doTest(new MockIntroduceVariableHandler("i", false, false, false, "java.io.File[]") {
       @Override
       protected boolean isInplaceAvailableInTestMode() {
@@ -464,8 +460,8 @@
     });
   }
 
-  private void doTest(IntroduceVariableBase testMe) throws Exception {
-    @NonNls String baseName = "/refactoring/introduceVariable/" + getTestName(false);
+  private void doTest(IntroduceVariableBase testMe) {
+    String baseName = "/refactoring/introduceVariable/" + getTestName(false);
     configureByFile(baseName + ".java");
     testMe.invoke(getProject(), getEditor(), getFile(), null);
     checkResultByFile(baseName + ".after.java");
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java
index 2e6865b..c56ff82 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveInnerTest.java
@@ -85,6 +85,10 @@
     doTest(createAction("p.A.B", "B", false, null, false, false, null));
   }
 
+  public void testConstructorUtilClassVisibility() throws Exception {
+    doTest(createAction("p.A.B", "B", false, null, false, false, null));
+  }
+
   public void testFieldAccessInSuper() throws Exception {
     doTest(createAction("p.A.B", "B", true, "a", false, false, null));
   }
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java
index cbf0955..f0d4e77 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/PullUpTest.java
@@ -16,17 +16,24 @@
 package com.intellij.refactoring;
 
 import com.intellij.JavaTestUtil;
+import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.pom.java.LanguageLevel;
 import com.intellij.psi.*;
 import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.refactoring.listeners.JavaRefactoringListenerManager;
 import com.intellij.refactoring.listeners.MoveMemberListener;
+import com.intellij.refactoring.memberPullUp.PullUpConflictsUtil;
 import com.intellij.refactoring.memberPullUp.PullUpProcessor;
 import com.intellij.refactoring.util.DocCommentPolicy;
+import com.intellij.refactoring.util.classMembers.InterfaceContainmentVerifier;
 import com.intellij.refactoring.util.classMembers.MemberInfo;
+import com.intellij.testFramework.IdeaTestUtil;
+import com.intellij.util.containers.MultiMap;
 import com.intellij.util.ui.UIUtil;
 import org.jetbrains.annotations.NotNull;
 
+import java.util.Arrays;
+
 /**
  * @author ven
  */
@@ -86,6 +93,16 @@
     doTest(new RefactoringTestUtil.MemberDescriptor("get", PsiMethod.class));
   }
 
+  public void testNotFunctionalAnymore() {
+    setLanguageLevel(LanguageLevel.JDK_1_8);
+    doTest(true, "Functional expression demands functional interface to have exact one method", new RefactoringTestUtil.MemberDescriptor("get", PsiMethod.class, true));
+  }
+
+  public void testStillFunctional() {
+    setLanguageLevel(LanguageLevel.JDK_1_8);
+    doTest(true, new RefactoringTestUtil.MemberDescriptor("get", PsiMethod.class, false));
+  }
+
   public void testAsDefault() {
     final RefactoringTestUtil.MemberDescriptor descriptor = new RefactoringTestUtil.MemberDescriptor("get", PsiMethod.class);
     doTest(descriptor);
@@ -156,6 +173,13 @@
   }
 
   private void doTest(final boolean checkMembersMovedCount, RefactoringTestUtil.MemberDescriptor... membersToFind) {
+    doTest(checkMembersMovedCount, null, membersToFind);
+  }
+
+  private void doTest(final boolean checkMembersMovedCount,
+                      String conflictMessage,
+                      RefactoringTestUtil.MemberDescriptor... membersToFind) {
+    final MultiMap<PsiElement, String> conflictsMap = new MultiMap<PsiElement, String>();
     configureByFile(BASE_PATH + getTestName(false) + ".java");
     PsiElement elementAt = getFile().findElementAt(getEditor().getCaretModel().getOffset());
     final PsiClass sourceClass = PsiTreeUtil.getParentOfType(elementAt, PsiClass.class);
@@ -169,7 +193,7 @@
       assertTrue(interfaces[0].isWritable());
       targetClass = interfaces[0];
     }
-    MemberInfo[] infos = RefactoringTestUtil.findMembers(sourceClass, membersToFind);
+    final MemberInfo[] infos = RefactoringTestUtil.findMembers(sourceClass, membersToFind);
 
     final int[] countMoved = {0};
     final MoveMemberListener listener = new MoveMemberListener() {
@@ -180,10 +204,35 @@
       }
     };
     JavaRefactoringListenerManager.getInstance(getProject()).addMoveMembersListener(listener);
+    final PsiDirectory targetDirectory = targetClass.getContainingFile().getContainingDirectory();
+    final PsiPackage targetPackage = targetDirectory != null ? JavaDirectoryService.getInstance().getPackage(targetDirectory) : null;
+    conflictsMap.putAllValues(
+      PullUpConflictsUtil
+        .checkConflicts(infos, sourceClass, targetClass, targetPackage, targetDirectory, new InterfaceContainmentVerifier() {
+          @Override
+          public boolean checkedInterfacesContain(PsiMethod psiMethod) {
+            return PullUpProcessor.checkedInterfacesContain(Arrays.asList(infos), psiMethod);
+          }
+        })
+    );
     final PullUpProcessor helper = new PullUpProcessor(sourceClass, targetClass, infos, new DocCommentPolicy(DocCommentPolicy.ASIS));
     helper.run();
     UIUtil.dispatchAllInvocationEvents();
     JavaRefactoringListenerManager.getInstance(getProject()).removeMoveMembersListener(listener);
+
+    if (conflictMessage != null && conflictsMap.isEmpty()) {
+      fail("Conflict was not detected");
+    }
+
+    if (conflictMessage == null && !conflictsMap.isEmpty()) {
+      fail(conflictsMap.values().iterator().next());
+    }
+
+    if (conflictMessage != null) {
+      assertEquals(conflictMessage, conflictsMap.values().iterator().next());
+      return;
+    }
+
     if (checkMembersMovedCount) {
       assertEquals(countMoved[0], membersToFind.length);
     }
@@ -195,4 +244,9 @@
   protected String getTestDataPath() {
     return JavaTestUtil.getJavaTestDataPath();
   }
+
+  @Override
+  protected Sdk getProjectJDK() {
+    return IdeaTestUtil.getMockJdk18();
+  }
 }
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java
index 5ea40f6..299a646 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/PushDownTest.java
@@ -16,12 +16,14 @@
 package com.intellij.refactoring;
 
 import com.intellij.codeInsight.TargetElementUtilBase;
+import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.psi.*;
 import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.refactoring.memberPushDown.PushDownProcessor;
 import com.intellij.refactoring.util.DocCommentPolicy;
 import com.intellij.refactoring.util.classMembers.MemberInfo;
 import com.intellij.refactoring.util.classMembers.MemberInfoStorage;
+import com.intellij.testFramework.IdeaTestUtil;
 import com.intellij.usageView.UsageInfo;
 import com.intellij.util.containers.MultiMap;
 
@@ -54,6 +56,12 @@
   public void testExtensionMethodToInterface() { doTest(); }
   public void testExtensionMethodToClass() { doTest(); }
 
+  public void testFunctionalExpression() { doTest(true);}
+  public void testFunctionalInterface() { doTest(true);}
+  public void testFunctionalExpressionDefaultMethod() { doTest();}
+
+  public void testInterfaceConstants() { doTest();}
+
   private void doTest() {
     doTest(false);
   }
@@ -122,4 +130,9 @@
 
     checkResultByFile(BASE_PATH + getTestName(false) + "_after.java");
   }
+
+  @Override
+  protected Sdk getProjectJDK() {
+    return IdeaTestUtil.getMockJdk18();
+  }
 }
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java
index a6768c9..e99d8a5 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java
@@ -134,6 +134,35 @@
     }
   }
 
+  public void testParameterFromFunctionalInterface() throws Exception {
+    try {
+      LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_8);
+      doSingleFileTest();
+      fail("Conflict was not detected");
+    }
+    catch (BaseRefactoringProcessor.ConflictsInTestsException e) {
+      String message = e.getMessage();
+      assertEquals("class <b><code>SAM</code></b> has 1 usage that is not safe to delete.", message);
+    }
+  }
+
+  public void testFunctionalInterfaceMethod() throws Exception {
+    try {
+      LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_8);
+      doSingleFileTest();
+      fail("Conflict was not detected");
+    }
+    catch (BaseRefactoringProcessor.ConflictsInTestsException e) {
+      String message = e.getMessage();
+      assertEquals("class <b><code>SAM</code></b> has 1 usage that is not safe to delete.", message);
+    }
+  }
+
+  public void testFunctionalInterfaceDefaultMethod() throws Exception {
+    LanguageLevelProjectExtension.getInstance(getProject()).setLanguageLevel(LanguageLevel.JDK_1_8);
+    doSingleFileTest();
+  }
+
   public void testMethodDeepHierarchy() throws Exception {
     doTest("Super");
   }
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java
index ec5ab9e..c77b344 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/inline/InlineMethodTest.java
@@ -260,6 +260,10 @@
     doTest(true);
   }
 
+  public void testMethodInsideChangeIfStatement() throws Exception {
+    doTest();
+  }
+
   private void doTestInlineThisOnly() {
     @NonNls String fileName = "/refactoring/inlineMethod/" + getTestName(false) + ".java";
     configureByFile(fileName);
diff --git a/java/java-tests/testSrc/com/intellij/roots/RootsChangedTest.java b/java/java-tests/testSrc/com/intellij/roots/RootsChangedTest.java
index 8d61ad0..25af740 100644
--- a/java/java-tests/testSrc/com/intellij/roots/RootsChangedTest.java
+++ b/java/java-tests/testSrc/com/intellij/roots/RootsChangedTest.java
@@ -16,14 +16,14 @@
 package com.intellij.roots;
 
 import com.intellij.ProjectTopics;
+import com.intellij.openapi.application.ex.PathManagerEx;
 import com.intellij.openapi.module.Module;
 import com.intellij.openapi.module.ModuleManager;
-import com.intellij.openapi.roots.impl.ModifiableModelCommitter;
 import com.intellij.openapi.projectRoots.ProjectJdkTable;
 import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.openapi.projectRoots.SdkModificator;
-import com.intellij.openapi.projectRoots.impl.JavaSdkImpl;
 import com.intellij.openapi.roots.*;
+import com.intellij.openapi.roots.impl.ModifiableModelCommitter;
 import com.intellij.openapi.roots.libraries.Library;
 import com.intellij.openapi.roots.libraries.LibraryTable;
 import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
@@ -58,6 +58,47 @@
     super.tearDown();
   }
 
+  public void testEventsAfterFileModifications() throws Exception {
+    final File root = FileUtil.createTempDirectory(getTestName(true), "");
+    File dir1 = new File(root, "dir1");
+    assertTrue(dir1.mkdirs());
+    final VirtualFile vDir1 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(dir1);
+
+    final Module moduleA = createModule("a.iml");
+    final ModifiableRootModel model = ModuleRootManager.getInstance(moduleA).getModifiableModel();
+    myModuleRootListener.reset();
+    
+    model.addContentEntry(vDir1.getUrl());
+    model.commit();
+
+    assertEventsCount(1);
+    assertSameElements(ModuleRootManager.getInstance(moduleA).getContentRoots(), vDir1);
+    
+    vDir1.delete(null);
+    assertEventsCount(1);
+    assertEmpty(ModuleRootManager.getInstance(moduleA).getContentRoots());
+ 
+    File dir2 = new File(root, "dir2");
+    dir2.mkdirs();
+    final VirtualFile vDir2 = LocalFileSystem.getInstance().refreshAndFindFileByIoFile(dir2);
+
+    vDir2.rename(null, "dir1");
+    assertEventsCount(1);
+    assertSameElements(ModuleRootManager.getInstance(moduleA).getContentRoots(), vDir2);
+
+    // when the existing root is renamed, it remains a root
+    vDir2.rename(null, "dir2");
+    assertEventsCount(0);
+    assertSameElements(ModuleRootManager.getInstance(moduleA).getContentRoots(), vDir2);
+ 
+    // and event if it is moved, it's still a root
+    File subdir = new File(root, "subdir");
+    subdir.mkdirs();
+    vDir2.move(null, LocalFileSystem.getInstance().refreshAndFindFileByIoFile(subdir));
+    assertEventsCount(0);
+    assertSameElements(ModuleRootManager.getInstance(moduleA).getContentRoots(), vDir2);
+  }
+
   public void testProjectLibraryChangeEvent() throws Exception {
     final LibraryTable projectLibraryTable = LibraryTablesRegistrar.getInstance().getLibraryTable(myProject);
     verifyLibraryTableEditing(projectLibraryTable);
@@ -68,16 +109,33 @@
     verifyLibraryTableEditing(globalLibraryTable);
   }
 
-  public void testProjectLibraryEventsInUncommitedModel() throws Exception {
+  public void testProjectLibraryEventsInUncommittedModel() throws Exception {
     final LibraryTable projectLibraryTable = LibraryTablesRegistrar.getInstance().getLibraryTable(myProject);
-    verifyLibraryTableEditingInUncommitedModel(projectLibraryTable);
+    verifyLibraryTableEditingInUncommittedModel(projectLibraryTable);
   }
 
-  public void testGlobalLibraryEventsInUncommitedModel() throws Exception {
+  public void testGlobalLibraryEventsInUncommittedModel() throws Exception {
     final LibraryTable globalLibraryTable = LibraryTablesRegistrar.getInstance().getLibraryTable();
-    verifyLibraryTableEditingInUncommitedModel(globalLibraryTable);
+    verifyLibraryTableEditingInUncommittedModel(globalLibraryTable);
   }
 
+  public void testEditLibraryForModuleLoadFromXml() throws IOException {
+    File moduleFile = PathManagerEx.findFileUnderProjectHome("java/java-tests/testData/moduleRootManager/rootsChanged/emptyModule/a.iml", getClass());
+    Module a = loadModule(moduleFile, true);
+    assertEventsCount(1);
+
+    final Sdk jdk = IdeaTestUtil.getMockJdk17();
+    ProjectJdkTable.getInstance().addJdk(jdk);
+    assertEventsCount(0);
+
+    ModuleRootModificationUtil.setModuleSdk(a, jdk);
+    assertEventsCount(1);
+
+    final SdkModificator sdkModificator = jdk.getSdkModificator();
+    sdkModificator.addRoot(getVirtualFile(createTempDirectory()), OrderRootType.CLASSES);
+    sdkModificator.commitChanges();
+    assertEventsCount(1);
+  }
 
   public void testModuleJdkEditing() throws Exception {
     final Module moduleA = createModule("a.iml");
@@ -93,9 +151,7 @@
     rootModelA.setSdk(jdk);
     rootModelB.setSdk(jdk);
     ModifiableRootModel[] rootModels = new ModifiableRootModel[]{rootModelA, rootModelB};
-    if (rootModels.length > 0) {
-      ModifiableModelCommitter.multiCommit(rootModels, ModuleManager.getInstance(rootModels[0].getProject()).getModifiableModel());
-    }
+    ModifiableModelCommitter.multiCommit(rootModels, ModuleManager.getInstance(rootModels[0].getProject()).getModifiableModel());
     assertEventsCount(1);
 
     final SdkModificator sdkModificator = jdk.getSdkModificator();
@@ -192,7 +248,7 @@
     assertEventsCount(1);
   }
 
-  private void verifyLibraryTableEditingInUncommitedModel(final LibraryTable libraryTable) {
+  private void verifyLibraryTableEditingInUncommittedModel(final LibraryTable libraryTable) {
     final Module moduleA = createModule("a.iml");
     final Module moduleB = createModule("b.iml");
     assertEventsCount(2);
diff --git a/java/java-tests/testSrc/com/intellij/unscramble/UnscrambleDialogTest.java b/java/java-tests/testSrc/com/intellij/unscramble/UnscrambleDialogTest.java
index e49823e..7124d3b 100644
--- a/java/java-tests/testSrc/com/intellij/unscramble/UnscrambleDialogTest.java
+++ b/java/java-tests/testSrc/com/intellij/unscramble/UnscrambleDialogTest.java
@@ -17,6 +17,7 @@
 
 import com.intellij.JavaTestUtil;
 import com.intellij.execution.ui.RunContentDescriptor;
+import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.io.FileUtil;
 import com.intellij.testFramework.fixtures.JavaCodeInsightFixtureTestCase;
 
@@ -65,6 +66,7 @@
   private RunContentDescriptor showText(String unscramble) {
     RunContentDescriptor descriptor = UnscrambleDialog.showUnscrambledText(null, "foo", getProject(), unscramble);
     assertNotNull(descriptor);
+    Disposer.register(myModule, descriptor);
     return descriptor;
   }
 
