Snapshot e242282deb41c328afbe971fc167e47ddfb26df9 from master branch of git://git.jetbrains.org/idea/community.git

Change-Id: Ifdc1818cde7b63f6d7bf42801f18c7f1557b8d85
diff --git a/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java b/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java
index bb59707..3ed3747 100644
--- a/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java
+++ b/java/compiler/impl/src/com/intellij/compiler/actions/ProcessAnnotationsAction.java
@@ -15,8 +15,8 @@
  */
 package com.intellij.compiler.actions;
 
-import org.jetbrains.jps.model.java.compiler.AnnotationProcessingConfiguration;
 import com.intellij.compiler.CompilerConfiguration;
+import com.intellij.compiler.CompilerWorkspaceConfiguration;
 import com.intellij.compiler.impl.FileSetCompileScope;
 import com.intellij.compiler.impl.ModuleCompileScope;
 import com.intellij.compiler.impl.javaCompiler.AnnotationProcessingCompiler;
@@ -37,6 +37,7 @@
 import com.intellij.psi.*;
 import com.intellij.util.containers.ContainerUtil;
 import org.jetbrains.annotations.Nullable;
+import org.jetbrains.jps.model.java.compiler.AnnotationProcessingConfiguration;
 
 import java.text.MessageFormat;
 import java.util.ArrayList;
@@ -79,7 +80,13 @@
       return;
     }
 
-    CompilerConfiguration compilerConfiguration = CompilerConfiguration.getInstance(project);
+    if (CompilerWorkspaceConfiguration.getInstance(project).useOutOfProcessBuild()) {
+      presentation.setEnabled(false);
+      return;
+    }
+    
+    final CompilerConfiguration compilerConfiguration = CompilerConfiguration.getInstance(project);
+    
     final Module module = LangDataKeys.MODULE.getData(dataContext);
     final Module moduleContext = LangDataKeys.MODULE_CONTEXT.getData(dataContext);
 
diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
index d9f3aac..e64ff40 100644
--- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
+++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java
@@ -854,17 +854,35 @@
     if (refreshOutputRoots) {
       // refresh on output roots is required in order for the order enumerator to see all roots via VFS
       final Set<File> outputs = new HashSet<File>();
-      for (final String path : CompilerPathsEx.getOutputPaths(ModuleManager.getInstance(myProject).getModules())) {
+      final Module[] affectedModules = compileContext.getCompileScope().getAffectedModules();
+      for (final String path : CompilerPathsEx.getOutputPaths(affectedModules)) {
         outputs.add(new File(path));
       }
+      final LocalFileSystem lfs = LocalFileSystem.getInstance();
       if (!outputs.isEmpty()) {
         final ProgressIndicator indicator = compileContext.getProgressIndicator();
         indicator.setText("Synchronizing output directories...");
-        LocalFileSystem.getInstance().refreshIoFiles(outputs, false, false, null);
+        lfs.refreshIoFiles(outputs, false, false, null);
         indicator.setText("");
       }
+      if (compileContext.isAnnotationProcessorsEnabled()) {
+        final Set<File> genSourceRoots = new THashSet<File>(FileUtil.FILE_HASHING_STRATEGY);
+        final CompilerConfiguration config = CompilerConfiguration.getInstance(myProject);
+        for (Module module : affectedModules) {
+          if (config.getAnnotationProcessingConfiguration(module).isEnabled()) {
+            final String path = CompilerPaths.getAnnotationProcessorsGenerationPath(module);
+            if (path != null) {
+              genSourceRoots.add(new File(path));
+            }
+          }
+        }
+        if (!genSourceRoots.isEmpty()) {
+          // refresh generates source roots asynchronously; needed for error highlighting update
+          lfs.refreshIoFiles(genSourceRoots, true, true, null);
+        }
+      }
     }
-    SwingUtilities.invokeLater(new Runnable() {
+    SwingUtilities.invokeLater(new Runnable() {                                                                 
       public void run() {
         int errorCount = 0;
         int warningCount = 0;
diff --git a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
index dc6cbd4..17f7c7d 100644
--- a/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
+++ b/java/debugger/impl/src/com/intellij/debugger/ui/JavaDebuggerSupport.java
@@ -21,6 +21,7 @@
 import com.intellij.debugger.settings.*;
 import com.intellij.debugger.ui.breakpoints.*;
 import com.intellij.ide.DataManager;
+import com.intellij.openapi.Disposable;
 import com.intellij.openapi.actionSystem.AnAction;
 import com.intellij.openapi.actionSystem.AnActionEvent;
 import com.intellij.openapi.actionSystem.PlatformDataKeys;
@@ -31,16 +32,17 @@
 import com.intellij.openapi.options.Configurable;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.project.ProjectManager;
+import com.intellij.openapi.util.Disposer;
 import com.intellij.openapi.util.Key;
 import com.intellij.util.containers.ContainerUtil;
 import com.intellij.xdebugger.AbstractDebuggerSession;
-import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointItem;
 import com.intellij.xdebugger.breakpoints.ui.XBreakpointGroupingRule;
 import com.intellij.xdebugger.impl.DebuggerSupport;
 import com.intellij.xdebugger.impl.actions.DebuggerActionHandler;
 import com.intellij.xdebugger.impl.actions.DebuggerToggleActionHandler;
 import com.intellij.xdebugger.impl.actions.EditBreakpointActionHandler;
 import com.intellij.xdebugger.impl.actions.MarkObjectActionHandler;
+import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointItem;
 import com.intellij.xdebugger.impl.breakpoints.ui.BreakpointPanelProvider;
 import com.intellij.xdebugger.impl.evaluate.quick.common.QuickEvaluateHandler;
 import com.intellij.xdebugger.impl.settings.DebuggerSettingsPanelProvider;
@@ -212,15 +214,21 @@
     }
 
     @Override
-    public void addListener(final BreakpointsListener listener, Project project) {
-      BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(getCurrentProject()).getBreakpointManager();
+    public void addListener(final BreakpointsListener listener, Project project, Disposable disposable) {
+      BreakpointManager breakpointManager = DebuggerManagerEx.getInstanceEx(project).getBreakpointManager();
       final MyBreakpointManagerListener listener1 = new MyBreakpointManagerListener(listener, breakpointManager);
       breakpointManager.addBreakpointManagerListener(listener1);
       myListeners.add(listener1);
+      Disposer.register(disposable, new Disposable() {
+        @Override
+        public void dispose() {
+          removeListener(listener);
+        }
+      });
     }
 
     @Override
-    public void removeListener(BreakpointsListener listener) {
+    protected void removeListener(BreakpointsListener listener) {
       for (MyBreakpointManagerListener managerListener : myListeners) {
         if (managerListener.myListener == listener) {
           BreakpointManager manager = managerListener.myBreakpointManager;
diff --git a/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java b/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java
index 0b2f4cb..2e5710a 100644
--- a/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java
+++ b/java/idea-ui/src/com/intellij/ide/util/projectWizard/SdkSettingsStep.java
@@ -17,9 +17,12 @@
 
 import com.intellij.CommonBundle;
 import com.intellij.ide.IdeBundle;
+import com.intellij.ide.util.PropertiesComponent;
+import com.intellij.openapi.module.ModuleType;
 import com.intellij.openapi.options.ConfigurationException;
 import com.intellij.openapi.project.Project;
 import com.intellij.openapi.project.ProjectManager;
+import com.intellij.openapi.projectRoots.ProjectJdkTable;
 import com.intellij.openapi.projectRoots.Sdk;
 import com.intellij.openapi.projectRoots.SdkTypeId;
 import com.intellij.openapi.roots.ProjectRootManager;
@@ -31,6 +34,8 @@
 
 import javax.swing.*;
 import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 
 /**
  * @author Dmitry Avdeev
@@ -52,6 +57,19 @@
 
     myJdkComboBox = new JdkComboBox(myModel, sdkFilter);
 
+    final PropertiesComponent component = project == null ? PropertiesComponent.getInstance() : PropertiesComponent.getInstance(project);
+    ModuleType moduleType = moduleBuilder.getModuleType();
+    final String selectedJdkProperty = "jdk.selected." + (moduleType == null ? "" : moduleType.getId());
+    myJdkComboBox.addActionListener(new ActionListener() {
+      @Override
+      public void actionPerformed(ActionEvent e) {
+        Sdk jdk = myJdkComboBox.getSelectedJdk();
+        if (jdk != null) {
+          component.setValue(selectedJdkProperty, jdk.getName());
+        }
+      }
+    });
+
     if (project != null) {
       Sdk sdk = ProjectRootManager.getInstance(project).getProjectSdk();
       if (sdk != null && moduleBuilder.isSuitableSdkType(sdk.getSdkType())) {
@@ -68,6 +86,14 @@
       }
     }
 
+    String value = component.getValue(selectedJdkProperty);
+    if (value != null) {
+      Sdk jdk = ProjectJdkTable.getInstance().findJdk(value);
+      if (jdk != null) {
+        myJdkComboBox.setSelectedJdk(jdk);
+      }
+    }
+
     JButton button = new JButton("Ne\u001Bw...");
     myJdkComboBox.setSetupButton(button, project, myModel,
                                  project == null ? new JdkComboBox.NoneJdkComboBoxItem() : new JdkComboBox.ProjectJdkComboBoxItem(),
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
index 211bcfb..2098dd6 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/analysis/HighlightUtil.java
@@ -1357,9 +1357,9 @@
       }
     }
 
-    final PsiClass aClass;
+    PsiClass aClass;
     if (qualifier != null) {
-      final PsiElement resolved = qualifier.resolve();
+      PsiElement resolved = qualifier.advancedResolve(true).getElement();
       if (resolved != null && !(resolved instanceof PsiClass)) {
         String description = JavaErrorMessages.message("class.expected");
         return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(qualifier).descriptionAndTooltip(description).create();
@@ -1378,7 +1378,7 @@
 
     if (expr instanceof PsiThisExpression) {
       final PsiMethod psiMethod = PsiTreeUtil.getParentOfType(expr, PsiMethod.class);
-      if (psiMethod == null || psiMethod.getContainingClass() != aClass) {
+      if (psiMethod == null || psiMethod.getContainingClass() != aClass && !isInsideDefaultMethod(psiMethod, aClass)) {
         if (aClass.isInterface()) {
           return thisNotFoundInInterfaceInfo(expr);
         }
@@ -1394,6 +1394,13 @@
     return null;
   }
 
+  private static boolean isInsideDefaultMethod(PsiMethod method, PsiClass aClass) {
+    while (method != null && method.getContainingClass() != aClass) {
+      method = PsiTreeUtil.getParentOfType(method, PsiMethod.class, true);
+    }
+    return method != null && method.hasModifierProperty(PsiModifier.DEFAULT);
+  }
+
   private static HighlightInfo thisNotFoundInInterfaceInfo(@NotNull PsiExpression expr) {
     return HighlightInfo.newHighlightInfo(HighlightInfoType.ERROR).range(expr).descriptionAndTooltip("Cannot find symbol variable this").create();
   }
diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MethodArgumentFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MethodArgumentFix.java
index 06a93cd..6ad881c 100644
--- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MethodArgumentFix.java
+++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/MethodArgumentFix.java
@@ -65,8 +65,9 @@
     PsiExpression expression = myArgList.getExpressions()[myIndex];
 
     try {
+      LOG.assertTrue(expression != null && expression.isValid());
       PsiExpression modified = myArgumentFixerActionFactory.getModifiedArgument(expression, myToType);
-      LOG.assertTrue(modified != null);
+      LOG.assertTrue(modified != null, myArgumentFixerActionFactory);
       expression.replace(modified);
     }
     catch (IncorrectOperationException e) {
diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java
index 4f4d74c..faa2dee 100644
--- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java
+++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/AddSingleMemberStaticImportAction.java
@@ -61,8 +61,7 @@
       if (parent instanceof PsiMethodReferenceExpression) return null;
       if (parent instanceof PsiJavaCodeReferenceElement && ((PsiJavaCodeReferenceElement)parent).getQualifier() != null) {
         PsiJavaCodeReferenceElement refExpr = (PsiJavaCodeReferenceElement)parent;
-        PsiReferenceParameterList parameterList = refExpr.getParameterList();
-        if (parameterList != null && parameterList.getFirstChild() != null) return null;
+        if (checkParameterizedReference(refExpr)) return null;
         PsiElement resolved = refExpr.resolve();
         if (resolved instanceof PsiMember && ((PsiModifierListOwner)resolved).hasModifierProperty(PsiModifier.STATIC)) {
           PsiClass aClass = getResolvedClass(element, (PsiMember)resolved);
@@ -99,6 +98,11 @@
     return null;
   }
 
+  private static boolean checkParameterizedReference(PsiJavaCodeReferenceElement refExpr) {
+    PsiReferenceParameterList parameterList = refExpr instanceof PsiReferenceExpression ? refExpr.getParameterList() : null;
+    return parameterList != null && parameterList.getFirstChild() != null;
+  }
+
   @Nullable
   private static PsiClass getResolvedClass(PsiElement element, PsiMember resolved) {
     PsiClass aClass = resolved.getContainingClass();
@@ -158,58 +162,61 @@
       @Override
       public void visitReferenceElement(PsiJavaCodeReferenceElement reference) {
 
-        if (reference.getParameterList() != null &&
-            reference.getParameterList().getFirstChild() != null) return;
+        try {
+          if (checkParameterizedReference(reference)) return;
 
-        if (referenceName.equals(reference.getReferenceName()) && !(reference instanceof PsiMethodReferenceExpression)) {
-          final PsiElement qualifierExpression = reference.getQualifier();
-          PsiElement referent = reference.getUserData(TEMP_REFERENT_USER_DATA);
-          if (!reference.isQualified()) {
-            if (referent instanceof PsiMember && referent != reference.resolve()) {
-              PsiElementFactory factory = JavaPsiFacade.getInstance(reference.getProject()).getElementFactory();
-              try {
-                final PsiClass containingClass = ((PsiMember)referent).getContainingClass();
-                if (containingClass != null) {
-                  PsiReferenceExpression copy = (PsiReferenceExpression)factory.createExpressionFromText("A." + reference.getReferenceName(), null);
-                  reference = (PsiReferenceExpression)reference.replace(copy);
-                  ((PsiReferenceExpression)reference.getQualifier()).bindToElement(containingClass);
+          if (referenceName.equals(reference.getReferenceName()) && !(reference instanceof PsiMethodReferenceExpression)) {
+            final PsiElement qualifierExpression = reference.getQualifier();
+            PsiElement referent = reference.getUserData(TEMP_REFERENT_USER_DATA);
+            if (!reference.isQualified()) {
+              if (referent instanceof PsiMember && referent != reference.resolve()) {
+                PsiElementFactory factory = JavaPsiFacade.getInstance(reference.getProject()).getElementFactory();
+                try {
+                  final PsiClass containingClass = ((PsiMember)referent).getContainingClass();
+                  if (containingClass != null) {
+                    PsiReferenceExpression copy = (PsiReferenceExpression)factory.createExpressionFromText("A." + reference.getReferenceName(), null);
+                    reference = (PsiReferenceExpression)reference.replace(copy);
+                    ((PsiReferenceExpression)reference.getQualifier()).bindToElement(containingClass);
+                  }
+                }
+                catch (IncorrectOperationException e) {
+                  LOG.error (e);
                 }
               }
-              catch (IncorrectOperationException e) {
-                LOG.error (e);
+              reference.putUserData(TEMP_REFERENT_USER_DATA, null);
+            } else {
+              if (qualifierExpression instanceof PsiJavaCodeReferenceElement) {
+                PsiElement aClass = ((PsiJavaCodeReferenceElement)qualifierExpression).resolve();
+                if (aClass instanceof PsiVariable) {
+                  aClass = PsiUtil.resolveClassInClassTypeOnly(((PsiVariable)aClass).getType());
+                }
+                if (aClass instanceof PsiClass && InheritanceUtil.isInheritorOrSelf((PsiClass)aClass, resolvedClass, true)) {
+                  boolean foundMemberByName = false;
+                  if (referent instanceof PsiMember) {
+                    final String memberName = ((PsiMember)referent).getName();
+                    final PsiClass containingClass = PsiTreeUtil.getParentOfType(reference, PsiClass.class);
+                    if (containingClass != null) {
+                      foundMemberByName |= containingClass.findFieldByName(memberName, true) != null;
+                      foundMemberByName |= containingClass.findMethodsByName(memberName, true).length > 0;
+                    }
+                  }
+                  if (!foundMemberByName) {
+                    try {
+                      qualifierExpression.delete();
+                    }
+                    catch (IncorrectOperationException e) {
+                      LOG.error(e);
+                    }
+                  }
+                }
               }
             }
             reference.putUserData(TEMP_REFERENT_USER_DATA, null);
-          } else {
-            if (qualifierExpression instanceof PsiJavaCodeReferenceElement) {
-              PsiElement aClass = ((PsiJavaCodeReferenceElement)qualifierExpression).resolve();
-              if (aClass instanceof PsiVariable) {
-                aClass = PsiUtil.resolveClassInClassTypeOnly(((PsiVariable)aClass).getType());
-              }
-              if (aClass instanceof PsiClass && InheritanceUtil.isInheritorOrSelf((PsiClass)aClass, resolvedClass, true)) {
-                boolean foundMemberByName = false;
-                if (referent instanceof PsiMember) {
-                  final String memberName = ((PsiMember)referent).getName();
-                  final PsiClass containingClass = PsiTreeUtil.getParentOfType(reference, PsiClass.class);
-                  if (containingClass != null) {
-                    foundMemberByName |= containingClass.findFieldByName(memberName, true) != null;
-                    foundMemberByName |= containingClass.findMethodsByName(memberName, true).length > 0;
-                  }
-                }
-                if (!foundMemberByName) {
-                  try {
-                    qualifierExpression.delete();
-                  }
-                  catch (IncorrectOperationException e) {
-                    LOG.error(e);
-                  }
-                }
-              }
-            }
           }
-          reference.putUserData(TEMP_REFERENT_USER_DATA, null);
         }
-        super.visitReferenceElement(reference);
+        finally {
+          super.visitReferenceElement(reference);
+        }
       }
     });
   }
diff --git a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java
index 123bc66..542a202 100644
--- a/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java
+++ b/java/java-impl/src/com/intellij/codeInsight/intention/impl/CreateSubclassAction.java
@@ -273,11 +273,14 @@
 
           final TextRange textRange = targetClass.getTextRange();
           final RangeMarker startClassOffset = editor.getDocument().createRangeMarker(textRange.getStartOffset(), textRange.getEndOffset());
+          startClassOffset.setGreedyToLeft(true);
+          startClassOffset.setGreedyToRight(true);
           editor.getDocument().deleteString(textRange.getStartOffset(), textRange.getEndOffset());
           CreateFromUsageBaseFix.startTemplate(editor, template, project, new TemplateEditingAdapter() {
             @Override
             public void templateFinished(Template template, boolean brokenOff) {
               try {
+                LOG.assertTrue(startClassOffset.isValid(), startClassOffset);
                 final PsiElement psiElement = containingFile.findElementAt(startClassOffset.getStartOffset());
                 final PsiClass aTargetClass = PsiTreeUtil.getParentOfType(psiElement, PsiClass.class);
                 LOG.assertTrue(aTargetClass != null, psiElement);
diff --git a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java
index d98845d..31ed040 100644
--- a/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java
+++ b/java/java-impl/src/com/intellij/psi/codeStyle/arrangement/JavaArrangementVisitor.java
@@ -340,7 +340,7 @@
     DefaultArrangementEntry current = getCurrent();
     JavaElementArrangementEntry entry;
     if (canArrange) {
-      TextRange expandedRange = myDocument == null ? null : ArrangementUtil.expandToLine(range, myDocument);
+      TextRange expandedRange = myDocument == null ? null : ArrangementUtil.expandToLineIfPossible(range, myDocument);
       TextRange rangeToUse = expandedRange == null ? range : expandedRange;
       entry = new JavaElementArrangementEntry(current, rangeToUse, type, name, true);
     }
diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java
index 354d935..8aaf941 100644
--- a/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/extractclass/ExtractClassProcessor.java
@@ -212,8 +212,8 @@
       public void visitReferenceExpression(final PsiReferenceExpression expression) {
         super.visitReferenceExpression(expression);
         final PsiElement resolved = expression.resolve();
-        if (resolved != null) {
-          dependsOnMoved[0] |= isInMovedElement(resolved);
+        if (resolved instanceof PsiMember) {
+          dependsOnMoved[0] |= !((PsiMember)resolved).hasModifierProperty(PsiModifier.STATIC) && isInMovedElement(resolved);
         }
       }
     });
@@ -550,6 +550,7 @@
     final Project project = psiManager.getProject();
     final GlobalSearchScope scope = GlobalSearchScope.allScope(project);
     final Iterable<PsiReference> calls = ReferencesSearch.search(method, scope);
+    final String fullyQualifiedName = StringUtil.getQualifiedName(newPackageName, newClassName);
     for (PsiReference reference : calls) {
       final PsiElement referenceElement = reference.getElement();
 
@@ -557,9 +558,16 @@
       if (parent instanceof PsiMethodCallExpression) {
         final PsiMethodCallExpression call = (PsiMethodCallExpression)parent;
         if (!isInMovedElement(call)) {
-          final String fullyQualifiedName = StringUtil.getQualifiedName(newPackageName, newClassName);
           usages.add(new RetargetStaticMethodCall(call, fullyQualifiedName));
         }
+      } else if (parent instanceof PsiImportStaticStatement) {
+        final PsiJavaCodeReferenceElement importReference = ((PsiImportStaticStatement)parent).getImportReference();
+        if (importReference != null) {
+          final PsiElement qualifier = importReference.getQualifier();
+          if (qualifier instanceof PsiJavaCodeReferenceElement) {
+            usages.add(new ReplaceClassReference((PsiJavaCodeReferenceElement)qualifier, fullyQualifiedName));
+          }
+        }
       }
     }
     usages.add(new RemoveMethod(method));
diff --git a/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/RetargetStaticMethodCall.java b/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/RetargetStaticMethodCall.java
index 03a1413..3d3ab20 100644
--- a/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/RetargetStaticMethodCall.java
+++ b/java/java-impl/src/com/intellij/refactoring/extractclass/usageInfo/RetargetStaticMethodCall.java
@@ -15,10 +15,7 @@
  */
 package com.intellij.refactoring.extractclass.usageInfo;
 
-import com.intellij.psi.PsiExpression;
-import com.intellij.psi.PsiExpressionList;
-import com.intellij.psi.PsiMethodCallExpression;
-import com.intellij.psi.PsiReferenceExpression;
+import com.intellij.psi.*;
 import com.intellij.refactoring.psi.MutationUtils;
 import com.intellij.refactoring.util.FixableUsageInfo;
 import com.intellij.util.IncorrectOperationException;
@@ -37,10 +34,12 @@
         final PsiReferenceExpression methodExpression = call.getMethodExpression();
         final PsiExpression qualifier = (PsiExpression) methodExpression.getQualifier();
         if (qualifier == null) {
+          final PsiElement resolveScope = call.resolveMethodGenerics().getCurrentFileResolveScope();
+          if (!(resolveScope instanceof PsiImportStaticStatement)) {
             MutationUtils.replaceExpression(delegateClassName + '.' + call.getText(), call);
+          }
         } else {
-            final PsiExpressionList parameterList = call.getArgumentList();
-            MutationUtils.replaceExpression(delegateClassName + '.' + methodExpression.getReferenceName()  +parameterList.getText() , call);
+            MutationUtils.replaceExpression(delegateClassName , qualifier);
         }
     }
 }
diff --git a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersDialog.java b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersDialog.java
index 1be6743..98ec9af 100644
--- a/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersDialog.java
+++ b/java/java-impl/src/com/intellij/refactoring/move/moveMembers/MoveMembersDialog.java
@@ -32,6 +32,7 @@
 import com.intellij.psi.*;
 import com.intellij.psi.search.GlobalSearchScope;
 import com.intellij.psi.util.PsiTreeUtil;
+import com.intellij.psi.util.PsiUtil;
 import com.intellij.refactoring.HelpID;
 import com.intellij.refactoring.JavaRefactoringSettings;
 import com.intellij.refactoring.RefactoringBundle;
@@ -411,7 +412,7 @@
     }
 
     public boolean isMemberEnabled(MemberInfo member) {
-      if(myTargetClass != null && myTargetClass.isInterface()) {
+      if(myTargetClass != null && myTargetClass.isInterface() && !PsiUtil.isLanguageLevel8OrHigher(myTargetClass)) {
         return !(member.getMember() instanceof PsiMethod);
       }
       return super.isMemberEnabled(member);
diff --git a/java/java-impl/src/com/intellij/refactoring/rename/JavaNameSuggestionProvider.java b/java/java-impl/src/com/intellij/refactoring/rename/JavaNameSuggestionProvider.java
index 1b76bc6..2588264 100644
--- a/java/java-impl/src/com/intellij/refactoring/rename/JavaNameSuggestionProvider.java
+++ b/java/java-impl/src/com/intellij/refactoring/rename/JavaNameSuggestionProvider.java
@@ -22,6 +22,7 @@
 import com.intellij.psi.codeStyle.SuggestedNameInfo;
 import com.intellij.psi.codeStyle.VariableKind;
 import com.intellij.psi.util.PropertyUtil;
+import com.intellij.psi.util.PsiTreeUtil;
 import com.intellij.usageView.UsageViewUtil;
 import com.intellij.util.ArrayUtil;
 import com.intellij.util.containers.ContainerUtil;
@@ -33,48 +34,23 @@
   @Nullable
   public SuggestedNameInfo getSuggestedNames(final PsiElement element, final PsiElement nameSuggestionContext, Set<String> result) {
     String initialName = UsageViewUtil.getShortName(element);
-    SuggestedNameInfo info = suggestNamesForElement(element);
+    SuggestedNameInfo info = suggestNamesForElement(element, nameSuggestionContext);
     if (info != null) {
       info = JavaCodeStyleManager.getInstance(element.getProject()).suggestUniqueVariableName(info, element, true, true);
     }
 
     String parameterName = null;
     String superMethodName = null;
-    if (nameSuggestionContext != null) {
+    if (nameSuggestionContext instanceof PsiParameter) {
       final PsiElement nameSuggestionContextParent = nameSuggestionContext.getParent();
-      if (nameSuggestionContextParent != null) {
+      if (nameSuggestionContextParent instanceof PsiParameterList) {
         final PsiElement parentOfParent = nameSuggestionContextParent.getParent();
-        if (parentOfParent instanceof PsiExpressionList) {
-          final PsiExpressionList expressionList = (PsiExpressionList)parentOfParent;
-          final PsiElement parent = expressionList.getParent();
-          if (parent instanceof PsiCallExpression) {
-            final PsiMethod method = ((PsiCallExpression)parent).resolveMethod();
-            if (method != null) {
-              final PsiParameter[] parameters = method.getParameterList().getParameters();
-              final PsiExpression[] expressions = expressionList.getExpressions();
-              for (int i = 0; i < expressions.length; i++) {
-                PsiExpression expression = expressions[i];
-                if (expression == nameSuggestionContextParent) {
-                  if (i < parameters.length) {
-                    parameterName = parameters[i].getName();
-                  }
-                  break;
-                }
-              }
-            }
+        if (parentOfParent instanceof PsiMethod) {
+          final String propName = PropertyUtil.getPropertyName((PsiMethod)parentOfParent);
+          if (propName != null) {
+            parameterName = propName;
           }
-        }
-        else if (parentOfParent instanceof PsiParameterList) {
-          final PsiElement parent3 = parentOfParent.getParent();
-          if (parent3 instanceof PsiMethod) {
-            final String propName = PropertyUtil.getPropertyName((PsiMethod)parent3);
-            if (propName != null) {
-              parameterName = propName;
-            }
-            if (nameSuggestionContextParent instanceof PsiParameter) {
-              superMethodName = getSuperMethodName((PsiParameter) nameSuggestionContextParent, (PsiMethod) parent3);
-            }
-          }
+          superMethodName = getSuperMethodName((PsiParameter) nameSuggestionContext, (PsiMethod) parentOfParent);
         }
       }
     }
@@ -166,7 +142,7 @@
   }
 
   @Nullable
-  private static SuggestedNameInfo suggestNamesForElement(final PsiElement element) {
+  private static SuggestedNameInfo suggestNamesForElement(final PsiElement element, PsiElement nameSuggestionContext) {
     PsiVariable var = null;
     if (element instanceof PsiVariable) {
       var = (PsiVariable)element;
@@ -182,7 +158,13 @@
 
     JavaCodeStyleManager codeStyleManager = JavaCodeStyleManager.getInstance(element.getProject());
     VariableKind variableKind = codeStyleManager.getVariableKind(var);
-    return codeStyleManager.suggestVariableName(variableKind, null, var.getInitializer(), var.getType());
+    final SuggestedNameInfo nameInfo = codeStyleManager.suggestVariableName(variableKind, null, var.getInitializer(), var.getType());
+    final PsiExpression expression = PsiTreeUtil.getParentOfType(nameSuggestionContext, PsiExpression.class, false);
+    if (expression != null) {
+      return new SuggestedNameInfo.Delegate(codeStyleManager.suggestVariableName(variableKind, null, expression, var.getType()).names, nameInfo);
+      
+    }
+    return nameInfo;
   }
 
 }
diff --git a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
index 950ba6f..871c964 100644
--- a/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
+++ b/java/java-impl/src/com/intellij/refactoring/safeDelete/JavaSafeDeleteProcessor.java
@@ -734,7 +734,7 @@
 
   public static boolean isInside (PsiElement place, PsiElement ancestor) {
     if (SafeDeleteProcessor.isInside(place, ancestor)) return true;
-    if (place instanceof PsiComment && ancestor instanceof PsiClass) {
+    if (PsiTreeUtil.getParentOfType(place, PsiComment.class, false) != null && ancestor instanceof PsiClass) {
       final PsiClass aClass = (PsiClass)ancestor;
       if (aClass.getParent() instanceof PsiJavaFile) {
         final PsiJavaFile file = (PsiJavaFile)aClass.getParent();
diff --git a/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java b/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java
index 560dcbd..85fae45 100644
--- a/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java
+++ b/java/java-psi-api/src/com/intellij/psi/PsiCapturedWildcardType.java
@@ -93,7 +93,15 @@
   }
 
   public PsiType getUpperBound () {
-    return myExistential.isExtends() ? myExistential.getBound() : PsiType.getJavaLangObject(myContext.getManager(), getResolveScope());
+    final PsiType bound = myExistential.getBound();
+    if (myExistential.isExtends()) {
+      return bound;
+    }
+    else {
+      return bound instanceof PsiCapturedWildcardType
+             ? ((PsiCapturedWildcardType)bound).getUpperBound()
+             : PsiType.getJavaLangObject(myContext.getManager(), getResolveScope());
+    }
   }
 
   public PsiWildcardType getWildcard() {
diff --git a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
index 49fbfec..b0f7d45 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/PsiUtil.java
@@ -466,7 +466,8 @@
     final PsiParameter[] parms = method.getParameterList().getParameters();
     if (args.length < parms.length - 1) return ApplicabilityLevel.NOT_APPLICABLE;
 
-    final boolean isRaw = isRawSubstitutor(method, substitutorForMethod);
+    final PsiClass containingClass = method.getContainingClass();
+    final boolean isRaw = containingClass != null && isRawSubstitutor(containingClass, substitutorForMethod);
     if (!areFirstArgumentsApplicable(args, parms, languageLevel, substitutorForMethod, isRaw)) return ApplicabilityLevel.NOT_APPLICABLE;
     if (args.length == parms.length) {
       if (parms.length == 0) return ApplicabilityLevel.FIXED_ARITY;
diff --git a/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java b/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java
index 5696b8b..5d2c6aa 100644
--- a/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java
+++ b/java/java-psi-api/src/com/intellij/psi/util/TypesDistinctProver.java
@@ -58,6 +58,11 @@
               proveArrayTypeDistinct(((PsiWildcardType)type1).getManager().getProject(), (PsiArrayType)extendsBound, type2)) return true;
           final PsiClass boundClass1 = PsiUtil.resolveClassInType(extendsBound);
           if (boundClass1 == null) return false;
+
+          if (CommonClassNames.JAVA_LANG_OBJECT.equals(psiClass2.getQualifiedName())) {
+            return !CommonClassNames.JAVA_LANG_OBJECT.equals(boundClass1.getQualifiedName());
+          }
+
           return proveExtendsBoundsDistinct(type1, type2, boundClass1, psiClass2);
         }
 
diff --git a/java/java-psi-impl/java-psi-impl.iml b/java/java-psi-impl/java-psi-impl.iml
index 89e9dba..8fa9e62 100644
--- a/java/java-psi-impl/java-psi-impl.iml
+++ b/java/java-psi-impl/java-psi-impl.iml
@@ -11,6 +11,8 @@
     <orderEntry type="module" module-name="core-impl" exported="" />
     <orderEntry type="module" module-name="resources-en" />
     <orderEntry type="library" name="asm4" level="project" />
+    <orderEntry type="module" module-name="openapi" />
+    <orderEntry type="module" module-name="external-system-api" />
   </component>
 </module>
 
diff --git a/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectData.java b/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectData.java
new file mode 100644
index 0000000..d1f5bfa
--- /dev/null
+++ b/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectData.java
@@ -0,0 +1,163 @@
+/*
+ * 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.externalSystem;
+
+import com.intellij.openapi.diagnostic.Logger;
+import com.intellij.openapi.externalSystem.model.Key;
+import com.intellij.openapi.externalSystem.model.ProjectSystemId;
+import com.intellij.openapi.externalSystem.model.project.AbstractProjectEntityData;
+import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
+import com.intellij.openapi.projectRoots.JavaSdkVersion;
+import com.intellij.pom.java.LanguageLevel;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @author Denis Zhdanov
+ * @since 4/12/13 12:27 PM
+ */
+public class JavaProjectData extends AbstractProjectEntityData {
+  
+  @NotNull public static final Key<JavaProjectData> KEY = Key.create(JavaProjectData.class);
+  
+  private static final Logger LOG = Logger.getInstance("#" + JavaProjectData.class.getName());
+
+  private static final long serialVersionUID = 1L;
+
+  private static final LanguageLevel  DEFAULT_LANGUAGE_LEVEL = LanguageLevel.JDK_1_6;
+  private static final JavaSdkVersion DEFAULT_JDK_VERSION    = JavaSdkVersion.JDK_1_6;
+  private static final Pattern        JDK_VERSION_PATTERN    = Pattern.compile(".*1\\.(\\d+).*");
+
+  @NotNull private JavaSdkVersion myJdkVersion    = DEFAULT_JDK_VERSION;
+  @NotNull private LanguageLevel  myLanguageLevel = DEFAULT_LANGUAGE_LEVEL;
+
+  @NotNull private  String myCompileOutputPath;
+
+  public JavaProjectData(@NotNull ProjectSystemId owner, @NotNull String compileOutputPath) {
+    super(owner);
+    myCompileOutputPath = compileOutputPath;
+  }
+
+  @NotNull
+  public String getCompileOutputPath() {
+    return myCompileOutputPath;
+  }
+
+  public void setCompileOutputPath(@NotNull String compileOutputPath) {
+    myCompileOutputPath = ExternalSystemApiUtil.toCanonicalPath(compileOutputPath);
+  }
+
+  @NotNull
+  public JavaSdkVersion getJdkVersion() {
+    return myJdkVersion;
+  }
+
+  public void setJdkVersion(@NotNull JavaSdkVersion jdkVersion) {
+    myJdkVersion = jdkVersion;
+  }
+
+  public void setJdkVersion(@Nullable String jdk) {
+    if (jdk == null) {
+      return;
+    }
+    try {
+      int version = Integer.parseInt(jdk.trim());
+      if (applyJdkVersion(version)) {
+        return;
+      }
+    }
+    catch (NumberFormatException e) {
+      // Ignore.
+    }
+
+    Matcher matcher = JDK_VERSION_PATTERN.matcher(jdk);
+    if (!matcher.matches()) {
+      return;
+    }
+    String versionAsString = matcher.group(1);
+    try {
+      applyJdkVersion(Integer.parseInt(versionAsString));
+    }
+    catch (NumberFormatException e) {
+      // Ignore.
+    }
+  }
+
+  public boolean applyJdkVersion(int version) {
+    if (version < 0 || version >= JavaSdkVersion.values().length) {
+      LOG.warn(String.format(
+        "Unsupported jdk version detected (%d). Expected to get number from range [0; %d]", version, JavaSdkVersion.values().length
+      ));
+      return false;
+    }
+    for (JavaSdkVersion sdkVersion : JavaSdkVersion.values()) {
+      if (sdkVersion.ordinal() == version) {
+        myJdkVersion = sdkVersion;
+        return true;
+      }
+    }
+    assert false : version + ", max value: " + JavaSdkVersion.values().length;
+    return false;
+  }
+
+  @NotNull
+  public LanguageLevel getLanguageLevel() {
+    return myLanguageLevel;
+  }
+
+  public void setLanguageLevel(@NotNull LanguageLevel level) {
+    myLanguageLevel = level;
+  }
+
+  public void setLanguageLevel(@Nullable String languageLevel) {
+    LanguageLevel level = LanguageLevel.parse(languageLevel);
+    if (level != null) {
+      myLanguageLevel = level;
+    }
+  }
+
+  @Override
+  public int hashCode() {
+    int result = super.hashCode();
+    result = 31 * result + myJdkVersion.hashCode();
+    result = 31 * result + myLanguageLevel.hashCode();
+    result = 31 * result + myCompileOutputPath.hashCode();
+    return result;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    if (!super.equals(o)) return false;
+
+    JavaProjectData project = (JavaProjectData)o;
+
+    if (!myCompileOutputPath.equals(project.myCompileOutputPath)) return false;
+    if (myJdkVersion != project.myJdkVersion) return false;
+    if (myLanguageLevel != project.myLanguageLevel) return false;
+
+    return true;
+  }
+
+  @Override
+  public String toString() {
+    return "java project";
+  }
+}
diff --git a/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectDataService.java b/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectDataService.java
new file mode 100644
index 0000000..05132a8
--- /dev/null
+++ b/java/java-psi-impl/src/com/intellij/externalSystem/JavaProjectDataService.java
@@ -0,0 +1,114 @@
+/*
+ * 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.externalSystem;
+
+import com.intellij.openapi.externalSystem.model.DataNode;
+import com.intellij.openapi.externalSystem.model.Key;
+import com.intellij.openapi.externalSystem.model.ProjectSystemId;
+import com.intellij.openapi.externalSystem.service.project.manage.ProjectDataService;
+import com.intellij.openapi.externalSystem.util.ExternalSystemApiUtil;
+import com.intellij.openapi.project.Project;
+import com.intellij.openapi.projectRoots.JavaSdk;
+import com.intellij.openapi.projectRoots.JavaSdkVersion;
+import com.intellij.openapi.projectRoots.ProjectJdkTable;
+import com.intellij.openapi.projectRoots.Sdk;
+import com.intellij.openapi.roots.LanguageLevelProjectExtension;
+import com.intellij.openapi.roots.ProjectRootManager;
+import com.intellij.pom.java.LanguageLevel;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * @author Denis Zhdanov
+ * @since 4/15/13 12:09 PM
+ */
+public class JavaProjectDataService implements ProjectDataService<JavaProjectData> {
+
+  @NotNull
+  @Override
+  public Key<JavaProjectData> getTargetDataKey() {
+    return JavaProjectData.KEY;
+  }
+
+  @Override
+  public void importData(@NotNull Collection<DataNode<JavaProjectData>> toImport, @NotNull Project project, boolean synchronous) {
+    if (toImport.size() != 1) {
+      throw new IllegalArgumentException(String.format("Expected to get a single project but got %d: %s", toImport.size(), toImport));
+    }
+    JavaProjectData projectData = toImport.iterator().next().getData();
+    
+    // JDK.
+    JavaSdkVersion version = projectData.getJdkVersion();
+    JavaSdk javaSdk = JavaSdk.getInstance();
+    ProjectRootManager rootManager = ProjectRootManager.getInstance(project);
+    Sdk sdk = rootManager.getProjectSdk();
+    if (sdk instanceof JavaSdk) {
+      JavaSdkVersion currentVersion = javaSdk.getVersion(sdk);
+      if (currentVersion == null || !currentVersion.isAtLeast(version)) {
+        Sdk newJdk = findJdk(version);
+        if (newJdk != null) {
+          rootManager.setProjectSdk(sdk);
+          LanguageLevel level = version.getMaxLanguageLevel();
+          LanguageLevelProjectExtension ext = LanguageLevelProjectExtension.getInstance(project);
+          if (level.compareTo(ext.getLanguageLevel()) < 0) {
+            ext.setLanguageLevel(level);
+          }
+        }
+      }
+    }
+    // Language level.
+    setLanguageLevel(projectData.getLanguageLevel(), project, synchronous);
+  }
+
+  @Nullable
+  private static Sdk findJdk(@NotNull JavaSdkVersion version) {
+    JavaSdk javaSdk = JavaSdk.getInstance();
+    List<Sdk> javaSdks = ProjectJdkTable.getInstance().getSdksOfType(javaSdk);
+    Sdk candidate = null;
+    for (Sdk sdk : javaSdks) {
+      JavaSdkVersion v = javaSdk.getVersion(sdk);
+      if (v == version) {
+        return sdk;
+      }
+      else if (candidate == null && v != null && version.getMaxLanguageLevel().isAtLeast(version.getMaxLanguageLevel())) {
+        candidate = sdk;
+      }
+    }
+    return candidate;
+  }
+  
+  @Override
+  public void removeData(@NotNull Collection<DataNode<JavaProjectData>> toRemove, @NotNull Project project, boolean synchronous) {
+  }
+
+  @SuppressWarnings("MethodMayBeStatic")
+  public void setLanguageLevel(@NotNull final LanguageLevel languageLevel, @NotNull Project project, boolean synchronous) {
+    final LanguageLevelProjectExtension languageLevelExtension = LanguageLevelProjectExtension.getInstance(project);
+    if (languageLevelExtension.getLanguageLevel().isAtLeast(languageLevel)) {
+      return;
+    }
+    ExternalSystemApiUtil.executeProjectChangeAction(project, ProjectSystemId.IDE, synchronous, new Runnable() {
+      @Override
+      public void run() {
+        languageLevelExtension.setLanguageLevel(languageLevel);
+      }
+    });
+  }
+  
+}
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java
index 27bf4b5..d0f86c7 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/PsiElementFactoryImpl.java
@@ -21,7 +21,6 @@
 import com.intellij.lexer.JavaLexer;
 import com.intellij.lexer.Lexer;
 import com.intellij.openapi.project.Project;
-import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.pom.java.LanguageLevel;
 import com.intellij.psi.*;
 import com.intellij.psi.codeStyle.CodeStyleManager;
@@ -200,7 +199,7 @@
       throw new IncorrectOperationException("Cannot create field with type \"null\".");
     }
 
-    final String text = StringUtil.join("class _Dummy_ { private ", type.getCanonicalText(), " ", name, "; }");
+    final String text = "class _Dummy_ { private " + type.getCanonicalText() + " " + name + "; }";
     final PsiJavaFile aFile = createDummyJavaFile(text);
     final PsiClass[] classes = aFile.getClasses();
     if (classes.length < 1) {
@@ -225,7 +224,7 @@
     }
 
     final String canonicalText = returnType.getCanonicalText();
-    final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("class _Dummy_ { public " + canonicalText, " ", name, "() {} }"));
+    final PsiJavaFile aFile = createDummyJavaFile("class _Dummy_ { public " + canonicalText + " " + name + "() {} }");
     final PsiClass[] classes = aFile.getClasses();
     if (classes.length < 1) {
       throw new IncorrectOperationException("Class was not created. Method name: " + name + "; return type: " + canonicalText);
@@ -248,7 +247,7 @@
   @NotNull
   @Override
   public PsiMethod createConstructor(@NotNull @NonNls final String name) {
-    final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("class ", name, " { public ", name, "() {} }"));
+    final PsiJavaFile aFile = createDummyJavaFile("class " + name + " { public " + name + "() {} }");
     final PsiMethod method = aFile.getClasses()[0].getMethods()[0];
     return (PsiMethod)CodeStyleManager.getInstance(myManager.getProject()).reformat(method);
   }
@@ -274,7 +273,7 @@
       throw new IncorrectOperationException("Cannot create parameter with type \"null\".");
     }
 
-    final String text = StringUtil.join(type.getCanonicalText() + " " + name);
+    final String text = type.getCanonicalText() + " " + name;
     PsiParameter parameter = createParameterFromText(text, null);
     final CodeStyleManager codeStyleManager = CodeStyleManager.getInstance(myManager.getProject());
     PsiUtil.setModifierProperty(parameter, PsiModifier.FINAL,
@@ -429,7 +428,7 @@
   @NotNull
   @Override
   public PsiPackageStatement createPackageStatement(@NotNull final String name) throws IncorrectOperationException {
-    final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("package ", name, ";"));
+    final PsiJavaFile aFile = createDummyJavaFile("package " + name + ";");
     final PsiPackageStatement stmt = aFile.getPackageStatement();
     if (stmt == null) {
       throw new IncorrectOperationException("Incorrect package name: " + name);
@@ -448,7 +447,7 @@
       throw new IncorrectOperationException("Cannot create import statement for local class.");
     }
 
-    final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("import static ", aClass.getQualifiedName(), ".", memberName, ";"));
+    final PsiJavaFile aFile = createDummyJavaFile("import static " + aClass.getQualifiedName() + "." + memberName + ";");
     final PsiImportStatementBase statement = extractImport(aFile, true);
     return (PsiImportStaticStatement)CodeStyleManager.getInstance(myManager.getProject()).reformat(statement);
   }
@@ -548,7 +547,7 @@
       throw new IncorrectOperationException("Cannot create import statement for local class.");
     }
 
-    final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("import ", aClass.getQualifiedName(), ";"));
+    final PsiJavaFile aFile = createDummyJavaFile("import " + aClass.getQualifiedName() + ";");
     final PsiImportStatementBase statement = extractImport(aFile, false);
     return (PsiImportStatement)CodeStyleManager.getInstance(myManager.getProject()).reformat(statement);
   }
@@ -563,7 +562,7 @@
       throw new IncorrectOperationException("Incorrect package name: \"" + packageName + "\".");
     }
 
-    final PsiJavaFile aFile = createDummyJavaFile(StringUtil.join("import ", packageName, ".*;"));
+    final PsiJavaFile aFile = createDummyJavaFile("import " + packageName + ".*;");
     final PsiImportStatementBase statement = extractImport(aFile, false);
     return (PsiImportStatement)CodeStyleManager.getInstance(myManager.getProject()).reformat(statement);
   }
@@ -580,7 +579,7 @@
       throw new IncorrectOperationException("Cannot create variable with type \"null\".");
     }
 
-    final String text = "X " + (initializer != null ? " = x" : "") + " = x";
+    final String text = "X " + name + (initializer != null ? " = x" : "") + ";";
 
     final PsiDeclarationStatement statement = (PsiDeclarationStatement)createStatementFromText(text, null);
     final PsiVariable variable = (PsiVariable)statement.getDeclaredElements()[0];
@@ -719,7 +718,7 @@
       throw new IncorrectOperationException("Unexpected type:" + exceptionType);
     }
 
-    final String text = StringUtil.join("catch (", exceptionType.getCanonicalText(), " ", exceptionName, ") {}");
+    final String text = "catch (" + exceptionType.getCanonicalText() +  " " + exceptionName + ") {}";
     final DummyHolder holder = DummyHolderFactory.createHolder(myManager, new JavaDummyElement(text, CATCH_SECTION, level(context)), context);
     final PsiElement element = SourceTreeToPsiMap.treeElementToPsi(holder.getTreeElement().getFirstChildNode());
     if (!(element instanceof PsiCatchSection)) {
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java
index 4c83755..cc46b4b 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java
@@ -16,11 +16,13 @@
 package com.intellij.psi.impl.source;
 
 import com.intellij.lang.ASTNode;
-import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.psi.*;
 import com.intellij.psi.impl.PsiImplUtil;
 import com.intellij.psi.impl.source.codeStyle.CodeEditUtil;
-import com.intellij.psi.impl.source.tree.*;
+import com.intellij.psi.impl.source.tree.CompositePsiElement;
+import com.intellij.psi.impl.source.tree.ElementType;
+import com.intellij.psi.impl.source.tree.JavaElementType;
+import com.intellij.psi.impl.source.tree.TreeElement;
 import com.intellij.psi.scope.PsiScopeProcessor;
 import com.intellij.psi.tree.IElementType;
 import com.intellij.psi.util.PsiTreeUtil;
@@ -36,8 +38,6 @@
 import java.util.List;
 
 public class PsiTypeElementImpl extends CompositePsiElement implements PsiTypeElement {
-  private static final Logger LOG = Logger.getInstance("#com.intellij.psi.impl.source.PsiTypeElementImpl");
-
   private volatile PsiType myCachedType = null;
 
   @SuppressWarnings({"UnusedDeclaration"})
@@ -120,22 +120,16 @@
 
       if (PsiUtil.isJavaToken(child, JavaTokenType.QUEST)) {
         assert type == null : this;
-        PsiElement next = PsiTreeUtil.skipSiblingsForward(child, PsiComment.class, PsiWhiteSpace.class);
-        if (next == null) {
-          type = PsiWildcardType.createUnbounded(getManager());
+        PsiElement boundKind = PsiTreeUtil.skipSiblingsForward(child, PsiComment.class, PsiWhiteSpace.class);
+        PsiElement boundType = PsiTreeUtil.skipSiblingsForward(boundKind, PsiComment.class, PsiWhiteSpace.class);
+        if (PsiUtil.isJavaToken(boundKind, JavaTokenType.EXTENDS_KEYWORD) && boundType instanceof PsiTypeElement) {
+          type = PsiWildcardType.createExtends(getManager(), ((PsiTypeElement)boundType).getType());
+        }
+        else if (PsiUtil.isJavaToken(boundKind, JavaTokenType.SUPER_KEYWORD) && boundType instanceof PsiTypeElement) {
+          type = PsiWildcardType.createSuper(getManager(), ((PsiTypeElement)boundType).getType());
         }
         else {
-          PsiElement bound = PsiTreeUtil.skipSiblingsForward(next, PsiComment.class, PsiWhiteSpace.class);
-          if (PsiUtil.isJavaToken(next, JavaTokenType.EXTENDS_KEYWORD) && bound instanceof PsiTypeElement) {
-            type = PsiWildcardType.createExtends(getManager(), ((PsiTypeElement)bound).getType());
-          }
-          else if (PsiUtil.isJavaToken(next, JavaTokenType.SUPER_KEYWORD) && bound instanceof PsiTypeElement) {
-            type = PsiWildcardType.createSuper(getManager(), ((PsiTypeElement)bound).getType());
-          }
-          else {
-            LOG.error("next=" + next + " bound=" + bound + ": " + this);
-            type = PsiWildcardType.createUnbounded(getManager());
-          }
+          type = PsiWildcardType.createUnbounded(getManager());
         }
         PsiAnnotation[] array = ContainerUtil.copyAndClear(annotations, PsiAnnotation.ARRAY_FACTORY, true);
         type = ((PsiWildcardType)type).annotate(array);
diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java
index 8b33ab2..712b32c 100644
--- a/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java
+++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/tree/java/ClassElement.java
@@ -26,6 +26,7 @@
 import com.intellij.psi.tree.ChildRoleBase;
 import com.intellij.psi.tree.IElementType;
 import com.intellij.psi.tree.TokenSet;
+import com.intellij.psi.util.PsiUtil;
 import com.intellij.util.CharTable;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
@@ -134,12 +135,17 @@
       }
     }
     else if (psiClass.isInterface()) {
+      final boolean level8OrHigher = PsiUtil.isLanguageLevel8OrHigher(psiClass);
       for (ASTNode child = first; child != afterLast; child = next) {
         next = child.getTreeNext();
-        if (child.getElementType() == JavaElementType.METHOD || child.getElementType() == JavaElementType.FIELD) {
+        final IElementType childElementType = child.getElementType();
+        if (childElementType == JavaElementType.METHOD || childElementType == JavaElementType.FIELD) {
           CompositeElement modifierList = (CompositeElement)((CompositeElement)child).findChildByRole(ChildRole.MODIFIER_LIST);
+          final TokenSet removeModifiersBitSet = level8OrHigher && childElementType == JavaElementType.METHOD
+                                                 ? MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET_18_METHOD
+                                                 : MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET;
           while (true) {
-            ASTNode modifier = modifierList.findChildByType(MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET);
+            ASTNode modifier = modifierList.findChildByType(removeModifiersBitSet);
             if (modifier == null) break;
             modifierList.deleteChildInternal(modifier);
           }
@@ -233,6 +239,12 @@
     NATIVE_KEYWORD
   );
 
+  private static final TokenSet MODIFIERS_TO_REMOVE_IN_INTERFACE_BIT_SET_18_METHOD = TokenSet.create(
+    PUBLIC_KEYWORD, ABSTRACT_KEYWORD,
+    FINAL_KEYWORD,
+    NATIVE_KEYWORD
+  );
+
   private static final TokenSet MODIFIERS_TO_REMOVE_IN_ENUM_BIT_SET = TokenSet.create(
     PUBLIC_KEYWORD, FINAL_KEYWORD
   );
diff --git a/java/java-runtime/src/FormPreviewFrame.java b/java/java-runtime/src/FormPreviewFrame.java
index 939c468..5e69856 100644
--- a/java/java-runtime/src/FormPreviewFrame.java
+++ b/java/java-runtime/src/FormPreviewFrame.java
@@ -53,8 +53,10 @@
     }
 
     frame.pack();
-    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
-    frame.setLocation((screenSize.width - frame.getWidth())/2, (screenSize.height - frame.getHeight())/2);
+    Rectangle screenBounds =
+      GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().getBounds();
+    frame.setLocation(screenBounds.x + (screenBounds.width - frame.getWidth()) / 2,
+                      screenBounds.y + (screenBounds.height - frame.getHeight()) / 2);
     frame.setVisible(true);
   }
 
diff --git a/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java b/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java
index 8b45dca..4e3b6c8 100644
--- a/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java
+++ b/java/java-runtime/src/com/intellij/rt/ant/execution/AntMain2.java
@@ -21,20 +21,25 @@
 
   public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
     IdeaAntLogger2.guardStreams();
-
-    // first try to use the new way of launching ant
+    
+    // as we build classpath ourselves, and ensure all libraries are added to classpath, 
+    // preferred way for us to run ant will be using the traditional ant entry point, via the "Main" class 
     try {
-      final Class antLauncher = Class.forName("org.apache.tools.ant.launch.Launcher");
+      final Class antMain = Class.forName("org.apache.tools.ant.Main");
       //noinspection HardCodedStringLiteral
-      antLauncher.getMethod("main", new Class[]{args.getClass()}).invoke(null, new Object[]{args});
+      antMain.getMethod("main", new Class[]{args.getClass()}).invoke(null, new Object[]{args});
       return;
     }
     catch (ClassNotFoundException e) {
-      // ignore and try older variant
+      // ignore
     }
-
-    final Class antMain = Class.forName("org.apache.tools.ant.Main");
+    
+    // fallback: try the newer approach, launcher
+    // This approach is less preferred in our case, but still...
+    // From the ant documentation: "You should start the launcher with the most minimal classpath possible, generally just the ant-launcher.jar."
+    final Class antLauncher = Class.forName("org.apache.tools.ant.launch.Launcher");
     //noinspection HardCodedStringLiteral
-    antMain.getMethod("main", new Class[]{args.getClass()}).invoke(null, new Object[]{args});
+    antLauncher.getMethod("main", new Class[]{args.getClass()}).invoke(null, new Object[]{args});
+
   }
 }
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedThisSuper.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedThisSuper.java
index cba08cd..76336cd 100644
--- a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedThisSuper.java
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/advHighlighting/QualifiedThisSuper.java
@@ -15,3 +15,10 @@
         System.out.println(<error descr="'Z' is not an enclosing class">Z.super</error>.toString());
     }
 }
+
+class W {
+    static String some = "";
+    static void m() {
+        synchronized (<error descr="Class name expected here">some</error>.this) { }
+    }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA104992.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA104992.java
new file mode 100644
index 0000000..3798c70
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA104992.java
@@ -0,0 +1,17 @@
+import java.util.Collection;
+import java.util.Set;
+
+class FooObject<T> {}
+class FooId<T extends FooObject> {}
+
+interface Bar {
+    <T extends FooObject, I extends FooId<? extends T>> T get(I key);
+    <T extends FooObject, I extends FooId<? extends T>> Collection<T> get(Collection<I> keys);
+}
+
+public class Target {
+    void foo(Bar bar) {
+        final Set<FooId<?>> keys = null;
+        final Collection<FooObject> values = bar.get(keys);
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105695.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105695.java
new file mode 100644
index 0000000..ab28299
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105695.java
@@ -0,0 +1,10 @@
+import java.util.Map;
+
+public class Test {
+    void bar(Prop p) {
+         Map<? extends String, ? extends String> map = <error descr="Inconvertible types; cannot cast 'Prop' to 'java.util.Map<? extends java.lang.String,? extends java.lang.String>'">(Map<? extends String, ?  extends String>)p</error>;
+    }
+}
+
+abstract class Hashtble<K,V> implements Map<K,V> {}
+abstract class Prop extends Hashtble<Object, Object>{}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105846.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105846.java
new file mode 100644
index 0000000..8b9c700
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/genericsHighlighting/IDEA105846.java
@@ -0,0 +1,5 @@
+class MyClass {
+    public static void main(Class<? extends MyClass> clazz){
+        clazz = (Class<? extends MyClass>) clazz.getSuperclass();
+    }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/ThisAccessibility.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/ThisAccessibility.java
new file mode 100644
index 0000000..c43ef52
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/interfaceMethods/ThisAccessibility.java
@@ -0,0 +1,24 @@
+interface Bazz {
+    Bazz foo = <error descr="Cannot find symbol variable this">Bazz.this</error>;
+    static void foo1() {
+        Bazz foo = <error descr="'Bazz.this' cannot be referenced from a static context">Bazz.this</error>;
+    }
+
+    Runnable bar = new Runnable() {
+       @Override
+       public void run() {
+           Bazz f = <error descr="Cannot find symbol variable this">Bazz.this</error>;
+       }
+    };
+  
+  
+    default void foo() {
+        Bazz foo = Bazz.this;
+        Runnable r = new Runnable() {
+            @Override
+            public void run() {
+                Bazz f = Bazz.this;
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Intersection.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Intersection.java
new file mode 100644
index 0000000..4b04c7a
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Intersection.java
@@ -0,0 +1,14 @@
+import java.io.*;
+interface Predicate<T> {
+  boolean test(String s);
+}
+class Test {
+  private static boolean test(String s) {
+    return false;
+  }
+  
+  {
+    Predicate<String> mh1 = (Predicate<String> & Serializable)Test::test;
+    Predicate<String> mh0 = (<warning descr="Casting 'Test::test' to 'Predicate<String> & Predicate<String>' is redundant">Predicate<String> & Predicate<String></warning>)Test::test;
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Ser.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Ser.java
new file mode 100644
index 0000000..c4b4bef
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/lambda/redundantCast/Ser.java
@@ -0,0 +1,20 @@
+import java.io.*;
+interface Predicate<T> {
+  boolean test(String s);
+}
+interface SerPredicate<T> extends Predicate<T>, Serializable {
+}
+
+interface NonSerPredicate<T> extends Predicate<T> {
+}
+
+class Test {
+  private static boolean test(String s) {
+    return false;
+  }
+
+  {
+    Predicate<String> mh2 = (SerPredicate<String>)Test::test;
+    Predicate<String> mh02 = (<warning descr="Casting 'Test::test' to 'NonSerPredicate<String>' is redundant">NonSerPredicate<String></warning>)Test::test;
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/DisabledInsideParameterizedReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/DisabledInsideParameterizedReference.java
new file mode 100644
index 0000000..b349ea7
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/DisabledInsideParameterizedReference.java
@@ -0,0 +1,6 @@
+import foo.*;
+class Class2 {
+  public static void main(String[] args) {
+    Class1.<String>f<caret>oo();
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference.java
new file mode 100644
index 0000000..85aa9ae
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference.java
@@ -0,0 +1,6 @@
+import foo.*;
+class Class2 {
+  public static void main(String[] args) {
+    new Class1.Inn<caret>er2<Class1.Inner1>();
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference.java
new file mode 100644
index 0000000..cf579dd
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference.java
@@ -0,0 +1,6 @@
+import foo.*;
+class Class2 {
+  public static void main(String[] args) {
+    new Class1.Inner2<Class1.In<caret>ner1>();
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference_after.java
new file mode 100644
index 0000000..9a2ff4d
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReferenceInsideParameterizedReference_after.java
@@ -0,0 +1,9 @@
+import foo.*;
+
+import static foo.Class1.Inner1;
+
+class Class2 {
+  public static void main(String[] args) {
+    new Class1.Inner2<Inner1>();
+  }
+}
diff --git a/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference_after.java b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference_after.java
new file mode 100644
index 0000000..6f57f14
--- /dev/null
+++ b/java/java-tests/testData/codeInsight/daemonCodeAnalyzer/quickFix/addSingleStaticImport/InsideParameterizedReference_after.java
@@ -0,0 +1,9 @@
+import foo.*;
+
+import static foo.Class1.Inner2;
+
+class Class2 {
+  public static void main(String[] args) {
+    new Inner2<Class1.Inner1>();
+  }
+}
diff --git a/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Extracted.java b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Extracted.java
new file mode 100644
index 0000000..50d8f56
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Extracted.java
@@ -0,0 +1,5 @@
+public class Extracted {
+    public static <T> T foo() {
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Test.java b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Test.java
new file mode 100644
index 0000000..1260839
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/after/Test.java
@@ -0,0 +1,6 @@
+class Test {
+
+    {
+    String s = true ? Extracted.<String>foo() : "";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/before/Test.java b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/before/Test.java
new file mode 100644
index 0000000..57a1130
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/implicitReferenceTypeParameters/before/Test.java
@@ -0,0 +1,7 @@
+class Test {
+  public static <T> T foo() { return null; }
+
+  {
+    String s = true ? Test.<String>foo() : "";
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Extracted.java b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Extracted.java
new file mode 100644
index 0000000..c2ef3ae
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Extracted.java
@@ -0,0 +1,7 @@
+package foo;
+
+public class Extracted {
+    public static <T> T foo() {
+        return null;
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Test.java b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Test.java
new file mode 100644
index 0000000..4d2368c
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Test.java
@@ -0,0 +1,3 @@
+package foo;
+class Test {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Usage.java b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Usage.java
new file mode 100644
index 0000000..4a102ee
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/staticImports/after/foo/Usage.java
@@ -0,0 +1,8 @@
+package foo;
+import static foo.Extracted.foo;
+
+class Usage {
+  {
+    foo();
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Test.java b/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Test.java
new file mode 100644
index 0000000..7a2b3a3
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Test.java
@@ -0,0 +1,4 @@
+package foo;
+class Test {
+  public static <T> T foo() { return null; }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Usage.java b/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Usage.java
new file mode 100644
index 0000000..4d6c4f2
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractClass/staticImports/before/foo/Usage.java
@@ -0,0 +1,8 @@
+package foo;
+import static foo.Test.foo;
+
+class Usage {
+  {
+    foo();
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/A.java b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/A.java
new file mode 100644
index 0000000..61ff2ab
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/A.java
@@ -0,0 +1,2 @@
+public class A {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/B.java b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/B.java
new file mode 100644
index 0000000..a4e6f3f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/after/B.java
@@ -0,0 +1,5 @@
+public interface B {
+    static void foo() {
+      System.out.println("Hello");
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/A.java b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/A.java
new file mode 100644
index 0000000..1144c81
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/A.java
@@ -0,0 +1,5 @@
+public class A {
+    public static void foo() {
+      System.out.println("Hello");
+    }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/B.java b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/B.java
new file mode 100644
index 0000000..375942a
--- /dev/null
+++ b/java/java-tests/testData/refactoring/moveMembers/staticToInterface/before/B.java
@@ -0,0 +1,2 @@
+public interface B {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/after/foo/I.java b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/after/foo/I.java
new file mode 100644
index 0000000..f0205fb
--- /dev/null
+++ b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/after/foo/I.java
@@ -0,0 +1,3 @@
+package foo;
+public interface I {
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/C1.java b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/C1.java
new file mode 100644
index 0000000..f00e66d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/C1.java
@@ -0,0 +1,8 @@
+/**
+ * C1.java - Safe-delete bug example
+ */
+package foo;
+
+public class C1 {
+  C<caret>1 fooo;
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/I.java b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/I.java
new file mode 100644
index 0000000..f0205fb
--- /dev/null
+++ b/java/java-tests/testData/refactoring/safeDelete/topLevelDocComment/before/foo/I.java
@@ -0,0 +1,3 @@
+package foo;
+public interface I {
+}
\ No newline at end of file
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 f2a6e3a..e6c8ec1 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/GenericsHighlightingTest.java
@@ -205,6 +205,9 @@
   public void testIDEA99347() { doTest5(false); }
   public void testIDEA86875() { doTest5(false); }
   public void testIDEA103760(){ doTest5(false); }
+  public void testIDEA105846(){ doTest5(false); }
+  public void testIDEA105695(){ doTest5(false); }
+  public void testIDEA104992(){ doTest5(false); }
 
   public void testWildcardsOnRawTypes() { doTest5(false); }
   public void testDisableWithinBoundsCheckForSuperWildcards() {
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 0e400c1..c31cce3 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingJdk6Test.java
@@ -28,24 +28,19 @@
 import org.jetbrains.annotations.NotNull;
 
 /**
- * This class is for "lightweight" tests only, i.e. those which can run inside default light project set up
- * For "heavyweight" tests use AdvHighlightingTest
+ * This class is for "lightweight" tests only, i.e. those which can run inside default light project set up.
+ * For "heavyweight" tests use AdvHighlightingTest.
  */
 public class LightAdvHighlightingJdk6Test extends LightDaemonAnalyzerTestCase {
   @NonNls static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/advHighlighting6";
 
   private void doTest(boolean checkWarnings, boolean checkInfos, Class<?>... classes) {
-    setLanguageLevel(LanguageLevel.JDK_1_6); 
+    setLanguageLevel(LanguageLevel.JDK_1_6);
     ((JavaVersionServiceImpl)JavaVersionService.getInstance()).setTestVersion(JavaSdkVersion.JDK_1_6, myTestRootDisposable);
     enableInspectionTools(classes);
     doTest(BASE_PATH + "/" + getTestName(false) + ".java", checkWarnings, checkInfos);
   }
 
-  private void doTest(boolean checkWarnings, boolean checkWeakWarnings, boolean checkInfos, Class<?>... classes) {
-    enableInspectionTools(classes);
-    doTest(BASE_PATH + "/" + getTestName(false) + ".java", checkWarnings, checkWeakWarnings, checkInfos);
-  }
-
   @NotNull
   @Override
   protected LocalInspectionTool[] configureLocalInspectionTools() {
@@ -57,6 +52,6 @@
     };
   }
 
-  public void testJavacQuirks() throws Exception { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(true, false); }
-  public void testMethodReturnTypeSubstitutability() throws Exception { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(true, false); }
+  public void testJavacQuirks() { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(true, false); }
+  public void testMethodReturnTypeSubstitutability() { setLanguageLevel(LanguageLevel.JDK_1_6); doTest(true, false); }
 }
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java
index f68f93c..b1217dd 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/LightAdvHighlightingTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2012 JetBrains s.r.o.
+ * 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.
@@ -241,7 +241,7 @@
     };
 
     point.registerExtension(extension);
-    
+
     try {
       UnusedDeclarationInspection deadCodeInspection = new UnusedDeclarationInspection();
       enableInspectionTool(deadCodeInspection);
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 dab1d63..e77dff3 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
@@ -29,6 +29,7 @@
   public void testInheritDefaultMethodInInterface() { doTest(false, false); }
   public void testStaticMethodsInFunctionalInterface() { doTest(false, false); }
   public void testCyclicSubstitutor() { doTest(false, false); }
+  public void testThisAccessibility() { doTest(false, false); }
 
   private void doTest() {
     doTest(false, false);
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java
new file mode 100644
index 0000000..17d7bd1
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/daemon/lambda/LambdaRedundantCastTest.java
@@ -0,0 +1,40 @@
+/*
+ * 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.codeInsight.daemon.lambda;
+
+import com.intellij.codeInsight.daemon.LightDaemonAnalyzerTestCase;
+import com.intellij.codeInspection.LocalInspectionTool;
+import com.intellij.codeInspection.redundantCast.RedundantCastInspection;
+import org.jetbrains.annotations.NonNls;
+import org.jetbrains.annotations.NotNull;
+
+public class LambdaRedundantCastTest extends LightDaemonAnalyzerTestCase {
+  @NonNls static final String BASE_PATH = "/codeInsight/daemonCodeAnalyzer/lambda/redundantCast";
+
+  @NotNull
+  @Override
+  protected LocalInspectionTool[] configureLocalInspectionTools() {
+    return new LocalInspectionTool[]{
+      new RedundantCastInspection()
+    };
+  }
+
+  public void testIntersection() { doTest(); }
+  public void testSer() { doTest(); }
+  private void doTest() {
+    doTest(BASE_PATH + "/" + getTestName(false) + ".java", true, false);
+  }
+}
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddSingleStaticImportActionTest.java b/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddSingleStaticImportActionTest.java
index d7bacf2..9ecdd1c 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddSingleStaticImportActionTest.java
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/intention/AddSingleStaticImportActionTest.java
@@ -30,6 +30,45 @@
     myFixture.checkResultByFile(getTestName(false) + "_after.java");
   }
 
+  public void testInsideParameterizedReference() {
+    myFixture.addClass("package foo; " +
+                       "public class Class1 {" +
+                       "  public static class Inner1 {}\n" +
+                       "  public static class Inner2<T> {}" +
+                       "}");
+    myFixture.configureByFile(getTestName(false) + ".java");
+
+    final IntentionAction intentionAction = myFixture.findSingleIntention("Add static import for 'foo.Class1.Inner2'");
+    assertNotNull(intentionAction);
+    myFixture.launchAction(intentionAction);
+    myFixture.checkResultByFile(getTestName(false) + "_after.java");
+  }
+
+  public void testInsideParameterizedReferenceInsideParameterizedReference() {
+    myFixture.addClass("package foo; " +
+                       "public class Class1 {" +
+                       "  public static class Inner1 {}\n" +
+                       "  public static class Inner2<T> {}" +
+                       "}");
+    myFixture.configureByFile(getTestName(false) + ".java");
+
+    final IntentionAction intentionAction = myFixture.findSingleIntention("Add static import for 'foo.Class1.Inner1'");
+    assertNotNull(intentionAction);
+    myFixture.launchAction(intentionAction);
+    myFixture.checkResultByFile(getTestName(false) + "_after.java");
+  }
+
+ public void testDisabledInsideParameterizedReference() {
+    myFixture.addClass("package foo; " +
+                       "public class Class1 {" +
+                       "  public static <T> T foo(){return null;}\n" +
+                       "}");
+    myFixture.configureByFile(getTestName(false) + ".java");
+
+    final IntentionAction intentionAction = myFixture.getAvailableIntention("Add static import for 'foo.Class1.foo'");
+    assertNull(intentionAction);
+  }
+
 
   @Override
   protected String getTestDataPath() {
diff --git a/java/java-tests/testSrc/com/intellij/codeInsight/psi/AnnotatedTypeTest.groovy b/java/java-tests/testSrc/com/intellij/codeInsight/psi/AnnotatedTypeTest.groovy
index cbaa56d..f186f9e 100644
--- a/java/java-tests/testSrc/com/intellij/codeInsight/psi/AnnotatedTypeTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/codeInsight/psi/AnnotatedTypeTest.groovy
@@ -19,7 +19,7 @@
 import com.intellij.psi.PsiFile
 import com.intellij.testFramework.LightIdeaTestCase
 
-@SuppressWarnings(["GrUnresolvedAccess"])
+@SuppressWarnings(["GrUnresolvedAccess", "GroovyAssignabilityCheck"])
 class AnnotatedTypeTest extends LightIdeaTestCase {
 
   public void testTypeComposition() {
@@ -55,6 +55,9 @@
 
     psi = javaFacade.elementFactory.createStatementFromText("@A java.lang.@TA(1) String s", context)
     assertEquals("@TA(1) String", psi.declaredElements[0].type.presentableText)
+
+    psi = javaFacade.elementFactory.createStatementFromText("Collection<? extends> s", context)
+    assertEquals("Collection<?>", psi.declaredElements[0].type.presentableText)
   }
 
 }
diff --git a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy
index 9c599d9..8c750fc 100644
--- a/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy
+++ b/java/java-tests/testSrc/com/intellij/psi/codeStyle/arrangement/JavaRearrangerByTypeTest.groovy
@@ -366,4 +366,26 @@
 }'''
     )
   }
+
+  void "test multiple elements at the same line"() {
+    doTest(
+      initial: '''\
+class Test {
+  int i;int getI() {
+    return i;
+  }int j;int getJ() {
+    return j;
+  }
+}''',
+      rules: [rule(FIELD), rule(METHOD)],
+      expected: '''\
+class Test {
+  int i;int j;int getI() {
+    return i;
+  }int getJ() {
+    return j;
+  }
+}'''
+    )
+  }
 }
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java b/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java
index 0199e1a..1e287b2 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/ExtractClassTest.java
@@ -6,6 +6,7 @@
 
 import com.intellij.JavaTestUtil;
 import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.util.text.StringUtil;
 import com.intellij.openapi.vfs.LocalFileSystem;
 import com.intellij.openapi.vfs.VirtualFile;
 import com.intellij.psi.PsiClass;
@@ -42,10 +43,16 @@
   }
 
   private void doTestMethod(final String methodName, final String conflicts) throws Exception {
+    doTestMethod(methodName, conflicts, "Test");
+  }
+
+  private void doTestMethod(final String methodName,
+                            final String conflicts,
+                            final String qualifiedName) throws Exception {
     doTest(new PerformAction() {
       @Override
       public void performAction(final VirtualFile rootDir, final VirtualFile rootAfter) throws Exception {
-        PsiClass aClass = myJavaFacade.findClass("Test", GlobalSearchScope.projectScope(myProject));
+        PsiClass aClass = myJavaFacade.findClass(qualifiedName, GlobalSearchScope.projectScope(myProject));
 
         assertNotNull("Class Test not found", aClass);
 
@@ -101,6 +108,14 @@
     doTestMethod();
   }
 
+  public void testImplicitReferenceTypeParameters() throws Exception {
+    doTestMethod();
+  }
+
+  public void testStaticImports() throws Exception {
+    doTestMethod("foo", null, "foo.Test");
+  }
+
   public void testNoConstructorParams() throws Exception {
     doTestFieldAndMethod();
   }
@@ -161,7 +176,8 @@
   private static void doTest(final PsiClass aClass, final ArrayList<PsiMethod> methods, final ArrayList<PsiField> fields, final String conflicts,
                              boolean generateGettersSetters) {
     try {
-      ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), "", null, "Extracted", null, generateGettersSetters, Collections.<MemberInfo>emptyList());
+      ExtractClassProcessor processor = new ExtractClassProcessor(aClass, fields, methods, new ArrayList<PsiClass>(), StringUtil.getPackageName(aClass.getQualifiedName()), null,
+                                                                  "Extracted", null, generateGettersSetters, Collections.<MemberInfo>emptyList());
       processor.run();
       LocalFileSystem.getInstance().refresh(false);
       FileDocumentManager.getInstance().saveAllDocuments();
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java b/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java
index 26d53d1..0a2c569 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/MoveMembersTest.java
@@ -2,7 +2,9 @@
 
 import com.intellij.JavaTestUtil;
 import com.intellij.openapi.fileEditor.FileDocumentManager;
+import com.intellij.openapi.roots.LanguageLevelProjectExtension;
 import com.intellij.openapi.vfs.VirtualFile;
+import com.intellij.pom.java.LanguageLevel;
 import com.intellij.psi.PsiClass;
 import com.intellij.psi.PsiElement;
 import com.intellij.psi.PsiMember;
@@ -126,6 +128,18 @@
   public void testInnerToInterface() throws Exception {
     doTest("A", "B", 0);
   }
+
+  public void testStaticToInterface() throws Exception {
+    final LanguageLevelProjectExtension levelProjectExtension = LanguageLevelProjectExtension.getInstance(getProject());
+    final LanguageLevel level = levelProjectExtension.getLanguageLevel();
+    try {
+      levelProjectExtension.setLanguageLevel(LanguageLevel.JDK_1_8);
+      doTest("A", "B", 0);
+    }
+    finally {
+      levelProjectExtension.setLanguageLevel(level);
+    }
+  }
   
   public void testEscalateVisibility1() throws Exception {
     doTest("A", "B", true, VisibilityUtil.ESCALATE_VISIBILITY, 0);
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/RenameSuggestionsTest.groovy b/java/java-tests/testSrc/com/intellij/refactoring/RenameSuggestionsTest.groovy
new file mode 100644
index 0000000..23aff0a
--- /dev/null
+++ b/java/java-tests/testSrc/com/intellij/refactoring/RenameSuggestionsTest.groovy
@@ -0,0 +1,105 @@
+/*
+ * 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.refactoring
+import com.intellij.codeInsight.TargetElementUtilBase
+import com.intellij.codeInsight.lookup.LookupElement
+import com.intellij.codeInsight.lookup.LookupEx
+import com.intellij.codeInsight.lookup.LookupManager
+import com.intellij.codeInsight.template.impl.TemplateManagerImpl
+import com.intellij.codeInsight.template.impl.TemplateState
+import com.intellij.psi.PsiElement
+import com.intellij.refactoring.rename.inplace.VariableInplaceRenameHandler
+import com.intellij.testFramework.LightCodeInsightTestCase
+/**
+ * User: anna
+ */
+class RenameSuggestionsTest extends LightCodeInsightTestCase {
+  public void "test by parameter name"() {
+    def text = """\
+     class Test {
+         void foo(int foo) {}
+         {
+             int bar = 0;
+             foo(b<caret>ar);
+         }
+     }
+   }
+   """
+
+    doTestSuggestionAvailable(text, "foo")
+  }
+
+  public void "test by super parameter name"() {
+    def text = """\
+     class Test {
+         void foo(int foo) {}
+     }
+     
+     class TestImpl extends Test {
+         void foo(int foo<caret>1) {}
+     }
+   }
+   """
+
+    doTestSuggestionAvailable(text, "foo")
+  }
+
+  private doTestSuggestionAvailable(String text, String suggestion) {
+    configure text
+    def oldPreselectSetting = myEditor.settings.preselectRename
+    try {
+      TemplateManagerImpl.setTemplateTesting(getProject(), getTestRootDisposable());
+      final PsiElement element = TargetElementUtilBase.findTargetElement(myEditor, TargetElementUtilBase.getInstance().getAllAccepted())
+
+      assertNotNull(element)
+
+      VariableInplaceRenameHandler handler = new VariableInplaceRenameHandler()
+
+
+      handler.doRename(element, editor, null);
+      
+      LookupEx lookup = LookupManager.getActiveLookup(editor)
+      assertNotNull(lookup)
+      boolean found = false;
+      for (LookupElement item : lookup.items) {
+        if (item.getLookupString().equals(suggestion)) {
+          found = true
+          break
+        }
+      }
+
+      if (!found) {
+        fail(suggestion + " not suggested")
+      }
+    }
+    catch (Exception e) {
+      e.printStackTrace()
+    }
+    finally {
+      myEditor.settings.preselectRename = oldPreselectSetting
+
+      TemplateState state = TemplateManagerImpl.getTemplateState(editor)
+
+      assertNotNull(state)
+
+      state.gotoEnd(false)
+    }
+  }
+
+  private def configure(String text) {
+    configureFromFileText("a.java", text)
+  }
+}
\ No newline at end of file
diff --git a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java
index 0f29053..9c1cf49 100644
--- a/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java
+++ b/java/java-tests/testSrc/com/intellij/refactoring/SafeDeleteTest.java
@@ -70,6 +70,12 @@
     doTest("C2");
   }
 
+
+  public void testTopLevelDocComment() throws Exception {
+    myDoCompare = false;
+    doTest("foo.C1");
+  }
+
   public void testTopParameterInHierarchy() throws Exception {
     myDoCompare = false;
     doTest("I");
diff --git a/java/jdkAnnotations/java/util/annotations.xml b/java/jdkAnnotations/java/util/annotations.xml
index 8ac6451..47962ab 100644
--- a/java/jdkAnnotations/java/util/annotations.xml
+++ b/java/jdkAnnotations/java/util/annotations.xml
@@ -858,7 +858,7 @@
     <annotation name="org.jetbrains.annotations.NotNull" />
   </item>
   <item name="java.util.SortedSet java.util.Comparator&lt;? super E&gt; comparator()">
-    <annotation name="org.jetbrains.annotations.NotNull" />
+    <annotation name="org.jetbrains.annotations.Nullable" />
   </item>
   <item name="java.util.SortedSet java.util.SortedSet&lt;E&gt; headSet(E)">
     <annotation name="org.jetbrains.annotations.NotNull" />
diff --git a/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java b/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java
index 42bba52..3202197 100644
--- a/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java
+++ b/java/openapi/src/com/intellij/psi/util/RedundantCastUtil.java
@@ -241,7 +241,9 @@
         PsiManager manager = methodExpr.getManager();
         PsiElementFactory factory = JavaPsiFacade.getInstance(manager.getProject()).getElementFactory();
 
-        PsiMethodCallExpression newCall = (PsiMethodCallExpression)factory.createExpressionFromText(methodCall.getText(), methodCall);
+        final PsiExpression expressionFromText = factory.createExpressionFromText(methodCall.getText(), methodCall);
+        if (!(expressionFromText instanceof PsiMethodCallExpression)) return;
+        PsiMethodCallExpression newCall = (PsiMethodCallExpression)expressionFromText;
         PsiExpression newQualifier = newCall.getMethodExpression().getQualifierExpression();
         PsiExpression newOperand = ((PsiTypeCastExpression)((PsiParenthesizedExpression)newQualifier).getExpression()).getOperand();
         newQualifier.replace(newOperand);
@@ -543,6 +545,24 @@
       if (opType instanceof PsiClassType && ((PsiClassType)opType).hasParameters()) return true;
     }
 
+    if (operand instanceof PsiLambdaExpression || operand instanceof PsiMethodReferenceExpression) {
+      if (castType instanceof PsiClassType && InheritanceUtil.isInheritor(PsiUtil.resolveClassInType(castType), CommonClassNames.JAVA_IO_SERIALIZABLE)) return true;
+      if (castType instanceof PsiIntersectionType) {
+        boolean redundant = false;
+        final PsiType[] conjuncts = ((PsiIntersectionType)castType).getConjuncts();
+        for (int i = 1; i < conjuncts.length; i++) {
+          PsiType conjunct = conjuncts[i];
+          if (TypeConversionUtil.isAssignable(conjuncts[0], conjunct)) {
+            redundant = true;
+            break;
+          }
+        }
+        if (!redundant) {
+          return true;
+        }
+      }
+    }
+
     PsiElement parent = typeCast.getParent();
     while(parent instanceof PsiParenthesizedExpression) parent = parent.getParent();